# Référence API des domaines DNSHE
English · 简体中文 · 繁體中文 · 日本語 · Русский · Bahasa Indonesia · Deutsch · Français · 한국어 · العربية
[Retour à la présentation](../README_FR.md) Enregistrez des domaines, gérez le DNS, actualisez les IP dynamiques et automatisez les opérations du compte. Les exemples utilisent le serveur API DNSHE et des identifiants fictifs. Remplacez noms, ID et clés par vos ressources. ## Sommaire - [Premiers pas](#premiers-pas) - [Authentification et conventions](#authentification-et-conventions) - [Gestion des domaines](#gestion-des-domaines) - [Gestion des enregistrements DNS](#gestion-des-enregistrements-dns) - [DNS dynamique (DDNS)](#dns-dynamique-ddns) - [Gestion des clés API](#gestion-des-clés-api) - [Dons de domaines](#dons-de-domaines) - [Quotas](#quotas) - [WHOIS](#whois) - [Erreurs et limites de requêtes](#erreurs-et-limites-de-requêtes) - [Exemples de clients](#exemples-de-clients) - [Sécurité et questions fréquentes](#sécurité-et-questions-fréquentes) - [Assistance](#assistance) ## Premiers pas ```text https://api005.dnshe.com/index.php?m=domain_hub ``` L'URL de base contient déjà `m=domain_hub` ; ajoutez les paramètres avec `&`. Requêtes et réponses utilisent JSON, sauf les paramètres de requête GET. La limite générale est de 60 requêtes/minute par défaut, configurable. Les fonctions dépendent du compte et du déploiement. Les commandes utilisent Bash/sh ; définissez d'abord ces variables d'environnement. ```bash export DNSHE_API_KEY='replace-with-your-api-key' export DNSHE_API_SECRET='replace-with-your-api-secret' export DNSHE_DDNS_TOKEN='replace-with-your-ddns-token' ``` ## Authentification et conventions Créez la première clé dans l'espace client → [Gérer les domaines](https://my.dnshe.com/index.php?m=domain_hub) → Gestion API. Utilisez les en-têtes `X-API-Key` et `X-API-Secret` ; les identifiants dans l'URL ou le corps sont désactivés. Les paramètres GET vont dans l'URL, les écritures dans un corps JSON avec `Content-Type: application/json`. `endpoint` sélectionne la ressource, `action` l'opération. `quota` et `whois` n'ont pas besoin d'`action`. DDNS utilise un jeton distinct. ## Gestion des domaines ### 1.1 Lister les domaines `GET` · `endpoint=subdomains` · `action=list` #### Paramètres - `page` — `integer`; facultatif; valeur par défaut / plage: `1`. - `cursor_id` — `integer`; facultatif. - `per_page` — `integer`; facultatif; valeur par défaut / plage: `200; 1–500`. - `include_total` — `boolean`; facultatif; valeur par défaut / plage: `false`. - `search` — `string`; facultatif. - `rootdomain` — `string`; facultatif. - `status` — `string`; facultatif; valeur par défaut / plage: `active | suspended | expired`. - `created_from / created_to` — `string`; facultatif; valeur par défaut / plage: `YYYY-MM-DD`. - `sort_by` — `string`; facultatif; valeur par défaut / plage: `id`. - `sort_dir` — `string`; facultatif; valeur par défaut / plage: `desc; asc | desc`. - `fields` — `string`; facultatif; valeur par défaut / plage: `all`. `page` est un numéro compatible commençant à 1. Pour les grandes collections, commencez avec `cursor_id=0`, puis utilisez `pagination.next_cursor_id` tant que `pagination.has_more=true` ; arrêtez à false. Le curseur trie par ID sans OFFSET. `per_page` : défaut 200, maximum 500, point de départ 50–100. `include_total=1` ajoute un comptage potentiellement coûteux. `search` cherche le préfixe ou domaine racine ; `rootdomain`, `status`, `created_from`, `created_to` filtrent. Dates : YYYY-MM-DD. `sort_by` : `id`, `created_at`, `updated_at`, `expires_at`, `subdomain` ; `sort_dir` : `asc` ou `desc`. `fields` est une sélection séparée par des virgules ou `all` : `id`, `subdomain`, `rootdomain`, `full_domain`, `status`, `created_at`, `updated_at`, `expires_at`, `never_expires`, `cloudflare_zone_id`, `provider_account_id`. Toute sélection inclut `id`. `count` décrit la collection retournée, pas forcément tous les résultats. #### Exemples de requêtes ```bash curl --fail-with-body --silent --show-error --max-time 30 -X GET "https://api005.dnshe.com/index.php?m=domain_hub&endpoint=subdomains&action=list" \ -H "X-API-Key: ${DNSHE_API_KEY}" \ -H "X-API-Secret: ${DNSHE_API_SECRET}" ``` ```bash curl --fail-with-body --silent --show-error --max-time 30 -X GET "https://api005.dnshe.com/index.php?m=domain_hub&endpoint=subdomains&action=list&cursor_id=0&per_page=100&fields=id,subdomain,rootdomain,status" \ -H "X-API-Key: ${DNSHE_API_KEY}" \ -H "X-API-Secret: ${DNSHE_API_SECRET}" ``` ```bash curl --fail-with-body --silent --show-error --max-time 30 -X GET "https://api005.dnshe.com/index.php?m=domain_hub&endpoint=subdomains&action=list&search=test&rootdomain=de5.net&status=active&sort_by=expires_at&sort_dir=asc&per_page=50" \ -H "X-API-Key: ${DNSHE_API_KEY}" \ -H "X-API-Secret: ${DNSHE_API_SECRET}" ``` #### Exemples de réponses ```json { "success": true, "count": 2, "subdomains": [ { "id": 1, "subdomain": "test", "rootdomain": "de5.net", "full_domain": "test.de5.net", "status": "active", "created_at": "2025-10-19 10:00:00", "updated_at": "2025-10-19 10:00:00" }, { "id": 2, "subdomain": "api", "rootdomain": "de5.net", "full_domain": "api.de5.net", "status": "active", "created_at": "2025-10-19 11:00:00", "updated_at": "2025-10-19 11:00:00" } ] } ``` ```json { "success": true, "count": 1, "subdomains": [ { "id": 901, "subdomain": "test", "rootdomain": "de5.net", "full_domain": "test.de5.net", "status": "active" } ], "pagination": { "mode": "cursor", "page": 1, "per_page": 100, "has_more": true, "cursor_id": 0, "next_cursor_id": 901 } } ``` ### 1.2 Enregistrer un domaine `POST` · `endpoint=subdomains` · `action=create` #### Paramètres - `subdomain` — `string`; obligatoire. - `domain` — `string`; obligatoire. `subdomain` est le préfixe, par exemple `myapp` ; `domain` la racine disponible, par exemple `de5.net`. L'enregistrement utilise `action=create` et `domain`. Le champ de réponse et filtre `rootdomain` ne servent pas à enregistrer. Disponibilité et quotas s'appliquent. #### Exemples de requêtes ```bash curl --fail-with-body --silent --show-error --max-time 30 -X POST "https://api005.dnshe.com/index.php?m=domain_hub&endpoint=subdomains&action=create" \ -H "X-API-Key: ${DNSHE_API_KEY}" \ -H "X-API-Secret: ${DNSHE_API_SECRET}" \ -H "Content-Type: application/json" \ -d '{ "subdomain": "myapp", "domain": "de5.net" }' ``` #### Exemples de réponses ```json { "success": true, "message": "Subdomain registered successfully", "subdomain_id": 3, "full_domain": "myapp.de5.net" } ``` ### 1.3 Détails du domaine `GET` · `endpoint=subdomains` · `action=get` #### Paramètres - `subdomain_id` — `integer`; obligatoire. Utilisez l'ID d'un domaine appartenant au compte authentifié. La réponse contient le domaine, `dns_records` et `dns_count`. #### Exemples de requêtes ```bash curl --fail-with-body --silent --show-error --max-time 30 -X GET "https://api005.dnshe.com/index.php?m=domain_hub&endpoint=subdomains&action=get&subdomain_id=1" \ -H "X-API-Key: ${DNSHE_API_KEY}" \ -H "X-API-Secret: ${DNSHE_API_SECRET}" ``` #### Exemples de réponses ```json { "success": true, "subdomain": { "id": 1, "subdomain": "test", "rootdomain": "de5.net", "full_domain": "test.de5.net", "status": "active", "created_at": "2025-10-19 10:00:00", "updated_at": "2025-10-19 10:00:00" }, "dns_records": [ { "id": 1, "name": "test.de5.net", "type": "A", "content": "203.0.113.10", "ttl": 600, "priority": null, "status": "active", "created_at": "2025-10-19 10:05:00" } ], "dns_count": 1 } ``` ### 1.4 Supprimer un domaine `POST / DELETE` · `endpoint=subdomains` · `action=delete` #### Paramètres - `subdomain_id` — `integer`; obligatoire. Supprime le domaine possédé et ses enregistrements DNS. `dns_records_deleted` indique le nombre supprimé. Vérifiez l'ID avant l'envoi. #### Exemples de requêtes ```bash curl --fail-with-body --silent --show-error --max-time 30 -X POST "https://api005.dnshe.com/index.php?m=domain_hub&endpoint=subdomains&action=delete" \ -H "X-API-Key: ${DNSHE_API_KEY}" \ -H "X-API-Secret: ${DNSHE_API_SECRET}" \ -H "Content-Type: application/json" \ -d '{ "subdomain_id": 1 }' ``` #### Exemples de réponses ```json { "success": true, "message": "Subdomain deleted successfully", "subdomain_id": 1, "full_domain": "test.de5.net", "dns_records_deleted": 4 } ``` ### 1.5 Renouveler un domaine `POST / PUT` · `endpoint=subdomains` · `action=renew` #### Paramètres - `subdomain_id` — `integer`; obligatoire. Le renouvellement gratuit normal DNSHE reste gratuit : `charged_amount=0` dans l'exemple. Le plugin générique peut configurer une récupération payante ; vérifiez l'état et les règles de la console pendant cette période. Lisez `previous_expires_at`, `new_expires_at`, `never_expires`, `remaining_days`, `charged_amount` dans la réponse. Échecs possibles : HTTP 403 `renewal disabled`, `redemption period requires administrator`, `renewal window expired` ; HTTP 422 `renewal_not_yet_available` ; HTTP 402 `insufficient balance for redemption renewal` ; HTTP 404 pour un domaine absent ou appartenant à un autre compte. Vérifiez la fenêtre ou contactez l'assistance, sans boucle de relance immédiate. #### Exemples de requêtes ```bash curl --fail-with-body --silent --show-error --max-time 30 -X POST "https://api005.dnshe.com/index.php?m=domain_hub&endpoint=subdomains&action=renew" \ -H "X-API-Key: ${DNSHE_API_KEY}" \ -H "X-API-Secret: ${DNSHE_API_SECRET}" \ -H "Content-Type: application/json" \ -d '{ "subdomain_id": 3 }' ``` #### Exemples de réponses ```json { "success": true, "message": "Subdomain renewed successfully", "subdomain_id": 3, "subdomain": "myapp", "previous_expires_at": "2027-05-01 00:00:00", "new_expires_at": "2028-05-01 00:00:00", "renewed_at": "2027-04-30 00:00:00", "never_expires": 0, "status": "active", "remaining_days": 367, "charged_amount": 0 } ``` ## Gestion des enregistrements DNS ### 2.1 Lister les enregistrements DNS `GET` · `endpoint=dns_records` · `action=list` #### Paramètres - `subdomain_id` — `integer`; obligatoire. Préférez l'`id` du module retourné par la liste/création ; les nouveaux ID publics ont 15 chiffres. `record_id` est l'identifiant du fournisseur DNS. Modification/suppression : au moins un ; les deux doivent désigner le même enregistrement, sinon `dns_record_identifier_mismatch`. Les anciens ID internes restent compatibles. La compatibilité de `record_id` numérique est documentée au moins jusqu'au 2027-06-12 ; utilisez désormais `id` pour le module. #### Exemples de requêtes ```bash curl --fail-with-body --silent --show-error --max-time 30 -X GET "https://api005.dnshe.com/index.php?m=domain_hub&endpoint=dns_records&action=list&subdomain_id=1" \ -H "X-API-Key: ${DNSHE_API_KEY}" \ -H "X-API-Secret: ${DNSHE_API_SECRET}" ``` #### Exemples de réponses ```json { "success": true, "count": 2, "records": [ { "id": 1, "record_id": "5a0ce6c4d1d4c71bc5e60a2a2a0e4997", "name": "test.de5.net", "type": "A", "content": "203.0.113.10", "ttl": 600, "priority": null, "line": null, "proxied": false, "status": "active", "created_at": "2025-10-19 10:05:00", "updated_at": "2025-10-19 10:05:00" }, { "id": 2, "name": "www.test.de5.net", "type": "CNAME", "content": "test.de5.net", "ttl": 600, "priority": null, "proxied": false, "status": "active", "created_at": "2025-10-19 10:10:00" } ] } ``` ### 2.2 Créer un enregistrement DNS `POST` · `endpoint=dns_records` · `action=create` #### Paramètres - `subdomain_id` — `integer`; obligatoire. - `type` — `string`; obligatoire. - `name` — `string`; facultatif; valeur par défaut / plage: `@`. - `content` — `string`; facultatif. - `ttl` — `integer`; facultatif; valeur par défaut / plage: `600`. - `priority` — `integer`; facultatif; valeur par défaut / plage: `MX: 10; SRV: 0`. - `line` — `string`; facultatif. - `record_weight / weight` — `integer`; facultatif. - `record_port / port` — `integer`; facultatif; valeur par défaut / plage: `1–65535`. - `record_target / target` — `string`; facultatif. - `caa_flag` — `integer`; facultatif; valeur par défaut / plage: `0; 0–255`. - `caa_tag` — `string`; facultatif; valeur par défaut / plage: `issue; 1–15 [A-Za-z0-9]`. - `caa_value` — `string`; facultatif. `type` accepte A, AAAA, CNAME, MX, TXT, NS, SRV, CAA. `name` est relatif au domaine enregistré ; absent, vide ou `@` désigne le domaine lui-même. Un nom complet est refusé ; `*` est autorisé uniquement dans l'étiquette la plus à gauche. `content` est obligatoire sauf construction par SRV/CAA structuré. Défauts : `ttl` 600 secondes ; `priority` 10 pour MX, 0 pour SRV. SRV : `record_weight`/`weight`, `record_port`/`port` (1–65535), `record_target`/`target` ; cible `.` signifie service indisponible. CAA : `caa_flag` (0–255, défaut 0), `caa_tag` (1–15 caractères alphanumériques, défaut `issue`), `caa_value`. `line` est propre à AliDNS ; les autres fournisseurs refusent une valeur non vide. Les écritures NS peuvent être désactivées par `disable_ns_management`. Après délégation externe, créer/modifier un enregistrement non-NS renvoie `external_dns_delegated`. Suppression d'anciens enregistrements, réconciliation et nettoyage d'expiration restent possibles. #### Exemples de requêtes ```bash curl --fail-with-body --silent --show-error --max-time 30 -X POST "https://api005.dnshe.com/index.php?m=domain_hub&endpoint=dns_records&action=create" \ -H "X-API-Key: ${DNSHE_API_KEY}" \ -H "X-API-Secret: ${DNSHE_API_SECRET}" \ -H "Content-Type: application/json" \ -d '{ "subdomain_id": 1, "type": "A", "content": "203.0.113.10", "ttl": 600 }' ``` #### Exemples de réponses ```json { "success": true, "message": "DNS record created successfully", "id": 738492016583241, "record_id": "5a0ce6c4d1d4c71bc5e60a2a2a0e4997" } ``` ### 2.3 Modifier un enregistrement DNS `POST / PUT / PATCH` · `endpoint=dns_records` · `action=modify` #### Paramètres - `id` — `integer`; facultatif. - `record_id` — `string`; facultatif. - `type / name / content` — `string`; facultatif. - `ttl / priority` — `integer`; facultatif. - `line` — `string`; facultatif. - `record_weight / weight` — `integer`; facultatif. - `record_port / port` — `integer`; facultatif. - `record_target / target` — `string`; facultatif. - `caa_flag` — `integer`; facultatif. - `caa_tag / caa_value` — `string`; facultatif. Envoyez `id` ou `record_id` et les champs à modifier. Les règles de nom et SRV/CAA sont identiques à la création. Les identifiants doivent désigner le même enregistrement. La réponse retourne les ID du module et du fournisseur. Préférez l'`id` du module retourné par la liste/création ; les nouveaux ID publics ont 15 chiffres. `record_id` est l'identifiant du fournisseur DNS. Modification/suppression : au moins un ; les deux doivent désigner le même enregistrement, sinon `dns_record_identifier_mismatch`. Les anciens ID internes restent compatibles. La compatibilité de `record_id` numérique est documentée au moins jusqu'au 2027-06-12 ; utilisez désormais `id` pour le module. Les écritures NS peuvent être désactivées par `disable_ns_management`. Après délégation externe, créer/modifier un enregistrement non-NS renvoie `external_dns_delegated`. Suppression d'anciens enregistrements, réconciliation et nettoyage d'expiration restent possibles. #### Exemples de requêtes ```bash curl --fail-with-body --silent --show-error --max-time 30 -X POST "https://api005.dnshe.com/index.php?m=domain_hub&endpoint=dns_records&action=modify" \ -H "X-API-Key: ${DNSHE_API_KEY}" \ -H "X-API-Secret: ${DNSHE_API_SECRET}" \ -H "Content-Type: application/json" \ -d '{ "id": 738492016583241, "type": "A", "content": "203.0.113.20", "ttl": 600 }' ``` #### Exemples de réponses ```json { "success": true, "message": "DNS record updated successfully", "id": 738492016583241, "record_id": "5a0ce6c4d1d4c71bc5e60a2a2a0e4997" } ``` ### 2.4 Supprimer un enregistrement DNS `POST / DELETE` · `endpoint=dns_records` · `action=delete` #### Paramètres - `id` — `integer`; facultatif. - `record_id` — `string`; facultatif. Préférez l'`id` du module retourné par la liste/création ; les nouveaux ID publics ont 15 chiffres. `record_id` est l'identifiant du fournisseur DNS. Modification/suppression : au moins un ; les deux doivent désigner le même enregistrement, sinon `dns_record_identifier_mismatch`. Les anciens ID internes restent compatibles. La compatibilité de `record_id` numérique est documentée au moins jusqu'au 2027-06-12 ; utilisez désormais `id` pour le module. #### Exemples de requêtes ```bash curl --fail-with-body --silent --show-error --max-time 30 -X POST "https://api005.dnshe.com/index.php?m=domain_hub&endpoint=dns_records&action=delete" \ -H "X-API-Key: ${DNSHE_API_KEY}" \ -H "X-API-Secret: ${DNSHE_API_SECRET}" \ -H "Content-Type: application/json" \ -d '{ "id": 1 }' ``` ```bash curl --fail-with-body --silent --show-error --max-time 30 -X POST "https://api005.dnshe.com/index.php?m=domain_hub&endpoint=dns_records&action=delete" \ -H "X-API-Key: ${DNSHE_API_KEY}" \ -H "X-API-Secret: ${DNSHE_API_SECRET}" \ -H "Content-Type: application/json" \ -d '{ "record_id": "5a0ce6c4d1d4c71bc5e60a2a2a0e4997" }' ``` #### Exemples de réponses ```json { "success": true, "message": "DNS record deleted successfully" } ``` ## DNS dynamique (DDNS) `GET / POST / PUT` · `endpoint=ddns` · `action=update` Créez un jeton pour un enregistrement A/AAAA dans Gestion des domaines → DDNS. Envoyez `Authorization: Bearer