How AI agents sign HTTP requests with Web Bot Auth

Web Bot Auth uses RFC 9421 signatures and a published key directory so sites can verify signed agent requests.

Web Bot Auth lets an automated client sign an HTTP request with an asymmetric key. A verifier reads Signature, Signature-Input, and Signature-Agent, fetches the signer's public key from its declared directory, and checks the signature before applying bot policy. The protocol works at the HTTP layer, so it does not require a new transport protocol or a per-site shared secret.

Key facts about Web Bot Auth

  • On 2026-09-01, the IETF published draft-ietf-webbotauth-httpsig-protocol-00, an Internet-Draft with Intended status: Standards Track. Thibault Meunier of Cloudflare and Sandor Major of Google are the authors. The draft expires on 2027-03-05. It is a work in progress, not an RFC.
  • A signed request carries Signature, Signature-Input, and Signature-Agent.
  • The signature parameters include created, expires, a base64url JWK SHA-256 thumbprint in keyid, and tag="web-bot-auth". The covered components must include @authority or @target-uri, and the signature must cover the Signature-Agent member for its own label.
  • In the default directory mode, the verifier resolves an HTTPS origin to /.well-known/http-message-signatures-directory, which returns a JWKS with media type application/http-message-signatures-directory+json.
  • OpenAI says ChatGPT Work's Cloud browser signs requests with Signature-Agent: "https://chatgpt.com". Google says only a subset of Google-Agent requests are signed, using https://agent.bot.goog, and labels its implementation experimental.

How Web Bot Auth signs a request

Web Bot Auth uses RFC 9421, HTTP Message Signatures. The signature travels in HTTP headers, while TLS continues to protect the connection. The current IETF draft requires the Signature-Agent field to be a Structured Fields dictionary. A minimal current-draft shape is:

GET /api/v1/catalog HTTP/1.1
Host: api.example.com
Signature-Agent: sig1="https://agent.example"
Signature-Input: sig1=("@authority" "signature-agent";key="sig1");created=...;expires=...;keyid="...";alg="ed25519";tag="web-bot-auth"
Signature: sig1=:base64-signature:

The signer chooses the components. The draft requires @authority or @target-uri, the time bounds, the key thumbprint, and the Web Bot Auth tag. It also requires the signer to cover the Signature-Agent member that corresponds to the signature label. A signer can cover more components, such as @method or @path, to narrow where a captured signature can be replayed. A body is not covered automatically. A request that needs body integrity must include and sign Content-Digest.

Cloudflare's deployed integration follows an older form of Signature-Agent, written as a quoted string:

Signature-Agent: "https://signature-agent.test"

Cloudflare says it rejects the later dictionary form, rejects an unquoted URI, and rejects a request that does not include signature-agent in Signature-Input. This is an implementation difference to check before sending the current IETF syntax to Cloudflare.

In the default directory mode, the verifier treats the Signature-Agent value as an HTTPS origin and fetches /.well-known/http-message-signatures-directory. The directory must return HTTP 200, use HTTPS, serve a JWKS, and use the registered media type. The verifier selects a key by matching the request's keyid to the published key and can cache the directory according to its cache headers. A valid signature proves that the holder of that key signed the covered components. It does not prove that the agent is harmless or that the request is authorized.

The directory itself can carry a possession proof. Cloudflare requires one signature per published key over the directory response, with tag="http-message-signatures-directory" and @authority covered. The current IETF draft recommends this proof for domain binding and requires valid proof before a verifier attributes redistributed key material to a Signature-Agent URL. The response signature stops a copied key set from being presented as if it came from another authority.

How edge networks verify signed agents

An edge provider can fetch and cache the public key, verify the request, and apply a bot rule before the request reaches an origin. OpenAI's Cloud browser allowlisting guide documents these integrations:

Platform

Identifier

Operator action

Cloudflare

Bot tag chatgpt-agent; Detection ID 129220581

Match the detection ID in a WAF rule

Akamai

ChatGPT Agent

Allow it in Artificial Intelligence bots

Vercel

ChatGPT Agent, entry chatgpt-operator

No extra configuration for Vercel-hosted sites

HUMAN

ChatGPT Agent

Manage it in Known Bots & Crawlers or AgenticTrust

Cloudflare announced its signed-agent category on 2025-08-28. Cloudflare says its Browser Rendering product sends signed Web Bot Auth headers and that the first partner cohort included ChatGPT agent, Goose from Block, Browserbase, and Anchor Browser.

Cloudflare's implementation has constraints that do not describe every possible RFC 9421 deployment:

  • Its documented signing flow uses Ed25519 keys and recommends covering @authority with ASCII-only components.
  • It recommends signing the whole query with @query, not an individual parameter with @query-params.
  • It rejects several RFC 9421 component parameters in requests, including sf, bs, key, and req.
  • Cloudflare is experimenting with RFC 7239 Forwarded values such as Forwarded: for="openai";use="reference" to carry operator and content-use information through an intermediary.

What changed in Web Bot Auth

RFC 9421, the underlying HTTP Message Signatures standard, is dated February 2024. Cloudflare's signed-agent announcement followed on 2025-08-28. The current IETF Web Bot Auth Internet-Draft arrived on 2026-09-01 and expires on 2027-03-05. Calling that draft a finished standard would be wrong.

Google's current guide still calls its Web Bot Auth integration experimental. It says that not all Google user agents use the protocol, that Google does not sign every request, and that operators should retain IP, reverse-DNS, and User-Agent checks as fallbacks.

Sources

Last verified: 2026-10-06.

Spotted an outdated or wrong claim? Agents can report it with evidence throughPOST /api/feedback; an editor checks every report. See llms.txt for the agent API.