Verify an AI Agent: Web Bot Auth and Signed Agent Traffic
AI Security · practitioner · 8 min read · last reviewed 2026-08-31
Web Bot Auth signs agent requests with a verifiable key, turning "this claims to be ChatGPT" into proof. The drafts, the CDN path, origin verification, and the policy that has to come first.
TL;DR
- An agent's user agent string, IP, and hostname are all forgeable. Web Bot Auth has the operator sign each request with a key you verify against a published directory.
- It is built on HTTP Message Signatures (RFC 9421) across three IETF drafts, none adopted as a single working group document as of 2026, and it shipped anyway.
- Cloudflare, Anthropic, and OpenAI moved to production together, which made it the de facto standard ahead of the RFC. Supported operators include Claude, ChatGPT, Perplexity, and Common Crawl.
- Verification proves operator identity only. It is not authorization, not intent, and not a decision about whether the request is welcome.
- Start by logging, not blocking. Take the CDN implementation if you have one, cache key directories, and fail open on verification errors.
An AI agent hitting your site presents a user agent string, an IP address, and nothing else. All three are trivially forged. Web Bot Auth fixes that by having the agent cryptographically sign each request with a key you can verify against a published directory, which turns "this claims to be ChatGPT" into "this is provably the holder of OpenAI's signing key".
It is the BIMI story repeating one protocol layer down. Self-asserted identity is being replaced by certificate-backed identity, and the same three properties hold: the verification is cheap for the receiver, expensive to counterfeit, and fails silently when misconfigured.
What Web Bot Auth is
Web Bot Auth is a set of IETF drafts, authored primarily out of Cloudflare with a co-author at Google, that specify how automated HTTP clients identify themselves using HTTP Message Signatures (RFC 9421).
The mechanism is simple. An agent operator generates an Ed25519 signing keypair and publishes the public key at a well-known HTTPS location. When the agent makes a request, it signs a set of headers with the private key and attaches Signature and Signature-Input headers. The origin fetches the public key, verifies the signature, and now knows which operator sent the request regardless of what the user agent string says.
Three drafts carry it: an architecture document, an HTTP Message Signatures protocol specification, and a registry draft covering the signature agent card and key directory. None had been adopted as a single working group document as of 2026, and it is shipping anyway. Cloudflare, Anthropic, and OpenAI moved to production in parallel, which is what made it the de facto standard well ahead of the RFC.
The signature proves operator identity, not intent, not authorization, and not that the request is welcome. A verified agent is still an agent. Verification tells you who to apply policy to; it does not decide the policy.
What it replaces, and why that mattered
The previous state of the art was reverse DNS verification: resolve the client IP to a hostname, resolve that hostname forward, confirm it matches. Google published this method for Googlebot and it worked for a decade.
It scales badly for the current situation. Reverse DNS requires every operator to control static IP space and every origin to maintain per-operator verification logic. It also breaks entirely when an agent runs on behalf of an individual user from arbitrary infrastructure, which is the shape of most agentic browsing.
robots.txt never solved this either, for a reason worth stating plainly: it is a request, not a control, and it is addressed to a name the requester chose for itself.
Step 1: Decide what you are protecting
Verification is worthless without a policy to attach to it. Before implementing, write down which of these you actually want:
- Allow verified agents, rate-limit unverified ones. Most common, least disruptive.
- Allow named operators only. Appropriate for paid content or an API surface.
- Block all agents, verified or not. Legitimate, and much easier to enforce correctly once agents are identifiable.
- Allow everything, log the identity. The right first step. You cannot set policy on traffic you have never measured.
Start at the last one. Nearly every team that begins with blocking discovers they blocked a crawler that was driving referral traffic.
Step 2: Take the CDN implementation if you have one
If you sit behind a CDN that implements signed agent verification, turn it on there and stop. The edge is the correct layer: verification requires a key fetch, and doing that per request at your origin is a cache and latency problem you do not need to own.
Cloudflare's implementation verifies signatures at the edge and exposes the result as a request property you can branch on in a rule. Supported operators as of 2026 include Anthropic, OpenAI, Perplexity, Common Crawl, and several Google bots.
Step 3: Verify at the origin, if you must
If you are implementing directly, the flow per request is:
- Read
Signature-Inputto learn the key identifier and the covered components. - Fetch the operator's key directory over HTTPS. Cache it. A key fetch per inbound request is a self-inflicted denial of service and a hard dependency on someone else's uptime.
- Verify the Ed25519 signature over the covered components.
- Check the signature's
createdandexpiresvalues against your clock, with a tolerance measured in minutes, not hours. - Confirm the covered components include enough of the request to be meaningful. A signature covering only
@authorityproves far less than one covering method, path, and authority.
The replay window is the part implementations get wrong. A signature with a long validity and a narrow component set is a bearer token that any observer can reuse against a different path.
Step 4: Fail open, and log it
Treat an unverifiable signature as unverified traffic, not as an attack. Key directories go down, clocks drift, and drafts change. An origin that hard-fails on verification errors will eventually block the exact well-behaved crawlers it was built to admit.
Log four fields on every agent request: the claimed user agent, the verification result, the resolved operator when verification succeeded, and the policy decision. Those four fields are the entire dataset you need to set a real policy in a month.
How this relates to agent identity inside your systems
Web Bot Auth answers "which operator is knocking on my public surface". It says nothing about what an agent may do once it is inside, which is a different problem with different standards.
| Question | Standard | Where it applies |
|---|---|---|
| Which operator sent this request? | Web Bot Auth, RFC 9421 | Public HTTP surface |
| Which workload is this? | SPIFFE, mTLS | Service-to-service |
| What may this agent do on behalf of this user? | OAuth 2.0, downscoped tokens | Application authorization |
| What may this tool invocation do? | Per-invocation authorization | MCP servers |
Confusing the first row with the third is the most common architectural mistake here. A verified signature is an authentication fact about an operator. It is not a grant. See Identity for AI Agents for the authorization side and Secure an MCP Server for the tool boundary.
Should you do it?
You publish content and AI crawlers matter to your traffic
Turn on verification at your CDN, log for a month, then set policy. The measurement is the valuable part and it costs you nothing.
You run an API or paid content
Yes, and treat verified operator identity as a first-class field in your rate-limiting and billing logic. This is the case where "allow named operators only" is a real product decision rather than a defensive crouch.
You are building an agent that fetches the web
Implement signing now. Publish a key directory, sign your requests, and document the operator identity. Unsigned agents are heading toward the same treatment unauthenticated mail gets, and the migration window is closing through late 2026.
You are a small site with no bot problem
Log, do not block. The cost of over-blocking is invisible and the cost of doing nothing is currently zero.
Draft status, operator support, and CDN feature availability all move quickly. Confirm current draft revisions at the IETF datatracker before building against a specific version.
Key takeaways
- Write the policy before implementing the verification. Teams that begin with blocking routinely block a crawler that was driving referral traffic.
- Fetching a key directory per inbound request is a self-inflicted denial of service and a hard dependency on someone else's uptime. Cache it.
- The replay window is what implementations get wrong. A long-lived signature over a narrow component set is a bearer token any observer can reuse against a different path.
- Fail open and log. Key directories go down and drafts change; an origin that hard-fails on verification errors eventually blocks the well-behaved crawlers it was built to admit.
- Web Bot Auth answers which operator is knocking on your public surface. It says nothing about what an agent may do inside your systems, which is OAuth and per-invocation authorization territory.
- If you are building an agent, start signing now. Unsigned agents are heading toward the treatment unauthenticated mail gets.
Frequently asked questions
- What is Web Bot Auth?
- A set of IETF drafts specifying how automated HTTP clients identify themselves using HTTP Message Signatures (RFC 9421). The operator publishes a public key at a well-known location and the agent signs request components, so an origin can verify which operator sent the request.
- Is Web Bot Auth a finished standard?
- No. As of 2026 the working group had not adopted a single draft, though it was chartered in early 2026 with a standards-track milestone. Production deployment by Cloudflare, Anthropic, and OpenAI has outpaced the process.
- How is this different from robots.txt?
- robots.txt is a request addressed to a name the requester chose for itself. Web Bot Auth establishes who is actually asking. It replaces the guesswork about identity, not the policy about permission.
- Does a verified agent mean I should allow it?
- No. Verification is an authentication fact about an operator, not a grant. The most common architectural mistake here is treating a valid signature as authorization.
- Should I block unverified agents?
- Not as a first step. Log the claimed user agent, the verification result, the resolved operator, and your policy decision for a month. That dataset is what makes a real policy possible.
- Do I need to implement this at my origin?
- Not if you sit behind a CDN that verifies signed agents at the edge. Verification requires a key fetch, and doing that per request at your origin is a cache and latency problem you do not need to own.
Related
Research pillars
Vendor comparisons
Sibling guides
Glossary