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):
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 camposync_dateindica 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) ouname(nome exato cadastrado). Nas operações de provisionamento, use oolt(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:
| Status | Significado |
|---|---|
online | ONT ativa com sinal dentro do esperado. |
signal-alert | Sinal se aproximando do limiar de alerta da OLT. |
low-signal | Sinal abaixo do limiar configurado. |
offline | ONT desconectada. |
break | Rompimento de fibra detectado. |
no-data | Sem dados de leitura para a ONT. |
Operações de consulta
/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âmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
olt | int | Não | ID da OLT. Sem olt e name, retorna todas. |
name | string | Não | Nome exato da OLT (alternativa ao ID). |
include_onts | bool | Não | true 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 -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=olt&operation=search_olt&olt=3&include_onts=true"
{
"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.
/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âmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
olt ou name | int / string | Sim | OLT alvo (ID ou nome exato). |
mac | string | Um dos três | MAC da ONT. |
ns | string | Um dos três | Serial da ONT. |
slot | int | Um dos três | Slot da ONT; pode combinar com pon e ont para afunilar. |
pon | int | Não | PON, usado junto com slot. |
ont | int | Não | Posição da ONT, usada junto com slot e pon. |
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=olt&operation=search_ont&olt=3&ns=ALCL:F0AB12CD"
{
"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.
/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âmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
olt ou name | int / string | Sim | OLT alvo (ID ou nome exato). |
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=olt&operation=status_summary&olt=3"
{
"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)
/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âmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
olt | int | Sim | ID da OLT Nokia. |
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=olt&operation=unprovisioned&olt=3"
{
"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).
/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âmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
olt | int | Sim | ID da OLT Nokia. |
slot | int | Sim | Slot da PON. |
pon | int | Sim | Número da PON. |
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=olt&operation=search_position&olt=3&slot=1&pon=2"
{ "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).
/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âmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
olt | int | Sim | ID da OLT Nokia. |
serial_number | string | Sim | Serial da ONT. Sem :, o separador é inserido automaticamente após o 4º caractere (padrão Nokia ALCL:XXXX...). |
model_id | int | Sim | ID do modelo de autorização de ONU cadastrado no catálogo do sistema. |
slot | int | Sim | Slot da PON. |
pon | int | Sim | Número da PON. |
ont | int | Sim | Posição da ONT (obtida em search_position). |
vlan | int | Sim | VLAN de serviço. |
description | string | Sim | Descrição da ONT (ex.: nome ou código do cliente). |
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"
{ "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).
/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âmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
olt | int | Sim | ID da OLT Nokia. |
slot | int | Sim | Slot da PON. |
pon | int | Sim | Número da PON. |
ont | int | Sim | Posição da ONT a remover. |
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"
{ "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)
- Chame
unprovisionede anoteserial,sloteponda ONT nova. - Chame
search_positioncom essesloteponpara obter a posição livre. - Chame
activationcom omodel_iddo perfil desejado, avlane adescriptiondo cliente. - Após a próxima sincronização da OLT, confirme com
search_ont(buscando pelo serial emns).
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
status | status_descricao |
|---|---|
| 1 | Crítico |
| 2 | Normal |
| 3 | Aviso |
| 4 | Manutenção |
| 5 | Desconhecido |
| 6 | OK |
Para os usuários PPPoE, o status é sempre online ou offline.
Operações
/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 -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=concentradora&operation=list"
{
"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 }
]
}/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âmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id | int | Sim | ID da concentradora. |
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).
/api/api.php?action=concentradora&operation=get_users
Retorna as sessões PPPoE da concentradora, com filtro opcional por status.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
id | int | Sim | ID da concentradora. |
status | string | Não | online, 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 -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=concentradora&operation=get_users&id=1&status=online"
{
"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.
/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âmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
username | string | Sim | Login PPPoE do usuário. |
concentradora_id | int | Sim | ID da concentradora. |
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).
/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âmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
username | string | Sim | Login PPPoE do usuário. |
concentradora_id | int | Sim | ID da concentradora. |
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.
/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.
/api/api.php?action=concentradora&operation=search
Busca concentradoras por nome ou IP (busca parcial).
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
query | string | Sim | Trecho do nome ou do IP. |
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).
/api/api.php?action=concentradora&operation=statistics
Visão geral do ambiente PPPoE. Sem parâmetros.
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=concentradora&operation=statistics"
{
"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"}.
/api/api.php?action=whatsapp&operation=send
Envia uma mensagem de texto para um ou mais destinatários.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
message | string | Sim | Texto da mensagem. Alias aceito: msg. |
contacts | string | Sim | Destinatá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 -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"
{ "msg": "ok" }Possíveis respostas:
| Resposta | Significado |
|---|---|
{"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.
/api/api.php?action=whatsapp&operation=status
Consulta o status da integração. Bom health-check antes de disparar um lote de mensagens.
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=CHAVE&action=whatsapp&operation=status"
{
"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.