send.webforms.toRead the docs →

Documentation

Human, agent or bot

More and more forms are filled in by AI agents acting for a person: booking a table, asking for a quote, applying for a job. WebForms tags every submission with who sent it, so you can treat each kind the way you want. Nothing to set up, on every plan.

Last updated

The four tags

human: a person in an ordinary browser. browser_agent: an AI agent driving a browser, known because the form was submitted through WebMCP, the browser is automated, or the agent named itself in its user agent. verified_agent: an AI agent that proved who it is with a cryptographic signature (Web Bot Auth), so the agent's domain, such as chatgpt.com, is shown with it. bot: a spam trap fired, or the sender is a script rather than a browser.

Only verified_agent is proof; the others are a careful reading of signals a sender controls, and the dashboard shows which signals decided each one. A submission from your own server (posting with curl or a backend library) is tagged bot, which is accurate: no browser sent it.

Where you see it

The inbox shows a tag on every submission not sent by a person, and the AI agents tab lists only those. The tag is in webhook payloads, the Submissions API (sender and agent, filter with ?sender=verified_agent) and the MCP tools.

Webhook payload
{
  "event": "submission.created",
  "submission": {
    "id": "sub_...",
    "data": { "name": "Ada", "email": "ada@example.com" },
    "sender": "verified_agent",
    "agent": "chatgpt.com"
  }
}

Routing on it

In a routing rule, use the field _meta.sender (the dashboard suggests it and its values) or _meta.agent. Send agent bookings to a separate channel, or skip your CRM for anything that is not a person.

Routing rule
{
  "name": "AI agents to the bookings channel",
  "conditions": [{ "field": "_meta.sender", "op": "in", "value": ["browser_agent", "verified_agent"] }],
  "integrationIds": ["int_slack"]
}

How verification works

An agent that supports Web Bot Auth signs each request with a key it publishes at its own domain, and says which domain in the Signature-Agent header. WebForms fetches that domain's public keys, checks the signature (HTTP Message Signatures, RFC 9421, Ed25519) and that it was made for this request and is current. A missing or failed signature never blocks a submission; it is simply not verified.

Get your endpoint

Free for 300 submissions a month. No card required.

Start free