TL;DR
Las API de Cloudflare permiten gestionar DNS, zonas, Workers, seguridad y analíticas de forma programática. Autentícate con tokens de API (recomendado) o claves globales, llama a api.cloudflare.com/client/v4 y gestiona los límites de velocidad con prudencia. Para realizar pruebas, utiliza Apidog para validar cambios de DNS, probar despliegues de Workers y automatizar la configuración en diferentes entornos.
Introducción
Cloudflare está delante de millones de sitios web y gestiona DNS, CDN, protección DDoS, WAF, funciones sin servidor (Workers) y más. Administrar todo esto desde el panel funciona para configuraciones pequeñas, pero si trabajas a escala, necesitas automatización.
La API de Cloudflare replica toda la funcionalidad del panel: crear zonas, actualizar registros DNS, configurar reglas de página, desplegar Workers, gestionar SSL y extraer analíticas, todo de forma programática.
Implementa la API de Cloudflare en:
- Infraestructura como código (Terraform, Pulumi)
- Pipelines CI/CD
- Gestión de múltiples zonas
- Actualizaciones automáticas de DNS
- Despliegues de Workers
💡 Tip: Si desarrollas sobre Cloudflare, Apidog te ayuda a probar llamadas API, validar respuestas y documentar tu integración. Guarda configuraciones de zona como solicitudes reutilizables y compártelas con tu equipo.
Prueba las APIs de Cloudflare con Apidog - gratis.
Al final de esta guía podrás:
- Autenticarte con tokens de API de Cloudflare
- Gestionar zonas y registros DNS
- Desplegar y gestionar Workers
- Configurar ajustes de seguridad
- Extraer analíticas y logs
Autenticación
Cloudflare ofrece dos métodos de autenticación. Para producción, usa tokens de API (no claves globales).
Método 1: Tokens de API (recomendado)
Los tokens de API tienen permisos específicos. Si se comprometen, el alcance del daño es limitado.
Cómo crear un token:
- Ve a Cloudflare Dashboard → Mi Perfil → Tokens de API
- Crear Token
- Elige una plantilla (Editar DNS de zona, despliegue de Workers, etc.) o selecciona permisos personalizados
- Establece zonas específicas o permite todas las zonas
- Copia el token
Cómo usar el token:
curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Método 2: Clave API global (no recomendado)
La clave global da acceso total a la cuenta. Evita este método cuando sea posible.
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"
Formato de respuesta
Todas las respuestas siguen esta estructura:
{
"result": { ... },
"success": true,
"errors": [],
"messages": []
}
Verifica success antes de procesar el campo result.
Gestión de zonas
Las zonas representan dominios gestionados en Cloudflare.
Listar zonas
curl -X GET "https://api.cloudflare.com/client/v4/zones" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Respuesta:
{
"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
}
Crear una zona
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"
}'
Obtener detalles de zona
curl -X GET "https://api.cloudflare.com/client/v4/zones/ZONE_ID" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Gestión de registros DNS
Los registros DNS mapean nombres de dominio a IPs y servicios.
Listar registros DNS
curl -X GET "https://api.cloudflare.com/client/v4/zones/ZONE_ID/dns_records" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Crear un registro 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
}'
Tipos de registro:
-
A- Dirección IPv4 -
AAAA- Dirección IPv6 -
CNAME- Alias -
MX- Correo -
TXT- Texto (SPF, DKIM, etc.) -
NS- Nameserver
Actualizar un registro 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
}'
Eliminar un registro DNS
curl -X DELETE "https://api.cloudflare.com/client/v4/zones/ZONE_ID/dns_records/RECORD_ID" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Cloudflare Workers
Workers ejecutan JavaScript en el edge, cerca de los usuarios.
Listar Workers
curl -X GET "https://api.cloudflare.com/client/v4/accounts/ACCOUNT_ID/workers/scripts" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Subir 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
Ejemplo 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)
}
}
Vincular una ruta
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"
}'
Espacio de nombres KV de Worker
Almacena datos accesibles desde 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"
}'
Seguridad y WAF
Reglas de página
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"
}
]
}'
Reglas de firewall
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": "Block traffic from China"
}'
Limitación de velocidad
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": "Rate limit API endpoints",
"match": {
"request": {
"methods": ["POST"],
"url_pattern": "*/api/*"
}
},
"threshold": 100,
"period": 60,
"action": {
"mode": "ban",
"timeout": 600
}
}'
Analíticas y logs
Analíticas de zona
curl -X GET "https://api.cloudflare.com/client/v4/zones/ZONE_ID/analytics/dashboard?since=-1440&continuous=true" \
-H "Authorization: Bearer YOUR_API_TOKEN"
Respuesta:
{
"result": {
"totals": {
"requests": {
"all": 1000000,
"cached": 800000,
"uncached": 200000
},
"bandwidth": {
"all": 50000000000,
"cached": 40000000000
},
"threats": {
"all": 5000
},
"pageviews": {
"all": 250000
}
}
}
}
Logs de zona (Logpush)
Habilita Logpush para enviar logs a tu almacenamiento:
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": "My Logpush Job",
"destination_conf": "s3://my-bucket/logs?region=us-east-1",
"dataset": "http_requests",
"logpull_options": "fields=ClientIP,ClientRequestPath,EdgeResponseStatus×tamps=rfc3339"
}'
Pruebas con Apidog
Los cambios de Cloudflare impactan producción. Prueba todo antes.
1. Configuración del entorno
CLOUDFLARE_API_TOKEN: tu_token
CLOUDFLARE_ACCOUNT_ID: abc123
ZONE_ID: xyz789
BASE_URL: https://api.cloudflare.com/client/v4
2. Validar respuestas
pm.test('La solicitud fue exitosa', () => {
const response = pm.response.json()
pm.expect(response.success).to.be.true
pm.expect(response.errors).to.be.empty
})
pm.test('Registro DNS creado correctamente', () => {
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
})
3. Probar despliegues de Workers
Guarda tus scripts Worker como archivos y prueba la carga vía Apidog:
pm.test('Worker subido', () => {
const response = pm.response.json()
pm.expect(response.result.id).to.eql('my-worker')
})
Prueba las APIs de Cloudflare con Apidog - gratis
Errores comunes y soluciones
403 Prohibido
Causa: El token carece de permisos necesarios.
Solución: Verifica los permisos del token en el panel de Cloudflare. Zona:DNS:Editar para editar DNS, Cuenta:Workers:Editar para Workers.
1003: Zona inválida o faltante
Causa: El ID de zona no existe o el token no tiene acceso.
Solución: Verifica el ID de zona en la URL y asegúrate de que el token incluye acceso a esa zona.
81057: El registro ya existe
Causa: Ya existe un registro DNS con el mismo nombre y tipo.
Solución: Usa PUT para actualizar, o elimina primero el registro existente.
Límite de velocidad excedido
Causa: Exceso de solicitudes (por defecto 1200/5 minutos).
Solución: Implementa backoff y operaciones por lotes.
async function updateRecords(records) {
for (const record of records) {
try {
await updateRecord(record)
await sleep(100) // Buffer para límite de velocidad
} catch (error) {
if (error.status === 429) {
await sleep(60000) // Espera un minuto
await updateRecord(record) // Reintenta
}
}
}
}
Alternativas y comparaciones
| Característica | Cloudflare | AWS Route 53 | Fastly |
|---|---|---|---|
| API de DNS | ✓ | ✓ | ✓ |
| API de CDN | ✓ | API de CloudFront | ✓ |
| Funciones de borde | Workers | Lambda@Edge | Compute@Edge |
| API de WAF | ✓ | AWS WAF | ✓ |
| Capa gratuita | Generosa | Pago por uso | Limitada |
| Formato de respuesta | JSON | XML/JSON | JSON |
La API de Cloudflare es más unificada que los servicios fragmentados de AWS. Workers da más flexibilidad que Lambda@Edge.
Casos de uso reales
SaaS multi-inquilino: Automatiza la creación de zonas de Cloudflare cuando los clientes agregan dominios personalizados. Usa la API para registros DNS y despliegue de Workers; aprovisiona certificados SSL automáticamente.
Despliegues blue-green: Cambia tráfico entre entornos actualizando registros A vía la API durante el despliegue; la propagación es instantánea en la red de Cloudflare.
Automatización anti-DDoS: Monitorea el tráfico usando la API de analíticas y aplica reglas de firewall vía API en caso de ataque, reduciendo el tiempo de respuesta de horas a segundos.
Conclusión
En este artículo has aprendido a:
- Autenticarte con tokens de API para acceso granular
- Gestionar zonas y registros DNS programáticamente
- Desplegar Workers para computación en el edge
- Configurar seguridad con reglas de firewall y limitación de velocidad
- Extraer analíticas y configurar el envío de logs
- Probar todo con Apidog antes de aplicar en producción
Preguntas Frecuentes
¿Cuál es la diferencia entre una zona y un dominio?
Una zona es la representación de un dominio en Cloudflare. Cuando agregas un dominio, creas una zona. El ID de zona se usa en las llamadas API para ese dominio.
¿Cómo encuentro mi ID de zona?
En el panel de Cloudflare, selecciona tu dominio → Resumen → busca la sección de API para ver el ID de zona.
¿Puedo usar la API de Cloudflare sin plan de pago?
Sí, la mayoría de funcionalidades API están disponibles en el plan gratuito. Workers tiene una capa gratuita generosa; algunas funciones avanzadas requieren planes pagos.
¿Cuánto tardan los cambios de DNS?
Los cambios vía API son inmediatos en Cloudflare. La propagación a los nameservers toma segundos; globalmente, depende del TTL y los resolvers, normalmente minutos.
¿Cuál es el límite de velocidad?
Por defecto: 1200 solicitudes cada 5 minutos por token. Chequea el header X-RateLimit-Remaining. Planes Enterprise tienen límites más altos.
¿Puedo gestionar varias cuentas con un solo token?
No. Los tokens tienen alcance por cuenta. Para varias cuentas, crea tokens separados o usa tokens de usuario con acceso a múltiples cuentas.
¿En qué se diferencian los Workers de Lambda?
Los Workers corren en más de 300 ubicaciones edge; los arranques en frío son mínimos. Ideales para manipulación request/response, no para procesos largos.
¿Puedo usar la API para purgar la caché?
Sí:
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"]
}'

Top comments (0)