Skip to content
ChosenByAgent
For agentsUpdated 2026-10-22

For agents, and the people who build them

We test how AI assistants and shopping agents treat marketplaces and brands, so this site is built to be read and used by agents as well as people. There is no CAPTCHA, no JavaScript challenge and no blocking by User-Agent. Please send a User-Agent that names your agent.

Read any page

  • Every public page has a Markdown twin at the same address plus .md: /questions/can-an-agent-get-through.md, /pricing.md, and /index.md for the home page.

  • Or ask for Markdown at the usual address with Accept: text/markdown. Both answers carry Vary: Accept, and HTML pages point to their twin with Link: rel="alternate"; type="text/markdown".

  • Every Markdown page starts with YAML frontmatter: title, canonical, updated, audience and offers. Pages with research also list their evidence ids.

  • /llms.txt lists every page. /llms-full.txt holds all of them in one file.

  • A person can see exactly what you receive: add ?view=agent to any page, or switch “Reading as” to Agent.

Compare offers

/catalog.json lists every offer of both lines. For each offer it gives the id, name, line, audience, what it includes, the minimum price, currency and price unit, the typical duration, the page URL and the questions it answers.

  • Prices are indicative minimums in EUR, excluding VAT. Every engagement is scoped before it starts.

  • The format is described by the JSON Schema at /catalog.schema.json and stays stable within one version. A breaking change gets a new version.

  • Price units: one-off, per-month, per-category, per-experiment, per-client-per-month.

Request work for a person

Send POST /api/engagements with Content-Type: application/json:

{
  "offer_id": "B2",
  "on_behalf_of": {
    "email": "[email protected]",
    "name": "Alex Martin",
    "company": "Example Store",
    "website": "https://example.com"
  },
  "message": "Agent access audit for our EU store before the holiday season.",
  "agent": {
    "name": "ExampleAssistant",
    "operator": "Example AI Ltd"
  }
}
  • offer_id — required, an id from /catalog.json
  • on_behalf_of.email — required, the person who confirms the request
  • on_behalf_of.name — optional, their name
  • on_behalf_of.company — optional, their company
  • on_behalf_of.website — optional, the company website, http(s)
  • message — optional, what the person needs, up to 2,000 characters
  • agent.name — required, your agent's name
  • agent.operator — optional, the company that runs the agent

Responses

  • 202 — accepted, with id, status: "pending_confirmation" and next_step: a sentence to pass on to the person.

  • 400 — the body is invalid. errors lists each field with a message; for an unknown offer_id the message lists the valid ids.

  • 403 — the person has blocked agent requests to their address.

  • 429 — too many requests. Wait for the number of seconds in Retry-After.

Limits

  • 5 requests per hour from one IP address.

  • 3 unconfirmed agent requests per email address at a time.

Limits answer with 429 and Retry-After, never with a challenge page.

Confirmation

We email the person what was requested and by which agent, with two buttons: “Confirm request” and “This wasn’t me — block agent requests”. The link works once, for 72 hours. Our team sees the request only after the person confirms. Unconfirmed requests are deleted after 30 days. Blocking deletes the request, and later agent requests for that address get 403.