33 endpoints documentados, 114 ferramentas no catálogo e todas as páginas disponíveis em Markdown. Sem chave de API, sem cadastro e sem OAuth — o que limita o uso é a cota por IP.
Descoberta
Tudo o que um cliente automatizado precisa ler antes da primeira chamada está em arquivo próprio, na raiz do site.
# 1. o serviço está de pé?
curl -s https://dev-tools.decussi.com/api/health
# 2. qual ferramenta resolve isto?
curl -s "https://dev-tools.decussi.com/api/tools?q=cpf&limit=3"
# 3. o conteúdo da página, em Markdown
curl -s -H "Accept: text/markdown" https://dev-tools.decussi.com/tools/br/validador-cpf
A base é https://dev-tools.decussi.com. Não há ambiente de sandbox separado, e ele não faria diferença: nenhum endpoint cobra, cria conta ou altera dados de terceiros. Para testar sem efeito colateral use example.com nas consultas de rede e SEO, 00000000000191 no CNPJ e 01001000 no CEP. Links de compartilhamento e URLs de webhook expiram sozinhos.
Autenticação
Os endpoints de leitura são abertos. Os que escrevem — compartilhamento, webhook, registro de uso — e os que consultam serviços externos em nome do site exigem um token CSRF, porque são os mesmos endpoints que a interface usa.
1Peça o token — GET /api/csrf devolve `{ "token": "…" }` e grava o cookie `csrf_token`.
2Guarde o cookie — O cookie tem de voltar na requisição seguinte — em curl, use `-c` para gravar e `-b` para reenviar.
3Repita o valor no cabeçalho — Envie o mesmo token em `x-csrf-token` (ou no campo `csrfToken` do corpo JSON).
Consultas externas (DNS, SSL, WHOIS, SEO, CEP, CNPJ)
15 requisições por minuto
Formulários (newsletter, sugestões)
5 requisições por minuto
Toda resposta da API traz os cabeçalhos de limite:
X-RateLimit-Limit — Teto de requisições da janela.
X-RateLimit-Remaining — Quantas ainda cabem na janela atual.
X-RateLimit-Reset — Quando a janela zera, em epoch de segundos.
RateLimit-Policy — Política no formato do rascunho da IETF, ex.: 60;w=60.
Retry-After — Segundos a esperar. Só aparece na resposta 429.
Erros
Todo erro sai em JSON, com o mesmo envelope — inclusive 404 e 405. O campo code é estável e serve para decidir o que fazer; hint diz como corrigir.
{
"error": "Domínio inválido",
"code": "invalid_domain",
"message": "Domínio inválido",
"hint": "Envie só o domínio, como example.com — sem protocolo, porta ou caminho.",
"status": 400,
"documentation_url": "https://dev-tools.decussi.com/developers#erros"
}
code
HTTP
Como resolver
invalid_request
400
Envie um corpo JSON válido com os campos descritos em /openapi.json.
invalid_parameter
400
Confira nome, tipo e formato dos campos enviados em /openapi.json.
invalid_domain
400
Envie só o domínio, como example.com — sem protocolo, porta ou caminho.
invalid_url
400
Envie uma URL http(s) pública e completa, como https://example.com/pagina.
invalid_host
400
Use um domínio ou um IP público; endereços privados são recusados.
invalid_port
400
Envie um número inteiro entre 1 e 65535.
invalid_ip
400
Envie um IPv4 ou IPv6 público, sem máscara nem porta.
invalid_email
400
Envie um endereço completo, como pessoa@example.com.
invalid_document
400
Confira a quantidade de dígitos e os dígitos verificadores antes de reenviar.
invalid_id
400
Use o identificador devolvido na criação do recurso, sem alterações.
invalid_method
400
Use um dos métodos listados para o endpoint em /openapi.json.
blocked_host
400
Endereços internos, localhost e IPs privados são bloqueados por segurança.
unauthorized
401
Este endpoint é interno e exige o segredo configurado no servidor.
csrf_token_invalid
403
Chame GET /api/csrf, guarde o cookie csrf_token e reenvie o valor no cabeçalho x-csrf-token.
not_found
404
Confira o identificador; links compartilhados expiram e somem depois do prazo.
endpoint_not_found
404
A lista completa de endpoints está em /openapi.json.
method_not_allowed
405
Use um dos métodos do cabeçalho Allow desta resposta.
not_acceptable
406
Peça text/html ou text/markdown no cabeçalho Accept.
conflict
409
Escolha outro identificador ou aguarde o recurso atual expirar.
payload_too_large
413
Reduza o conteúdo enviado; o limite de cada endpoint está em /openapi.json.
rate_limited
429
Espere os segundos indicados em Retry-After antes de repetir a requisição.
internal_error
500
Tente de novo em instantes; se persistir, relate em github.com/dudecussi.
upstream_error
502
A falha é do serviço consultado. Tente de novo em alguns minutos.
upstream_timeout
504
O serviço consultado demorou demais. Repita a requisição mais tarde.
Conteúdo em Markdown
Qualquer página pública responde em Markdown quando o pedido traz Accept: text/markdown, e a mesma página também está no sufixo .md. As respostas trazem Vary: Accept, então um cache intermediário nunca serve HTML a quem pediu Markdown. Um Accept que não aceita nem text/html nem text/markdown recebe 406 com a lista do que é possível servir.
Catálogo completo em JSON: slug, nome, descrição, grupo, URL e se a ferramenta processa os dados no navegador. É o endpoint para descobrir qual página resolve um problema antes de mandar alguém para o site.
Parâmetros
q(query · string · opcional) — Busca por nome, descrição ou palavra-chave da ferramenta.
group(query · string · opcional · um de: json, security, network, text, date, web, dev, seo, br) — Filtra por grupo.
Devolve qualquer página pública do site em Markdown, com um cabeçalho YAML de título, descrição e URL canônica. O mesmo conteúdo sai de qualquer URL do site com `Accept: text/markdown` ou com o sufixo `.md`.
Parâmetros
path(query · string · obrigatório) — Caminho da página no site, começando com barra.
curl -s "https://dev-tools.decussi.com/api/md?path=/tools/json/json-viewer"
# a mesma resposta, negociada na URL da própria página:
curl -s -H "Accept: text/markdown" https://dev-tools.decussi.com/tools/json/json-viewer
Erros: invalid_parameter, not_found, rate_limited
Rede
POST
/api/infra/dns
token CSRF · 15/min
Consulta A, AAAA, MX, TXT, NS, CNAME e SOA em uma chamada.
Corpo JSON
domain(string · obrigatório) — Domínio a consultar. Protocolo e caminho são ignorados.
Executa uma requisição HTTP a partir do servidor e devolve status, tempo, cabeçalhos e corpo. Só endereços públicos; o destino é revalidado depois de cada redirecionamento.
Corpo JSON
url(string · obrigatório) — URL de destino.
method(string · opcional · um de: GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS · padrão "GET") — Método HTTP.
headers(object · opcional) — Cabeçalhos extras, como pares nome/valor.
body(string · opcional) — Corpo da requisição, quando o método aceita.
Segue os redirecionamentos salto a salto, sem deixar o cliente resolver, e sonda as quatro variantes de www e protocolo para revelar conteúdo servido em mais de um endereço.
Corpo JSON
url(string · obrigatório) — URL de partida da cadeia.
Devolve um token e grava o cookie `csrf_token`. Os endpoints marcados com autenticação `csrf` exigem os dois: o cookie na requisição e o mesmo valor no cabeçalho `x-csrf-token`.