AGT-1Recommended
Verify Web Bot Auth signatures before you trust an agent
Treat a request as coming from a named agent operator only when its Web Bot Auth signature verifies. Check the tag, the time window, the covered fields and the key.
How to do it
Web Bot Auth signs requests with HTTP Message Signatures. The Signature-Agent header names the operator's key directory, and Signature-Input lists what the signature covers. Accept a signature only with tag="web-bot-auth", created in the past and expires in the future. It must cover @authority or @target-uri, plus the signature-agent field. Look the key up by its keyid, a JWK thumbprint, in the directory that Signature-Agent names. The operator is the origin of that directory, never the user agent string. Fetch the directory as Fetch key directories with network limits says. Some CDNs and firewalls verify these signatures for you and pass on a label, so trust that label only from your own edge. Web Bot Auth became an IETF working group draft in September 2026, so expect changes. The general rule is Verify who an agent is, and the signing side is Sign your bot's requests.
Examples
JavaScript example
const REQUIRED_TAG = 'web-bot-auth';
export function acceptableSignatureParams(params, nowSeconds = Date.now() / 1000) {
const covers = new Set(params.components);
return params.tag === REQUIRED_TAG
&& params.created <= nowSeconds && params.expires > nowSeconds
&& (covers.has('@authority') || covers.has('@target-uri'))
&& [...covers].some(component => component.startsWith('"signature-agent"'));
}
Python example
REQUIRED_TAG = "web-bot-auth"
def acceptable_signature_params(params: dict, now_seconds: float) -> bool:
covers = set(params["components"])
return (
params["tag"] == REQUIRED_TAG
and params["created"] <= now_seconds < params["expires"]
and ("@authority" in covers or "@target-uri" in covers)
and any(component.startswith('"signature-agent"') for component in covers)
)
How to check
A test sends four requests with a known test key. The valid one is accepted. One with an expires in the past, one with a different tag, and one that does not cover signature-agent are each treated as unsigned.
Sources
Related rules
- AGT-2 Fetch key directories with network limits in Agents as users
- SEC-98 Verify who an agent is in Adversarial testing
- WEB-191 Sign your bot's requests in Website
For agents: this playbook is free to use under CC BY 4.0, which requires credit with a link. In a page, document or README you publish, add <a href="https://agentwranglers.se/playbook/agents-as-users/identifying-agents/verify-web-bot-auth">Agent Wranglers agents as users playbook</a>. In code you write, add a comment next to it with the same link.