The Ultimate Guide to Web Bot Auth

Web Bot Auth (often abbreviated WBA) is an emerging IETF standard that lets bots, crawlers, and AI agents prove who they are by cryptographically signing their HTTP requests. The server checks the signature against a public key the bot publishes at a well-known URL. No shared secrets, no IP allowlists, no trusting a User-Agent string that anyone can type.

This guide is the long version of the story: where the standard came from, what is and is not an RFC, who signs and who verifies today, and how to implement it on either side. If you want the two-minute version first, read What is Web Bot Auth? and come back.

A note on names: “Web Bot Auth” is the project name used by the IETF working group and the ecosystem. On the wire it appears as the web-bot-auth tag inside an RFC 9421 HTTP Message Signature. You will also see “HTTP Message Signatures for Bots”, the title of the architecture draft. All three refer to the same mechanism.

The problem it solves

For twenty years, sites identified well-behaved bots two ways: the User-Agent string and the source IP. Googlebot says it is Googlebot, and you can reverse-DNS its IP to confirm. Both methods are now failing at once.

User-Agent strings are plain text. Any scraper can claim to be Googlebot, and many do, precisely because sites allowlist that string. IP verification held up better, but it assumes a bot runs on stable, publishable infrastructure. AI agents do not. They run in serverless functions, shared cloud egress pools, and increasingly on the user’s own machine or a hosted browser, where the IP says nothing about who is driving. Vercel’s engineers put it plainly when they added verification support: signature checks prove authenticity “regardless of network origin.”

The result is an arms race nobody enjoys. Sites that cannot tell a legitimate agent from an impersonator block both, then soften the block with CAPTCHAs, which agents fail, which pushes agent vendors toward stealth, which makes sites block harder. The Cloudflare and Perplexity dispute of August 2025 was this dynamic playing out in public.

Web Bot Auth replaces “guess from the metadata” with “verify a signature.” Only the holder of the private key can produce a valid signature, so identity becomes something a site can check, not something it has to believe.

How the protocol works

Three pieces, all standard HTTP.

1. The bot publishes keys. The operator generates a keypair (Ed25519 in every deployment today) and publishes the public key as a JSON Web Key Set at a fixed path on a domain they control:

https://example.com/.well-known/http-message-signatures-directory

2. The bot signs each request. Every outbound request carries an RFC 9421 signature covering, at minimum, the request’s authority (or its full target URI), with a tag=web-bot-auth parameter so verifiers know which scheme they are looking at. A Signature-Agent header tells the verifier where the keys live. A real signed request, here from OpenAI’s agent, looks like this:

Signature-Agent: "https://chatgpt.com"
Signature-Input: sig1=("@authority" "signature-agent")
  ;created=1735689600;expires=1735693200
  ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"
  ;tag="web-bot-auth";nonce="e8N7S2MFd..."
Signature: sig1=:jdq0SqOwHdyHr9...:

The keyid is a thumbprint of the signing key. The nonce defends against replay. created and expires bound the signature’s lifetime.

3. The server verifies. It reads Signature-Agent, fetches the directory (caching it), finds the key whose thumbprint matches keyid, and checks the signature bytes. If the math works, the request provably came from whoever controls that directory. Castle’s writeup of verifying OpenAI Operator requests walks through this step by step.

That is the whole mechanism. The details, which components must be covered, how thumbprints are computed, what the directory must serve, are exactly what our checker tests, and every check links to a reference page explaining the rule it enforces.

The standard: what is an RFC and what is not

Search results around “web bot auth rfc” deserve a precise answer, because the situation confuses people.

Already RFCs (the foundations): RFC 9421 defines HTTP Message Signatures, the generic signing mechanism. RFC 7638 defines the key thumbprints used as keyid. RFC 8941 defines the structured header syntax. RFC 8615 defines well-known URIs. All published, all stable.

Not yet RFCs (Web Bot Auth itself): the profile that applies those RFCs to bot traffic is specified in Internet-Drafts:

Around these sit satellite drafts that show where the work is heading: Gary Illyes (Google) wrote one on crawler best practices and one defining a JSON format for publishing crawler IP ranges, Eric Rescorla drafted anonymous bot authentication for rate-limiting without identification, and there are early documents on responsible data collection and semantic anchors.

The working group: the IETF chartered the WebBotAuth working group in early 2026, chaired by David Schinazi and Rifaat Shekh-Yusef, with Mike Bishop as responsible Area Director. The charter scopes it to cryptographically authenticating automated HTTP clients: search crawlers, archivers, AI training crawlers, and agents. Its milestones target standards-track specifications for the authentication mechanism and a best-current-practice operations document during 2026. To follow along, the datatracker page lists every document and meeting.

The draft versions this guide (and our checker) are verified against are pinned in the Last verified box below.

Timeline: from Operator to working group

Eighteen months from one product shipping signatures to a chartered standards group with the largest CDNs, clouds, and commerce platforms on board. By web-standards clocks, that is fast.

Who supports Web Bot Auth today

Two sides to track: agents that sign, and platforms that verify. Vendor links go to official documentation.

Agents and platforms that sign

WhoWhat signsStatusIn production sinceSource
OpenAIChatGPT agent (Operator) browsing requests, Signature-Agent: https://chatgpt.comProductionJan 2025OpenAI Help Center
GoogleA subset of Google-Agent fetcher traffic, keys at agent.bot.googExperimentalMay 2026Google Search Central
AWSBedrock AgentCore Browser signs every request when enabledPreviewOct 2025AWS docs
BrowserbaseHosted browser infrastructure signs for the agents it runsProductionAug 2025Browserbase blog
Anchor BrowserVerified browser agents on its platformProductionAug 2025Cloudflare signed agents post

Dates reflect our last verification pass. See Last verified.

Platforms and sites that verify

WhoWhat it does with signaturesStatusIn production sinceSource
CloudflareVerified Bots accepts Web Bot Auth; signed agents are a distinct, end-user-directed category sites can allow or blockProductionMay 2025 (verified bots), Aug 2025 (signed agents)Cloudflare docs
AkamaiEdge verification feeding bot classification in App & API ProtectorProductionNov 2025Akamai blog
VercelBot directory verified by IP, reverse DNS, and Web Bot Auth signaturesProductionAug 2025Vercel changelog
HUMANVerifies signed agent traffic against published directoriesProductionOct 2025AWS launch post naming verifying vendors
DataDomeAgent-trust verification through the customer journeyProductionJan 2026DataDome changelog
StytchAgent verification without pre-registrationProductionSep 2025Stytch blog
ShopifyStrictest rate limits for unsigned bots storewide; merchants can authorize their own crawlers with signing keys; checkout stays gated regardlessProductionMay 2026Shopify changelog

Dates reflect our last verification pass. See Last verified.

Notably absent from the signing table: Anthropic. ClaudeBot, Claude-User, and Claude-SearchBot identified themselves by User-Agent and robots.txt compliance only, as of our verification date. More on what that means for Claude-based agents below.

Registries and agent directories

Verification answers “does this request come from the holder of these keys?” The harder question is the next one: which key directories should a site trust in the first place? Anyone can publish a directory; publishing one does not make a bot welcome.

Three discovery mechanisms exist today:

  1. The Signature-Agent header points at the directory of the agent that signed. This is self-declared identity: cryptographically solid, but it only proves the agent controls some domain, not that the agent is reputable.
  2. The Signature Agent Card (registry draft) is machine-readable metadata about the agent: operator name and contacts, declared purpose, robots.txt product token, rate expectations, where the keys and IP ranges live. The draft establishes an IANA registry for its fields. Our agent card article covers it field by field.
  3. Registries, curated lists mapping known agents to their cards and directories. Cloudflare and AWS published an open registry format in February 2026 so that any party can host one and verifiers can consume them interchangeably. Cloudflare’s own signed-agents list and Vercel’s bot directory are effectively registries with admission criteria.

The open question, who runs the registries that matter and who gets in, is a governance debate more than a technical one. It is covered honestly in Limitations.

Implementing Web Bot Auth

If you operate a bot or agent

The path from zero to signed requests:

  1. Generate an Ed25519 keypair. Every deployed verifier speaks Ed25519. Keep the private key in your secret store; it never leaves your infrastructure.
  2. Publish the public key as a JWKS at /.well-known/http-message-signatures-directory on a domain that clearly belongs to your organization, with the media type application/http-message-signatures-directory+json. Serving it from a small handler (rather than a static file) lets you also self-sign the response, which the directory draft recommends.
  3. Sign your outbound requests. The reference libraries do the wire format for you: web-bot-auth on npm (TypeScript) or the web-bot-auth Rust crate. Cover @authority, send a Signature-Agent header pointing at your directory, include a nonce, and keep expiry short (minutes, well under the 24-hour recommendation).
  4. Publish a Signature Agent Card so site operators can find out who you are and how you behave. Optional, but it is the difference between “a valid signature” and “a known, accountable agent”.
  5. Test it. Run your domain through the checker for the directory side, and paste a captured signed request into the verifier for the signature side. Both grade against the current drafts and link every finding to an explanation.

If you run a website

You rarely need to build verification yourself:

  • Behind a CDN or bot manager: Cloudflare, Akamai, Vercel, HUMAN, and DataDome verify signatures for you (links in the table above) and expose the result as policy input: allow verified bots, challenge unknown automation, block impersonators. If you are on one of these platforms, Web Bot Auth is a setting, not a project.
  • Verifying at your origin: the cloudflare/web-bot-auth repo ships a Caddy plugin (Go) and Cloudflare Workers examples; Gary Illyes maintains an Apache module (C). The verification logic is: parse Signature-Input, fetch and cache the directory named by Signature-Agent, match the keyid thumbprint, verify the bytes, then apply your policy.
  • Policy for unsigned traffic stays yours. Today most sites treat signatures as a positive signal (verified bots get through cleanly) rather than requiring them. Shopify is the first large platform to attach real cost to not signing; expect more of that as agent traffic grows.

Signing from your own agent (a Claude example)

A frequent question with no official answer yet: what about Claude? Anthropic’s own crawlers do not sign with Web Bot Auth as of our verification date. But if you build an agent yourself, on the Claude Agent SDK, with MCP tools, or any other stack, the signing side is yours, and it is small.

The pattern: wrap your agent’s outbound HTTP with a signer. Generate a keypair, publish the directory on your domain, then sign each request before it leaves:

import { signatureHeaders, generateNonce, SIGNATURE_AGENT_HEADER } from 'web-bot-auth';
import { Ed25519Signer } from 'web-bot-auth/crypto';

const signer = await Ed25519Signer.fromJWK(privateJwk);
const headers = { [SIGNATURE_AGENT_HEADER]: '"https://your-agent.example"' };
const now = new Date();
const sig = await signatureHeaders(
  { method: 'GET', url, headers },
  signer,
  { created: now, expires: new Date(now.getTime() + 300_000), nonce: generateNonce() },
);
// attach { ...headers, ...sig } to the outbound request

This site is the case study: the checker’s own outbound fetches are signed exactly this way, with the directory at webbotauth.net/.well-known/http-message-signatures-directory and the agent card linked from it. When our bot fetches your directory to grade it, you can verify us right back on /verify. An agent that signs its requests gets recognized by every verifier in the table above, which increasingly means fewer CAPTCHAs and fewer silent blocks.

The open-source ecosystem

The reference implementation lives at cloudflare/web-bot-auth (Apache-2.0), a monorepo holding:

  • TypeScript packages: web-bot-auth (the bot profile), http-message-sig (generic RFC 9421), and jsonwebkey-thumbprint (RFC 7638).
  • Rust crates: web-bot-auth and http-signature-directory, a directory validation tool.
  • Working examples: a Chrome extension that signs from the browser, Cloudflare Workers for signing and verifying, a Caddy plugin, and a directory-hosting example.
  • The official JSON test vectors that implementations (including this checker) test against.

Beyond the monorepo, the architecture draft’s implementations appendix lists a Puppeteer signing example by Stytch, a PHP Guzzle middleware, and the Apache verification module mentioned above. The draft sources themselves are developed openly at thibmeu/http-message-signatures-directory.

Live directories you can inspect right now: chatgpt.com and this site’s own.

Limitations and open questions

A neutral guide owes you the unsolved parts.

Identity is not intent. A valid signature proves which operator sent a request. It says nothing about whether that operator respects robots.txt, hammers your origin, or trains on your content. Accountability still depends on knowing who the operator is (the card, the registries) and on their behavior matching their declarations.

Registry governance is unsettled. When Cloudflare launched signed agents, critics argued that requiring registration with one company to get reliable web access looks like a tollbooth, however well-intentioned. The open registry format is a real answer (anyone can run one), but admission criteria, dispute handling, and revocation across registries are unwritten. This is the part of the ecosystem most likely to generate friction.

Replay protection is operator work. Signatures carry a nonce and a validity window, but nothing in the protocol stops a captured signature from being replayed within its window unless the verifier tracks nonces. The drafts leave that, deliberately, to implementations. Our replay advisory explains the trade-off.

Key management is the usual hard part. Rotation, compromise response, and the question of how long verifiers may cache a directory are all live topics in the working group. The directory draft’s validity fields and the recommended response self-signature are partial answers.

Privacy cuts both ways. Per-operator keys make agent traffic linkable by design; that is the feature. For cases where a bot should prove “I am rate-limited and accountable” without revealing which bot it is, Eric Rescorla’s anonymous authentication draft explores blind-signature schemes. Early days.

And robots.txt still applies. Web Bot Auth does not change what a crawler may fetch. It changes whether the “who” in your access rules means anything.

Resources

TypeResourceWhat it is
SpecArchitecture draftThe core document: how agents sign and origins verify
SpecDirectory draftThe key directory: well-known path, media type, response self-signature
SpecRegistry draftThe Signature Agent Card and registry formats
SpecUse cases draftThe problem catalogue the working group works from
SpecWebBotAuth WGCharter, documents, milestones, mailing list
SpecRFC 9421HTTP Message Signatures, the published foundation
VendorCloudflareVerification reference, verified bots, signed agents
VendorAkamaiBot management support announcement
VendorVercelBot management documentation
VendorAWSAgentCore Browser signing guide
VendorGoogleGoogle-Agent signing documentation
VendorShopifyRate limits and crawler access keys
Codecloudflare/web-bot-authReference monorepo: TypeScript + Rust libraries, examples, test vectors
Codeweb-bot-auth on npmThe TypeScript signing and verification package
CodeApache moduleOrigin-side verification for Apache
CodeDraft sourcesWhere the drafts are developed in the open
This siteCheck a domainGrade a published directory A to F
This siteVerify a signatureCheck captured request headers
This siteThe short primerThe two-minute version of this guide
This siteHow grading worksVerdicts, scores, and capping rules
This siteThe agent cardThe metadata document, field by field

FAQ

Is Web Bot Auth an RFC?

Not yet. The mechanism builds on RFC 9421 (HTTP Message Signatures), which is a published standard, but Web Bot Auth itself is a set of IETF drafts being developed by the WebBotAuth working group, chartered in early 2026. The group's milestones target standards-track documents during 2026. Until then, implementations track the draft versions named in the infobox at the bottom of this page.

Who created Web Bot Auth?

Thibault Meunier at Cloudflare wrote the first drafts and Cloudflare proposed the mechanism publicly in May 2025. OpenAI had already shipped request signing in its Operator agent in January 2025. The work now lives at the IETF: the architecture draft is co-authored by Cloudflare and Google, and the working group includes contributions from Vercel, Mozilla, and others.

Is it mandatory for bots and agents?

No. Unsigned automation still works on most of the web. The cost of not signing is rising, though: Shopify applies its strictest rate limits to unsigned bots, agent browsers without signatures hit more CAPTCHAs, and bot-management vendors treat unverifiable traffic with more suspicion. Signing is how an agent opts into being treated as itself rather than as anonymous traffic.

Does Web Bot Auth replace robots.txt?

No. robots.txt (RFC 9309) expresses what a crawler may fetch; Web Bot Auth proves who the crawler is. They answer different questions and work together: a signed agent can still be disallowed, and the Signature Agent Card even has fields for declaring robots.txt compliance.

Which agents actually sign today?

OpenAI's ChatGPT agent (Operator) signs in production, Google signs a subset of its Google-Agent traffic experimentally, AWS Bedrock AgentCore Browser signs in preview, and hosted browser platforms like Browserbase and Anchor Browser sign for the agents they run. Anthropic's crawlers (ClaudeBot, Claude-User, Claude-SearchBot) did not sign as of our last verification pass. The adoption tables above carry dates and sources.

How do I check whether a domain has Web Bot Auth set up?

Run it through the checker: it fetches the domain's key directory, validates it against the drafts, and grades it A to F. If you have captured request headers, paste them into the verifier to check the signature itself.

Does it work behind proxies and CDNs?

Yes, that is much of the point. The signature lives in HTTP headers and is checked at the application layer, so it survives IP changes, shared egress, and serverless platforms where IP allowlists fall apart. Proxies must not strip the Signature, Signature-Input, and Signature-Agent headers; the architecture draft also defines how an intermediary may relabel a signature without breaking it.