DEV Community

Alex Spinov
Alex Spinov

Posted on

Cloudflare Has a Free API — DNS, Analytics, and CDN Management Without the Dashboard

Cloudflare API Is Surprisingly Powerful

Cloudflare free plan includes API access to DNS management, analytics, cache purging, and more. No paid plan needed for most operations.

Setup

import requests

API_TOKEN = "your_cloudflare_api_token"
HEADERS = {"Authorization": f"Bearer {API_TOKEN}", "Content-Type": "application/json"}
BASE = "https://api.cloudflare.com/client/v4"
Enter fullscreen mode Exit fullscreen mode

Create a token at dash.cloudflare.com/profile/api-tokens.

List All Zones (Domains)

def list_zones():
    r = requests.get(f"{BASE}/zones", headers=HEADERS)
    zones = r.json()["result"]
    return [{"name": z["name"], "id": z["id"], "status": z["status"]} for z in zones]

for z in list_zones():
    print(f"{z[name]} ({z[status]}) — {z[id]}")
Enter fullscreen mode Exit fullscreen mode

Manage DNS Records

def list_dns(zone_id):
    r = requests.get(f"{BASE}/zones/{zone_id}/dns_records", headers=HEADERS)
    return [{"type": d["type"], "name": d["name"], "content": d["content"]}
            for d in r.json()["result"]]

def add_dns(zone_id, record_type, name, content):
    data = {"type": record_type, "name": name, "content": content, "ttl": 1}
    r = requests.post(f"{BASE}/zones/{zone_id}/dns_records", 
                      headers=HEADERS, json=data)
    return r.json()["success"]

# Add an A record
add_dns("zone_id", "A", "api.example.com", "1.2.3.4")
Enter fullscreen mode Exit fullscreen mode

Purge Cache

def purge_cache(zone_id, urls=None):
    if urls:
        data = {"files": urls}
    else:
        data = {"purge_everything": True}
    r = requests.post(f"{BASE}/zones/{zone_id}/purge_cache",
                      headers=HEADERS, json=data)
    return r.json()["success"]

# Purge specific URLs
purge_cache("zone_id", ["https://example.com/style.css"])

# Purge everything
purge_cache("zone_id")
Enter fullscreen mode Exit fullscreen mode

Get Analytics

def get_analytics(zone_id):
    r = requests.get(f"{BASE}/zones/{zone_id}/analytics/dashboard",
                     headers=HEADERS, params={"since": "-1440"})
    data = r.json()["result"]["totals"]
    return {
        "requests": data["requests"]["all"],
        "bandwidth": data["bandwidth"]["all"],
        "threats": data["threats"]["all"],
        "pageviews": data["pageviews"]["all"]
    }
Enter fullscreen mode Exit fullscreen mode

Real Use Cases

  1. Automated deployments — purge cache after deploy
  2. Dynamic DNS — update A records for home servers
  3. Multi-site management — manage dozens of domains from one script
  4. Monitoring — track bandwidth and threat trends
  5. Disaster recovery — quickly switch DNS in an incident

Free Plan API Limits

  • 1200 API calls per 5 minutes
  • All DNS operations included
  • Analytics, cache purge, firewall rules
  • Workers (100K requests/day free)

More API tutorials | GitHub


More from me: 10 Dev Tools I Use Daily | 77 Scrapers on a Schedule | 150+ Free APIs

Top comments (0)