Authentification
Toutes les requêtes API nécessitent une authentification via une clé API. Transmettez la clé dans l’en-tête Authorization en tant que token Bearer. La clé API doit commencer par le préfixe nxd_.
Exigence du plan : l’API REST, l’API compatible ISPmanager et les webhooks sont disponibles à partir du plan Pro, tout comme les deux fonctionnalités que cette référence couvre également : DNSSEC et zones secondaires (slave). Une clé rattachée à un plan qui ne les inclut pas reçoit une réponse 403.
Authorization: Bearer nxd_your_api_key_here
La couche d’authentification API est sans état – chaque requête est authentifiée indépendamment. Il n’y a ni sessions ni cookies.
Gardez votre clé API secrète. Ne la partagez pas dans du code côté client, des dépôts publics ou des URL. Si une clé est compromise, révoquez-la immédiatement et créez-en une nouvelle.
Erreurs d’authentification
| Statut | Cause probable |
|---|---|
401 |
Clé API manquante ou invalide, clé expirée ou compte annulé |
403 |
La clé n’a pas la portée requise par le point de terminaison, ou le plan du compte n’inclut pas l’accès à l’API – la vérification du plan répond 403, et non 401, sur tous les chemins. |
Format de réponse
Toutes les réponses sont en JSON. Les réponses réussies ont la structure suivante :
Ressource unique
{
"status": "success",
"data": {
"id": "xK9mQ2",
"name": "example.com",
...
}
}
Liste paginée
{
"status": "success",
"data": [ ... ],
"meta": {
"total": 150,
"page": 1,
"per_page": 25,
"last_page": 6
}
}
Réponse d’erreur
{
"status": "error",
"error": {
"code": "validation_error",
"message": "Validation failed.",
"details": {
"name": ["Domain name is required."]
}
}
}
Les erreurs levées plus profondément dans la plateforme – un quota, un domaine bloqué, une défaillance des serveurs de noms – portent le même objet error, mais sans champ status. Branchez votre code sur error.code, qui est stable, plutôt que sur la présence de status. Par contrat, les messages sont en anglais sur toutes les instances et dans toutes les langues ; error.code est la partie exploitable par une machine.
Identifiants publics
Chaque ressource est identifiée par un id opaque (par exemple xK9mQ2), utilisé dans les chemins d’URL. Les identifiants numériques de la base de données ne sont jamais exposés ni acceptés.
Pagination des listes
Les points de terminaison de liste qui renvoient des résultats paginés acceptent les paramètres de requête suivants :
| Paramètre | Type de paramètre | Par défaut | Description du paramètre |
|---|---|---|---|
page |
integer | 1 | Numéro de page (minimum 1) |
per_page |
integer | 25 | Éléments par page (1-100) |
Limitation de débit
Les requêtes sont comptées par compte, et non par clé, dans une fenêtre glissante d’une minute ; le budget dépend de votre plan – le comparatif des plans, sur la page des tarifs, en donne le chiffre. Les requêtes non authentifiées sont comptées par adresse IP. Chaque réponse indique l’état courant de votre budget, vous n’avez donc rien à deviner :
| En-tête | Signification |
|---|---|
X-RateLimit-Limit | Nombre de requêtes autorisées dans la fenêtre. |
X-RateLimit-Remaining | Nombre de requêtes restantes dans la fenêtre en cours. |
X-RateLimit-Reset | Horodatage Unix auquel la fenêtre est réinitialisée. |
Retry-After | Nombre de secondes à attendre, envoyé sur une réponse 429. |
Pour les traitements en masse – import d’une grande zone, réconciliation de centaines d’enregistrements – lisez X-RateLimit-Remaining et mettez le traitement en pause avant que ce compteur n’atteigne zéro, plutôt que de réessayer après une réponse 429. Le CLI le fait pour vous.
Quelques opérations disposent de leur propre fenêtre, plus longue, en plus du quota de requêtes : une zone peut être déplacée vers un autre groupe de serveurs de noms trois fois par jour. La réponse indique quelle limite a été atteinte.
Zones DNS
Gérez les zones DNS. Nécessite zones.read pour les opérations de lecture et zones.write pour les opérations d’écriture.
GET /v1/zones
Liste toutes les zones de l’utilisateur authentifié.
Paramètres de requête
search– filtrer les zones par nompage,per_page– paramètres de pagination
Champs de réponse
Champs : id, name, type (master/slave), status, ns_group, created_at, updated_at
GET /v1/zones/{id}
Obtenir des informations détaillées sur une zone spécifique, y compris les données SOA, les serveurs de noms et le nombre d’enregistrements.
Champs de réponse supplémentaires
records_count, soa (primary_ns, admin_email, serial, refresh, retry, expire, minimum), nameservers (tableau), ns_group (id, slug, name)
POST /v1/zones
Créer une nouvelle zone DNS. Refusée avec un code 409 si le domaine existe déjà ou chevauche la zone d’un autre compte, et avec un code 422 si la limite de zones du plan est atteinte ou si le domaine est bloqué.
Corps de la requête (JSON)
{
"name": "example.com",
"type": "master",
"ns_group": "eu"
}
Une zone secondaire (slave) à la place :
{
"name": "example.com",
"type": "slave",
"master_ip": "203.0.113.10"
}
name(obligatoire) – nom de domainetype–"master"(par défaut) ou"slave"ns_group– groupe NS auquel assigner la zone (optionnel, utilise le groupe par défaut si omis)master_ip– obligatoire pour les zones secondaires ; doit être une adresse IP publique valide
Renvoie 201 Created avec l’objet zone.
PATCH /v1/zones/{id}
Déplace la zone vers un autre groupe de serveurs de noms. C’est le seul PATCH de l’API. Portée : zones.write.
Corps de la requête (JSON)
{
"ns_group": "eu"
}
Renvoie la zone dans son état après le déplacement, sous la même forme que GET /v1/zones/{id}. Le groupe est désigné par son slug – les valeurs que GET /v1/ns-groups renvoie pour votre compte ; toute autre valeur est rejetée avec un code 400.
La zone continue de répondre pendant toute l’opération : les nouveaux serveurs de noms sont provisionnés avant la réponse et les précédents continuent de servir le temps que les résolveurs se rafraîchissent. Mettez ensuite à jour la délégation chez votre registrar. Une zone peut être déplacée trois fois par jour ; au-delà, l’appel renvoie 429.
DELETE /v1/zones/{id}
Supprimer une zone et tous ses enregistrements.
Renvoie 204 No Content en cas de succès.
GET /v1/zones/{id}/export
Exporter une zone au format BIND ou en JSON structuré.
Paramètres de requête
format–"bind"(par défaut) renvoie le texte du fichier de zone BIND ;"json"renvoie un tableau structuré d’enregistrements avec name, type, content et ttl
Enregistrements
Gérez les enregistrements DNS au sein d’une zone. Tous les points de terminaison des enregistrements sont imbriqués sous une zone. Nécessite records.read pour les opérations de lecture et records.write pour les opérations d’écriture.
GET /v1/zones/{zoneId}/records
Liste tous les enregistrements d’une zone.
Paramètres de requête
type– filtrer par type d’enregistrement (ex. :A,CNAME,MX)name– filtrer par nom d’enregistrement (correspondance de sous-chaîne)search– rechercher dans le nom et le contenu
Champs de réponse
id, name, type, content, ttl, disabled, fields (champs analysés spécifiques au type)
GET /v1/zones/{zoneId}/records/{recordId}
Obtenir un enregistrement unique par son identifiant.
POST /v1/zones/{zoneId}/records
Créer un nouvel enregistrement DNS.
Corps de la requête (JSON)
{
"type": "A",
"name": "www",
"ttl": 3600,
"content": "93.184.216.34"
}
type(obligatoire) – type d’enregistrement (A, AAAA, CNAME, MX, TXT, SRV, CAA, NS, PTR, ALIAS, DNAME, DS, TLSA)name– nom de l’enregistrement relatif à la zone (par défaut :@pour l’apex de la zone)ttl– durée de vie en secondes (par défaut : 3600)content– valeur de l’enregistrement (IP pour A/AAAA, nom d’hôte pour CNAME/NS/PTR, texte pour TXT, serveur de messagerie pour MX)
Champs spécifiques au type
- MX :
priority(par défaut : 10) - SRV :
priority,weight,port - CAA :
flags(par défaut : 0),tag(par défaut : "issue") - DS :
keytag,algorithm,digest_type - TLSA :
usage,selector,matching_type
Pour MX, SRV, CAA, DS et TLSA, content ne porte que la valeur principale – le serveur de messagerie, la cible SRV, le domaine de l’autorité de certification, l’empreinte hexadécimale seule – tout le reste passe par les champs ci-dessus. L’envoi de données d’enregistrement déjà assemblées (par exemple 0 issue "letsencrypt.org" comme contenu CAA) est rejeté avec un code 400 qui nomme le champ.
Le TTL appartient à l’ensemble d’enregistrements. Omettez ttl lorsque vous ajoutez une valeur à un nom qui existe déjà : le TTL en place est conservé. Si vous en envoyez un, il s’applique à toutes les valeurs portant ce nom. Pour un nom entièrement nouveau, la valeur par défaut est de 3600 secondes.
Renvoie 201 Created avec l’objet enregistrement.
PUT /v1/zones/{zoneId}/records/{recordId}
Mettre à jour un enregistrement existant. N’incluez que les champs que vous souhaitez modifier ; les champs omis conservent leurs valeurs actuelles.
{
"content": "93.184.216.35",
"ttl": 7200
}
Renvoie 200 OK avec l’objet enregistrement mis à jour. Remarque : l’identifiant de l’enregistrement peut changer après une mise à jour car il est calculé à partir du nom, du type et du contenu de l’enregistrement.
DELETE /v1/zones/{zoneId}/records/{recordId}
Supprimer un enregistrement de la zone.
Renvoie 204 No Content en cas de succès.
DNSSEC
Gérez DNSSEC pour vos zones. Nécessite zones.read pour consulter le statut et zones.write pour activer ou désactiver.
GET /v1/zones/{id}/dnssec
Obtenir le statut DNSSEC d’une zone, y compris les clés et les enregistrements DS.
Champs de réponse
enabled (booléen), keys (tableau d’enregistrements DNSKEY), ds_records (tableau d’enregistrements DS à configurer auprès du bureau d’enregistrement)
POST /v1/zones/{id}/dnssec/enable
Activer DNSSEC pour une zone. Génère automatiquement les clés de signature.
Renvoie le statut DNSSEC avec les clés générées et les enregistrements DS.
POST /v1/zones/{id}/dnssec/disable
Désactiver DNSSEC pour une zone. Supprime toutes les clés de signature.
Renvoie {"enabled": false, "keys": [], "ds_records": []}.
Groupes NS
Liste les groupes de serveurs de noms disponibles. Utilisez l’id d’un groupe comme ns_group lors de la création d’une zone. Toute clé d’API valide peut lire cet endpoint.
GET /v1/ns-groups
Liste les groupes de serveurs de noms actifs.
Champs de réponse par groupe
id, name, slug
Compte
Consulter les informations du compte et gérer les clés API.
GET /v1/account
Obtenir les informations du compte actuel, y compris les détails de l’abonnement.
Champs de réponse
Champs : id (UUID), email, name, role, status, language, timezone, created_at
subscription – objet avec plan, billing_cycle, status, current_period_start, current_period_end (ou null si aucun abonnement)
GET /v1/account/api-keys
Liste toutes les clés API de l’utilisateur authentifié.
Champs de réponse par clé
id, name, key_prefix (8 premiers caractères), permissions (tableau), last_used_at, expires_at, created_at
POST /v1/account/api-keys
Créer une nouvelle clé API.
Corps de la requête (JSON)
{
"name": "CI/CD Pipeline",
"permissions": ["zones.read", "records.read", "records.write"],
"expires_at": "2027-01-01"
}
name(obligatoire) – nom lisible (max. 255 caractères)permissions(obligatoire) – tableau de permissions (au moins une requise) :zones.read,zones.write,records.read,records.write,webhooks.read,webhooks.writeexpires_at– date d’expiration optionnelle (ISO 8601 ouYYYY-MM-DD) ; doit être dans le futur
La réponse inclut la clé API complète dans le champ
key. C’est la seule fois où la clé complète est renvoyée. Stockez-la en lieu sûr.
Renvoie 201 Created avec les détails de la clé, y compris la valeur complète de la key.
DELETE /v1/account/api-keys/{id}
Révoquer (supprimer définitivement) une clé API.
Renvoie 204 No Content en cas de succès.
Facturation
Consulter l’abonnement, les plans et les factures. Ces points de terminaison sont en lecture seule.
GET /v1/billing/subscription
Obtenir les détails de l’abonnement actuel. Renvoie null si aucun abonnement actif.
Champs de réponse
Champs : id, plan, billing_cycle, status, current_period_start, current_period_end, created_at
GET /v1/billing/plans
Liste tous les plans disponibles avec les tarifs et les fonctionnalités.
Champs de réponse par plan
id, name, slug, description, price_monthly, price_yearly, currency, max_domains, max_records, features (tableau)
GET /v1/billing/invoices
Liste les factures de l’utilisateur authentifié, les plus récentes d’abord.
Paramètres de requête
status– filtrer par statut (draft,issued,sent,void)page,per_page– paramètres de pagination
GET /v1/billing/invoices/{id}
Obtient une facture via son <code>id</code>.
Champs de réponse
Champs : id, number, status, amount (TTC), net_amount (HT), tax_amount, tax_rate, currency, issued_at, created_at. Les montants sont des chaînes décimales simples.
Webhooks
Gérez les abonnements webhook sortants pour recevoir des notifications en temps réel sur les modifications de zones et d’enregistrements. Nécessite webhooks.read pour la lecture et webhooks.write pour créer, modifier ou supprimer.
GET /v1/webhooks
Liste tous les abonnements webhook de l’utilisateur authentifié.
Champs de réponse par webhook
id, url, events (tableau), description, is_active, failure_count, last_triggered_at, created_at
POST /v1/webhooks
Crée un abonnement webhook.
Corps de la requête (JSON)
{
"url": "https://example.com/webhook",
"events": ["zone.created", "record.created"],
"description": "Production webhook"
}
url(obligatoire) – endpoint HTTPS qui recevra les charges utiles des événementsevents(obligatoire) – tableau des types d’événements auxquels s’abonnerdescription– libellé lisible facultatif
La réponse inclut un
secretpour vérifier les signatures de webhook (HMAC). C’est la seule fois où le secret est renvoyé. Conservez-le en lieu sûr.
Renvoie 201 Created avec l’id et le secret du webhook.
GET /v1/webhooks/{id}
Obtient un abonnement webhook avec ses livraisons les plus récentes.
PUT /v1/webhooks/{id}
Met à jour un abonnement webhook. N’incluez que les champs à modifier.
Renvoie 200 OK avec l’objet webhook mis à jour.
DELETE /v1/webhooks/{id}
Supprime un abonnement webhook.
Renvoie 204 No Content en cas de succès.
POST /v1/webhooks/{id}/test
Envoie un événement de test à l’endpoint du webhook pour vérifier qu’il est joignable.
Met en file d’attente une livraison de test avec une charge utile "type": "test".
Vérifier une livraison
Chaque livraison est signée avec le secret renvoyé à la création du webhook et porte quatre en-têtes :
X-NexDNS-Signature: sha256=<hmac>
X-NexDNS-Timestamp: 1785370265
X-NexDNS-Event: record.created
X-NexDNS-Delivery: 42
Recalculez HMAC-SHA256 sur le corps brut exact de la requête avec votre secret, puis comparez le résultat à l’empreinte hexadécimale qui suit sha256=, en temps constant. Une différence signifie que la requête ne vient pas de nous. X-NexDNS-Delivery identifie la tentative : les nouvelles tentatives d’un même événement partagent donc l’id de l’événement, mais pas le numéro de livraison.
Charge utile de la livraison
{
"id": "evt_szpj9u04z8u0",
"type": "record.created",
"created_at": "2026-07-30 00:31:05",
"data": {
"zone": { "name": "example.com" },
"record": { "name": "www.example.com.", "type": "A", "content": "203.0.113.10", "ttl": 3600 }
}
}
Types d’événements disponibles
Abonnez-vous à n’importe quelle combinaison de ces types d’événements :
zone.created, zone.updated, zone.deleted, record.created, record.updated, record.deleted, dnssec.enabled, dnssec.disabled, zone.health.problem, zone.health.resolved
Codes d’erreur
Toutes les erreurs suivent un format cohérent avec un code d’erreur sous forme de chaîne et un message lisible.
| Statut HTTP | Code d’erreur | Description de l’erreur |
|---|---|---|
400 |
validation_error |
Le corps de la requête a échoué à la validation. Vérifiez details pour les erreurs spécifiques aux champs. |
401 |
unauthorized |
Clé API manquante, invalide ou expirée. |
403 |
forbidden |
La clé API n’a pas la permission requise, le plan du compte n’inclut pas l’accès à l’API, ou le plan n’inclut pas la capacité utilisée (par exemple les zones secondaires ou DNSSEC). |
404 |
not_found |
La ressource demandée n’existe pas ou n’est pas accessible par l’utilisateur authentifié. |
409 |
conflict |
La ressource existe déjà (ex. : nom de zone en double). |
422 |
quota_exceeded |
La limite de zones ou d’enregistrements de votre plan est atteinte. |
422 |
domain_blacklisted |
Le domaine figure sur la liste des domaines bloqués et ne peut pas être ajouté. |
429 |
rate_limit_exceeded |
Trop de requêtes. Vérifiez l’en-tête Retry-After. |
500 |
server_error |
Une erreur interne inattendue s’est produite. Veuillez réessayer ou contacter l’assistance si le problème persiste. |
502 |
dns_server_error |
Les serveurs de noms sont temporairement indisponibles. La requête n’a pas été appliquée ; réessayez. |
Exemples de code
Tous les exemples utilisent curl. Remplacez nxd_your_api_key par votre clé API réelle.
Lister vos zones
curl -s "https://api.nexdns.tech/v1/zones" \
-H "Authorization: Bearer nxd_your_api_key"
Créer une zone
curl -s -X POST "https://api.nexdns.tech/v1/zones" \
-H "Authorization: Bearer nxd_your_api_key" \
-H "Content-Type: application/json" \
-d '{"name": "example.com"}'
Ajouter un enregistrement A
curl -s -X POST "https://api.nexdns.tech/v1/zones/{zoneId}/records" \
-H "Authorization: Bearer nxd_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"type": "A",
"name": "www",
"ttl": 3600,
"content": "93.184.216.34"
}'
Ajouter un enregistrement MX
curl -s -X POST "https://api.nexdns.tech/v1/zones/{zoneId}/records" \
-H "Authorization: Bearer nxd_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"type": "MX",
"name": "@",
"ttl": 3600,
"content": "mail.example.com",
"priority": 10
}'
Mettre à jour un enregistrement
curl -s -X PUT "https://api.nexdns.tech/v1/zones/{zoneId}/records/{recordId}" \
-H "Authorization: Bearer nxd_your_api_key" \
-H "Content-Type: application/json" \
-d '{"content": "93.184.216.35", "ttl": 7200}'
Supprimer un enregistrement
curl -s -X DELETE "https://api.nexdns.tech/v1/zones/{zoneId}/records/{recordId}" \
-H "Authorization: Bearer nxd_your_api_key"
Exporter une zone (format BIND)
curl -s "https://api.nexdns.tech/v1/zones/{zoneId}/export" \
-H "Authorization: Bearer nxd_your_api_key"
Activer DNSSEC
curl -s -X POST "https://api.nexdns.tech/v1/zones/{zoneId}/dnssec/enable" \
-H "Authorization: Bearer nxd_your_api_key"
Créer une clé API
curl -s -X POST "https://api.nexdns.tech/v1/account/api-keys" \
-H "Authorization: Bearer nxd_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Read-only key",
"permissions": ["zones.read", "records.read"],
"expires_at": "2027-12-31"
}'
Obtenir les informations du compte
curl -s "https://api.nexdns.tech/v1/account" \
-H "Authorization: Bearer nxd_your_api_key"