Shield
Verified Agents
More than half of web traffic is automated, and a growing share of it is legitimate — AI agents shopping, booking, and researching for real customers. Shield identifies automation that declares itself, so aggressive treatment is reserved for automation that refuses to.
How Identification Works
Shield verifies agent identity two ways, in order of preference:
1. Web Bot Auth (HTTP Message Signatures)
The emerging IETF standard (RFC 9421 signatures with the web-bot-auth tag)
backed by OpenAI, Google, Amazon, and Cloudflare. The agent signs each request with an
Ed25519 key and points to its published key directory via the
Signature-Agent header.
Shield fetches the directory, checks the signature, and confirms exactly which agent is calling —
identity that can't be spoofed by copying a user-agent string.
GET /products HTTP/1.1
Host: example.com
Signature-Agent: "https://agent.bot.goog"
Signature-Input: sig1=("@authority" "signature-agent");created=1753100000;\
keyid="poqkLGiy...";alg="ed25519";expires=1753100300;nonce="e8N7...";tag="web-bot-auth"
Signature: sig1=:jdq0SqOwHdyHr9+r5jw3iYZH6aNGKijYp/EstF4RQTQdi5N5YYKrD+mCT1HA1nZDsi6nJKuHxUi/5Syp3rLWBA==: 2. Confirmed crawlers (reverse DNS)
Established crawlers that predate Web Bot Auth — Googlebot, Bingbot, Applebot — are confirmed the way their operators document: reverse-DNS lookup of the calling IP, forward-confirmed back to the same address. A client merely claiming to be Googlebot from an unrelated IP gets no credit, and its user-agent lie counts against its humanity score.
Verification happens automatically on every /challenge
and /solve request an agent
makes through the widget flow. A verified identity is bound into the response token and surfaced
in the siteverify response
as the agent field.
Per-Widget Agent Policy
Each widget chooses how verified agents are treated, in the widget's settings:
| Policy | Behaviour |
|---|---|
allow default |
Verified agents pass without interactive escalation. The token carries their identity;
the humanity score stays honest (low — they're automation). You route on the
agent field.
|
challenge | No identity credit. Verified agents are scored like any anonymous client — clear automation signals will cap their score and trigger escalation in managed mode. |
block |
Verified agents are rejected at solve time with the
agent-blocked error code.
|
Whatever the policy, anonymous automation is always treated aggressively: clear automation signals with no declared identity hard-cap the humanity score. Declaring identity is the fast path — that's the incentive.
Routing on Identity
The score answers "is this a human?"; the agent field answers "then who is it?". Use both:
const result = await siteverify(token)
if (!result.success) reject()
else if (result.agent?.verified) {
// Declared automation — route it, don't fight it
routeToApi(result.agent.domain)
} else if (result.score >= 40) {
allow() // human traffic
} else {
block() // automation that refused to identify itself
} Server-Side Verification: agentverify
Agents don't only arrive through forms. When a signed request hits your origin directly —
an API endpoint, a content page — forward its signature headers to
agentverify and Shield
does the verification for you. No widget, no JavaScript, no challenge.
POST https://shield.edge.network/agentverify
Content-Type: application/json
{
"secret": "es_secret_...",
"authority": "example.com",
"headers": {
"signature-agent": "...",
"signature-input": "...",
"signature": "..."
}
} Response:
{
"success": true,
"agent": { "domain": "agent.bot.goog", "verified": true, "method": "web-bot-auth" },
"policy": "allow",
"error-codes": []
} authority is the
Host the agent addressed
(signatures cover it, so it must match), and headers
are the three signature headers verbatim from the incoming request. Failures return
success: false with
missing-signature-headers or
signature-verification-failed.
Web Bot Auth adoption is early and uneven — Google signs its AI-browsing agent but not Googlebot indexing, and rollouts are gradual. Treat a valid signature as strong positive identity; treat its absence as neutral, not negative.
What Shield Stores
Nothing new. Agent verification is stateless — key directories are cached briefly in memory, and the only persisted artefact is the hourly verified agent counter in your widget's analytics. No per-request logs, no agent request history.