Pular para o conteúdo
Tutorial

API de pesquisa de DNS: consulte registros A, MX e TXT em REST

| 6 min read

Procure registros DNS programaticamente com três endpoints REST. Consulte tipos de registro únicos, agrupe vários tipos e verifique a propagação no Google, Cloudflare e Quad9.

Server racks in a data center
Photo by Taylor Vick on Unsplash

Seu script de monitoramento precisa verificar os registros MX após uma migração de DNS. Você poderia instalar dig, analise sua saída multilinha com regex e lide com uma dúzia de casos extremos onde o formato varia entre os tipos de registro. Ou você pode enviar uma solicitação HTTP e obter JSON estruturado de volta.

A API botoi DNS oferece três pontos de extremidade: pesquisa de tipo único, pesquisa em lote para vários tipos de registro de uma só vez e um verificador de propagação que consulta Google, Cloudflare e Quad9 em paralelo. Todos os três retornam JSON consistente que você pode alimentar em qualquer script ou aplicativo sem analisar a ginástica.

Procure um único tipo de registro

O /v1/dns/lookup endpoint usa um domínio e um tipo de registro opcional. Se você omite o tipo, o padrão é registros A. Aqui está uma pesquisa MX para stripe.com:

curl -X POST https://api.botoi.com/v1/dns/lookup \\
  -H "Content-Type: application/json" \\
  -d '{"domain": "stripe.com", "type": "MX"}'

Resposta:

{
  "success": true,
  "data": {
    "domain": "stripe.com",
    "type": "MX",
    "records": [
      { "type": "MX", "value": "aspmx.l.google.com", "priority": 1, "ttl": 3600 },
      { "type": "MX", "value": "alt1.aspmx.l.google.com", "priority": 5, "ttl": 3600 },
      { "type": "MX", "value": "alt2.aspmx.l.google.com", "priority": 5, "ttl": 3600 },
      { "type": "MX", "value": "alt3.aspmx.l.google.com", "priority": 10, "ttl": 3600 },
      { "type": "MX", "value": "alt4.aspmx.l.google.com", "priority": 10, "ttl": 3600 }
    ],
    "query_time_ms": 14
  }
}

Cada registro MX retorna com um priority campo e um ttl em segundos. Não há necessidade de dividir strings ou adivinhar qual número é a prioridade; a API faz isso para você.

Registros TXT para SPF e verificação

Os registros TXT contêm políticas SPF, tokens de propriedade de domínio e seletores DKIM. Pergunte-lhes o da mesma forma:

curl -X POST https://api.botoi.com/v1/dns/lookup \\
  -H "Content-Type: application/json" \\
  -d '{"domain": "github.com", "type": "TXT"}'

Resposta:

{
  "success": true,
  "data": {
    "domain": "github.com",
    "type": "TXT",
    "records": [
      { "type": "TXT", "value": "v=spf1 ip4:192.30.252.0/22 include:_netblocks.google.com ~all", "ttl": 3600 },
      { "type": "TXT", "value": "MS=ms58704441", "ttl": 3600 },
      { "type": "TXT", "value": "docusign=087098e3-3d46-47b7-9b4e-8a23028154cd", "ttl": 3600 }
    ],
    "query_time_ms": 11
  }
}

A API oferece suporte a oito tipos de registro: A, AAAA, MX, TXT, CNAME, NS, SOA e PTR. Cada type retorna o mesmo formato estruturado com type, value, e ttl campos.

Consulte vários tipos de registros de uma só vez

Quatro chamadas HTTP separadas para obter registros A, MX, TXT e NS são um desperdício. O /v1/dns/batch endpoint executa todas as pesquisas em paralelo e retorna o resultados agrupados por tipo.

curl -X POST https://api.botoi.com/v1/dns/batch \\
  -H "Content-Type: application/json" \\
  -d '{"domain": "github.com", "types": ["A", "MX", "TXT", "NS"]}'

Resposta:

{
  "success": true,
  "data": {
    "domain": "github.com",
    "results": {
      "A": [
        { "type": "A", "value": "140.82.121.3", "ttl": 60 }
      ],
      "MX": [
        { "type": "MX", "value": "aspmx.l.google.com", "priority": 1, "ttl": 3600 },
        { "type": "MX", "value": "alt1.aspmx.l.google.com", "priority": 5, "ttl": 3600 },
        { "type": "MX", "value": "alt2.aspmx.l.google.com", "priority": 5, "ttl": 3600 }
      ],
      "TXT": [
        { "type": "TXT", "value": "v=spf1 ip4:192.30.252.0/22 include:_netblocks.google.com ~all", "ttl": 3600 },
        { "type": "TXT", "value": "MS=ms58704441", "ttl": 3600 }
      ],
      "NS": [
        { "type": "NS", "value": "dns1.p08.nsone.net", "ttl": 900 },
        { "type": "NS", "value": "dns2.p08.nsone.net", "ttl": 900 },
        { "type": "NS", "value": "dns3.p08.nsone.net", "ttl": 900 },
        { "type": "NS", "value": "dns4.p08.nsone.net", "ttl": 900 }
      ]
    }
  }
}

Uma solicitação, uma resposta, todos os quatro tipos de registro. Se você omitir o types array, o ponto final é padronizado como A, AAAA, MX, TXT e NS. Isto é útil para construir painéis de visão geral do domínio ou execução de auditorias DNS abrangentes.

Verifique a propagação do DNS entre resolvedores

Você atualizou seu registro A há 20 minutos. Seu resolvedor local mostra o novo IP, mas clientes em outras regiões ainda acessam o servidor antigo. O /v1/dns/propagation endpoint consulta três principais resolvedores públicos e informa se eles concordam.

curl -X POST https://api.botoi.com/v1/dns/propagation \\
  -H "Content-Type: application/json" \\
  -d '{"domain": "stripe.com", "type": "A"}'

Resposta:

{
  "success": true,
  "data": {
    "domain": "stripe.com",
    "type": "A",
    "resolvers": {
      "google": {
        "records": ["185.166.143.28", "185.166.143.29"],
        "response_time_ms": 18
      },
      "cloudflare": {
        "records": ["185.166.143.28", "185.166.143.29"],
        "response_time_ms": 9
      },
      "quad9": {
        "records": ["185.166.143.28", "185.166.143.29"],
        "response_time_ms": 22
      }
    },
    "consistent": true
  }
}

O consistent campo é true quando todos os três resolvedores retornam o mesmo conjunto classificado de registros. Quando é false, o resolvers objeto mostra exatamente qual resolvedor ainda está servindo dados obsoletos e quanto tempo levou cada consulta.

Exemplo prático: verifique os registros MX antes de aceitar inscrições

Um caso de uso comum: alguém entra user@typo-domain.cm em seu formulário de inscrição. A validação de sintaxe é aprovada porque o formato está correto, mas o domínio não possui servidores de email. Você descobrirá isso três dias depois, quando o e-mail de boas-vindas for devolvido.

Este exemplo do Node.js verifica os registros MX no momento da inscrição e rejeita endereços de e-mail apontando para domínios sem infraestrutura de correio:

import express from "express";

const app = express();
app.use(express.json());

async function lookupMx(domain) {
  const res = await fetch("https://api.botoi.com/v1/dns/lookup", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "X-Api-Key": process.env.BOTOI_API_KEY,
    },
    body: JSON.stringify({ domain, type: "MX" }),
  });
  return res.json();
}

app.post("/signup", async (req, res) => {
  const { email } = req.body;
  const domain = email.split("@")[1];

  // Check if the domain has MX records before accepting the signup
  const { data } = await lookupMx(domain);

  if (!data.records || data.records.length === 0) {
    return res.status(422).json({
      error: \`The domain \\\${domain} has no mail servers. Check the email address and try again.\`,
    });
  }

  // MX records exist; proceed with signup
  await createUser({ email });
  res.status(201).json({ created: true });
});

app.listen(3000);

A verificação adiciona 10 a 30 ms à solicitação de inscrição. Esse é um preço pequeno para evitar danos à reputação do remetente. Você também pode armazenar em cache os resultados MX por domínio por 30 minutos para evitar pesquisas repetidas para o mesmo domínio.

Monitore a propagação do DNS após uma migração

Depois de alterar os registros DNS, você deseja saber o momento em que todos os principais resolvedores atendem ao novo valores. Este script pesquisa o endpoint de propagação a cada 30 segundos e registra o estado de cada resolvedor:

async function checkPropagation(domain, type) {
  const res = await fetch("https://api.botoi.com/v1/dns/propagation", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "X-Api-Key": process.env.BOTOI_API_KEY,
    },
    body: JSON.stringify({ domain, type }),
  });
  return res.json();
}

// After updating DNS records, poll until all resolvers agree
async function waitForPropagation(domain, type, intervalMs = 30000) {
  let attempts = 0;

  while (attempts < 60) {
    const { data } = await checkPropagation(domain, type);

    console.log(
      \`Attempt \\\${attempts + 1}: consistent=\\\${data.consistent}\`
    );

    for (const [name, info] of Object.entries(data.resolvers)) {
      console.log(\`  \\\${name}: \\\${JSON.stringify(info.records)}\`);
    }

    if (data.consistent) {
      console.log("Propagation complete.");
      return data;
    }

    attempts++;
    await new Promise((r) => setTimeout(r, intervalMs));
  }

  throw new Error("Propagation did not complete within 30 minutes.");
}

// Usage
waitForPropagation("yourdomain.com", "A");

Execute isso como um trabalho em segundo plano depois de fazer alterações no DNS. Ele registra os registros de cada resolvedor em todas as tentativas e sai quando todos os três concordam. O intervalo de 30 segundos mantém você abaixo do limite de taxa do nível gratuito (5 solicitações por minuto).

Pontos-chave

  • /v1/dns/lookup retorna JSON estruturado para qualquer um dos oito suportados tipos de registro. Os registros MX incluem prioridade; Os registros SOA incluem serial, atualização, nova tentativa, expirar e campos mínimos.
  • /v1/dns/batch consulta vários tipos de registro em paralelo com uma solicitação. O padrão é A, AAAA, MX, TXT e NS se você não especificar.
  • /v1/dns/propagation verifica Google, Cloudflare e Quad9 e retorna um booleano consistent bandeira. Use-o para verificar se as alterações de DNS se tornaram globais.
  • Todos os três endpoints funcionam anonimamente a 5 req/min. Passe um X-Api-Key cabeçalho para limites mais altos.
  • A API é executada na rede de ponta da Cloudflare. As consultas são resolvidas por meio de DNS sobre HTTPS, para que você obtenha a mesma confiabilidade que consultar diretamente no Cloudflare ou no DNS do Google, empacotado em um formato JSON amigável ao desenvolvedor.

FAQ

Como procuro registros DNS programaticamente?
Envie uma solicitação POST para https://api.botoi.com/v1/dns/lookup com um corpo JSON contendo o domínio e o tipo de registro. A API retorna JSON estruturado com todos os registros, TTLs e tempo de consulta correspondentes. Não é necessária instalação dig ou análise de saída.
Quais tipos de registro DNS a API suporta?
A API oferece suporte a oito tipos de registro: A, AAAA, MX, TXT, CNAME, NS, SOA e PTR. Se você omitir o parâmetro type, o padrão será registros A.
Como posso verificar se as alterações de DNS foram propagadas?
Use o terminal /v1/dns/propagation. Ele consulta Google DNS, Cloudflare DNS e Quad9 em paralelo e retorna um booleano "consistente" indicando se todos os três resolvedores retornam os mesmos registros. Se consistente for falso, a propagação ainda está em andamento.
Posso consultar vários tipos de registros DNS em uma única solicitação?
Sim. O endpoint /v1/dns/batch aceita uma matriz de tipos (por exemplo, ["A", "MX", "TXT"]) e consulta todos eles em paralelo. A resposta agrupa registros por tipo. Se você omitir o parâmetro types, o padrão será A, AAAA, MX, TXT e NS.
A API de pesquisa de DNS é gratuita?
O acesso anônimo está disponível a 5 solicitações por minuto e 100 solicitações por dia com limitação de taxa baseada em IP. Nenhuma chave de API ou conta é necessária. Para maior rendimento, os planos pagos começam em US$ 9/mês com uma única chave de API cobrindo todos os mais de 150 endpoints.

Comece a construir com botoi

150+ endpoints de API para consultas, processamento de texto, geração de imagens e utilitários para desenvolvedores. Plano gratuito, sem cartão de crédito.