Rightshold™ Sign up

Answers · AI crawlers

How do I verify which AI agent is hitting my site with Web Bot Auth signatures?

Last updated

TL;DR: Check the request's signature, not its user-agent. With Web Bot Auth, an agent signs each request with HTTP Message Signatures (RFC 9421) and sends three headers: Signature, Signature-Input (tag="web-bot-auth", a keyid that is the key's JWK thumbprint, created and expires) and Signature-Agent, the HTTPS URL where its public keys are published. You fetch that key set, pick the key the keyid names, and verify the signature. If it checks out, the request was signed by a key that URL publishes, so you can allowlist, rate limit or block by that URL. ChatGPT's cloud browser signs as "https://chatgpt.com", with keys at chatgpt.com/.well-known/http-message-signatures-directory, and Google signs some Google-Agent requests as https://agent.bot.goog. A valid signature is identity, not permission, and it isn't everywhere yet: the protocol is still an IETF working-group draft and Google says it doesn't sign every request, so keep IP-list or reverse-DNS checks as the fallback.

What should I check, step by step?

1. Make sure the headers reach you. OpenAI's troubleshooting advice is to confirm that proxies in front of your origin keep Signature, Signature-Input and Signature-Agent.

  1. If your CDN or bot manager already verifies Web Bot Auth, use its verified result. OpenAI says Cloudflare, Akamai, HUMAN and Vercel recognize ChatGPT's signed traffic and verify the signatures themselves.
  2. To verify it yourself, parse Signature-Input and require tag="web-bot-auth", a keyid, created and expires that haven't passed, @authority or @target-uri among the covered components, and the signature-agent header covered too.
  3. Resolve Signature-Agent over HTTPS only, accept only a 200 response and don't follow redirects. ChatGPT and Google send their origin and publish keys at /.well-known/http-message-signatures-directory on it, served as application/http-message-signatures-directory+json.
  4. Select the key whose JWK SHA-256 thumbprint equals the keyid and verify per RFC 9421. Cache the key set according to its Cache-Control header, and drop cached keys that disappear from it; Google says those may be expired or revoked.
  5. Attach policy only to the signer URL you resolved yourself, such as chatgpt.com or agent.bot.goog. Never attach it to the user-agent string or to an unverified Signature-Agent value.
  6. Keep the old checks as a fallback for unsigned requests: the operator's published IP lists or a reverse-then-forward DNS lookup. Google says not all of Google-Agent's requests are signed.
  7. After verifying, still decide what the agent may do. Apply rate limits per signer, log the signer URL with each request, and keep logins, payments and forms behind your normal rules.

What a valid signature proves, and what it doesn't

The working-group draft (draft-ietf-webbotauth-httpsig-protocol-01, October 29, 2026, by authors at Cloudflare and Google) says the Signature-Agent URL is the agent's identifier only once the verifier has fetched it and found a key that verifies the request. Until then it's a claim, and verifiers must not attach policy to it.

Replay and scope

A signature covering only @authority verifies for any method, path or body sent to that host until it expires, so anyone who sees one request can reuse it until then. The draft recommends expires no more than 24 hours after created and suggests covering @method and @path to narrow it.

Where implementations differ

The current draft makes Signature-Agent a dictionary keyed by the signature label, such as g="https://agent.bot.goog", which is how Google sends it. Earlier drafts used a bare quoted string, such as "https://chatgpt.com". The draft requires signers to send the dictionary form and lets verifiers accept both.

How do I ask Rightshold about this (free, no key)?

Add the MCP server https://www.rightshold.com/mcp to Claude, Cursor, ChatGPT, Grok or VS Code, then ask: “This request says it comes from ChatGPT's agent. Does its Web Bot Auth signature verify, and does my policy (only chatgpt.com and agent.bot.goog) allow it?”

One-click setup

{
  "tool": "gate_check",
  "arguments": {
    "policy": {
      "allowed_signature_agents": [
        "chatgpt.com",
        "agent.bot.goog"
      ]
    },
    "request": {
      "method": "GET",
      "url": "<the requested URL>",
      "headers": {
        "signature-agent": "<as received>",
        "signature-input": "<as received>",
        "signature": "<as received>"
      }
    }
  }
}

Rightshold checks the signatures and requests you pass it. It doesn't sit in front of your site, see your traffic or block anything unless you add the check to your stack, it doesn't track nonces for replay, and it can't identify requests that carry no signature. A verified signature identifies the key's publisher, not that the agent is safe or allowed. Not legal advice.

What are the sources?

Related

Not legal advice. JSON · Markdown · All answers

Get a free API key in one call

No card and no email needed. 100 free credits; the license and policy checks stay free without a key.

curl -s -X POST https://www.rightshold.com/v1/accounts/signup -H "Content-Type: application/json" -d '{"accept_terms":true}'
export RIGHTSHOLD_API_KEY=rs_...   # the api_key from the reply (shown once)
curl -s https://www.rightshold.com/v1/licenses/check -H "Authorization: Bearer $RIGHTSHOLD_API_KEY" \
  -H "Content-Type: application/json" -d '{"license":"MIT","intended_use":{"commercial_use":true}}'