Identify which anti-bot / bot-management solution a website uses (detection only).
antibot-detect performs passive fingerprinting: it makes a single, ordinary
browser-like request to a URL and inspects the response headers, cookies, and
HTML body for the common signatures of well-known bot-management products. It
then reports what it found, with a confidence level and the exact evidence that
matched.
It uses curl_cffi to impersonate a
real Chrome browser at the TLS layer, so it can reach pages that would otherwise
reject a generic HTTP client on fingerprint alone.
It does not solve challenges, defeat protections, or evade detection. It only tells you what is there.
| Provider | Signals used |
|---|---|
| Cloudflare | cf-ray, cf-cache-status, server: cloudflare headers; __cf_bm, cf_clearance cookies; /cdn-cgi/challenge-platform/, "Just a moment…", "Checking your browser" body markers |
| Akamai Bot Manager | AkamaiGHost server header, X-Akamai-* headers; _abck, bm_sz, bm_sv, ak_bmsc cookies |
| DataDome | datadome cookie; x-datadome* headers; geo.captcha-delivery.com references |
| PerimeterX / HUMAN | _px, _pxhd, _pxvid cookies; /api/v1/px/, client.perimeterx.net, px-captcha body markers |
| Imperva / Incapsula | incap_ses_*, visid_incap_*, nlbi_* cookies; X-Iinfo, X-CDN: Incapsula headers |
| Kasada | x-kpsdk-ct, x-kpsdk-v headers; ips.js script reference |
| AWS WAF | aws-waf-token cookie; awselb/ server header; AWS WAF challenge markers |
| reCAPTCHA | google.com/recaptcha/api.js, gstatic.com/recaptcha/ |
| hCaptcha | hcaptcha.com/1/api.js, js.hcaptcha.com |
| Cloudflare Turnstile | challenges.cloudflare.com/turnstile/ |
Confidence is scored as:
- HIGH — one strong signal (e.g. a vendor-specific cookie or header) or two or more signals of any kind.
- MEDIUM — a single weak/ambiguous signal.
- LOW — present but inconclusive.
Requires Python 3.10+.
git clone https://github.com/mmewni/antibot-detect.git
cd antibot-detect
# activate
python -m venv .venv
source .venv/bin/activate # Linux/Mac
.venv\Scripts\activate # Windows cmd
.venv\Scripts\Activate.ps1 # Powershell
# editable install
pip install -e .
# with test dependencies
pip install -e ".[dev]"antibot-detect <url> [--json] [--all] [--timeout SECS] [--verbose]
| Option | Description |
|---|---|
--json |
Machine-readable JSON output (to stdout). |
--all |
Also list detectors that did not match. |
--timeout SECS |
Request timeout in seconds (default: 15). |
--verbose |
Show fetch details: status, redirect chain, sampled headers, cookies. |
-V, --version |
Print the version. |
-h, --help |
Show help. |
$ antibot-detect https://www.cloudflare.com
Detected bot-management / anti-bot solutions
┏━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Solution ┃ Confidence ┃ Evidence ┃
┡━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ Cloudflare │ HIGH │ Header cf-ray: a07db3657c5b438f-LHR │
│ │ │ Header server: cloudflare │
│ │ │ Cookie __cf_bm present │
└────────────┴────────────┴───────────────────────────────────────────┘$ antibot-detect https://www.cloudflare.com --json
{
"requested_url": "https://www.cloudflare.com",
"final_url": "https://www.cloudflare.com/",
"status": 200,
"detections": [
{
"name": "Cloudflare",
"confidence": "HIGH",
"evidence": [
"Header cf-ray: a07db368eaa2ae03-LHR",
"Header server: cloudflare",
"Cookie __cf_bm present (Bot Management)"
]
}
],
"tool": "antibot-detect",
"version": "0.1.0"
}$ antibot-detect https://example.org --all
╭──────────────────────────────── Result ─────────────────────────────────╮
│ No known anti-bot / bot-management solution detected via passive │
│ fingerprinting. │
│ Note: a negative result is not proof of absence; JS-only defenses may │
│ not be visible without rendering. │
╰─────────────────────────────────────────────────────────────────────────╯
Not detected: Cloudflare, Akamai Bot Manager, DataDome, PerimeterX / HUMAN,
Imperva / Incapsula, Kasada, AWS WAF, reCAPTCHA, hCaptcha, Cloudflare Turnstilefrom antibot_detect.core import analyze
result = analyze("https://example.com", timeout=15)
for detection in result.detections:
print(detection.name, detection.confidence, detection.evidence)- Fetch (
fetcher.py) —curl_cffirequests the URL while impersonatingchrome120, sending a realistic header set (Accept,Accept-Language,Sec-Fetch-*, etc.). TheUser-Agentis not set manually so it stays consistent with the impersonated TLS fingerprint. Redirects are followed and every hop's status, headers, and cookies are recorded. The body is captured up to ~500 KB. - Detect (
detectors/) — each detector scans the headers (case-insensitive, across the full redirect chain), cookies, and body for its provider's signatures, and returns aDetectionwith evidence and a confidence score. - Report (
cli.py) — results are rendered as arichtable, or as JSON.
--browsermode — an optional Playwright-backed fetch that executes JavaScript, so detectors can also see dynamically injected challenge widgets and scripts that never appear in the raw HTML (many CAPTCHA and sensor scripts are added at runtime).- Support for more anti-bot/WAF providers
- A
--batchmode that reads a list of URLs from a file. - Per-signal weighting tunable via a config file.
This tool is for defensive security research, web development, and educational purposes. It only identifies bot-management solutions via passive fingerprinting, it does not attempt to bypass them.