Appearance
Detection signals
How Eureka tells agents, humans and bots apart. Each classification records its signals, visible in reports and in the raw data.
In the browser (tag)
Evidence is combined into a probability that the activity is not human. It starts at about 5%:
- Static evidence (user agent, automation traces, environment, agent overlays) holds as long as it is present.
- Behavioural evidence is updated on every click, keystroke and scroll, with a one-minute half-life.
The actor switches to non-human above 0.8, and back to human below 0.35 for two actions in a row. Each switch creates an actor_switch event and a new actor segment.
| Signal | Weight | Meaning |
|---|---|---|
ua:<name> | 6–10 | User agent of a known bot or user-triggered AI agent (ua:googlebot, ua:gptbot, ua:chatgpt-user, ua:google-agent…). Browsers used by both agents and humans (ChatGPT Atlas, Comet) are deliberately not listed. |
webdriver | 5 | navigator.webdriver is true (WebDriver, CDP-launched Chrome, Playwright) |
headless_ua | 5 | HeadlessChrome in the user agent |
auto:<tool> | 3–5 | Automation globals: Selenium/ChromeDriver, PhantomJS, Nightmare, CEF, Playwright… |
ext:claude | 6 | The overlay Claude in Chrome shows while it acts ([id^="claude-agent"]). Source: a third-party report, not verified by Eureka. |
ext:browser_use | 5 | browser-use highlight overlay |
zero_outer, no_lang, no_plugins, rtt0, swgl | 0.7–2 | Headless browser traits (no window size, no languages, no plugins, zero network latency, software graphics) |
cdp_runtime, cdp_binding | 0.7–1 | A Chrome DevTools Protocol client is attached (also true when DevTools is open, hence the low weight) |
untrusted | 3 | Click or input generated by a script (isTrusted false) without a real input just before |
no_move_click | 1.5 | Mouse click with no pointer movement in the previous 1.5 s |
teleport | 1.2 | Only 1–2 pointer moves before the click |
center_click | 1 | Click within half a pixel of the element's centre |
zero_press | 1 | Mouse button pressed and released in under 8 ms |
idle_burst | 0.6 | More than 2 s of silence, then an instant action: the screenshot → think → act loop of vision agents |
bulk_input | 1.5 | 4+ characters inserted without key presses |
paste_nokey | 1 | Paste without Ctrl/Cmd+V or context menu |
robotic_keys | 1.5 | Metronomic typing rhythm |
scroll_noinput | 0.8 | Scroll without wheel, touch, key or pointer input |
human_path | −1.5 | Curved pointer path with variable speed |
human_keys | −1 | Irregular typing rhythm |
touch | −0.8 | Touch interaction |
False-positive guards: touch never produces mouse signals; keyboard activation (Enter, Space) never produces click signals; input-method composition and browser autofill are excluded from typing signals; scrolls triggered by the site right after a click are ignored; weak environment signals alone (DevTools open, virtual machines) stay below the threshold.
On the server (collector and processor)
| Signal | Meaning |
|---|---|
| Web Bot Auth | The request carries a Signature-Agent header (for example ChatGPT agent: "https://chatgpt.com"): classified as a named AI agent. Signature verification is on the roadmap. |
| User-agent rules | Full lists of search crawlers, AI crawlers, AI search indexers, user-triggered AI fetchers and agents, automation and monitoring tools |
| Verified IP ranges | Published ranges of Google, Bing, OpenAI, Perplexity…, refreshed daily. A crawler outside its owner's ranges gets ua_spoof and becomes unknown_bot. |
ua_mismatch | The browser's user agent differs from the one in the request header |
dc_asn | Traffic from a hosting provider (AWS, GCP, Azure, OVH, Hetzner…) |
fetcher_runs_js | An AI fetcher that executes JavaScript is upgraded to AI agent |
Limits
Agents that drive the user's own Chrome (Claude in Chrome, Perplexity Comet, ChatGPT Atlas agent mode) have a normal fingerprint and user agent. Eureka recognizes them from behaviour and known page artefacts, with a confidence score, not with certainty. New artefacts and tuned thresholds are pushed through the remote configuration (detect.signatures, detect.thresholds) without redeploying the tag.