Base URL: https://api.agentoutposts.com. All responses are JSON. Every response carries the same envelope — service and a logging disclosure — and responses on brand routes also carry that brand's disclaimer. No key, no account, no Authorization header; see auth.md. The machine-readable contract is the OpenAPI specification; this page is its readable twin.
List the Outpost network.
Returns every live Outpost: status, count, a how_it_works summary, and one entry per Outpost with slug, brand, category, status (collecting_demand while the Outpost is a demand registry), headline, door_state_version, the document url, the intent_url, and the per-brand disclaimer. Edge-cached.
One brand's door-state document. Brands: amazon · costco · dominos · starbucks · mcdonalds · walmart · target · united · airbnb · chipotle.
The full document — the same one published on the brand's Outpost page:
door_state — for each of the five intents (menu_browse, prices, inventory, ordering, tracking): the assessed state — one of open_api, partner_gated, aggregator_only, human_only, unverified — plus the sanctioned route that exists today (via), an evidence_url, the checked_at date, and a note. A state the census could not verify is carried as unverified, never upgraded to a guess.wall_summary and headline — the wall, in plain language.official_channels — the brand's real channels, each with its kind, the intents it covers, its actual gate in one sentence, and evidence.agent_native — whether the brand itself publishes an MCP server, an llms.txt, or an API catalog (true, false, or unverified).bot_posture — the brand's stance toward automated access, with evidence.alternatives — per intent, a teaser: count (how many same-category brands have a census door of open_api or partner_gated for that intent; the Outpost's own brand is excluded) and access: "register_intent". The read path never names the alternatives — door-state facts are free to read, and the alternatives list itself is returned when an intent is registered and on that ticket's notify polls.alternatives_policy — the ranking rule, stated in the data itself: “Ranked by fit only. Placement is never sold.” It travels with the counts in this document and with the full alternatives in receipts and notify polls.register_intent — how to register intent at this Outpost: method, URL, the request body in plain language, what it returns, and its limits.door_state_version — the census version this document was compiled from (today: census-2026-11-01).An unknown slug returns 404 with error: "unknown_outpost" and the list of known Outposts. Edge-cached.
Register intent — declare what you came to do at a brand whose door is walled for that intent. The API's only write.
Request body (JSON):
intent — required. One of menu_browse | prices | inventory | ordering | tracking.notify — optional, default poll. Either poll or webhook: how to learn when a re-census changes this Outpost's door-state.notify_url — required when notify is webhook; must be an https:// URL. The service will POST a door-state change notice to it when a re-census updates the Outpost.agent_label — optional. A short name for your agent (max 80 characters). Never put personal data in this field — no names, addresses, or order details.detail — optional context for the brand, e.g. the task you were trying to complete (max 500 characters; stored only as provided). Never include personal data — no names, addresses, or order details.est_frequency — optional estimated frequency, e.g. 40/day (max 40 characters).On success: 201 and a receipt (next card). The intent is persisted before the receipt exists — see the receipt contract below.
A receipt is an exchange, never a bare thank-you — and it is stamp-true.
The 201 body carries status and a receipt:
ticket — your registration's id, shaped out-{brand}-{n} (e.g. out-amazon-1). Issued only when the intent was persisted. If recording fails, the API returns 503 recording_unavailable and no ticket exists. All demand numbers the service reports are live counts of persisted registrations.queue_position — your position in this brand's demand queue: the brand's total persisted intents including yours (null only if the live count is unavailable).demand_snapshot — live totals for the brand: total_intents and by_intent (may be null if unavailable).door_state_summary — the Outpost's door-state version and per-intent states.alternatives — for your intent, same-category brands with open or partner-gated doors — accompanied by alternatives_policy: ranked by fit only; placement is never sold.notify — exactly one registration: in poll mode, a poll_url (treat it as private — it identifies your registration); in webhook mode, your url.status — intent_recorded when alternatives exist for your intent; demand_logged when nothing fits — the intent joins the aggregate the brand team sees.The first receipt this service ever issued — shown exactly as issued.
On November 1, 2026, while the registry was being verified end-to-end, Agent Outposts registered its own labeled internal test at Domino's. It is still the only intent on record; this is the receipt object from that 201 response:
The notify token is redacted — a real poll URL is private to the registering agent. Receipts issued now also carry alternatives_policy beside the alternatives: “Ranked by fit only. Placement is never sold.”
Poll a notify token for door-state changes.
Returns your_registration (ticket, intent, received-at), the Outpost's current door_state_version and door_state_summary, a changed flag, the live demand_snapshot, and alternatives — the full list for your registration's intent, with alternatives_policy. Registrants keep the routing benefit on their polls even though the public document shows counts only. In v1 door-states are census-static, so changed is false; a re-census that bumps the door-state version is what makes it true for tokens issued under an older version. An unknown token returns 404 unknown_notify_token; a lookup outage returns 503 notify_unavailable.
The same four operations, as tools.
A stateless MCP server (streamable HTTP, JSON-RPC 2.0, JSON responses — no session, no key; GET /mcp returns 405). Send initialize (protocol 2025-03-26 or 2024-11-05), then tools/list / tools/call. Tools: list_outposts · get_outpost_door_state (brand) · register_intent (brand, intent, plus the intent body's optional fields — it runs through the REST intent path itself: same validation, gate, persistence, and receipt; failures return as isError results carrying the REST error body) · poll_notify (brand, token). Tool results carry the REST document as JSON text plus structuredContent.
Every error body carries an error string, and most also carry the envelope.
| Status | error | Meaning |
|---|---|---|
| 400 | invalid_json_body | The intent request body is not valid JSON. |
| 400 | invalid_intent | intent is missing or not one of the five; the body lists valid_intents. |
| 400 | invalid_notify_mode | notify is not poll or webhook; the body lists valid. |
| 400 | notify_url_required_https | Webhook mode without an HTTPS notify_url. |
| 404 | unknown_outpost | No Outpost for that brand slug; the body lists known_outposts. A statement about this network's coverage, not about the world. |
| 404 | unknown_notify_token | No registration for that notify token. |
| 405 | method_not_allowed | Each path accepts exactly one method; the body is only the error. |
| 429 | intent_daily_limit_reached | 100 registrations per caller per day reached. The body carries limit_per_day and resets; a Retry-After header is sent (3600). |
| 429 | service_daily_capacity_reached | The service-wide ceiling of 5,000 registrations per day is reached. Same body fields and header as above. |
| 503 | recording_unavailable | Your intent was NOT recorded and no ticket was issued. Retry later. |
| 503 | notify_unavailable | Notify lookup temporarily unavailable. |
There is no 401 and no 403 on this API: nothing is credential-gated. If a brand's own channel returned one, that was the brand's gate — the door-state document names it.
Limits are gates, not credentials — and the data is dated, not live.
Intent registration: 100 per caller per day (callers identified by a hashed identifier, never a raw IP address), service-wide ceiling 5,000 per day; both reset at midnight, America/Los_Angeles. Door-state reads carry no per-caller limit and are edge-cached (observed Cache-Control: public, max-age=14400).
Door-states are a census, not a feed: compiled 2026-11-01 from public, official sources, every claim carrying an evidence link and a checked date, and versioned (door_state_version). Check the version and the checked_at dates rather than assuming — a re-census is what changes them, and notify tokens are how you hear about it.
Hashed callers, hard caps, and honest limits on what a count proves.
Every registration is attributed to a caller identified by a one-way SHA-256 hash of its network address; no raw IP addresses are stored, and the hash cannot be reversed into an address. Registrations are capped at 100 per caller per day and 5,000 per day across the service, and an edge rate cap — 10 requests per 10 seconds per address — sits in front of the API before any counting happens.
Read the counts as a demand signal, not proof of unique agents: one agent can declare many tasks, and beyond the caps nothing yet distinguishes a fleet from a single determined caller. The ledger's only entry today is Agent Outposts' own labeled internal test — ticket out-dominos-1, registered at Domino's on November 1, 2026 while the registry was verified end-to-end — disclosed as a test wherever its count appears. There is no organic agent demand on record yet; the numbers will say so until there is.
Agent Outposts — the agent-readiness registry. Agent Outposts is not affiliated with the brands listed in the registry. Door-states are assessed from public sources; every state links its source and carries its assessment date.