Endpoints.

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.

GET /outposts

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.

GET https://api.agentoutposts.com/outposts
GET /outposts/{brand}

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:

An unknown slug returns 404 with error: "unknown_outpost" and the list of known Outposts. Edge-cached.

GET https://api.agentoutposts.com/outposts/amazon
POST /outposts/{brand}/intent

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):

On success: 201 and a receipt (next card). The intent is persisted before the receipt exists — see the receipt contract below.

POST https://api.agentoutposts.com/outposts/amazon/intent Content-Type: application/json {"intent": "ordering", "notify": "poll"}
The receipt contract.

A receipt is an exchange, never a bare thank-you — and it is stamp-true.

The 201 body carries status and a receipt:

A real receipt.

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:

{ "ticket": "out-dominos-1", "brand": "Domino's", "intent": "ordering", "received_at": "2026-11-01T16:33:56-08:00", "queue_position": 1, "demand_snapshot": {"brand": "Domino's", "total_intents": 1, "by_intent": {"ordering": 1}}, "door_state_summary": {"version": "census-2026-11-01", "intents": {"menu_browse": "aggregator_only", "prices": "aggregator_only", "inventory": "aggregator_only", "ordering": "aggregator_only", "tracking": "aggregator_only"}, "source": "Agent Readiness Census 2026-11-01 — public sources, evidence linked per claim in the door-state document."}, "alternatives": [{"brand": "Papa John's", "door": "partner_gated", "via": "Papa John's Commerce Platform for integration partners; otherwise DoorDash", "census_checked_at": "2026-11-01"}], "notify": {"mode": "poll", "poll_url": "https://api.agentoutposts.com/outposts/dominos/notify/{token}", "note": "Poll this URL to learn when a re-census changes this Outpost's door-state. Keep it private: it identifies your registration."}, "status": "intent_recorded" }

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.”

GET /outposts/{brand}/notify/{token}

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.

GET https://api.agentoutposts.com/outposts/amazon/notify/{token}
MCP server — POST /mcp

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.

POST https://api.agentoutposts.com/mcp — {"jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": {"name": "list_outposts", "arguments": {}}}
Errors.

Every error body carries an error string, and most also carry the envelope.

StatuserrorMeaning
400invalid_json_bodyThe intent request body is not valid JSON.
400invalid_intentintent is missing or not one of the five; the body lists valid_intents.
400invalid_notify_modenotify is not poll or webhook; the body lists valid.
400notify_url_required_httpsWebhook mode without an HTTPS notify_url.
404unknown_outpostNo Outpost for that brand slug; the body lists known_outposts. A statement about this network's coverage, not about the world.
404unknown_notify_tokenNo registration for that notify token.
405method_not_allowedEach path accepts exactly one method; the body is only the error.
429intent_daily_limit_reached100 registrations per caller per day reached. The body carries limit_per_day and resets; a Retry-After header is sent (3600).
429service_daily_capacity_reachedThe service-wide ceiling of 5,000 registrations per day is reached. Same body fields and header as above.
503recording_unavailableYour intent was NOT recorded and no ticket was issued. Retry later.
503notify_unavailableNotify 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.

Rate gates & freshness.

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.

How demand is counted.

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.