DEV Community

Cover image for Comment utiliser les APIs Cloudflare ?
Antoine Laurent
Antoine Laurent

Posted on • Originally published at apidog.com

Comment utiliser les APIs Cloudflare ?

En bref

Les API de Cloudflare permettent de gérer DNS, zones, Workers, sécurité et analyses de façon automatisée. Utilisez les jetons API (recommandé) ou les clés globales pour l'authentification, ciblez api.cloudflare.com/client/v4, et gérez les limites de débit proprement. Pour tester vos intégrations, validez les modifications DNS, les déploiements Workers et automatisez la configuration sur différents environnements avec Apidog.

Essayez Apidog dès aujourd'hui

Introduction

Cloudflare protège et accélère des millions de sites web : DNS, CDN, protection DDoS, WAF, Workers sans serveur, etc. Pour les petites architectures, le dashboard suffit. À grande échelle, automatisez avec l’API.

Presque toutes les fonctions du dashboard sont exposées : création de zones, gestion DNS, déploiement de Workers, règles de page, SSL, analyses, etc.

Les usages typiques de l’API Cloudflare :

  • Infrastructure as code (Terraform, Pulumi)
  • Intégration dans les pipelines CI/CD
  • Gestion multi-zones
  • Mise à jour DNS automatisée
  • Déploiement de Workers

💡 Astuce : Pour tester vos appels API Cloudflare, valider les réponses et documenter vos intégrations, Apidog permet d’enregistrer les configurations de zones sous forme de requêtes réutilisables et partageables avec votre équipe.

Testez les API Cloudflare avec Apidog - gratuit

À la fin de ce guide, vous serez capable de :

  • Vous authentifier avec les jetons API Cloudflare
  • Gérer zones et enregistrements DNS
  • Déployer/gérer les Workers
  • Configurer la sécurité
  • Extraire analyses et logs

Authentification

Cloudflare propose deux méthodes d’authentification. Utilisez les jetons API, pas la clé globale.

Méthode 1 : Jetons API (recommandé)

Les jetons API sont limités à des permissions précises. En cas de fuite, l'impact reste limité.

Créer un jeton :

  1. Dashboard Cloudflare → Mon profil → Jetons API
  2. Créer un jeton
  3. Choisir un modèle (ex. : DNS, Workers) ou personnalisé
  4. Définir les zones (spécifiques ou toutes)
  5. Copier le jeton

Utiliser le jeton :

curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" \
  -H "Authorization: Bearer YOUR_API_TOKEN"
Enter fullscreen mode Exit fullscreen mode

Méthode 2 : Clé API globale (non recommandé)

La clé globale donne un accès complet au compte. À éviter.

curl -X GET "https://api.cloudflare.com/client/v4/user" \
  -H "X-Auth-Email: your-email@example.com" \
  -H "X-Auth-Key: YOUR_GLOBAL_API_KEY"
Enter fullscreen mode Exit fullscreen mode

Format de réponse

Toutes les réponses Cloudflare :

{
  "result": { ... },
  "success": true,
  "errors": [],
  "messages": []
}
Enter fullscreen mode Exit fullscreen mode

Vérifiez toujours success avant de traiter result.

Gestion des zones

Une zone représente un domaine dans Cloudflare.

Lister les zones

curl -X GET "https://api.cloudflare.com/client/v4/zones" \
  -H "Authorization: Bearer YOUR_API_TOKEN"
Enter fullscreen mode Exit fullscreen mode

Réponse :

{
  "result": [
    {
      "id": "023e105f4ecef8ad9ca31a8372d0c353",
      "name": "example.com",
      "status": "active",
      "paused": false,
      "type": "full",
      "development_mode": 0,
      "name_servers": [
        "ns1.cloudflare.com",
        "ns2.cloudflare.com"
      ],
      "original_name_servers": [
        "ns1.example.com"
      ],
      "original_registrar": null
    }
  ],
  "success": true
}
Enter fullscreen mode Exit fullscreen mode

Créer une zone

curl -X POST "https://api.cloudflare.com/client/v4/zones" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "newdomain.com",
    "account": {
      "id": "ACCOUNT_ID"
    },
    "type": "full"
  }'
Enter fullscreen mode Exit fullscreen mode

Obtenir les détails d'une zone

curl -X GET "https://api.cloudflare.com/client/v4/zones/ZONE_ID" \
  -H "Authorization: Bearer YOUR_API_TOKEN"
Enter fullscreen mode Exit fullscreen mode

Gestion des enregistrements DNS

Gérez l’association des noms de domaine avec des IP/services.

Lister les enregistrements DNS

curl -X GET "https://api.cloudflare.com/client/v4/zones/ZONE_ID/dns_records" \
  -H "Authorization: Bearer YOUR_API_TOKEN"
Enter fullscreen mode Exit fullscreen mode

Créer un enregistrement DNS

curl -X POST "https://api.cloudflare.com/client/v4/zones/ZONE_ID/dns_records" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "A",
    "name": "www",
    "content": "192.0.2.1",
    "ttl": 3600,
    "proxied": true
  }'
Enter fullscreen mode Exit fullscreen mode

Types d’enregistrements :

  • A – IPv4
  • AAAA – IPv6
  • CNAME – Alias
  • MX – Mail
  • TXT – Texte (SPF, DKIM…)
  • NS – Serveur de noms

Mettre à jour un enregistrement DNS

curl -X PUT "https://api.cloudflare.com/client/v4/zones/ZONE_ID/dns_records/RECORD_ID" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "A",
    "name": "www",
    "content": "192.0.2.2",
    "ttl": 3600,
    "proxied": true
  }'
Enter fullscreen mode Exit fullscreen mode

Supprimer un enregistrement DNS

curl -X DELETE "https://api.cloudflare.com/client/v4/zones/ZONE_ID/dns_records/RECORD_ID" \
  -H "Authorization: Bearer YOUR_API_TOKEN"
Enter fullscreen mode Exit fullscreen mode

Cloudflare Workers

Exécutez du JavaScript en edge, proche des utilisateurs.

Lister les Workers

curl -X GET "https://api.cloudflare.com/client/v4/accounts/ACCOUNT_ID/workers/scripts" \
  -H "Authorization: Bearer YOUR_API_TOKEN"
Enter fullscreen mode Exit fullscreen mode

Uploader un Worker

curl -X PUT "https://api.cloudflare.com/client/v4/accounts/ACCOUNT_ID/workers/scripts/my-worker" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/javascript" \
  --data-binary @worker.js
Enter fullscreen mode Exit fullscreen mode

Exemple de Worker :

export default {
  async fetch(request, env, ctx) {
    const url = new URL(request.url)

    if (url.pathname === '/api/hello') {
      return new Response(JSON.stringify({ message: 'Hello from the edge!' }), {
        headers: { 'Content-Type': 'application/json' }
      })
    }

    return fetch(request)
  }
}
Enter fullscreen mode Exit fullscreen mode

Lier une route

curl -X POST "https://api.cloudflare.com/client/v4/zones/ZONE_ID/workers/routes" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "pattern": "example.com/api/*",
    "script": "my-worker"
  }'
Enter fullscreen mode Exit fullscreen mode

Espace de noms KV Worker

Stockez des données accessibles depuis les Workers :

curl -X POST "https://api.cloudflare.com/client/v4/accounts/ACCOUNT_ID/storage/kv/namespaces" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "my-kv-namespace"
  }'
Enter fullscreen mode Exit fullscreen mode

Sécurité et WAF

Règles de page

curl -X POST "https://api.cloudflare.com/client/v4/zones/ZONE_ID/pagerules" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "targets": [
      {
        "target": "url",
        "constraint": {
          "operator": "matches",
          "value": "example.com/*"
        }
      }
    ],
    "actions": [
      {
        "id": "ssl",
        "value": "flexible"
      },
      {
        "id": "cache_level",
        "value": "aggressive"
      }
    ]
  }'
Enter fullscreen mode Exit fullscreen mode

Règles de pare-feu

curl -X POST "https://api.cloudflare.com/client/v4/zones/ZONE_ID/firewall/rules" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "filter": {
      "expression": "ip.geoip.country eq \"CN\"",
      "paused": false
    },
    "action": "block",
    "description": "Bloquer le trafic venant de Chine"
  }'
Enter fullscreen mode Exit fullscreen mode

Limitation de débit

curl -X POST "https://api.cloudflare.com/client/v4/zones/ZONE_ID/rate_limits" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "disabled": false,
    "description": "Limiter le débit des points d'accès API",
    "match": {
      "request": {
        "methods": ["POST"],
        "url_pattern": "*/api/*"
      }
    },
    "threshold": 100,
    "period": 60,
    "action": {
      "mode": "ban",
      "timeout": 600
    }
  }'
Enter fullscreen mode Exit fullscreen mode

Analyses et logs

Analyses de zone

curl -X GET "https://api.cloudflare.com/client/v4/zones/ZONE_ID/analytics/dashboard?since=-1440&continuous=true" \
  -H "Authorization: Bearer YOUR_API_TOKEN"
Enter fullscreen mode Exit fullscreen mode

Réponse :

{
  "result": {
    "totals": {
      "requests": {
        "all": 1000000,
        "cached": 800000,
        "uncached": 200000
      },
      "bandwidth": {
        "all": 50000000000,
        "cached": 40000000000
      },
      "threats": {
        "all": 5000
      },
      "pageviews": {
        "all": 250000
      }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Logs de zone (Logpush)

Activez Logpush pour envoyer les logs vers votre stockage :

curl -X POST "https://api.cloudflare.com/client/v4/zones/ZONE_ID/logpush/jobs" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Mon travail Logpush",
    "destination_conf": "s3://my-bucket/logs?region=us-east-1",
    "dataset": "http_requests",
    "logpull_options": "fields=ClientIP,ClientRequestPath,EdgeResponseStatus&timestamps=rfc3339"
  }'
Enter fullscreen mode Exit fullscreen mode

Tester avec Apidog

Les modifications Cloudflare impactent la prod. Testez systématiquement.

Test API avec Apidog

1. Configuration de l'environnement

CLOUDFLARE_API_TOKEN: your_token
CLOUDFLARE_ACCOUNT_ID: abc123
ZONE_ID: xyz789
BASE_URL: https://api.cloudflare.com/client/v4
Enter fullscreen mode Exit fullscreen mode

2. Valider les réponses

pm.test('La requête a réussi', () => {
  const response = pm.response.json()
  pm.expect(response.success).to.be.true
  pm.expect(response.errors).to.be.empty
})

pm.test('Enregistrement DNS créé correctement', () => {
  const response = pm.response.json()
  pm.expect(response.result.type).to.eql('A')
  pm.expect(response.result.name).to.eql('www')
  pm.expect(response.result.proxied).to.be.true
})
Enter fullscreen mode Exit fullscreen mode

3. Tester les déploiements de Workers

Enregistrez les scripts Worker comme fichiers dans Apidog et testez les uploads :

pm.test('Worker téléchargé', () => {
  const response = pm.response.json()
  pm.expect(response.result.id).to.eql('my-worker')
})
Enter fullscreen mode Exit fullscreen mode

Testez les API Cloudflare avec Apidog – gratuit


Erreurs courantes et solutions

403 Interdit

Cause : Jeton sans permission requise.

Solution : Vérifiez les permissions du jeton. Par exemple, modifications DNS : Zone:DNS:Edit. Workers : Account:Workers:Edit.

1003 : Zone invalide ou manquante

Cause : L’ID de zone n’existe pas ou le jeton n’y a pas accès.

Solution : Vérifiez l’ID de zone, et la portée du jeton.

81057 : L’enregistrement existe déjà

Cause : Un enregistrement DNS identique existe déjà.

Solution : Utilisez PUT (update), ou supprimez d’abord l’enregistrement.

Limite de débit dépassée

Cause : Trop de requêtes (par défaut 1200/5min).

Solution : Mettez en place un backoff et batch.

async function updateRecords(records) {
  for (const record of records) {
    try {
      await updateRecord(record)
      await sleep(100) // Tampon limitation de débit
    } catch (error) {
      if (error.status === 429) {
        await sleep(60000) // Attendre une minute
        await updateRecord(record) // Réessayer
      }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Alternatives et comparaisons

Fonctionnalité Cloudflare AWS Route 53 Fastly
API DNS
API CDN API CloudFront
Fonctions Edge Workers Lambda@Edge Compute@Edge
API WAF AWS WAF
Niveau gratuit Généreux Paiement à l'utilisation Limité
Format de réponse JSON XML/JSON JSON

L’API Cloudflare est plus unifiée que les services AWS. Les Workers offrent plus de flexibilité que Lambda@Edge.

Cas d'utilisation concrets

SaaS multi-tenant. Une plateforme crée automatiquement des zones Cloudflare à chaque ajout de domaine client. Workers pour le routage, API DNS pour les enregistrements, certificats SSL provisionnés en API.

Déploiements bleu-vert. Mise à jour automatique des enregistrements DNS pour basculer le trafic entre environnements : propagation instantanée via Cloudflare.

Automatisation réponse DDoS. Surveillance du trafic via l’API d’analyse : les attaques déclenchent l’ajout de règles de pare-feu automatiquement, réduisant le temps de réponse.

En résumé

Ce que vous pouvez désormais faire :

  • Authentification sécurisée par jetons API
  • Gestion programmatique des zones et DNS
  • Déploiement de Workers en edge
  • Sécurité : firewall, limitation de débit
  • Extraction d’analyses, logs
  • Tests automatisés avec Apidog avant la mise en production

FAQ

Quelle est la différence entre une zone et un domaine ?

Une zone est la représentation d'un domaine chez Cloudflare. L’ajout d’un domaine crée une zone, identifiée par un ID utilisé dans l’API.

Comment trouver mon ID de zone ?

Dashboard Cloudflare → domaine → Aperçu → section API.

Puis-je utiliser l'API Cloudflare sans forfait payant ?

Oui, la plupart des fonctions sont incluses dans les forfaits gratuits. Les Workers ont un généreux niveau gratuit. Certaines options avancées (WAF avancé, Logpush) sont payantes.

Combien de temps pour propager une modification DNS ?

Immédiat côté Cloudflare ; propagation DNS globale dépend du TTL (généralement quelques minutes).

Quelle est la limite de débit ?

Par défaut : 1200 requêtes/5min/jeton. Vérifiez X-RateLimit-Remaining. Les clients Enterprise ont plus.

Gérer plusieurs comptes avec un seul jeton ?

Non : un jeton = un compte. Pour plusieurs comptes, créez plusieurs jetons ou utilisez un jeton utilisateur avec droits multi-comptes.

Différences Workers vs Lambda ?

Workers : s’exécutent en edge (300+ villes), min. de cold start, usage idéal manipulation requêtes/réponses, pas de traitements longs.

Purger le cache via API ?

Oui :

curl -X POST "https://api.cloudflare.com/client/v4/zones/ZONE_ID/purge_cache" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "files": ["https://example.com/style.css"]
  }'
Enter fullscreen mode Exit fullscreen mode

Top comments (0)