The Database Delivery API gives every subscriber programmatic access to their plan's blocklist export — 17,410+ classified AI-tool domains, refreshed daily. Check when the database last changed, download the full CSV, and automate your firewall or DNS-filter sync with a cron job and an API key.
The API is a single authenticated endpoint that dispatches on an action query parameter. All requests are HTTPS GET. Metadata responses are JSON; database downloads stream CSV.
# Base URL https://www.aitoolsblocklist.com/api/database/ # Four actions ?action=database_info # JSON — file name, last-updated time, size ?action=download_database # CSV — your plan's full blocklist export ?action=download_categories # CSV — category / subcategory domain counts ?action=status # JSON — API key and subscription status
Columns: domain, relevant_categories_of_ai_tool (all matching categories, |-delimited) — ready for direct ingestion into firewalls, DNS filters, and proxies.
Columns: category, subcategory, domain_count — the full 18-category / 172-subcategory taxonomy with counts.
Exports are regenerated every day. Poll database_info and re-download only when last_updated_unix changes.
Every subscription plan includes an API key, issued when your plan is activated. Send it with each request either as the X-API-Key header (recommended) or as an api_key query parameter.
Keep your key out of logs: prefer the X-API-Key header over the query parameter in production — URLs (and the keys embedded in them) routinely end up in proxy and web-server logs.
download_database returns ai_tools_5k.csv — the 5,000 highest-traffic AI-tool domains.
download_database returns ai_tools_full.csv — the complete database of 17,410+ domains.
Additional delivery formats included with your plan (JSON, EDL, PAC, hosts, DNS RPZ) are available from your account downloads page.
Returns metadata about your plan's database export — use it to decide whether a new download is needed.
curl -H "X-API-Key: YOUR_API_KEY" \ "https://www.aitoolsblocklist.com/api/database/?action=database_info" # Response { "client": "Acme Corp", "plan": "Full Database ($499/month)", "database_file": "ai_tools_full.csv", "last_updated": "2026-07-14 05:30:02 CEST", "last_updated_unix": 1784088729, "file_size_bytes": 1183744, "file_size_human": "1.13 MB" }
Streams your plan's blocklist as CSV (Content-Type: text/csv, served as an attachment). Three columns: domain, category, subcategory.
curl -H "X-API-Key: YOUR_API_KEY" \ -o ai_tools.csv \ "https://www.aitoolsblocklist.com/api/database/?action=download_database" # File contents (excerpt) domain,category,subcategory chatgpt.com,Text & Language,General assistants & chatbots github.com,Code & Development,Code assistants & autocomplete midjourney.com,Image & Visual,Image generation
Streams the taxonomy summary as CSV — every category and subcategory with its current domain count. Useful for building category pickers and policy UIs.
curl -H "X-API-Key: YOUR_API_KEY" \ -o ai_tools_categories.csv \ "https://www.aitoolsblocklist.com/api/database/?action=download_categories" # File contents (excerpt) category,subcategory,domain_count Agents & Automation,AI workflow automation,678 Text & Language,General assistants & chatbots,1204
Returns your API key and subscription status — handy as a health check in monitoring and for verifying a key after activation.
curl -H "X-API-Key: YOUR_API_KEY" \ "https://www.aitoolsblocklist.com/api/database/?action=status" # Response { "client": "Acme Corp", "api_key_active": true, "plan": "Full Database ($499/month)", "subscribed_database": "ai_tools_full.csv", "database_last_updated": "2026-07-14 05:30:02 CEST", "database_file_size": "1.13 MB" }
Errors are returned as JSON with an error flag and a human-readable message.
| Code | Meaning | Typical Cause |
|---|---|---|
| 200 | Success | JSON metadata or CSV stream returned |
| 400 | Bad request | Missing or unknown action parameter |
| 401 | Unauthorized | No API key supplied in header or query |
| 403 | Forbidden | Invalid API key, or key deactivated (e.g. lapsed subscription) |
| 404 | Not found | Export file not yet generated for your account |
| 500 | Server error | Temporary backend issue — retry with backoff |
# Example error response { "error": true, "message": "API key is inactive. Please contact support at [email protected]." }
The canonical integration: a cron job that checks database_info, downloads the CSV only when it changed, and regenerates your enforcement config.
import csv, io, os, requests BASE = "https://www.aitoolsblocklist.com/api/database/" HEADERS = {"X-API-Key": os.environ["AITOOLS_API_KEY"]} STATE_FILE = "/var/lib/aitools/last_updated" def get_last_updated(): info = requests.get(BASE, headers=HEADERS, params={"action": "database_info"}, timeout=30).json() return str(info["last_updated_unix"]) def download_csv(): resp = requests.get(BASE, headers=HEADERS, params={"action": "download_database"}, timeout=120) resp.raise_for_status() return resp.text def main(): stamp = get_last_updated() if os.path.exists(STATE_FILE) and open(STATE_FILE).read() == stamp: return # nothing new today rows = list(csv.DictReader(io.StringIO(download_csv()))) # Category-level policy: block everything except approved code assistants blocked = [r["domain"] for r in rows if r["category"] != "Code & Development"] with open("/etc/squid/ai_blocklist.txt", "w") as f: f.write("\n".join(sorted(blocked))) open(STATE_FILE, "w").write(stamp) os.system("squid -k reconfigure") if __name__ == "__main__": main()
# /etc/cron.d/aitools — refresh the blocklist every night at 06:15 15 6 * * * root curl -sf -H "X-API-Key: $AITOOLS_API_KEY" \ "https://www.aitoolsblocklist.com/api/database/?action=download_database" \ | cut -d, -f1 | tail -n +2 > /etc/unbound/ai_domains.txt \ && unbound-control reload
# Nagios/Zabbix-style check: alert if the key is inactive curl -sf -H "X-API-Key: $AITOOLS_API_KEY" \ "https://www.aitoolsblocklist.com/api/database/?action=status" \ | jq -e '.api_key_active == true'
Exports change once per day. Check database_info first and download only when last_updated_unix moves — it keeps your sync fast and your bandwidth use flat.
If a download fails, keep enforcing yesterday's list rather than dropping enforcement entirely. The daily cadence means a stale list is at most a day behind.
Filter the CSV by category/subcategory instead of maintaining domain-level exceptions — allow approved tool categories, block the rest, and your policy survives daily domain churn.
Found a domain in the wrong category? Email [email protected] — corrections ship in a subsequent daily export.
Every plan includes API access with your key issued at activation. Tell us about your stack and we'll help you wire up the sync.
Tell us about your firewall, DNS filter, or proxy setup and we will help you integrate the Database Delivery API.