AI Tools Blocklist
Home AI Tools Database Taxonomy Pricing
Solutions
Enterprise IT & CISO Education Firewall Admins Shadow AI Prevention
Integrations
Palo Alto Networks FortiGate Cisco Umbrella pfSense REST API
Download Free Sample
Cisco Umbrella Guide

Block AI Tools with Cisco Umbrella
DNS Filtering

Block AI tools at the DNS layer before a single TCP connection is made. Import 16,024+ classified domains into Umbrella destination lists and enforce across every network and roaming client.

16,024+AI Domains
18Categories
DNSLayer Blocking
DailyUpdates
Download Sample Domain List View Pricing
DNS-Layer Enforcement

Why DNS-Layer Blocking with Cisco Umbrella Is the Fastest Way to Stop AI Tool Access

How DNS Blocking Works

1

DNS Query

A device queries chat.openai.com. The query hits Umbrella's recursive resolver before any connection starts.

2

Policy Check

Umbrella checks the domain against your destination list. If it matches, the block policy fires instantly.

3

Blocked

Umbrella returns a block page IP. No TCP session, no TLS handshake, no data leaves the network.

Three Key Advantages Over Firewall URL Filtering

Protocol-Agnostic

HTTPS, WebSocket, gRPC — any protocol that starts with a DNS lookup is blocked. No deep packet inspection or TLS decryption required.

All-Device Coverage

Covers every device on your DNS infrastructure — IoT, printers with AI integrations, and unmanaged personal devices on corporate Wi-Fi.

Roaming Client

Umbrella's roaming client enforces DNS policies off-network. Employees at coffee shops or home get the same AI restrictions as HQ.

The Coverage Gap

Umbrella's built-in AI categories lag months behind the market. New AI tools launch daily on obscure domains that no vendor classifies in real time.

Our Solution

16,024+ AI-tool domains, classified into 18 functional categories, updated every 24 hours from a corpus of 102 million scanned domains. Every new AI tool we detect is automatically blocked within a day of discovery.

DNS Blocking vs. Firewall URL Filtering

<1ms
DNS block latency
Zero
TLS decryption required
100%
Roaming client coverage
24hr
Feed update cycle
Destination Lists

Setting Up Destination Lists for AI Tool Domains

Destination lists are named domain collections referenced by DNS policies. Populate one with AI-tool domains and attach it with a block action.

How It Works

When Umbrella's resolver processes a query matching any domain on the list, it enforces your policy action instead of returning the real DNS answer.

Key Facts

Block and Allow list types supported

Up to 60,000 entries per list (most packages)

Category-filtered feeds for lower-limit packages

Management API for bulk import (required for 16,024+ domains)

Creating a Destination List via the Dashboard

1

Navigate

Go to Policies > Policy Components > Destination Lists and click Add.

2

Configure

Name it "AI Tools Blocklist", set type to Block, and save.

3

Populate via API

For 16,024+ domains, use the Management API. The script below automates the full workflow.

#!/usr/bin/env python3
"""Create and populate a Cisco Umbrella destination list with AI tool domains."""

import requests
import json

# Umbrella Management API credentials
UMBRELLA_API_KEY    = "your-management-api-key"
UMBRELLA_API_SECRET = "your-management-api-secret"
ORG_ID              = "your-org-id"

# AI Tools Blocklist API credentials
BLOCKLIST_API_KEY = "your-blocklist-api-key"
BLOCKLIST_FEED    = "https://api.aitoolsblocklist.com/v1/feed/domains?format=plain"

BASE_URL = f"https://api.umbrella.com/v1/organizations/{ORG_ID}"

def get_auth_token():
    """Obtain OAuth2 token from Umbrella API."""
    resp = requests.post(
        "https://api.umbrella.com/auth/v2/token",
        auth=(UMBRELLA_API_KEY, UMBRELLA_API_SECRET),
        data={"grant_type": "client_credentials"},
        timeout=10
    )
    resp.raise_for_status()
    return resp.json()["access_token"]

def fetch_ai_domains():
    """Download the latest AI tool domains from the blocklist feed."""
    resp = requests.get(
        BLOCKLIST_FEED,
        headers={"Authorization": f"Bearer {BLOCKLIST_API_KEY}"},
        timeout=30
    )
    resp.raise_for_status()
    domains = [line.strip() for line in resp.text.splitlines() if line.strip()]
    return domains

def create_destination_list(token, name):
    """Create a new block-type destination list in Umbrella."""
    resp = requests.post(
        f"{BASE_URL}/destinationlists",
        headers={
            "Authorization": f"Bearer {token}",
            "Content-Type": "application/json"
        },
        json={
            "name": name,
            "access": "block",
            "isGlobal": False
        },
        timeout=10
    )
    resp.raise_for_status()
    list_id = resp.json()["id"]
    print(f"Created destination list: {name} (ID: {list_id})")
    return list_id

def add_domains_to_list(token, list_id, domains, batch_size=500):
    """Add domains in batches to avoid API payload limits."""
    for i in range(0, len(domains), batch_size):
        batch = domains[i:i + batch_size]
        payload = [{"destination": d} for d in batch]
        resp = requests.post(
            f"{BASE_URL}/destinationlists/{list_id}/destinations",
            headers={
                "Authorization": f"Bearer {token}",
                "Content-Type": "application/json"
            },
            json=payload,
            timeout=30
        )
        resp.raise_for_status()
        print(f"  Added batch {i // batch_size + 1}: {len(batch)} domains")

# Main workflow
token   = get_auth_token()
domains = fetch_ai_domains()
print(f"Fetched {len(domains)} AI tool domains from blocklist feed")

list_id = create_destination_list(token, "AI Tools Blocklist")
add_domains_to_list(token, list_id, domains)
print(f"Done. {len(domains)} domains loaded into destination list {list_id}")

The script authenticates via OAuth2, downloads domains from our feed, and populates the list in batches of 500. Once complete, the destination list is immediately available for DNS policies.

DNS Policies

Configuring DNS Policies to Block AI Tool Domains

DNS policies define what happens when a query matches your destination list. Policies are evaluated in priority order — first match wins.

Navigate to Policies > DNS Policies and click Add. Configure four components: identity, destination list, action, and block page.

Policy Actions

Block

DNS returns a block page IP — no connection is ever established. Recommended for high-risk AI categories.

Warn

Users see a warning but can proceed. Ideal for transition periods. All proceed-through events are logged.

Allow with Logging

DNS resolves normally, but every query is logged. Use for audit phases or lower-risk AI categories.

Policy Priority and Ordering

Umbrella evaluates policies from highest priority (lowest number) to lowest. Use this to layer nuanced controls:

  1. Priority 1: Allow AI tools for the Data Science team (identity: AD group "Data Science", destination list: "AI Tools Blocklist", action: Allow)
  2. Priority 2: Warn on AI tool access for Engineering (identity: AD group "Engineering", destination list: "AI Tools Blocklist", action: Warn)
  3. Priority 3: Block AI tools for all other users (identity: All Identities, destination list: "AI Tools Blocklist", action: Block)

Data scientists get full access, engineers see a warning, and everyone else is hard-blocked. First-match behavior makes this straightforward without complex boolean logic.

Identity-Based Policies

Identity-Based Enforcement: Block AI by Department, Role, or Location

Umbrella integrates with Active Directory, SAML providers, and its roaming client for per-group AI blocking policies.

Legal Team

Block all AI tools to prevent confidential document exposure.

Marketing Team

Allow image generation tools, block text AI and code assistants.

IT Security Team

Unrestricted access for threat research and tool evaluation.

Active Directory Integration

AD Connector

Install the Umbrella AD Connector on a domain controller. It reads group memberships and maps them to Umbrella identities automatically.

Create AD Groups

Map your policy to groups: "AI-Blocked-Users", "AI-Warned-Users", and "AI-Allowed-Users". Reference these as identities in your DNS policies.

Category-Level Granularity

Create separate destination lists per AI category using our filtered API endpoints. Apply different combinations per department policy.

# Download category-specific domain lists for granular Umbrella policies

# High-risk: text generation and chatbots
curl -s -H "Authorization: Bearer $API_KEY" \
  "https://api.aitoolsblocklist.com/v1/feed/domains?format=plain&categories=text-language" \
  -o /tmp/ai-text-language.txt

# High-risk: code assistants and development tools
curl -s -H "Authorization: Bearer $API_KEY" \
  "https://api.aitoolsblocklist.com/v1/feed/domains?format=plain&categories=code-development" \
  -o /tmp/ai-code-dev.txt

# Medium-risk: image and visual generation
curl -s -H "Authorization: Bearer $API_KEY" \
  "https://api.aitoolsblocklist.com/v1/feed/domains?format=plain&categories=image-visual" \
  -o /tmp/ai-image-visual.txt

# Lower-risk: productivity and collaboration
curl -s -H "Authorization: Bearer $API_KEY" \
  "https://api.aitoolsblocklist.com/v1/feed/domains?format=plain&categories=productivity-collaboration" \
  -o /tmp/ai-productivity.txt

echo "Category lists downloaded:"
wc -l /tmp/ai-text-language.txt /tmp/ai-code-dev.txt \
      /tmp/ai-image-visual.txt /tmp/ai-productivity.txt

Each category list becomes a separate destination list. Finance blocks text-language, code-development, and agents-automation. Design blocks only text and code, allowing image tools.

Roaming Client Enforcement

Off-Network Protection

The Umbrella roaming client redirects DNS queries to Umbrella's anycast resolvers when devices leave the corporate network. AI tool blocks remain enforced at airports, home networks, and coffee shops. The client reports device identity, so identity-based policies work off-network too.

Automated Updates

Automating Daily Updates via the Umbrella Management API

A static destination list decays within days. Automated synchronization keeps your blocklist current as new AI tools appear.

The script below runs as a daily cron job — it downloads the latest feed, diffs against existing domains, and adds only new entries.

#!/usr/bin/env python3
"""Sync AI Tools Blocklist feed to Cisco Umbrella destination list daily."""

import requests
import logging
import time

logging.basicConfig(level=logging.INFO, format="%(asctime)s %(message)s")
log = logging.getLogger("umbrella-sync")

# Configuration
UMBRELLA_KEY     = "your-management-api-key"
UMBRELLA_SECRET  = "your-management-api-secret"
ORG_ID           = "your-org-id"
DEST_LIST_ID     = 123456  # ID of your AI Tools destination list
BLOCKLIST_API    = "your-blocklist-api-key"
FEED_URL         = "https://api.aitoolsblocklist.com/v1/feed/domains?format=plain"
BASE             = f"https://api.umbrella.com/v1/organizations/{ORG_ID}"
BATCH_SIZE       = 500
RATE_LIMIT_PAUSE = 1.0  # seconds between batches

def get_token():
    resp = requests.post(
        "https://api.umbrella.com/auth/v2/token",
        auth=(UMBRELLA_KEY, UMBRELLA_SECRET),
        data={"grant_type": "client_credentials"},
        timeout=10
    )
    resp.raise_for_status()
    return resp.json()["access_token"]

def fetch_feed_domains():
    """Get latest AI tool domains from blocklist feed."""
    resp = requests.get(
        FEED_URL,
        headers={"Authorization": f"Bearer {BLOCKLIST_API}"},
        timeout=60
    )
    resp.raise_for_status()
    return set(line.strip() for line in resp.text.splitlines() if line.strip())

def fetch_umbrella_domains(token):
    """Get current domains from Umbrella destination list (paginated)."""
    domains = set()
    page = 1
    while True:
        resp = requests.get(
            f"{BASE}/destinationlists/{DEST_LIST_ID}/destinations",
            headers={"Authorization": f"Bearer {token}"},
            params={"page": page, "limit": 100},
            timeout=15
        )
        resp.raise_for_status()
        data = resp.json()
        entries = data.get("data", [])
        if not entries:
            break
        for entry in entries:
            domains.add(entry["destination"])
        page += 1
    return domains

def add_domains(token, domains):
    """Add new domains in batches."""
    domain_list = list(domains)
    for i in range(0, len(domain_list), BATCH_SIZE):
        batch = domain_list[i:i + BATCH_SIZE]
        payload = [{"destination": d} for d in batch]
        resp = requests.post(
            f"{BASE}/destinationlists/{DEST_LIST_ID}/destinations",
            headers={
                "Authorization": f"Bearer {token}",
                "Content-Type": "application/json"
            },
            json=payload, timeout=30
        )
        resp.raise_for_status()
        log.info(f"  Added {len(batch)} domains (batch {i // BATCH_SIZE + 1})")
        time.sleep(RATE_LIMIT_PAUSE)

def remove_domains(token, domain_ids):
    """Remove stale domains by ID."""
    for did in domain_ids:
        resp = requests.delete(
            f"{BASE}/destinationlists/{DEST_LIST_ID}/destinations/{did}",
            headers={"Authorization": f"Bearer {token}"},
            timeout=10
        )
        resp.raise_for_status()

# Daily sync workflow
log.info("Starting Umbrella AI Tools Blocklist sync")
token = get_token()

feed_domains    = fetch_feed_domains()
current_domains = fetch_umbrella_domains(token)

to_add    = feed_domains - current_domains
to_remove = current_domains - feed_domains

log.info(f"Feed: {len(feed_domains)} | Current: {len(current_domains)}")
log.info(f"To add: {len(to_add)} | To remove: {len(to_remove)}")

if to_add:
    add_domains(token, to_add)
log.info("Sync complete")
# Cron entry: run the Umbrella sync script daily at 3:00 AM
0 3 * * * /usr/bin/python3 /opt/scripts/umbrella_ai_sync.py >> /var/log/umbrella-sync.log 2>&1

On a typical day, only a few dozen new domains are added. The initial run loads the full set; subsequent runs sync only diffs.

Reporting

Reporting and Visibility: Who Is Trying to Access AI Tools?

Understanding which tools employees attempt to access informs policy decisions and provides compliance evidence.

Umbrella Dashboard Reports

Security Activity

Filter by your destination list to see all blocked DNS queries. Shows domain, identity, timestamp, and triggering policy.

Top Destinations

Aggregates blocked domains by volume. Major chatbots top the list, followed by a long tail of specialized tools.

Top Identities

Shows which users or groups generate the most blocks. Identifies departments needing training or legitimate AI access.

Pulling Block Events via the Reporting API

For SIEM integration, the Reporting API provides programmatic access to block event data. The example below pulls the last 24 hours of AI-related blocks.

#!/usr/bin/env python3
"""Pull AI tool block events from Umbrella Reporting API for SIEM integration."""

import requests
import json
from datetime import datetime, timedelta

UMBRELLA_KEY    = "your-reporting-api-key"
UMBRELLA_SECRET = "your-reporting-api-secret"
ORG_ID          = "your-org-id"

REPORT_URL = f"https://reports.api.umbrella.com/v2/organizations/{ORG_ID}/activity"

def get_token():
    resp = requests.post(
        "https://api.umbrella.com/auth/v2/token",
        auth=(UMBRELLA_KEY, UMBRELLA_SECRET),
        data={"grant_type": "client_credentials"},
        timeout=10
    )
    resp.raise_for_status()
    return resp.json()["access_token"]

def get_ai_block_events(token, hours=24):
    """Fetch blocked DNS events for AI tool domains."""
    now   = datetime.utcnow()
    start = now - timedelta(hours=hours)

    params = {
        "from":     start.strftime("%Y-%m-%dT%H:%M:%S.000Z"),
        "to":       now.strftime("%Y-%m-%dT%H:%M:%S.000Z"),
        "verdict":  "blocked",
        "limit":    500
    }

    resp = requests.get(
        REPORT_URL,
        headers={"Authorization": f"Bearer {token}"},
        params=params,
        timeout=30
    )
    resp.raise_for_status()
    return resp.json().get("data", [])

token  = get_token()
events = get_ai_block_events(token)

print(f"AI tool block events (last 24h): {len(events)}")
for event in events[:20]:
    print(json.dumps({
        "timestamp":   event.get("datetime"),
        "domain":      event.get("domain"),
        "identity":    event.get("identity"),
        "action":      event.get("verdict"),
        "policy":      event.get("policyIdentity"),
        "source_ip":   event.get("externalIp")
    }, indent=2))

SIEM Alert Triggers

50+ blocks/hour from one user (circumvention attempt)

New domain appearing for the first time (trending tool)

Department spike after internal AI tool announcement

Advanced Configuration

Advanced Configuration: Closing Bypass Gaps

DNS-layer blocking is highly effective, but sophisticated users can attempt to bypass it. These configurations close the gaps.

Block DNS-over-HTTPS (DoH) & DNS-over-TLS (DoT)

Modern browsers encrypt DNS queries via DoH, bypassing Umbrella entirely. Close this vector:

Block outbound port 443 to known DoH resolvers (1.1.1.1, 8.8.8.8) at the firewall

Block port 853 (DoT) entirely

Chrome: set DnsOverHttpsMode to "off" via GPO/MDM

Firefox: set network.trr.mode to 5 via enterprise policy

Deploy the Umbrella roaming client — it intercepts system-level DoH

Combine with Umbrella's Built-In Categories

Enable Umbrella's native "Artificial Intelligence" category as a baseline layer, then overlay your AI Tools Blocklist destination list for comprehensive coverage. If a domain is missing from one source, the other catches it.

Intelligent Proxy Integration

Enable Umbrella's intelligent proxy for full URL inspection on risky domains. This allows blocking specific URL paths (e.g., example.com/ai-assistant) while allowing the rest of a shared domain.

Deployment Checklist

  • Create AI Tools destination list
  • Populate via Management API script
  • Create DNS policies per department
  • Set policy priority ordering
  • Configure block page branding
  • Deploy roaming client to remote users
  • Block DoH/DoT bypass vectors
  • Schedule daily feed sync via cron
  • Configure SIEM integration for reports
  • Review Top Destinations report weekly

SSL Inspection

Umbrella's intelligent proxy performs SSL decryption for proxied domains. This is only needed for URL-path-level blocking on shared domains — not required for standard domain-level blocking. Deploy the Umbrella root CA to all devices via GPO/MDM if enabled.

For layered defense, deploy the same feed to your Palo Alto firewall for inline inspection and to Umbrella for DNS enforcement. The firewall catches hardcoded IPs; Umbrella catches roaming and split-tunnel VPN traffic.

Get Started with Cisco Umbrella AI Blocking

Tell us about your Umbrella deployment and we will help you configure AI tool blocking with our domain feed. Include your approximate user count and Umbrella package tier.

Request a Custom AI Tools Blocklist

Tell us your requirements and we will prepare a tailored domain feed for your organization.