API de DNS
Gerencie zonas e registros do DNS autoritativo do Ravi Monitor por integração externa e consulte as estatísticas do DNS recursivo. É a mesma API usada para publicar registros automaticamente a partir de ERPs e painéis do provedor.
Visão geral
A área dns da API pública permite criar e excluir zonas (domínios), criar, pesquisar e excluir registros (subdomínios) do DNS Autoritativo, além de ler as estatísticas do DNS recursivo do servidor. O caso de uso típico é o sistema de gestão do provedor criar zonas e registros sozinho, sem que ninguém precise abrir a tela do Ravi.
A criação de registros por API aceita o parâmetro priority (para registros MX) e o modo lote com defer_reload + reload_nsd.
Pré-requisitos
- Chave de API com a permissão Acesso a DNS marcada. Chaves são criadas em Configurações, aba Integrações, card Gerenciamento de API (somente a conta Master gerencia chaves Somente Master). Veja Criar uma chave de API.
- Ambiente DNS do Ravi instalado e ativo (área DNS do menu). A operação
recursiveretorna a última estatística coletada do DNS recursivo (é preciso que ele já tenha coletado dados ao menos uma vez; o estado atual do serviço vem no blocoservice_status); as operações de autoritativo exigem o servidor autoritativo gerenciado pelo Ravi. - Sem a permissão, o gateway responde HTTP
403com{"status":"error","message":"Access denied for dns"}. Token inválido responde HTTP401.
Formato das chamadas e das respostas
Todas as operações usam o endpoint único da API, por GET ou POST:
https://SEU-SERVIDOR/api/api.php?token=CHAVE&action=dns&operation=OPERACAO&...
O módulo DNS responde JSON direto, sem envelope: sucesso vem como {"msg":"ok"} (nas mutações) ou como o objeto pedido (ex.: {"authoritative":[...]}). Os erros de negócio vêm com HTTP 200 e o texto em inglês no campo msg.
Não confie apenas no código HTTP: neste módulo, qualquer resposta cujo msg seja diferente de "ok" deve ser tratada como erro. Apenas os erros do gateway (token, permissão, action) usam códigos HTTP 400/401/403.
Parâmetros comuns
| Parâmetro | Alias aceito | Uso |
|---|---|---|
operation | - | Obrigatório em toda chamada. |
domain | dom | Zona alvo (ex.: provedor.com.br). |
subdomain | subdom | Nome do registro (ex.: www, @, mail). |
type | tipo | Tipo do registro: A, AAAA, CNAME, MX, NS, PTR, TXT (SRV é aceito se o valor de host incluir prioridade, peso e porta). |
host | - | Valor/destino do registro (IP, hostname ou texto TXT). |
comment | - | Comentário livre gravado no registro (opcional). |
adicional | alt_domain | Somente para PTR: domínio alternativo (opcional; sem espaços nem caracteres especiais). |
priority | prioridade | Prioridade numérica para registros MX (opcional). |
defer_reload | - | 1 = não recarrega o servidor autoritativo nesta chamada (modo lote; veja reload_nsd). |
Comportamento automático
- Toda mutação (criar/excluir zona ou registro) sem
defer_reloadregenera e assina as zonas e recarrega o servidor autoritativo (NSD) de forma síncrona: a resposta demora cerca de 1,5 a 2 segundos a mais. Não trate isso como lentidão anômala. - Ao criar uma zona por API, o sistema já cria automaticamente 3 registros
A:ns1,ns2ewww, apontando para os IPs detectados do próprio servidor. Com 2 IPs,ns1usa o primeiro ens2o segundo; com 1 IP, ambos usam o mesmo; sem IP detectável, ficam0.0.0.0para o operador ajustar. - Excluir uma zona também exclui os registros de DNS reverso interligados a ela.
- As estatísticas de
recursiverefletem o último ciclo de coleta do módulo DNS, não um instantâneo em tempo real absoluto.
Operações
O módulo aceita 8 operações. As de leitura funcionam bem por GET; para as mutações, prefira POST com HTTPS, porque a chave trafega na requisição.
/api/api.php?action=dns&operation=recursive
Retorna as estatísticas do DNS recursivo do servidor: status do serviço, métricas de consultas e cache, indicadores de segurança (DNSSEC) e o tamanho das listas de bloqueio ativas.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
token | string | Sim | Chave de API com Acesso a DNS. |
Blocos da resposta:
service_status:unbound_active(serviço realmente ativo) eunbound_enabled(recursivo ligado nas opções do Ravi).current_metrics: consultas por segundo, tempo de resposta médio e mediano, taxa de acerto de cache (%), taxa de validação DNSSEC (%) e totais de consultas.query_types: contagem por tipo (A, AAAA, PTR, CNAME, ANY).security_metrics: validações DNSSEC, respostas bogus, consultas e respostas indesejadas.network_metrics: consultas TCP e IPv6.cache_metrics: tamanho do cache e fila de requisições.blocklists: quantidade de entradas de cada lista de bloqueio ativa (só aparecem as categorias ligadas na tela do DNS; chaves possíveis:adware_malware,phishing,anatel,cryptomining,ads,adult,social,games_gambling,tracking_analytics,fake_news).
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=SUA_CHAVE&action=dns&operation=recursive"
{
"recursive": {
"service_status": { "unbound_active": true, "unbound_enabled": true },
"current_metrics": { "queries_per_second": 412.7, "cache_hit_ratio": 87.3, "dnssec_validation_ratio": 96.1, ... },
"query_types": { "A": 125034, "AAAA": 30211, "PTR": 812, "CNAME": 145, "ANY": 3 },
"security_metrics":{ "dnssec_validated": 118220, "dnssec_bogus": 4, "unwanted_queries": 51, "unwanted_replies": 12 },
"network_metrics": { "tcp_queries": 210, "ipv6_queries": 18754 },
"cache_metrics": { ... },
"blocklists": { "phishing": 41230, "anatel": 1287 }
}
}Erro: {"msg":"No DNS log data found"} quando nunca houve coleta de estatísticas.
/api/api.php?action=dns&operation=authoritative
Lista as zonas do DNS autoritativo com seus registros. Sem domain, retorna todas as zonas; com domain, apenas a zona informada.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
token | string | Sim | Chave de API com Acesso a DNS. |
domain | string | Não | Filtra por uma zona específica. |
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=SUA_CHAVE&action=dns&operation=authoritative&domain=cliente.com.br"
{
"authoritative": [
{
"id": 12,
"domain": "cliente.com.br",
"entries": [
{ "id": 301, "name": "ns1", "value": "203.0.113.10", "type": "A", "host": null, "priority": null, "alt_domain": null },
{ "id": 302, "name": "www", "value": "203.0.113.20", "type": "A", "host": null, "priority": null, "alt_domain": null },
{ "id": 303, "name": "@", "value": "mail.cliente.com.br", "type": "MX", "host": null, "priority": 10, "alt_domain": null }
]
}
]
}Erro: {"msg":"No authoritative domains found"}.
Dois detalhes de compatibilidade: registros criados pela API 7.2 trazem o rótulo em name e o destino em value, mas registros antigos criados por versões anteriores da interface podem vir com a semântica trocada (value = rótulo, host = destino); verifique qual campo está preenchido. E uma zona sem registros retorna "entries":"null" como a string "null", não como o valor JSON null.
/api/api.php?action=dns&operation=add_domain
Cria uma zona no DNS autoritativo, já com os registros padrão ns1, ns2 e www (tipo A, apontando para os IPs do próprio servidor), e recarrega o servidor autoritativo.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
token | string | Sim | Chave de API com Acesso a DNS. |
domain | string | Sim | Zona a criar (ex.: cliente.com.br). |
defer_reload | 1 | Não | Pula a recarga do NSD nesta chamada (modo lote). |
curl -s -X POST "https://ravi.seuprovedor.com.br/api/api.php" \ -d "token=SUA_CHAVE" -d "action=dns" \ -d "operation=add_domain" -d "domain=cliente.com.br"
{"msg":"ok"}Erros: Please provide a valid domain, Domain already exists.
/api/api.php?action=dns&operation=add_subdomain
Cria um registro dentro de uma zona existente. É permitido repetir nome+tipo com valores diferentes (ex.: @ NS ns1 e @ NS ns2, ou vários TXT); apenas a combinação exata nome+tipo+valor repetida é recusada.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
token | string | Sim | Chave de API com Acesso a DNS. |
domain | string | Sim | Zona onde o registro será criado. |
subdomain | string | Sim | Nome do registro (www, @, mail...). |
type | string | Sim | A, AAAA, CNAME, MX, NS, PTR ou TXT (SRV é aceito se o valor de host incluir prioridade, peso e porta). |
host | string | Sim | Valor/destino do registro. |
priority | número | Não | Prioridade para registros MX. |
comment | string | Não | Comentário livre gravado no registro. |
adicional | string | Não | Somente PTR: publica o registro sob o domínio alternativo em vez da zona principal (aceita apenas letras, números, pontos e hífens). |
defer_reload | 1 | Não | Pula a recarga do NSD nesta chamada (modo lote). |
Registros TXT: envie o texto puro em host, sem aspas. O sistema adiciona as aspas na zona e divide automaticamente valores com mais de 255 caracteres em blocos concatenados, conforme o padrão DNS. Chaves DKIM longas e registros SPF podem ser enviados inteiros em uma única chamada, sem tratamento prévio.
PTR com domínio alternativo: quando adicional é informado em um registro PTR, o registro passa a ser publicado sob o domínio alternativo em vez da zona principal. Exemplo: subdomain=host1 com adicional=reverso.exemplo.net cria o PTR como host1.reverso.exemplo.net (com subdomain=@, o nome publicado é o próprio domínio alternativo). O campo aceita apenas letras, números, pontos e hífens; qualquer outro caractere retorna o erro Alternative domain cannot contain spaces or special characters.
curl -s -X POST "https://ravi.seuprovedor.com.br/api/api.php" \ -d "token=SUA_CHAVE" -d "action=dns" -d "operation=add_subdomain" \ -d "domain=cliente.com.br" -d "subdomain=@" -d "type=MX" \ -d "host=mail.cliente.com.br" -d "priority=10"
curl -s -X POST "https://ravi.seuprovedor.com.br/api/api.php" \ -d "token=SUA_CHAVE" -d "action=dns" -d "operation=add_subdomain" \ -d "domain=exemplo.com" -d "subdomain=host1" -d "type=PTR" \ -d "host=192.168.1.1" -d "adicional=reverso.exemplo.net"
{"msg":"ok"}Erros: Please provide domain, subdomain, type and host, Domain not found, Entry already exists, Alternative domain cannot contain spaces or special characters (PTR com adicional inválido).
/api/api.php?action=dns&operation=search_subdomain
Verifica se um registro existe na zona. Útil antes de criar ou excluir, e para conferir o resultado de um lote.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
token | string | Sim | Chave de API com Acesso a DNS. |
domain | string | Sim | Zona onde procurar. |
subdomain | string | Sim | Nome do registro. |
type | string | Sim | Tipo do registro. |
host | string | Não | Se informado, a busca passa a ser exata por nome+tipo+valor (útil quando há vários registros de mesmo nome e tipo). |
curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=SUA_CHAVE&action=dns&operation=search_subdomain&domain=cliente.com.br&subdomain=www&type=A"
{"msg":"true"}{"msg":"true"} = o registro existe; {"msg":"false"} = não existe. Erro: Domain not found.
/api/api.php?action=dns&operation=delete_subdomain
Exclui um registro da zona. A busca é feita por nome+tipo, sem considerar o valor.
Se existem vários registros com o mesmo nome e tipo (ex.: dois NS, vários TXT), a exclusão remove o primeiro que casar e não é possível escolher qual. Remova um por chamada e confira o resultado com authoritative antes de repetir.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
token | string | Sim | Chave de API com Acesso a DNS. |
domain | string | Sim | Zona do registro. |
subdomain | string | Sim | Nome do registro a excluir. |
type | string | Sim | Tipo do registro a excluir. |
defer_reload | 1 | Não | Pula a recarga do NSD nesta chamada (modo lote). |
curl -s -X POST "https://ravi.seuprovedor.com.br/api/api.php" \ -d "token=SUA_CHAVE" -d "action=dns" -d "operation=delete_subdomain" \ -d "domain=cliente.com.br" -d "subdomain=www" -d "type=A"
{"msg":"ok"}Erros: Subdomain not found, Domain not found.
/api/api.php?action=dns&operation=delete_domain
Exclui uma zona inteira do DNS autoritativo.
A exclusão é irreversível e remove a zona, todos os seus registros e também os registros de DNS reverso interligados a ela. Confirme a zona antes de chamar.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
token | string | Sim | Chave de API com Acesso a DNS. |
domain | string | Sim | Zona a excluir. |
defer_reload | 1 | Não | Pula a recarga do NSD nesta chamada (modo lote; veja reload_nsd). A exclusão de zona dispara a mesma recarga automática das demais mutações e respeita o parâmetro da mesma forma. |
curl -s -X POST "https://ravi.seuprovedor.com.br/api/api.php" \ -d "token=SUA_CHAVE" -d "action=dns" \ -d "operation=delete_domain" -d "domain=cliente.com.br"
{"msg":"ok"}Erro: Domain not found.
/api/api.php?action=dns&operation=reload_nsd
Recarrega o servidor autoritativo sob demanda. É o par do defer_reload: ao criar ou alterar muitos registros, envie defer_reload=1 em cada mutação (pulando a recarga individual) e chame reload_nsd uma única vez no fim. O resultado é 1 recarga em vez de N, e o lote fica muito mais rápido.
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
token | string | Sim | Chave de API com Acesso a DNS. |
A chamada espera o serviço do Ravi processar a recarga, por até 15 segundos.
curl -s -X POST "https://ravi.seuprovedor.com.br/api/api.php" \ -d "token=SUA_CHAVE" -d "action=dns" -d "operation=reload_nsd"
{"msg":"ok","reload_confirmed":true,"waited_ms":1800}Se a espera estourar os 15 segundos, a resposta vem como {"msg":"ok_reload_timeout","reload_confirmed":false,...}: a recarga ainda pode completar logo em seguida; confirme com dig e, se preciso, repita a chamada.
Exemplos práticos
Criar uma zona e um registro MX
O fluxo mais comum de integração: criar a zona do cliente e publicar um registro. O mesmo padrão vale para A, AAAA, CNAME, TXT e os demais tipos.
# 1) criar a zona (ns1/ns2/www são criados automaticamente) curl -s -X POST "https://ravi.seuprovedor.com.br/api/api.php" \ -d "token=SUA_CHAVE" -d "action=dns" \ -d "operation=add_domain" -d "domain=cliente.com.br" # 2) criar o registro MX curl -s -X POST "https://ravi.seuprovedor.com.br/api/api.php" \ -d "token=SUA_CHAVE" -d "action=dns" -d "operation=add_subdomain" \ -d "domain=cliente.com.br" -d "subdomain=@" -d "type=MX" \ -d "host=mail.cliente.com.br" -d "priority=10" # 3) conferir curl -s "https://ravi.seuprovedor.com.br/api/api.php?token=SUA_CHAVE&action=dns&operation=search_subdomain&domain=cliente.com.br&subdomain=@&type=MX&host=mail.cliente.com.br"
<?php $base = 'https://ravi.seuprovedor.com.br/api/api.php'; $token = 'SUA_CHAVE'; function dnsApi($params) { global $base, $token; $params += ['token' => $token, 'action' => 'dns']; $ch = curl_init($base); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query($params), CURLOPT_RETURNTRANSFER => true, ]); $resp = json_decode(curl_exec($ch), true); curl_close($ch); // neste módulo, msg != "ok" significa erro (mesmo com HTTP 200) if (isset($resp['msg']) && strpos($resp['msg'], 'ok') !== 0 && !in_array($resp['msg'], ['true', 'false'], true)) { throw new Exception('API DNS: ' . $resp['msg']); } return $resp; } dnsApi(['operation' => 'add_domain', 'domain' => 'cliente.com.br']); dnsApi([ 'operation' => 'add_subdomain', 'domain' => 'cliente.com.br', 'subdomain' => '@', 'type' => 'MX', 'host' => 'mail.cliente.com.br', 'priority' => 10, ]);
import requests BASE = "https://ravi.seuprovedor.com.br/api/api.php" TOKEN = "SUA_CHAVE" def dns_api(**params): params.update(token=TOKEN, action="dns") resp = requests.post(BASE, data=params, timeout=30).json() # neste módulo, msg != "ok" significa erro (mesmo com HTTP 200) msg = resp.get("msg", "ok") if not msg.startswith("ok") and msg not in ("true", "false"): raise RuntimeError(f"API DNS: {msg}") return resp dns_api(operation="add_domain", domain="cliente.com.br") dns_api(operation="add_subdomain", domain="cliente.com.br", subdomain="@", type="MX", host="mail.cliente.com.br", priority=10)
Lote de registros com uma recarga só
Cada mutação recarrega o servidor autoritativo e custa 1,5 a 2 segundos. Para publicar vários registros de uma vez (ex.: SPF, DKIM e MX de um domínio de e-mail), use defer_reload=1 em cada chamada e feche o lote com reload_nsd.
# mutações sem recarga individual curl -s -X POST "https://ravi.seuprovedor.com.br/api/api.php" \ -d "token=SUA_CHAVE" -d "action=dns" -d "operation=add_subdomain" \ -d "domain=cliente.com.br" -d "subdomain=@" -d "type=TXT" \ -d "host=v=spf1 mx -all" -d "defer_reload=1" curl -s -X POST "https://ravi.seuprovedor.com.br/api/api.php" \ -d "token=SUA_CHAVE" -d "action=dns" -d "operation=add_subdomain" \ -d "domain=cliente.com.br" -d "subdomain=mail" -d "type=A" \ -d "host=203.0.113.25" -d "defer_reload=1" # uma recarga só, no fim do lote curl -s -X POST "https://ravi.seuprovedor.com.br/api/api.php" \ -d "token=SUA_CHAVE" -d "action=dns" -d "operation=reload_nsd"
Se você usar defer_reload=1 e esquecer de chamar reload_nsd no fim, as mudanças ficam gravadas mas não entram em vigor no DNS até a próxima recarga. Se o dig ainda responde o valor antigo depois de um lote, esse costuma ser o motivo.
Migrando do webservice antigo
Integrações que usavam os endpoints antigos de /webservice/ (autenticação por token do sistema + usuário e senha na URL) deixaram de funcionar na 7.2 e devem migrar para /api/api.php com chave de API. Correspondência das chamadas:
| Chamada legada | Substituto na API atual |
|---|---|
webservice/dns.php?acao=recursivo | action=dns&operation=recursive |
...acao=autoritativo | operation=authoritative |
...acao=add_dom | operation=add_domain |
...acao=add_subdom | operation=add_subdomain |
...acao=pesquisar_subdom | operation=search_subdomain |
...acao=delete_subdom | operation=delete_subdomain |
...acao=delete_dom | operation=delete_domain |
Além de voltar a funcionar, a migração troca usuário e senha em texto na URL por uma chave revogável com permissão restrita à área de DNS.
Solução de problemas
| Sintoma | Causa provável |
|---|---|
HTTP 403 Access denied for dns | A chave existe, mas a permissão Acesso a DNS não está marcada. A conta Master pode ajustar a chave em Configurações, aba Integrações. |
{"msg":"ok"}, mas o dig ainda responde o valor antigo | Recarga em andamento (ela é síncrona, mas há propagação e cache), ou uso de defer_reload=1 sem chamar reload_nsd no fim do lote. |
reload_nsd devolve ok_reload_timeout | O serviço do Ravi estava ocupado e a confirmação passou de 15 segundos. A recarga costuma completar em seguida; verifique com dig e repita se preciso. |
Registro criado não aparece como esperado no authoritative | Verifique os campos name e value: registros antigos criados pela interface de versões anteriores podem vir com a semântica trocada. |
{"msg":"No DNS log data found"} no recursive | O DNS recursivo nunca coletou estatísticas neste servidor; confirme que o recursivo está ativo na área DNS. |
Boas práticas: use HTTPS e POST (a chave trafega na requisição); crie uma chave exclusiva para a integração de DNS, só com Acesso a DNS marcado; em lotes, sempre defer_reload=1 + reload_nsd final.