Aller au contenu
Tutorial

API de recherche DNS : interrogez les enregistrements A, MX et TXT via REST

| 6 min read

Recherchez les enregistrements DNS par programme avec 3 points de terminaison REST. Interrogez des types d'enregistrement uniques, regroupez plusieurs types et vérifiez la propagation sur Google, Cloudflare et Quad9.

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

Votre script de surveillance doit vérifier les enregistrements MX après une migration DNS. Vous pourriez installer dig, analysez sa sortie multiligne avec regex et gérez la douzaine de cas extrêmes où le format varie selon les types d'enregistrement. Ou vous pouvez envoyer une requête HTTP et obtenir JSON structuré en arrière.

L'API DNS botoi vous offre trois points de terminaison : recherche d'un seul type, recherche par lots de plusieurs types d'enregistrement à la fois et un vérificateur de propagation qui interroge Google, Cloudflare et Quad9 en parallèle. Tous les trois renvoient un JSON cohérent que vous pouvez insérer dans n'importe quel script ou application sans analyser la gymnastique.

Rechercher un seul type d'enregistrement

La /v1/dns/lookup le point de terminaison prend un domaine et un type d'enregistrement facultatif. Si vous omettez le type, la valeur par défaut est les enregistrements A. Voici une recherche MX pour stripe.com :

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

Réponse:

{
  "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
  }
}

Chaque enregistrement MX revient avec un priority champ et un ttl dans secondes. Pas besoin de diviser les chaînes ou de deviner quel numéro est la priorité ; l'API fait ça pour toi.

Enregistrements TXT pour SPF et vérification

Les enregistrements TXT contiennent des politiques SPF, des jetons de propriété de domaine et des sélecteurs DKIM. Interrogez-les le de la même manière :

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

Réponse:

{
  "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
  }
}

L'API prend en charge huit types d'enregistrement : A, AAAA, MX, TXT, CNAME, NS, SOA et PTR. Chacun type renvoie le même format structuré avec type, value, et ttl champs.

Interroger plusieurs types d'enregistrements à la fois

Quatre appels HTTP distincts pour obtenir les enregistrements A, MX, TXT et NS sont un gaspillage. Le /v1/dns/batch le point de terminaison exécute toutes les recherches en parallèle et renvoie le résultats regroupés par type.

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

Réponse:

{
  "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 }
      ]
    }
  }
}

Une demande, une réponse, les quatre types d'enregistrement. Si vous omettez le types tableau, le point de terminaison est par défaut A, AAAA, MX, TXT et NS. Ceci est utile pour construire tableaux de bord de présentation du domaine ou exécution d’audits DNS complets.

Vérifier la propagation DNS entre les résolveurs

Vous avez mis à jour votre enregistrement A il y a 20 minutes. Votre résolveur local affiche la nouvelle IP, mais les clients d’autres régions accèdent toujours à l’ancien serveur. Le /v1/dns/propagation le point de terminaison interroge trois résolveurs publics majeurs et vous indique s'ils sont d'accord.

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

Réponse:

{
  "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
  }
}

La consistent le champ est true lorsque les trois résolveurs renvoient le même ensemble d’enregistrements triés. Quand c'est false, la resolvers objet vous montre exactement quel résolveur fournit toujours des données obsolètes et combien de temps a pris chaque requête.

Exemple pratique : vérifiez les enregistrements MX avant d'accepter les inscriptions

Un cas d'utilisation courant : quelqu'un entre user@typo-domain.cm dans votre formulaire d'inscription. La validation de la syntaxe réussit car le format est correct, mais le domaine n'a pas de serveur de messagerie. Vous le découvrirez trois jours plus tard lorsque l'e-mail de bienvenue rebondira.

Cet exemple Node.js vérifie les enregistrements MX au moment de l'inscription et rejette les adresses e-mail pointant vers vers des domaines sans infrastructure de messagerie :

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);

La vérification ajoute 10 à 30 ms à la demande d'inscription. C'est un petit prix pour éviter les rebonds atteinte à votre réputation d'expéditeur. Vous pouvez également mettre en cache les résultats MX par domaine pendant 30 minutes pour éviter les recherches répétées pour le même domaine.

Surveiller la propagation DNS après une migration

Après avoir modifié les enregistrements DNS, vous souhaitez savoir à quel moment tous les principaux résolveurs servent le nouveau valeurs. Ce script interroge le point de terminaison de propagation toutes les 30 secondes et enregistre l'état de chaque résolveur :

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");

Exécutez-le en arrière-plan après avoir apporté des modifications DNS. Il enregistre les enregistrements de chacun résolveur à chaque tentative et quitte lorsque les trois sont d'accord. L'intervalle de 30 secondes vous permet sous la limite de débit du niveau gratuit (5 requêtes par minute).

Points clés

  • /v1/dns/lookup renvoie du JSON structuré pour l'un des huit pris en charge types d'enregistrements. Les enregistrements MX incluent la priorité ; Les enregistrements SOA incluent les enregistrements série, actualisation, nouvelle tentative, expirer et les champs minimum.
  • /v1/dns/batch interroge plusieurs types d’enregistrements en parallèle avec une seule requête. La valeur par défaut est A, AAAA, MX, TXT et NS si vous ne le spécifiez pas.
  • /v1/dns/propagation vérifie Google, Cloudflare et Quad9 et renvoie un booléen consistent drapeau. Utilisez-le pour vérifier que les modifications DNS sont devenues globales.
  • Les trois points de terminaison fonctionnent de manière anonyme à 5 req/min. Passer un X-Api-Key en-tête pour des limites plus élevées.
  • L'API s'exécute sur le réseau périphérique de Cloudflare. Les requêtes sont résolues via DNS sur HTTPS, vous obtenez ainsi la même fiabilité que si vous interrogeiez directement Cloudflare ou Google DNS, encapsulé dans un format JSON convivial pour les développeurs.

FAQ

Comment rechercher des enregistrements DNS par programmation ?
Envoyez une requête POST à ​​https://api.botoi.com/v1/dns/lookup avec un corps JSON contenant le domaine et le type d'enregistrement. L'API renvoie du JSON structuré avec tous les enregistrements correspondants, les durées de vie et l'heure de la requête. Aucune installation de fouille ou analyse de sortie requise.
Quels types d’enregistrements DNS l’API prend-elle en charge ?
L'API prend en charge huit types d'enregistrement : A, AAAA, MX, TXT, CNAME, NS, SOA et PTR. Si vous omettez le paramètre type, la valeur par défaut est les enregistrements A.
Comment vérifier si les modifications DNS se sont propagées ?
Utilisez le point de terminaison /v1/dns/propagation. Il interroge Google DNS, Cloudflare DNS et Quad9 en parallèle et renvoie un booléen « cohérent » indiquant si les trois résolveurs renvoient les mêmes enregistrements. Si cohérent est faux, la propagation est toujours en cours.
Puis-je interroger plusieurs types d’enregistrements DNS en une seule requête ?
Oui. Le point de terminaison /v1/dns/batch accepte un tableau de types (par exemple, ["A", "MX", "TXT"]) et les interroge tous en parallèle. La réponse regroupe les enregistrements par type. Si vous omettez le paramètre types, la valeur par défaut est A, AAAA, MX, TXT et NS.
L’API de recherche DNS est-elle gratuite ?
L'accès anonyme est disponible à 5 requêtes par minute et 100 requêtes par jour avec une limitation de débit basée sur IP. Aucune clé API ou compte requis. Pour un débit plus élevé, les forfaits payants commencent à 9 $/mois avec une seule clé API couvrant plus de 150 points de terminaison.

Commencez a construire avec botoi

150+ endpoints API pour la recherche, le traitement de texte, la generation d'images et les utilitaires pour developpeurs. Offre gratuite, sans carte bancaire.