{"name":"Runtype Mock API","description":"Mock endpoints for prototyping AI agents. Returns realistic sample data shaped like real platform APIs.","platforms":{"shopify":{"baseUrl":"/shopify","endpoints":["GET /admin/api/2024-01/products.json","GET /admin/api/2024-01/products/search.json?query=","GET /admin/api/2024-01/products/:id.json","GET /admin/api/2024-01/custom_collections.json","GET /admin/api/2024-01/custom_collections/:id.json","GET /admin/api/2024-01/inventory_levels.json","POST /admin/api/2024-01/checkouts.json","GET /admin/api/2024-01/orders/:id.json","GET /webhooks/topics","POST /webhooks/emit"]},"bigcommerce":{"baseUrl":"/bigcommerce","endpoints":["GET /v3/catalog/products","GET /v3/catalog/products/:id","GET /v3/catalog/categories","GET /v3/inventory/items","POST /v3/carts","GET /v3/orders/:id"]},"woocommerce":{"baseUrl":"/woocommerce","endpoints":["GET /wp-json/wc/v3/products","GET /wp-json/wc/v3/products/:id","GET /wp-json/wc/v3/products/categories","GET /wp-json/wc/v3/orders/:id"]},"stripe-billing":{"baseUrl":"/stripe-billing","endpoints":["GET /v1/customers","GET /v1/customers/:id","GET /v1/customers/search?query=","GET /v1/subscriptions/:id","GET /v1/subscriptions?customer=","GET /v1/products","GET /v1/products/:id","GET /v1/prices?product=","GET /v1/prices/:id","POST /v1/invoices/create_preview","GET /v1/invoices?customer=","GET /v1/coupons","GET /v1/coupons/:id","GET /v1/promotion_codes"]}},"demo":{"baseUrl":"/demo","description":"Frozen, stateless mock of the Runtype client-surface wire, backed by scripted scenarios instead of a model. Point an unmodified Persona widget at `<origin>/demo` with any client token (e.g. `ct_demo`) to get a working demo chat: real SSE streaming, real tool chrome, and a real WebMCP pause/resume round trip. No model runs, no server-side tool execution, and nothing a visitor types is stored.","endpoints":["GET /demo","POST /demo/v1/client/init","POST /demo/v1/client/chat","POST /demo/v1/client/resume","POST /demo/v1/client/visitor/reset","GET /demo/v1/client/conversations"]},"checkout":{"baseUrl":"/checkout","endpoints":["POST /session"]},"mcp-oauth2":{"baseUrl":"/mcp-oauth2","description":"Mock MCP server with OAuth2. DCR blocked + client_id_metadata_document_supported (simulates Airtable).","endpoints":["POST / (MCP initialize → 401)","GET /.well-known/oauth-protected-resource","GET /.well-known/oauth-authorization-server/mcp-oauth2 (root-level, RFC 8414)","POST /oauth2/register (always 403)","GET /oauth2/authorize","POST /oauth2/token"]},"a2a-agent":{"description":"Mock external A2A agent for import smoke tests. Two versions served from separate sub-trees so the Runtype import path can discover, negotiate, and round-trip each, plus a non-streaming twin of each (card advertises streaming:false and the streaming method answers \"Method not found\") so the one-shot send path is reachable. Methods: SendMessage/SendStreamingMessage/GetTask/CancelTask (1.0) and message/send, message/stream, tasks/get, tasks/cancel (0.3).","triggers":{"[a2a-ask]":"answer input-required with a fixed question + a contextId/taskId; a follow-up message carrying that contextId completes the task and echoes both handles back","[a2a-delay]":"stall 6s before answering, so a per-agent request timeout is provable","[a2a-stream-message]":"(1.0 streaming only) answer with the StreamResponse { message } arm instead of artifact updates","[a2a-auth]":"answer auth-required (the other pause state) with the same fixed question + contextId shape as [a2a-ask]","[a2a-mixed-parts]":"(send path) reply parts gain a data sibling, a file sibling, and an unknown-kind sibling; the 0.3 data/file siblings also carry text bait that a kind-honoring parser must drop, while the unknown-kind text must surface","[a2a-completed-bare]":"(send path) answer a completed task with NO artifacts, so only the task JSON is left to surface","[a2a-report-auth]":"(send path) reply text embeds authorization=<first 16 hex of sha256(header value)> or authorization=none; add [a2a-report-header:<Name>] to also embed <name>=<digest|none> for one named header","[a2a-report-path]":"(send path) reply text embeds path=<the request path the call landed on>","[a2a-fail]":"answer a task parked on a terminal failure state with no artifacts (send: task JSON; stream: one final status-update); [a2a-fail:failed|rejected|canceled] picks the state, default failed","[a2a-task-failed] / [a2a-task-rejected] / [a2a-task-canceled]":"(send path) like [a2a-fail:<state>] but status.message carries \"mock <state> reason\"","[a2a-task-error]":"(send path) answer a task whose ONLY failure signal is a top-level error object (no status), with an artifact that must not surface","[a2a-rpc-error]":"(send path) answer a JSON-RPC error envelope (code -32001) instead of a result","[a2a-http-500]":"(send path) answer HTTP 500 with a plain-text body","[a2a-bad-json]":"(send path) answer HTTP 200 with a body that is not JSON"},"rawResult":{"baseUrl":"/a2a-raw-result","endpoints":["POST /a2a-raw-result (JSON-RPC reflector: result is { marker, echoed: <request body> }, neither a Task nor a Message)"]},"versions":{"0.3":{"baseUrl":"/a2a-03","endpoints":["GET /a2a-03/.well-known/agent-card.json (legacy 0.3 card: top-level url + flat authentication)","POST /a2a-03 (JSON-RPC: message/send, message/stream, tasks/get, tasks/cancel)"]},"1.0":{"baseUrl":"/a2a-10","endpoints":["GET /a2a-10/.well-known/agent-card.json (1.0 card: supportedInterfaces[] + securitySchemes)","POST /a2a-10 (JSON-RPC: SendMessage, SendStreamingMessage, GetTask, CancelTask)"]},"0.3-nostream":{"baseUrl":"/a2a-03-nostream","endpoints":["GET /a2a-03-nostream/.well-known/agent-card.json (capabilities.streaming: false)","POST /a2a-03-nostream (JSON-RPC: message/send, tasks/get, tasks/cancel; message/stream → -32601)"]},"1.0-nostream":{"baseUrl":"/a2a-10-nostream","endpoints":["GET /a2a-10-nostream/.well-known/agent-card.json (capabilities.streaming: false)","POST /a2a-10-nostream (JSON-RPC: SendMessage, GetTask, CancelTask; SendStreamingMessage → -32601)"]}}},"sse":{"baseUrl":"/sse","description":"Replays any SSE stream it is handed on the request, with realistic pacing. No inference, no storage, no auth. Format-agnostic: unified Runtype events, OpenAI chunks, Anthropic message events and A2A frames all replay byte-for-byte.","endpoints":["POST /sse/replay — body is the script: text/event-stream (raw, canonical) or application/json { sse } | { frames: [{event?, id?, data, delayMs?}] } | { events: [unified events] }","GET /sse/replay?s=<base64url(deflate-raw(sse))> — share-link form; also accepts POST (the body is then a dispatch payload, used only by vars=1)","GET|POST /sse/library/:name — first-party canned recordings","GET /sse/library — the library manifest","POST /sse/encode — body = script → { url, encodedLength }"],"docs":"GET /sse for pacing options, unified-stream options, caps and the library manifest."},"docs":"To use: point your agent's external tool URL at these endpoints. When ready for production, swap the base URL for your real platform."}