OLT, Concentradora e WhatsApp

Referência das áreas olt, concentradora e whatsapp da API pública: consulta de OLTs e ONTs, provisionamento remoto (Nokia), sessões PPPoE das concentradoras e envio de mensagens pelo WhatsApp pareado no Ravi.

API de OLT

A área action=olt consulta as OLTs monitoradas e suas ONTs e, em OLTs Nokia, também provisiona e exclui ONTs remotamente. Exige uma chave de API com a permissão Acesso a OLTs marcada; sem ela, o gateway responde HTTP 403. A autenticação e a URL base são as mesmas de toda a API (veja Autenticação):

URL base
GET|POST  https://SEU-SERVIDOR/api/api.php?token=CHAVE&action=olt&operation=OPERACAO&...

Como os dados são obtidos

  • Operações de leitura (search_olt, search_ont, status_summary) retornam o retrato da última sincronização da OLT, feita conforme o cronograma configurado na tela de OLT (de 5 minutos até 6 horas). O campo sync_date indica quando o dado foi coletado. Não é uma consulta viva ao equipamento.
  • Operações de escrita (activation, exclusion, unprovisioned, search_position) conectam de fato na OLT por SSH ou Telnet, usando as credenciais cadastradas (próprias da OLT ou herdadas do padrão do sistema). Hoje elas estão disponíveis somente para OLTs Nokia: em qualquer outra marca a resposta é {"msg":"Service not available for this OLT model"}. Para as demais marcas, use a tela de OLT.
  • Em todas as chamadas, a OLT pode ser identificada por olt (ID numérico) ou name (nome exato cadastrado). Nas operações de provisionamento, use o olt (ID).

Neste módulo os erros de operação chegam com HTTP 200 e o corpo {"msg":"..."}. Trate como sucesso apenas as respostas esperadas de cada operação; qualquer outra mensagem em msg é erro. Só o gateway usa códigos HTTP (400/401/403).

Status calculado da ONT

O resumo de saúde classifica cada ONT com base no limiar de sinal configurado na OLT:

StatusSignificado
onlineONT ativa com sinal dentro do esperado.
signal-alertSinal se aproximando do limiar de alerta da OLT.
low-signalSinal abaixo do limiar configurado.
offlineONT desconectada.
breakRompimento de fibra detectado.
no-dataSem dados de leitura para a ONT.

Operações de consulta

GET /api/api.php?action=olt&operation=search_olt

Lista as OLTs cadastradas, com a opção de incluir todas as ONTs de cada uma.

ParâmetroTipoObrigatórioDescrição
oltintNãoID da OLT. Sem olt e name, retorna todas.
namestringNãoNome exato da OLT (alternativa ao ID).
include_ontsboolNãotrue inclui o array onts com todas as ONTs da última sincronização (padrão: false).

Cada OLT traz id, name, execution_cronogram, ip, brand (V-Solution, Huawei, Fiberhome, ZTE, Ubiquiti, PARKS, NOKIA, Phyhome, C-DATA, Intelbras, Digistar, DATACOM, Cianet) e sync_date. Cada ONT traz, entre outros: slot, pon, ont, interface, nome, desc, mac, ns (serial), rxpower, txpower, oltrx, voltagem, temperatura, distancia, biascurrent, dataconn, reason (motivo da queda), data (data e hora da leitura daquela ONT na última sincronização) e status (código bruto de status da ONT: 0 = rompimento de fibra, 1 = ONT ativa, 2 e 4 = offline). O status calculado usado em status_summary deriva desse código combinado ao nível de sinal (rxpower) frente ao limiar configurado na OLT.

curl
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=olt&operation=search_olt&olt=3&include_onts=true"
resposta
{
  "olts": [
    {
      "id": 3,
      "name": "OLT-CENTRO",
      "execution_cronogram": "Run every 5 minutes",
      "ip": "10.0.0.10",
      "brand": "NOKIA",
      "sync_date": "2026-07-03 10:05:02",
      "onts": [
        { "slot": "1", "pon": "2", "ont": "14", "nome": "cliente-joao", "ns": "ALCL:F0AB12CD",
          "rxpower": "-19.8", "txpower": "2.1", "status": "1", "mac": "AA:BB:CC:DD:EE:FF" }
      ]
    }
  ]
}

Erros: No OLTs found, OLT not found.

GET /api/api.php?action=olt&operation=search_ont

Busca ONTs de uma OLT por MAC, serial ou posição física. Útil para localizar o cliente a partir do dado que o sistema de gestão tem em mãos.

ParâmetroTipoObrigatórioDescrição
olt ou nameint / stringSimOLT alvo (ID ou nome exato).
macstringUm dos trêsMAC da ONT.
nsstringUm dos trêsSerial da ONT.
slotintUm dos trêsSlot da ONT; pode combinar com pon e ont para afunilar.
ponintNãoPON, usado junto com slot.
ontintNãoPosição da ONT, usada junto com slot e pon.
curl
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=olt&operation=search_ont&olt=3&ns=ALCL:F0AB12CD"
resposta
{
  "onts": [
    { "slot": "1", "pon": "2", "ont": "14", "name": "cliente-joao", "description": "Rua A, 123",
      "rx_ont": "-19.8", "tx_ont": "2.1", "rx_olt": "-21.4", "voltage": "3.2", "temperature": "45",
      "distance": "1830", "biascurrent": "9", "status": "1", "sync_date": "2026-07-03 10:05:02", "reason": "" }
  ]
}

Erros: At least one parameter must be provided: 'mac', 'ns', or 'slot', OLT ID or name is required, OLT not found, ONT not found.

GET /api/api.php?action=olt&operation=status_summary

Resumo de saúde da OLT: total de ONTs e contagem por status calculado (tabela acima).

ParâmetroTipoObrigatórioDescrição
olt ou nameint / stringSimOLT alvo (ID ou nome exato).
curl
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=olt&operation=status_summary&olt=3"
resposta
{
  "total_onts": 412,
  "status_counts": {
    "online": 396, "signal-alert": 6, "low-signal": 4,
    "offline": 4, "break": 1, "no-data": 1
  }
}

Erros: OLT ID or name is required, OLT not found.

Operações de provisionamento (somente Nokia)

GET /api/api.php?action=olt&operation=unprovisioned

Consulta a OLT ao vivo, atualiza a lista de ONTs pendentes do sistema e retorna as ONTs aguardando autorização. Primeiro passo do fluxo de provisionamento.

ParâmetroTipoObrigatórioDescrição
oltintSimID da OLT Nokia.
curl
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=olt&operation=unprovisioned&olt=3"
resposta
{
  "msg": "Search completed successfully",
  "ONTs": [
    { "pon": "2", "slot": "1", "serial": "ALCL:F0AB99EE" }
  ]
}

Erros: OLT ID is required, OLT not found, Service not available for this OLT model (marca diferente de Nokia) ou msg contendo Error connecting. IP: ... (falha de conexão com a OLT).

GET /api/api.php?action=olt&operation=search_position

Retorna a próxima posição livre em uma PON. Use para descobrir o valor de ont antes de chamar activation.

ParâmetroTipoObrigatórioDescrição
oltintSimID da OLT Nokia.
slotintSimSlot da PON.
ponintSimNúmero da PON.
curl
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=olt&operation=search_position&olt=3&slot=1&pon=2"
resposta
{ "msg": "Search completed successfully", "position": 15 }

Erros: Missing required parameter: slot, Missing required parameter: pon, OLT ID is required, OLT not found, Service not available for this OLT model (marca diferente de Nokia) ou msg contendo Error connecting. IP: ... (falha de conexão com a OLT).

POST /api/api.php?action=olt&operation=activation

Autoriza (ativa) uma ONT na OLT Nokia, executando o modelo de autorização escolhido, e já cadastra a ONT no monitoramento, removendo-a da lista de pendentes.

ParâmetroTipoObrigatórioDescrição
oltintSimID da OLT Nokia.
serial_numberstringSimSerial da ONT. Sem :, o separador é inserido automaticamente após o 4º caractere (padrão Nokia ALCL:XXXX...).
model_idintSimID do modelo de autorização de ONU cadastrado no catálogo do sistema.
slotintSimSlot da PON.
ponintSimNúmero da PON.
ontintSimPosição da ONT (obtida em search_position).
vlanintSimVLAN de serviço.
descriptionstringSimDescrição da ONT (ex.: nome ou código do cliente).
curl
curl -s -X POST "https://ravi.seuprovedor.com.br/api/api.php" \
  -d "token=CHAVE" -d "action=olt" -d "operation=activation" \
  -d "olt=3" -d "serial_number=ALCLF0AB99EE" -d "model_id=2" \
  -d "slot=1" -d "pon=2" -d "ont=15" -d "vlan=100" \
  -d "description=cliente-maria"
resposta
{ "msg": "ONT activated successfully" }

Erros: Missing required parameter: X, OLT ID is required, OLT not found, Model id N not found, Service not available for this OLT model (marca diferente de Nokia) ou msg contendo Error connecting. IP: ... (falha de SSH: confira credenciais e porta na tela da OLT).

DEL /api/api.php?action=olt&operation=exclusion

Remove a ONT da OLT Nokia e do monitoramento do Ravi.

A exclusão é aplicada no equipamento na hora e derruba o serviço do assinante daquela posição. Confirme slot, PON e posição antes de chamar; não há desfazer pela API.

ParâmetroTipoObrigatórioDescrição
oltintSimID da OLT Nokia.
slotintSimSlot da PON.
ponintSimNúmero da PON.
ontintSimPosição da ONT a remover.
curl
curl -s -X POST "https://ravi.seuprovedor.com.br/api/api.php" \
  -d "token=CHAVE" -d "action=olt" -d "operation=exclusion" \
  -d "olt=3" -d "slot=1" -d "pon=2" -d "ont=15"
resposta
{ "msg": "ONT removed successfully", "log": "..." }

O campo log traz a saída da sessão no equipamento, útil para auditoria. Os erros são os mesmos de activation.

Fluxo recomendado de provisionamento (Nokia)

  1. Chame unprovisioned e anote serial, slot e pon da ONT nova.
  2. Chame search_position com esse slot e pon para obter a posição livre.
  3. Chame activation com o model_id do perfil desejado, a vlan e a description do cliente.
  4. Após a próxima sincronização da OLT, confirme com search_ont (buscando pelo serial em ns).

Exemplo completo da ativação nas três linguagens:

# 1) pendentes  2) posição livre  3) ativação
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=olt&operation=unprovisioned&olt=3"
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=olt&operation=search_position&olt=3&slot=1&pon=2"
curl -s -X POST "https://ravi.seuprovedor.com.br/api/api.php" \
  -d "token=CHAVE" -d "action=olt" -d "operation=activation" \
  -d "olt=3" -d "serial_number=ALCL:F0AB99EE" -d "model_id=2" \
  -d "slot=1" -d "pon=2" -d "ont=15" -d "vlan=100" -d "description=cliente-maria"
<?php
$base  = 'https://ravi.seuprovedor.com.br/api/api.php';
$token = 'CHAVE';

function ravi(array $params) {
    global $base, $token;
    $ch = curl_init($base);
    curl_setopt_array($ch, [
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => http_build_query(['token' => $token] + $params),
        CURLOPT_RETURNTRANSFER => true,
    ]);
    $out = json_decode(curl_exec($ch), true);
    curl_close($ch);
    return $out;
}

$pend = ravi(['action' => 'olt', 'operation' => 'unprovisioned', 'olt' => 3]);
$ont  = $pend['ONTs'][0];

$pos = ravi(['action' => 'olt', 'operation' => 'search_position',
             'olt' => 3, 'slot' => $ont['slot'], 'pon' => $ont['pon']]);

$res = ravi(['action' => 'olt', 'operation' => 'activation', 'olt' => 3,
             'serial_number' => $ont['serial'], 'model_id' => 2,
             'slot' => $ont['slot'], 'pon' => $ont['pon'], 'ont' => $pos['position'],
             'vlan' => 100, 'description' => 'cliente-maria']);

if (($res['msg'] ?? '') !== 'ONT activated successfully') {
    throw new RuntimeException('Falha na ativação: ' . ($res['msg'] ?? '?'));
}
import requests

BASE  = "https://ravi.seuprovedor.com.br/api/api.php"
TOKEN = "CHAVE"

def ravi(**params):
    r = requests.post(BASE, data={"token": TOKEN, **params}, timeout=60)
    return r.json()

pend = ravi(action="olt", operation="unprovisioned", olt=3)
ont  = pend["ONTs"][0]

pos = ravi(action="olt", operation="search_position",
           olt=3, slot=ont["slot"], pon=ont["pon"])

res = ravi(action="olt", operation="activation", olt=3,
           serial_number=ont["serial"], model_id=2,
           slot=ont["slot"], pon=ont["pon"], ont=pos["position"],
           vlan=100, description="cliente-maria")

if res.get("msg") != "ONT activated successfully":
    raise RuntimeError(f"Falha na ativação: {res.get('msg')}")

As ativações e exclusões de ONT feitas pela API ficam registradas no Histórico de ações do sistema, o que facilita auditar o que cada integração executou.


API de Concentradora

A área action=concentradora é de somente leitura: lista concentradoras PPPoE ativas, detalha configuração, consulta sessões (usuários online e offline), histórico de conexões por usuário e estatísticas gerais. Exige uma chave de API com a permissão Acesso a Concentradoras marcada.

Os dados vêm da última sincronização da concentradora (mesmo raciocínio da OLT): o campo ultima_sincronizacao indica quando o retrato foi tirado. Só concentradoras cadastradas e habilitadas aparecem nas respostas.

Diferente dos módulos de OLT, DNS e WhatsApp, este módulo usa códigos HTTP de verdade e um envelope próprio: sucesso vem como {"success":true,"data":...} e erro como {"success":false,"error":"..."} com HTTP 400 ou 404. Falhas internas (por exemplo, banco de dados indisponível) respondem HTTP 500 com o mesmo envelope {"success":false,"error":"..."}. As mensagens de erro saem no idioma configurado no sistema.

Status da concentradora

statusstatus_descricao
1Crítico
2Normal
3Aviso
4Manutenção
5Desconhecido
6OK

Para os usuários PPPoE, o status é sempre online ou offline.

Operações

GET /api/api.php?action=concentradora&operation=list

Lista todas as concentradoras ativas. Sem parâmetros extras.

Campos por concentradora: id, nome, ip, marca, tipo, status, status_descricao, ultima_sincronizacao, tempo_sincronizacao, alerta_pppoe_ativo, ping_ativo, dias_offline, cron_ativo, dados_historicos_ativo, alerta_linkdown_ativo, usuarios_online, total_usuarios.

curl
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=concentradora&operation=list"
resposta
{
  "success": true,
  "data": [
    { "id": 1, "nome": "BNG-01", "ip": "10.0.0.1", "marca": "Mikrotik", "tipo": "PPPoE",
      "status": 2, "status_descricao": "Normal", "ultima_sincronizacao": "2026-07-03 10:04:00",
      "usuarios_online": 388, "total_usuarios": 512 }
  ]
}
GET /api/api.php?action=concentradora&operation=get

Detalha uma concentradora: tudo do list mais a configuração SNMP (herdar_pai, snmp, versao_snmp, porta_snmp), tamanho_pacotes, quantidade_pacotes e historico_trafego_ativo. O detalhe também inclui o campo ativo (sempre true, pois apenas concentradoras habilitadas são retornadas pela API).

ParâmetroTipoObrigatórioDescrição
idintSimID da concentradora.
curl
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=concentradora&operation=get&id=1"

Erros: ID da concentradora não fornecido (HTTP 400), Concentradora não encontrada (HTTP 404).

GET /api/api.php?action=concentradora&operation=get_users

Retorna as sessões PPPoE da concentradora, com filtro opcional por status.

ParâmetroTipoObrigatórioDescrição
idintSimID da concentradora.
statusstringNãoonline, offline ou all (padrão: all).

Por usuário: username, ip, vlan, status, data_desconexao (só para offline), download_bytes, upload_bytes, ping_ms, jitter_ms, packet_loss.

Os campos ping_ms, jitter_ms e packet_loss são retornados como texto (ex.: "15.2") ou null quando não há medição, caso comum em usuários offline. O campo tempo_sincronizacao também é texto (ex.: "0.523"). Já download_bytes e upload_bytes são numéricos.

curl
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=concentradora&operation=get_users&id=1&status=online"
resposta
{
  "success": true,
  "data": [
    { "username": "joao.silva", "ip": "100.64.1.23", "vlan": "110", "status": "online",
      "download_bytes": 5382190342, "upload_bytes": 812009344,
      "ping_ms": "8.2", "jitter_ms": "1.1", "packet_loss": "0" }
  ]
}

Se a concentradora nunca sincronizou, a resposta é sucesso com data vazio.

GET /api/api.php?action=concentradora&operation=get_user_details

Detalha um usuário PPPoE específico: tudo do get_users mais concentradora_id, concentradora_nome, linkdown_count (número de sessões registradas, ou seja, reconexões) e historico_ping, que hoje retorna sempre uma lista vazia.

ParâmetroTipoObrigatórioDescrição
usernamestringSimLogin PPPoE do usuário.
concentradora_idintSimID da concentradora.
curl
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=concentradora&operation=get_user_details&username=joao.silva&concentradora_id=1"

Erros: Username e concentradora_id são obrigatórios (400), Concentradora não encontrada (404), Dados da concentradora não encontrados (sem sincronização), Usuário não encontrado (404).

GET /api/api.php?action=concentradora&operation=get_user_history

Histórico de sessões do usuário, das mais recentes para as mais antigas: data_conexao, data_desconexao, duracao (texto "N dias, HH:MM:SS"), duracao_segundos, ip, vlan, download_bytes, upload_bytes.

ParâmetroTipoObrigatórioDescrição
usernamestringSimLogin PPPoE do usuário.
concentradora_idintSimID da concentradora.
curl
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=concentradora&operation=get_user_history&username=joao.silva&concentradora_id=1"

Os campos download_bytes e upload_bytes são acumulados em bytes (não bits) por sessão. Para estimar taxa de transferência, compare duas leituras e divida a diferença pelo intervalo entre sincronizações.

GET /api/api.php?action=concentradora&operation=get_user_traffic

Mantida apenas por compatibilidade: retorna sempre data vazio com a mensagem "Dados de tráfego granular não disponíveis. Use get_user_history para obter tráfego por sessão.". Use get_user_history para obter o tráfego por sessão.

Mesmo sendo apenas de compatibilidade, a operação ainda exige username e concentradora_id; sem eles responde HTTP 400 com o erro Username e concentradora_id são obrigatórios.

GET /api/api.php?action=concentradora&operation=search

Busca concentradoras por nome ou IP (busca parcial).

ParâmetroTipoObrigatórioDescrição
querystringSimTrecho do nome ou do IP.
curl
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=concentradora&operation=search&query=BNG"

Cada resultado traz um conjunto reduzido em relação ao list: id, nome, ip, marca, tipo, status, status_descricao, ultima_sincronizacao, tempo_sincronizacao e usuarios_online. Não retorna total_usuarios nem os campos de configuração de alertas; para o detalhe completo, use o get com o id retornado.

Erro: Query de busca não fornecida (400).

GET /api/api.php?action=concentradora&operation=statistics

Visão geral do ambiente PPPoE. Sem parâmetros.

curl
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=concentradora&operation=statistics"
resposta
{
  "success": true,
  "data": {
    "total_concentradoras": 4,
    "concentradoras_por_status": [
      { "status": 2, "status_descricao": "Normal", "total": 3 },
      { "status": 3, "status_descricao": "Aviso", "total": 1 }
    ],
    "total_usuarios_pppoe": 2048,
    "usuarios_online": 1874,
    "usuarios_offline": 174,
    "top_concentradoras": [ { "id": 1, "nome": "BNG-01", "ip": "10.0.0.1", "usuarios_online": 388 } ]
  }
}

Exemplos de uso

Listagem de concentradoras e consulta dos usuários online nas três linguagens:

# 1) lista as concentradoras  2) usuários online da concentradora 1
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=concentradora&operation=list"
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=concentradora&operation=get_users&id=1&status=online"
<?php
$url = 'https://ravi.seuprovedor.com.br/api/api.php'
     . '?token=CHAVE&action=concentradora&operation=list';

$r = json_decode(file_get_contents($url), true);

if ($r['success']) {
    foreach ($r['data'] as $c) {
        echo $c['nome'] . ': ' . $c['usuarios_online'] . " online\n";
    }
}
import requests

r = requests.get("https://ravi.seuprovedor.com.br/api/api.php",
                 params={"token": "CHAVE", "action": "concentradora",
                         "operation": "get_users", "id": 1, "status": "online"},
                 timeout=60)
data = r.json()

if data["success"]:
    for u in data["data"]:
        print(u["username"], u["ip"], u["ping_ms"])

Não há paginação: get_users de uma concentradora grande pode retornar uma resposta extensa. Filtre por status quando possível e evite polling mais frequente que o ciclo de sincronização, pois o dado só muda a cada ciclo.


API de WhatsApp

A área action=whatsapp envia mensagens pelo número de WhatsApp pareado no Ravi (o mesmo usado pelos alertas do sistema) e consulta o status da conexão. Uso típico: os sistemas do provedor disparam avisos por um único número já conectado, sem manter outra integração de WhatsApp. Exige uma chave de API com a permissão Acesso a WhatsApp marcada.

Pré-requisitos

  • Integração de WhatsApp ativada nas Configurações do sistema. Se estiver desligada, toda chamada responde {"msg":"WhatsApp API is disabled"}.
  • Número pareado por QR code em Configurações, aba Integrações. Sem sessão pareada, a resposta é {"msg":"No client connected"}.
POST /api/api.php?action=whatsapp&operation=send

Envia uma mensagem de texto para um ou mais destinatários.

ParâmetroTipoObrigatórioDescrição
messagestringSimTexto da mensagem. Alias aceito: msg.
contactsstringSimDestinatário(s), separados por vírgula. Número puro (ex.: 5531999999999) recebe o sufixo de contato individual automaticamente; o JID individual completo (ex.: 5531999999999@s.whatsapp.net) também é aceito; para grupos, informe o JID terminando em @g.us. Valores que já contêm @ são usados exatamente como enviados.

Informe cada número completo, com código do país e DDD, apenas dígitos (ex.: 5531999999999 para um número do Brasil). A API não valida o formato: número incompleto ou com sinais vira um destinatário inexistente no WhatsApp.

curl
curl -s -X POST "https://ravi.seuprovedor.com.br/api/api.php" \
  -d "token=CHAVE" -d "action=whatsapp" -d "operation=send" \
  -d "contacts=5531988887777,5531977776666" \
  -d "message=Backup concluído com sucesso"
resposta
{ "msg": "ok" }

Possíveis respostas:

RespostaSignificado
{"msg":"ok"}Todas as mensagens foram enviadas.
{"msg":"Sending error","error":{"partial_success":true,"sent":X,"total":Y},...}Envio parcial: parte dos destinatários recebeu. Trate este caso na integração.
{"msg":"Message sending failed","debug_output":...}Nenhuma mensagem enviada.
{"msg":"No client connected"}WhatsApp não pareado ou serviço fora do ar.
{"msg":"WhatsApp API is disabled"}Integração desligada nas Configurações.

Erros de validação: Message cannot be empty, Please provide contacts, No valid contacts provided. Todos chegam com HTTP 200: verifique o campo msg.

O envio usa o mesmo número pareado que dispara os alertas do próprio Ravi. Respeite os limites de envio do WhatsApp: disparos em massa ou fora dos padrões da plataforma podem levar ao bloqueio do número, o que também interrompe os alertas do sistema.

GET /api/api.php?action=whatsapp&operation=status

Consulta o status da integração. Bom health-check antes de disparar um lote de mensagens.

curl
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=whatsapp&operation=status"
resposta
{
  "status": {
    "system_enabled": true,
    "service_connected": true,
    "connection_status": "connected"
  }
}

system_enabled indica a flag ligada nas Configurações; service_connected indica se a sessão do WhatsApp está realmente conectada (consulta viva ao serviço). connection_status assume apenas dois valores, connected ou disconnected, espelhando o booleano service_connected: para decidir programaticamente, prefira testar service_connected.

Exemplo prático: avisar o NOC com verificação prévia

# confere a conexão e envia
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=whatsapp&operation=status"
curl -s -X POST "https://ravi.seuprovedor.com.br/api/api.php" \
  -d "token=CHAVE" -d "action=whatsapp" -d "operation=send" \
  -d "contacts=5531988887777" -d "message=Janela de manutenção iniciada"
<?php
$base  = 'https://ravi.seuprovedor.com.br/api/api.php';
$token = 'CHAVE';

function ravi(array $params) {
    global $base, $token;
    $ch = curl_init($base);
    curl_setopt_array($ch, [
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => http_build_query(['token' => $token] + $params),
        CURLOPT_RETURNTRANSFER => true,
    ]);
    $out = json_decode(curl_exec($ch), true);
    curl_close($ch);
    return $out;
}

$st = ravi(['action' => 'whatsapp', 'operation' => 'status']);
if (empty($st['status']['service_connected'])) {
    throw new RuntimeException('WhatsApp não conectado');
}

$res = ravi(['action' => 'whatsapp', 'operation' => 'send',
             'contacts' => '5531988887777',
             'message'  => 'Janela de manutenção iniciada']);

if (($res['msg'] ?? '') !== 'ok') {
    throw new RuntimeException('Falha no envio: ' . ($res['msg'] ?? '?'));
}
import requests

BASE  = "https://ravi.seuprovedor.com.br/api/api.php"
TOKEN = "CHAVE"

def ravi(**params):
    r = requests.post(BASE, data={"token": TOKEN, **params}, timeout=60)
    return r.json()

st = ravi(action="whatsapp", operation="status")
if not st.get("status", {}).get("service_connected"):
    raise RuntimeError("WhatsApp não conectado")

res = ravi(action="whatsapp", operation="send",
           contacts="5531988887777",
           message="Janela de manutenção iniciada")

if res.get("msg") != "ok":
    raise RuntimeError(f"Falha no envio: {res.get('msg')}")

Se as chamadas passarem a responder No client connected, refaça o pareamento do número por QR code em Configurações, aba Integrações.