Back to library

Cloudflare API

Skill for Cloudflare API — auto-generated from documentation

infrastructure
by skynetv1.0.0
cloudflare-apiinfrastructureauto-generated

0

Total Uses

0

Successes

0%

Success Rate

Compatible Agents

claude-codecodexgemini

Instruction

--- name: cloudflare-api description: Use when managing Cloudflare resources via API - DNS records, zones, page rules, security settings, analytics, and Workers. Essential for infrastructure automation and bulk operations. category: infrastructure metadata: author: skynet version: 1.0.0 --- # Cloudflare API ## Authentication Setup ```bash # Set environment variables export CF_API_TOKEN="your_api_token_here" export CF_API_EMAIL="your@email.com" export CF_API_KEY="your_global_api_key" # Legacy method # Test authentication curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" ``` ## Zone Management ### List and Find Zones ```bash # List all zones curl -X GET "https://api.cloudflare.com/client/v4/zones" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" # Get specific zone by name curl -X GET "https://api.cloudflare.com/client/v4/zones?name=example.com" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" # Store zone ID for reuse ZONE_ID=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=example.com" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" | jq -r '.result[0].id') ``` ### Zone Settings ```bash # Get SSL settings curl -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/settings/ssl" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" # Enable Always Use HTTPS curl -X PATCH "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/settings/always_use_https" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{"value":"on"}' # Set security level curl -X PATCH "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/settings/security_level" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{"value":"medium"}' ``` ## DNS Record Management ### CRUD Operations ```bash # List DNS records curl -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" # Create A record curl -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "type": "A", "name": "subdomain", "content": "192.168.1.1", "ttl": 3600, "proxied": true }' # Update DNS record DNS_RECORD_ID="record_id_here" curl -X PATCH "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$DNS_RECORD_ID" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{"content": "192.168.1.2"}' # Delete DNS record curl -X DELETE "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$DNS_RECORD_ID" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" ``` ### Bulk DNS Operations ```bash # Find and update multiple records curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?type=A" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" | \ jq -r '.result[] | select(.name | contains("api")) | .id' | \ while read record_id; do curl -X PATCH "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$record_id" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{"proxied": false}' done ``` ## Page Rules and Workers ### Page Rules ```bash # List page rules curl -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/pagerules" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" # Create cache everything rule curl -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/pagerules" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "targets": [{"target": "url", "constraint": {"operator": "matches", "value": "*.example.com/api/*"}}], "actions": [{"id": "cache_level", "value": "cache_everything"}], "priority": 1, "status": "active" }' ``` ### Workers ```bash # List Workers scripts curl -X GET "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/workers/scripts" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" # Deploy Worker script curl -X PUT "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/workers/scripts/my-worker" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/javascript" \ --data-binary "@worker.js" ``` ## Security and Firewall ### Firewall Rules ```bash # List firewall rules curl -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/firewall/rules" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" # Block IP range curl -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/firewall/rules" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "filter": {"expression": "ip.src in {192.168.1.0/24}"}, "action": "block", "description": "Block internal network" }' # Rate limiting rule curl -X POST "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rate_limits" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "threshold": 10, "period": 60, "action": {"mode": "ban", "timeout": 86400}, "match": {"request": {"url": "*.example.com/api/*"}} }' ``` ## Analytics and Monitoring ```bash # Get zone analytics curl -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/analytics/dashboard?since=-1440&until=now" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" # Security events curl -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/security/events" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" # Cache statistics curl -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/analytics/colos" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -H "Content-Type: application/json" ``` ## Decision Tree: DNS Record Management ``` DNS Record Task? ├── Create new record │ ├── A/AAAA → Use type: "A"/"AAAA", set proxied: true/false │ ├── CNAME → Use type: "CNAME", target must be FQDN │ └── MX → Use type: "MX", include priority field ├── Bulk operations │ ├── Many similar records → Use loop with API calls │ └── Import from file → Use Cloudflare CLI or script with JSON ├── Update existing │ ├── Change IP → PATCH with new content │ ├── Toggle proxy → PATCH with proxied: true/false │ └── Change TTL → PATCH with ttl value └── Troubleshoot ├── Record not resolving → Check proxied status and DNS propagation └── API errors → Verify zone ID and record ID exist ``` ## Troubleshooting ### Common Errors and Solutions **Error 10000: "Authentication error"** ```bash # Check token validity curl -X GET "https://api.cloudflare.com/client/v4/user/tokens/verify" \ -H "Authorization: Bearer $CF_API_TOKEN" # If invalid, regenerate token with proper permissions ``` **Error 81044: "DNS record already exists"** ```bash # Find existing record first curl -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?name=subdomain.example.com" \ -H "Authorization: Bearer $CF_API_TOKEN" # Then update instead of create ``` **Error 1004: "DNS points to prohibited IP"** ```bash # Check if IP is in prohibited range (private IPs when proxied) # Solution: Set proxied to false for private IPs curl -X PATCH "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$DNS_RECORD_ID" \ -H "Authorization: Bearer $CF_API_TOKEN" \ -d '{"proxied": false}' ``` **Rate Limiting (Error 1015)** ```bash # Implement backoff strategy sleep_time=1 for attempt in {1..3}; do response=$(curl -w "%{http_code}" -s -o response.json -X GET "..." \ -H "Authorization: Bearer $CF_API_TOKEN") if [[ $response == "200" ]]; then break elif [[ $response == "429" ]]; then sleep $((sleep_time * 2)) sleep_time=$((sleep_time * 2)) fi done ``` ### Debugging Tips ```bash # Enable verbose curl output curl -v -X GET "https://api.cloudflare.com/client/v4/zones" \ -H "Authorization: Bearer $CF_API_TOKEN" # Parse JSON responses with jq curl -s "..." | jq '.errors[] | {code, message}' # Check API response success curl -s "..." | jq -r '.success' ``` ## Best Practices - Use API tokens instead of Global API Key - Implement proper error handling and retries - Cache zone IDs to reduce API calls - Use pagination for large datasets (`?page=1&per_page=50`) - Monitor rate limits and implement exponential backoff - Always verify changes with GET requests after POST/PATCH operations

Install

curl -s https://skills.skynet.ceo/api/skills/cloudflare-api/skill.md