API CNF · v1

Une seule API pour c.nf : zones et enregistrements DNS, fichiers personnels, paquets, identifiants enregistrés, recherches de domaines et quelques services publics qui ne demandent aucun compte. Toute opération authentifiée reste limitée au compte dont la clé a fait l’appel.

Vue d’ensemble

La version 1 permet d’effectuer des opérations DNS sur les zones que vous avez revendiquées depuis la gestion DNS. Créez et révoquez des jetons dans Compte → Clés d’API.

La même frontière de confiance que la console. L’API applique le même contrôle de propriété des zones vérifiées que la console. Une zone disponible dans votre compte de console est accessible à votre clé d’API ; toute autre zone renvoie 403 forbidden_zone.
Pour obtenir un catalogue des points de terminaison lisible par machine, demandez GET /v1?format=json ou envoyez Accept: application/json à /v1.

URL de base et gestion des versions

https://api.c.nf/v1

Tous les points de terminaison se trouvent sous /v1. Toute modification incompatible utilisera un nouveau chemin de version majeure. Des champs et points de terminaison rétrocompatibles pourront être ajoutés à la v1 et seront consignés dans le journal des modifications.

Authentification et portées

Toute requête qui lit ou modifie des données de compte doit inclure un jeton Bearer. Les jetons commencent par cnf_, suivi de 32 caractères hexadécimaux.

curl https://api.c.nf/v1/dns/zones \
  -H "Authorization: Bearer cnf_a1b2c3d4e5f60718293a4b5c6d7e8f90"

Les jetons sont stockés sous forme de hachages à sens unique et leur valeur complète n’est affichée qu’à leur création. Si vous perdez un jeton, révoquez-le et créez-en un autre.

Utilisez uniquement l’en-tête Authorization. L’authentification Basic et les jetons placés dans la chaîne de requête ne sont pas acceptés. Un jeton présent dans une URL peut fuiter dans les journaux, les en-têtes Referer et l’historique du navigateur.

Chaque jeton possède des portées. Un jeton sans portée configurée reçoit dns:read par défaut. La portée d’écriture autorise également la lecture.

PortéeAutorisations
dns:read Répertorier les zones et les enregistrements, et consulter un enregistrement précis.
dns:write Lire, créer, modifier et supprimer des enregistrements DNS et des revendications de zone.
* Toutes les portées. À utiliser uniquement si cela est réellement nécessaire.

En cas de portée incompatible, l’API renvoie 403 forbidden_scope et inclut required_scopes ainsi que token_scopes pour faciliter le diagnostic.

Isolation entre utilisateurs

Un jeton Bearer correspond à un seul user_id. Chaque gestionnaire de zone vérifie la revendication validée de cet utilisateur avant toute lecture ou écriture. Il n’existe ni dérogation administrateur, ni mécanisme d’usurpation, ni contournement entre utilisateurs.

Même un jeton doté de * ne peut agir que sur les zones vérifiées de son propre utilisateur. Toute tentative d’utiliser la zone d’un autre compte renvoie 403 forbidden_zone.

Enveloppe de réponse

Réponse réussie

{
  "success": true,
  "data": { "zones": [] },
  "request_id": "req_abc123def456abcd"
}

Réponse d’erreur

{
  "success": false,
  "error": "forbidden_zone",
  "message": "zone not verified for this account (or does not exist)",
  "request_id": "req_abc123def456abcd",
  "zone": "example.com"
}

request_id figure dans chaque réponse et peut être enregistré sans risque dans les journaux côté client.

Codes d’erreur

HTTPCode d’erreurSignification
400 bad_request Un champ obligatoire manque, le corps est mal formé ou une valeur saisie n’est pas valide.
401 unauthorized Le jeton Bearer est absent, non valide ou révoqué.
403 forbidden_scope Le jeton ne possède pas la portée requise.
403 forbidden_zone La zone n’est pas vérifiée pour ce compte, ou elle n’existe pas.
404 not_found La zone, l’enregistrement ou l’utilisateur demandé est introuvable.
405 method_not_allowed Ce point de terminaison ne prend pas en charge cette méthode HTTP.
502 upstream_error Le fournisseur DNS a renvoyé une erreur.

Vérification des zones

Lorsque POST /v1/dns/zones revendique une zone, le serveur choisit l’une des méthodes suivantes :

  1. Vérification instantanée (method: "auto") — Utilisée si aucun autre compte n’a revendiqué la zone. La revendication est immédiatement vérifiée. Les enregistrements ne font autorité qu’après que le propriétaire a dirigé la délégation NS du bureau d’enregistrement vers les serveurs de noms renvoyés.
  2. Vérification TXT — Utilisée pour une revendication contestée. Ajoutez la valeur TXT renvoyée à _cnfdns-verify.<zone>, puis appelez POST /v1/dns/zones/{zone}/verify.
  3. Ancienne vérification NS — Les anciennes revendications en attente peuvent utiliser verify_method: "ns". La vérification compare les réponses NS publiques de la zone avec le jeu de serveurs de noms attendu.
Pourquoi la vérification instantanée est sûre. Les enregistrements stockés par c.nf restent inactifs tant que le propriétaire du domaine ne modifie pas la délégation NS faisant autorité auprès du bureau d’enregistrement. Une première revendication ne suffit pas à elle seule à les publier.
Zones inversées Le même modèle s’applique à in-addr.arpa et ip6.arpa. Revendiquez la zone, obtenez expected_ns, puis transmettez ces cibles de délégation au registre concerné.

La vérification est idempotente. La répéter pour une revendication déjà vérifiée renvoie verified: true sans modifier la revendication.

Types d’enregistrements et limites

Types d’enregistrements pris en charge

A, AAAA, CNAME, MX, TXT, NS, SRV, CAA, PTR, SPF.

priority est obligatoire pour MX et SRV, et ignoré pour les autres types. ttl doit être compris entre 60 et 2 592 000 secondes.

Points de terminaison

Services publics

De petits points d’accès fiables et sans compte : heure, adresse, pays, taux de change et empreintes.

MéthodeCheminPortéeRôle
GET /v1/public/time Public L’heure UTC actuelle au format ISO 8601, RFC 2822 et Unix.
GET /v1/public/timestamp Public L’horodatage Unix actuel, en secondes et en millisecondes.
GET /v1/public/ip Public L’adresse d’où provient cette requête.
GET /v1/public/geo Public Le pays d’où provient cette requête, tel que déterminé en périphérie.
GET /v1/public/fx Public Taux de change pour une devise de base, actualisés toutes les heures.
GET /v1/public/hash Public Calculer l’empreinte d’une chaîne avec SHA-256 ou un autre algorithme pris en charge.

Compte

À qui appartient un jeton et ce qu’il permet de faire.

MéthodeCheminPortéeRôle
GET /v1/account/me N’importe quel jeton Le compte du jeton, ses portées et les points d’accès qu’elles ouvrent.
GET /v1/account/sessions account:read Toutes les sessions de navigateur actuellement connectées à ce compte.
POST /v1/account/sessions/revoke account:write Déconnecter une session.
POST /v1/account/sessions/revoke-all account:write Déconnecter toutes les sessions.
POST /v1/account/profile account:write Changer votre nom affiché.

DNS

Revendiquez un domaine, prouvez que vous le contrôlez, puis gérez ses enregistrements.

MéthodeCheminPortéeRôle
GET /v1/dns/zones dns:read Toutes les zones revendiquées par ce compte.
POST /v1/dns/zones dns:write Revendiquer une zone. Sans conflit, c’est immédiat ; sinon, un défi TXT est émis.
GET /v1/dns/zones/{zone} dns:read Une zone, avec ses instructions de vérification si elle est encore en attente.
POST /v1/dns/zones/{zone}/verify dns:write Lancer la vérification et marquer la zone comme vérifiée si elle correspond.
DELETE /v1/dns/zones/{zone} dns:write Abandonner une revendication. Les enregistrements ne sont pas touchés.
GET /v1/dns/zones/{zone}/records dns:read Tous les enregistrements d’une zone vérifiée.
POST /v1/dns/zones/{zone}/records dns:write Ajouter un enregistrement à une zone vérifiée.
GET /v1/dns/zones/{zone}/records/{id} dns:read Un enregistrement précis.
PATCH /v1/dns/zones/{zone}/records/{id} dns:write Modifier une partie d’un enregistrement ; ce que vous omettez garde sa valeur.
DELETE /v1/dns/zones/{zone}/records/{id} dns:write Supprimer un enregistrement.

Identifiants

Le coffre d’identifiants privé derrière l’outil du même nom.

MéthodeCheminPortéeRôle
GET /v1/cred cred:read cred:write Identifiants enregistrés, filtrables par plateforme.
POST /v1/cred cred:write Enregistrer un identifiant.

Fichiers

Stockage personnel : lister, envoyer, modifier, partager et supprimer.

MéthodeCheminPortéeRôle
GET /v1/files files:read files:write Vos fichiers, les plus récents d’abord.
GET /v1/files/{id} files:read files:write Un fichier, avec son lien de partage s’il en a un.
GET /v1/files/download files:read files:write Télécharger un fichier.
POST /v1/files/upload files:write Envoyer un fichier.
POST /v1/files/update files:write Modifier les informations d’un fichier, y compris son partage.
POST /v1/files/rename files:write Changer le nom sous lequel un fichier est téléchargé.
POST /v1/files/delete files:write Supprimer un fichier et son contenu.
POST /v1/files/upload-chunk files:write Envoyer une partie d’un envoi volumineux.
POST /v1/files/upload-finalize files:write Assembler les parties en un fichier.

CDN

Mise en cache en périphérie et trafic de vos fichiers partagés.

MéthodeCheminPortéeRôle
GET /v1/cdn/stats cdn:read Réglages de cache et nombre de requêtes pour vos fichiers partagés.
POST /v1/cdn/config cdn:write Définir la durée de conservation en périphérie, ou cesser de servir le fichier.
POST /v1/cdn/purge cdn:write Retirer immédiatement un fichier du cache de périphérie.

Transfert de SMS

Les messages relayés depuis votre téléphone, et les clés qui l’autorisent.

MéthodeCheminPortéeRôle
GET /v1/sms/messages sms:read Messages transférés vers votre compte.
GET /v1/sms/keys sms:read sms:write Les clés de transfert utilisées par vos appareils.
POST /v1/sms/keys sms:write Émettre une clé de transfert. Cinq au maximum.
DELETE /v1/sms/keys sms:write Révoquer une clé de transfert.

Sites statiques

Envoyez un zip, servez un site.

MéthodeCheminPortéeRôle
GET /v1/sites sites:read sites:write Vos sites statiques, du plus récemment déployé au plus ancien.
POST /v1/sites/deploy sites:write Déployer un zip comme site.
POST /v1/sites/delete sites:write Supprimer un site et ses fichiers.

Déploiements

Vos points d’accès formulaire, webhook et lien court déployés.

MéthodeCheminPortéeRôle
GET /v1/deployments deploy:read deploy:write Vos déploiements et leur nombre d’utilisations.
POST /v1/deployments/toggle deploy:write Activer ou désactiver un déploiement.
POST /v1/deployments/delete deploy:write Supprimer un déploiement.

Domaines

Votre portefeuille de domaines et ses données d’enregistrement.

MéthodeCheminPortéeRôle
GET /v1/domains domain:read domain:write Vos domaines, les plus proches de l’expiration d’abord.
POST /v1/domains/whois-sync domain:write Actualiser un domaine depuis sa fiche de registre.

Paquets

Publiez des versions et consultez leurs versions et totaux de téléchargement.

MéthodeCheminPortéeRôle
GET /v1/packages packages:read packages:write Vos paquets, avec le nombre de versions et le total des téléchargements.
GET /v1/packages/{slug} packages:read packages:write Un paquet, avec toutes ses versions et tous ses artefacts.
POST /v1/packages/publish packages:write Publier une version, en créant le paquet s’il est nouveau.
POST /v1/packages/update packages:write Modifier les informations d’un paquet.
POST /v1/packages/delete packages:write Supprimer un paquet, toutes ses versions et tous ses artefacts.

WHOIS

Données d’enregistrement d’un domaine, mises en cache et partagées avec les outils de domaines.

MéthodeCheminPortéeRôle
GET /v1/whois whois:read Informations d’enregistrement d’un domaine.

Pour les agents IA

Orientez un agent vers /v1/ai pour un résumé conçu pour être collé tel quel dans une invite, ou vers /v1/ai?format=json pour les mêmes points d’accès sous forme de définitions d’outils. /v1/openapi.json est le contrat OpenAPI 3.1 complet et /llms.txt la carte destinée aux robots. Les quatre sont générés depuis la même table de routes que cette page : aucun ne peut décrire un point d’accès inexistant.

curl https://api.c.nf/v1/ai
curl https://api.c.nf/v1/ai?format=json
curl https://api.c.nf/v1/openapi.json

Champs de requête

Créer une revendication de zone

ChampTypeObligationNotes
zone string Obligatoire Zone apex, convertie en minuscules par le serveur. Les zones inversées sont acceptées.

Créer un enregistrement DNS

ChampTypeObligationNotes
type string Obligatoire A, AAAA, CNAME, MX, TXT, NS, SRV, CAA, PTR ou SPF.
host string Facultatif Sous-domaine uniquement. Utilisez une chaîne vide ou @ pour l’apex.
value string Obligatoire Contenu de l’enregistrement, par exemple une adresse IP, un nom cible ou une valeur textuelle.
ttl integer Facultatif Entre 60 et 2 592 000 secondes. La valeur par défaut est 3 600.
priority integer Facultatif Obligatoire pour MX et SRV ; ignoré pour les autres types.

Modifier un enregistrement DNS

ChampTypeObligationNotes
host string Facultatif Sous-domaine de remplacement.
value string Facultatif Ne peut pas être vide après fusion avec l’enregistrement actuel.
ttl integer Facultatif Entre 60 et 2 592 000 secondes.
priority integer Facultatif Utilisé uniquement pour MX et SRV.
Le type d’enregistrement ne peut pas être modifié avec PATCH. Supprimez l’enregistrement et créez-en un autre pour changer son type.

Exemples

Répertorier les zones

curl -H "Authorization: Bearer $CNF_TOKEN" \
  https://api.c.nf/v1/dns/zones

Revendiquer une zone

curl -X POST https://api.c.nf/v1/dns/zones \
  -H "Authorization: Bearer $CNF_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"zone":"example.com"}'

Vérifier une zone

curl -X POST https://api.c.nf/v1/dns/zones/example.com/verify \
  -H "Authorization: Bearer $CNF_TOKEN"

Créer un enregistrement

curl -X POST https://api.c.nf/v1/dns/zones/example.com/records \
  -H "Authorization: Bearer $CNF_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"type":"A","host":"api","value":"192.0.2.10"}'

Démarrage rapide

  1. Créez une clé d’API avec dns:write dans Compte → Clés d’API, puis copiez-la lorsqu’elle s’affiche.
  2. Stockez le jeton dans une variable d’environnement protégée sur votre machine.
  3. Appelez GET /v1/account/me pour vérifier le jeton et ses portées.
  4. Revendiquez une zone. La réponse indique si la vérification est instantanée, fondée sur TXT ou fondée sur l’ancienne méthode NS.
  5. Effectuez la preuve DNS renvoyée lorsqu’elle est requise, puis appelez le point de terminaison de vérification.
  6. Ne créez, consultez, modifiez ou supprimez des enregistrements qu’une fois la revendication vérifiée.

Journal des modifications

v1.1.0 — gestion des zones

  • Ajout des revendications de zone par API, avec vérification instantanée ou par TXT.
  • Ajout de l’état d’une zone et de points de terminaison de vérification idempotents.
  • Ajout de la révocation d’une revendication sans suppression implicite des enregistrements.
  • Ajout des filtres « vérifiées », « en attente » et « toutes » à la liste des zones.

v1.0.0 — version initiale

  • Ajout de l’authentification par jeton Bearer et de l’isolation des zones entre utilisateurs.
  • Ajout des portées de lecture et d’écriture.
  • Ajout des points de terminaison de compte, de liste des zones et de gestion des enregistrements.
  • Ajout d’une enveloppe de réponse cohérente comprenant un identifiant de requête.