agent-signals / probe
Origin-side classification of AI-agent traffic

This page has already decided what you are.

No CDN, no bot vendor, nothing in the path but this server. The reading below is not an example: it is what the classifier made of the request you just sent, and it is already in the log.

Request 1 · Tier 3 — what your request looked like on arrival

the GET that delivered this page
agent 100/100 tier unattested

7 signals fired · agent from 50

Scored from HTTP headers alone. Nothing has executed yet, so there is no attestation and this is tier 3 by definition — for a browser too.

  • attestationAbsent no weight no browser attestation submitted (tier 3, definitional)
  • knownAgentUserAgent +60 matched claudebot
  • genericBot +40 isbot matched Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +c
  • missingSecFetch +30 none of Sec-Fetch-Mode, Sec-Fetch-Site or Sec-Fetch-Dest present
  • missingAcceptLanguage +15 no Accept-Language header
  • hostingAsn +15 hosting network: AMAZON-02
  • missingDeviceId +10 no deviceId on the request

visit cdcd5154-e0aa-4ed0-a8b4-1d98c504ebbc · untagged — add ?ref=your-label to group one run together in the log

Request 2 · after the page runs

live

Waiting for JavaScript. If you are reading this in a client that does not execute scripts, that is the result: there is no second request, the classifier never sees an attestation from you, and request 1 above is the whole story.

The decision, in the order it is made

three tiers
  1. Declared agent checked first, terminal
    A Web Bot Auth header (Signature-Agent, or RFC 9421 Signature and Signature-Input). Terminal: nothing else is consulted, and the signature is not verified. A browser never sends one.
  2. Attested browser then
    The page executed and submitted a coherent attestation. Read as human — unless the attestation contradicts itself, which scores higher than anything else here.
  3. No attestation otherwise ← you are here
    Neither of the above, so this did not come from the application's own client. That is a definition rather than a guess, and it is where every first page load starts — a browser included.

The marker follows your latest request, not this visit as a whole. Loading this page is two requests: the GET that delivered the HTML, then a POST once the page has run and has an attestation to send. They are classified independently and can land in different tiers — which is the normal case for a browser, and the reason the two panels above disagree.

Point something at it

same classifier, json out
curl -s http://agent-signals.agentic-commerce-lab.ai/api/probe | jq

# force the hosting signal without an ASN lookup
curl -s 'http://agent-signals.agentic-commerce-lab.ai/api/probe?hosting=1&asn=Amazon-02' | jq

# post an attestation the way the page does
curl -s http://agent-signals.agentic-commerce-lab.ai/api/probe -X POST \
  -H 'content-type: application/json' \
  -d '{"attestation":{"nonce":"x","webdriver":true,"userAgentData":null,"permissions":{}}}' | jq

Network lookup for the hosting signal is on. Private and loopback addresses are skipped, so it stays quiet in local development.

How it decides

and what it refuses to look at

Three tiers, and only the third is probabilistic. A Web Bot Auth header (RFC 9421) is a caller declaring itself an agent, which ends the decision. A coherent browser attestation is a human. Neither means the request did not come from this application's own client — which is a definition, not a guess.

The signature is not verified. Verifying it would answer which operator is calling, and nothing here turns on that: every agent is treated the same, so a forged declaration only volunteers its owner for the agent class. That changes if being signed ever earns something better than a bill.

Weighted signals then set confidence within a tier. Every weight traces to a measurement in Fayolle et al., arXiv:2606.30119. The heaviest ones fire on self-contradiction rather than on any single spoofable attribute, because that study's most transferable finding is that stealth increases detectability.

Browser-resident assistants are scoped as human by decision: that is a person using their own browser. TLS fingerprinting is rejected — 10 of 15 tools in the study's dataset share a JA4 fingerprint with a human.

The task page

where agents actually get pointed

The site at / is ordinary content with something to do, and no mention of any of this. It prints a reference code and asks for it back in a form, so a submission only counts if the caller rendered the page, read it, and returned the session cookie it was given. That criterion is what separates “a POST arrived” from “the caller completed the task”.

Each submission is logged with its outcome, so you can compare completion rates across tools rather than just verdicts.