Agent Wranglers

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

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.