How it works, · 5 min read

Web Bot Auth explained: how AI agents sign their requests

For thirty years, bots identified themselves with a name in the User-Agent header and a hope that you'd believe it. IP lists and reverse DNS made that name checkable, but they don't work well for the newest visitors: AI agents that browse in a normal browser, from cloud addresses that change all the time.

Web Bot Auth is the fix being built for that. The bot signs each request with a private key, and anyone can check the signature against a public key the operator publishes. Here is how it works.

The problem it solves

A crawler like Googlebot has a stable fleet of servers, a fixed name and published addresses. Checking it is easy.

An AI agent is different. ChatGPT agent runs a real browser to do tasks for a person: open a site, compare prices, fill in a form. Its User-Agent looks like an ordinary Chrome visitor. It may run on shared cloud infrastructure. You can't pick it out by name, and an IP list would be large, shared and fast-changing.

Site owners still need to know what it is. Agents behave differently from people, and many sites want to allow good agents through while blocking scrapers that pretend to be them.

How it works, step by step

Web Bot Auth builds on HTTP Message Signatures (RFC 9421), a standard way to sign parts of an HTTP request. The Web Bot Auth drafts at the IETF describe how bots should use it.

  1. The operator creates a key pair. It keeps the private key and publishes the public key in a key directory on its own domain, at a well-known address.
  2. The bot signs each request. It computes a signature over chosen parts of the request, using the private key, with a creation time and an expiry.
  3. The request carries three headers. Signature-Agent says where to find the key directory. Signature-Input says what was signed, with which key and when. Signature holds the signature itself.
  4. The site checks it. It fetches the public key from the directory named in Signature-Agent, rebuilds what was signed, and verifies. If the signature holds and hasn't expired, the request came from someone holding the operator's private key.
What the headers look like (shortened, illustrative)
Signature-Agent: "https://chatgpt.com"
Signature-Input: sig1=("@authority" "signature-agent");created=1761642000;expires=1761642060;keyid="…";alg="ed25519";tag="web-bot-auth"
Signature: sig1=:…base64…:

Compared with IP lists and reverse DNS

Bot verification methods compared
MethodProvesWeak spot
User-Agent nameNothingAnyone can type any name.
Published IP listThe request came from the operator's addressesLists change; hard for agents on shared cloud addresses.
Reverse DNS + forward lookupThe address belongs to the operator's domainTwo DNS lookups per new address; not every operator supports it.
Web Bot Auth signatureThe sender holds the operator's private keyOnly works for bots that sign; still new.

These methods stack. A visit can be checked by IP list today and by signature tomorrow. More detail on the first two in how to verify AI bots.

Who uses it today

Adoption is early, but it has started with the visitors that need it most.

  • OpenAI signs requests from ChatGPT agent and sends https://chatgpt.com in the Signature-Agent header. That header is also how SenseGap recognizes ChatGPT agent, since its User-Agent looks like an ordinary browser.
  • Cloudflare verifies signed bots and agents at its edge and lets site owners treat them as verified.
  • Other infrastructure companies, including AWS, have announced support for checking these signatures.

Expect the list to grow, especially among AI agents. For the classic crawlers, IP lists will stay the main check for a while.

What it means for site owners

You don't need to do anything to keep signed agents working. The signature is extra information; requests are served as before.

What changes is what you can know and enforce:

  • You can tell agents from people. A request with a valid ChatGPT agent signature is an AI acting for a person, not the person.
  • You can allow good agents precisely. Instead of loosening rules for anything that looks like Chrome, you can allow requests with a valid signature from operators you trust.
  • You can stop impersonation. A request claiming Signature-Agent: "https://chatgpt.com" without a valid signature is not ChatGPT.

To block ChatGPT agent today, match the header at your server. In nginx:

nginx
if ($http_signature_agent ~* "chatgpt\.com") {
    return 403;
}

A header match is a blunt rule. Anyone can send the header, so use it to block, never to allow.

What Web Bot Auth doesn't do

A valid signature answers one question: who sent this request. It leaves others open.

  • It doesn't say why. A signed request from an AI company could be a crawl, a search fetch or an agent acting for a person. You still need the operator's documentation, and the bot's name, to know the purpose.
  • It doesn't make a bot polite. A signed agent can still request too many pages or ignore your preferences. Signatures make it easier to hold the right company responsible, not to prevent the behavior.
  • It doesn't cover unsigned bots. Most crawlers don't sign yet. For them, IP lists and reverse DNS remain the checks.
  • It depends on key handling. If an operator's private key leaked, signatures would no longer prove much until the key is rotated. Operators publish key expiry dates partly for this reason.

None of these are reasons to ignore it. Together with the older checks, signatures close the gap that AI agents opened: a visitor that looks like a person but isn't.

Where SenseGap stands

SenseGap recognizes ChatGPT agent by its Signature-Agent header and records it as an AI agent visit, apart from crawlers and from fetches that answer a person. Today those visits are labeled Unverified, because full signature checks are coming soon. When they ship, signed visits will be marked Real or Fake with the same evidence trail as IP and DNS checks.

See the current checks on how we verify bots.

FAQ, the short answers.

Questions, answered plainly

What is Web Bot Auth?

A way for bots and AI agents to prove their identity by signing each HTTP request with a private key. Sites verify the signature with a public key the operator publishes. It is built on HTTP Message Signatures (RFC 9421).

What is the Signature-Agent header?

A request header that tells the site where to find the signer's public key directory. ChatGPT agent sends https://chatgpt.com. On its own the header proves nothing; the Signature header has to verify against the published key.

Does ChatGPT agent use Web Bot Auth?

Yes. OpenAI signs ChatGPT agent's requests with HTTP Message Signatures and sends https://chatgpt.com in the Signature-Agent header.

Do I need to change my site to support Web Bot Auth?

No. Signed requests work like any other request. Verifying signatures is optional and usually done by your CDN or an analytics tool.

See what AI does on your site. Every visit counted and checked. Estimates always labeled.

Get started