API pública do Ravi Monitor
Integre o Ravi Monitor 7.2 aos sistemas do seu provedor: crie chaves de API com permissões por área, autentique as chamadas e consuma respostas JSON a partir de qualquer linguagem.
Visão geral
A API pública permite que sistemas externos do provedor (ERP, CRM, scripts de automação, painéis próprios, sistemas de provisionamento) consultem e operem o Ravi Monitor sem abrir a interface web. Casos de uso típicos:
- Provisionar e excluir ONTs na OLT a partir do sistema de gestão do provedor.
- Consultar status de grupos, dispositivos e sensores monitorados, e também criar, editar e excluir esses itens por API. Novo na 7.2
- Consultar sessões PPPoE das concentradoras: usuário online, histórico e tráfego.
- Gerenciar domínios e registros do DNS autoritativo.
- Enviar mensagens de WhatsApp pelo número pareado no Ravi.
- Acompanhar e gerenciar o ambiente Flow (anti-DDoS) por integração externa: tráfego ao vivo, eventos, mitigação, whitelist e mais. Novo na 7.2
Toda a API funciona sobre um endpoint único, com autenticação por chaves de API criadas na própria interface. Cada chave tem permissões independentes por área do sistema: OLT, Dispositivos, Concentradoras, DNS, WhatsApp e Flow.
Como as chamadas se organizam
Toda requisição informa dois parâmetros de roteamento, além do token:
| Parâmetro | O que é | Exemplos |
|---|---|---|
action | A área do sistema que será acessada. | olt, dispositivo, concentradora, dns, whatsapp, flow |
operation | A operação dentro da área. | list_groups, overview, send |
Resumo das áreas disponíveis (cada uma tem sua página nesta documentação):
action | Permissão na chave | O que cobre |
|---|---|---|
olt | Acesso a OLTs | Ativação, exclusão e consulta de ONTs, busca por posição e resumo de status. |
dispositivo | Acesso a Dispositivos | CRUD completo de grupos, dispositivos e sensores, descoberta SNMP, catálogo e topologia. |
concentradora | Acesso a Concentradoras | Sessões PPPoE: listagem, detalhes, histórico, tráfego e estatísticas. |
dns | Acesso a DNS | Domínios e registros do DNS autoritativo, consulta do recursivo. |
whatsapp | Acesso a WhatsApp | Envio de mensagens e status do pareamento. |
flow | Acesso a Flow Novo na 7.2 | Cerca de 36 operações de monitoramento e gestão do anti-DDoS. |
API atual e webservice legado
Instalações antigas podem ter integrações apontando para o webservice legado (/webservice/*.php), que autentica com usuário e senha de um login web passados na URL. Esse mecanismo é mantido apenas por compatibilidade. Toda integração nova deve usar a API descrita aqui, em /api/api.php, com chave de API e permissões por área.
O webservice legado envia usuário e senha em texto na URL. Só isso já é motivo para migrar as integrações antigas para a API atual.
Criar uma chave de API Somente Master
A chave de API é uma string aleatória de 32 caracteres alfanuméricos, gerada automaticamente pelo sistema e armazenada criptografada. Ela é a única credencial da API: não há usuário, senha nem sessão. Criar, alterar e excluir chaves exige estar logado com a conta Master.
Passo a passo
- No menu superior, clique no ícone de engrenagem para abrir Configurações.
- Abra a aba Integrações e localize o card Gerenciamento de API.
- Clique em Nova Chave API. Se ainda não existir nenhuma chave, o card mostra o estado vazio Nenhuma chave API configurada com o mesmo botão.
- Na modal Gerenciamento de Chave API, o campo Chave API já vem preenchido com a chave gerada. Clique em Copiar e guarde a chave em um local seguro agora.
- Preencha Descrição (opcional) com o nome da integração (por exemplo, "Integração ERP" ou "Painel NOC"). Depois que a chave for mascarada, a descrição é a única forma de identificá-la.
- Em Permissões de Acesso, marque as áreas que a integração vai usar. É obrigatório marcar pelo menos uma; caso contrário o formulário exibe o aviso "Por favor, selecione pelo menos uma permissão de acesso." e não envia.
- Clique em Criar Chave API. A tela volta para a aba Integrações com a mensagem API criada com sucesso, e a chave aparece na lista do card com um cronômetro regressivo de 2 horas.
Permissões por área
As seis caixas de permissão aparecem nesta ordem na modal:
| # | Permissão | Libera |
|---|---|---|
| 1 | Acesso a OLTs | action=olt |
| 2 | Acesso a Dispositivos | action=dispositivo |
| 3 | Acesso a Concentradoras | action=concentradora |
| 4 | Acesso a DNS | action=dns |
| 5 | Acesso a WhatsApp | action=whatsapp |
| 6 | Acesso a Flow Novo na 7.2 | action=flow |
Na versão atual, o rótulo do 2º checkbox aparece como "Acesso a Concentradoras", igual ao 3º. Vale a ordem da lista acima: o 2º da grade libera Dispositivos e o 3º libera Concentradoras.
Aplique o princípio do menor privilégio: marque apenas as áreas que a integração realmente usa. A linha Selecionar todas é útil só para testes.
Janela de cópia de 2 horas
A chave fica visível e copiável por até 2 horas após a criação. Passado esse prazo, ela aparece mascarada na lista (apenas os 4 últimos caracteres) e o botão de copiar é desabilitado. Importante: a chave continua válida para sempre; o que expira é somente a visualização. Se você não copiou a chave a tempo, não existe forma de recuperá-la: exclua e crie outra.
Alterar uma chave
Na lista do card, cada chave tem os botões Alterar e Excluir. O botão Alterar reabre a modal com o título Alterar Chave API, onde é possível mudar a descrição e as permissões, confirmando em Atualizar Chave API.
Só use Alterar nas 2 primeiras horas de vida da chave. Depois desse prazo a modal mostra a chave mascarada e, ao salvar, o valor mascarado é gravado como nova chave: a chave original para de funcionar e as integrações passam a receber Invalid token. Para mudar permissões de uma chave antiga, o caminho seguro é excluí-la e criar outra, atualizando o token na integração.
Excluir (revogar) uma chave
- Na lista do card Gerenciamento de API, clique em Excluir na linha da chave.
- Confirme no diálogo Excluir API ("Tem certeza que deseja excluir esta chave API?").
- A chave é removida na hora, com a mensagem API excluída com sucesso!. A revogação é imediata: a próxima chamada com essa chave recebe HTTP 401
Invalid token.
Boa prática: crie uma chave por integração, sempre com a descrição preenchida. Assim você consegue revogar uma integração específica sem derrubar as demais.
Autenticação
Todas as chamadas vão para um único endpoint no seu servidor Ravi:
https://<SEU-SERVIDOR-RAVI>/api/api.php
A autenticação é feita exclusivamente pelo parâmetro token, enviado junto com os demais parâmetros da chamada. Não é um header HTTP: mesmo que o cliente envie Authorization, ele não é lido. Os métodos aceitos são GET e POST (form-urlencoded), e todos os parâmetros funcionam nos dois. Evite enviar o mesmo parâmetro por GET e POST na mesma chamada: a precedência varia conforme a área.
Parâmetros obrigatórios em toda chamada:
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
token | string | Sim | A chave de API de 32 caracteres criada na interface. |
action | string | Sim | A área: olt, dispositivo, concentradora, dns, whatsapp ou flow (singular, minúsculas, exatamente assim). |
operation | string | Sim | A operação dentro da área. Cada área tem sua lista, documentada na página correspondente. |
Não há sessão, cookie nem login: cada chamada é independente e autossuficiente. Também não há usuário associado à chave; a chave dá acesso direto às áreas liberadas.
Prefira POST + HTTPS em produção. Com GET, o token fica gravado em logs de acesso do servidor web, em proxies e no histórico do navegador. Ative o HTTPS na aba Certificado SSL das Configurações. Em caso de vazamento do token, exclua a chave e crie outra.
Primeira chamada: exemplo mínimo completo
O exemplo abaixo lista os grupos de dispositivos (requer a permissão Acesso a Dispositivos na chave). Troque a URL e o token pelos seus.
# POST com form-urlencoded (recomendado em produção)
curl -s -X POST "https://ravi.seuprovedor.com.br/api/api.php" \
-d "token=aB3xK9mP2qR7sT1vW5yZ8cD4fG6hJ0kL" \
-d "action=dispositivo" \
-d "operation=list_groups"<?php $url = 'https://ravi.seuprovedor.com.br/api/api.php'; $dados = [ 'token' => 'aB3xK9mP2qR7sT1vW5yZ8cD4fG6hJ0kL', 'action' => 'dispositivo', 'operation' => 'list_groups', ]; $ch = curl_init($url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($dados)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $corpo = curl_exec($ch); $codigo = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); $resposta = json_decode($corpo, true); // Trate como erro: HTTP >= 400 OU corpo com "msg" / "status":"error" / "success":false if ($codigo >= 400 || isset($resposta['msg']) || ($resposta['status'] ?? '') === 'error' || ($resposta['success'] ?? true) === false) { die('Erro na API: ' . $corpo); } print_r($resposta['groups']);
import requests URL = "https://ravi.seuprovedor.com.br/api/api.php" TOKEN = "aB3xK9mP2qR7sT1vW5yZ8cD4fG6hJ0kL" r = requests.post(URL, data={ "token": TOKEN, "action": "dispositivo", "operation": "list_groups", }, timeout=30) corpo = r.json() # Trate como erro: HTTP >= 400 OU corpo com "msg" / "status":"error" / "success":false if r.status_code >= 400 or "msg" in corpo or corpo.get("status") == "error" or corpo.get("success") is False: raise RuntimeError(f"Erro na API: {r.text}") print(corpo["groups"])
Resposta esperada (a permissão está correta e existem grupos cadastrados):
{"groups":[{"id":1,"name":"Backbone","parent_id":0}, ...]}O mesmo padrão vale para qualquer área. Por exemplo, um resumo do ambiente Flow (permissão Acesso a Flow):
curl -s -X POST "https://ravi.seuprovedor.com.br/api/api.php" \
-d "token=aB3xK9mP2qR7sT1vW5yZ8cD4fG6hJ0kL" \
-d "action=flow" \
-d "operation=overview"
# → {"status":"success","data":{"collector_online":true,"flows_per_sec":..., "events_active":0, ...}}Ordem de validação do gateway
Toda chamada passa pelas validações abaixo, nesta ordem, antes de chegar à área pedida:
tokenausente: HTTP 400 com{"status":"error","message":"Token not provided"}.actionausente: HTTP 400 com{"status":"error","message":"Action not provided"}.- Token não corresponde a nenhuma chave cadastrada: HTTP 401 com
Invalid token. - Chave válida mas sem a permissão da área: HTTP 403 com
Access denied for <area>(por exemplo,Access denied for flow). actionfora da lista de áreas: HTTP 400 comInvalid action.- Tudo certo: a área valida a
operatione seus parâmetros próprios e responde.
O endpoint responde com CORS aberto, então tecnicamente dá para chamá-lo direto de uma página web. Evite: isso exporia o token no navegador de qualquer visitante. Chame a API sempre a partir do seu backend.
Teste de conectividade
Antes de integrar uma área específica, você pode validar de uma vez o endereço do servidor e a validade do token com a ação ping (a ação status é um apelido equivalente). Ela não exige operation nem permissão de área: basta um token válido.
curl -s "https://ravi.seuprovedor.com.br/api/api.php?action=ping&token=SEU_TOKEN"
{"status":"success","data":{"status":"online","versao":"2.0","servidor":"Ravi Monitor"}}Uma resposta com "status":"success" confirma que o servidor está no ar e que o token é válido. Token ausente ou inválido cai nas mesmas respostas de erro do gateway (Token not provided, Invalid token). Use o ping como primeiro passo de qualquer integração e como monitor de saúde da API.
Formato das respostas
Toda resposta vem com Content-Type: application/json; charset=utf-8. Erros internos do servidor nunca vazam para o corpo da resposta; eles vão para o log do servidor, preservando o JSON.
Os erros do gateway (token, permissão, área) sempre usam o envelope {"status":"error","message":"..."}. Já o corpo de sucesso varia conforme a área, por herança de gerações diferentes da API. A página de cada área mostra o formato real; o resumo é este:
Área (action) | Sucesso | Erro de operação |
|---|---|---|
flow | {"status":"success","data":{...}} em todas as operações | {"status":"error","message":"..."} com HTTP 4xx/5xx |
concentradora | {"success":true,"data":[...]} | {"success":false,"error":"..."} com HTTP 400/404 |
dispositivo | varia por operação: objeto direto ({"groups":[...]}, {"devices":[...]}, {"sensors":[...]}...), {"msg":"ok", ...} nas criações e {"status":"success", ...} nas operações mais novas | {"msg":"..."} ou {"status":"error","message":"..."}, em geral com HTTP 200 |
olt | objeto direto por operação | {"msg":"..."} com HTTP 200 |
dns | objeto direto por operação | {"msg":"..."} com HTTP 200 |
whatsapp | {"msg":"ok"} no envio; {"status":{...}} na consulta de status | {"msg":"..."} com HTTP 200 |
Regra prática para o integrador: trate como erro qualquer HTTP maior ou igual a 400 e qualquer corpo com "status":"error" ou "success":false. Não confie apenas no código HTTP: as áreas mais antigas respondem 200 com {"msg":"..."} tanto quando a operação falha quanto em alguns sucessos (por exemplo, {"msg":"ok"}); nessas áreas, compare o valor de msg com a mensagem de sucesso esperada da operação, indicada na página de cada área.
Mensagens de erro comuns
As mensagens de erro do gateway vêm em inglês no corpo da resposta:
| Mensagem | HTTP | Causa |
|---|---|---|
Token not provided | 400 | Faltou o parâmetro token. |
Action not provided | 400 | Faltou o parâmetro action. |
Invalid token | 401 | Chave inexistente, revogada ou regravada (veja o aviso sobre editar chaves com mais de 2 horas). |
Access denied for <area> | 403 | A chave existe, mas a permissão daquela área não foi marcada. |
Invalid action | 400 | action fora de olt/dispositivo/concentradora/dns/whatsapp/flow. |
Please provide a valid operation | 200 (olt, dns, whatsapp, dispositivo) ou 400 (flow, concentradora) | Faltou o parâmetro operation. |
Invalid OLT operation / Invalid device operation / Invalid DNS operation / Invalid WhatsApp operation | 200 | operation desconhecida na área. |
Invalid Flow operation | 400 | operation desconhecida na área Flow. |
Operação inválida. Operações disponíveis: list, get, ... | 400 | operation desconhecida na concentradora (esta mensagem vem no idioma do sistema). |
Database connection error | 500 ou 200 | Problema no banco de dados do servidor Ravi. |
Database error | 200 (olt, dns, whatsapp, dispositivo) ou 500 (flow) | Falha de consulta no banco de dados do servidor Ravi durante a operação. Nas áreas legadas chega no envelope {"msg":"Database error: ..."}, podendo trazer detalhes após os dois-pontos; na área flow chega como {"status":"error","message":"Database error"}. |
Limites e boas práticas
O que você precisa saber sobre limites da API:
- Controle de carga: dimensione a integração com moderação: evite paralelismo alto e polling agressivo, e aplique backoff em caso de erro. Consultas ao vivo acompanham bem intervalos de 5 a 10 segundos.
- Evite polling agressivo: para dados "ao vivo" do Flow, intervalos de 5 a 10 segundos já acompanham a atualização do coletor; faça backoff em caso de erro.
- Configure o timeout do cliente com folga: algumas operações demoram porque conversam com equipamentos reais. As operações de OLT, por exemplo, abrem sessão SSH ou Telnet com o equipamento antes de responder. Use 60 segundos ou mais para operações de OLT (30 segundos atendem as consultas comuns) e trate o estouro de tempo na integração em vez de repetir a chamada às cegas.
- Sem expiração de chave: a chave vale até ser excluída. A janela de 2 horas se aplica apenas à visualização e cópia na tela.
- Sem limite de quantidade de chaves: crie quantas precisar. Ainda assim, mantenha poucas chaves e apague as sem uso: cada chamada valida o token contra todas as chaves cadastradas, e menos chaves também facilitam a auditoria.
- Recursos dependem do servidor: a API não substitui a configuração dos recursos na tela. Por exemplo,
action=flowpressupõe o ambiente Flow configurado e rodando (que depende de plano elegível), eaction=whatsapppressupõe o WhatsApp pareado. Se o Flow responde comcollector_online:falseou dados vazios, o ambiente não está ativo naquele servidor.
Checklist de segurança
- Uma chave por integração, com Descrição (opcional) sempre preenchida: é o único jeito de identificar a chave depois que ela é mascarada.
- Menor privilégio: marque só as áreas que a integração usa. Selecionar todas apenas para testes.
- Copie a chave e guarde em um cofre de senhas no momento da criação (janela de 2 horas).
- Use HTTPS e POST; nunca embuta a chave em uma página web pública.
- Revogue (botão Excluir) as chaves de integrações desativadas; a revogação vale já na chamada seguinte.
- Rotacione as chaves periodicamente. Como a chave não expira, a rotação é manual: crie uma chave nova, atualize o token na integração e exclua a antiga.
- Não use Alterar em chaves com mais de 2 horas (nem para a rotação); exclua e recrie.
Problemas frequentes
| Sintoma | Causa provável e solução |
|---|---|
Invalid token em uma integração que funcionava | Alguém abriu Alterar em uma chave com mais de 2 horas e salvou, regravando a chave com o valor mascarado. Exclua a chave, crie uma nova e atualize a integração. |
Invalid token logo na primeira chamada da integração | Espaços ou quebras de linha colados junto com a chave. O token é comparado exatamente como foi enviado, sem limpeza automática; um espaço a mais já derruba a autenticação. Cole a chave de novo, sem caracteres extras. |
HTTP 403 Access denied for <area> | A chave não tem a permissão daquela área. Edite a chave (se tiver menos de 2 horas) ou recrie com a permissão marcada. |
| A integração "acha" que deu certo, mas nada aconteceu | Áreas legadas respondem HTTP 200 com {"msg":"..."} em erro. Verifique o corpo da resposta, não só o código HTTP. |
| A chave aparece com asteriscos na tela | Comportamento normal após 2 horas; a chave continua funcionando. Se não foi copiada a tempo, crie outra. |
action=flow responde, mas com dados vazios | O ambiente Flow não está configurado ou rodando naquele servidor. Configure o Flow pela interface antes de integrar. |