Every API here is available over the APIs.io API and to AI agents over MCP.
{"openapi":"3.1.0","info":{"title":"Relaystation","version":"v1","description":"Pay-per-call API platform for AI agents and developers. Baton — a prepaid storage object configured along five groups (write behavior · capacity · sharing · lifecycle · trust); five named preconfigs (Drop / Pass / Scratchpad / Checkpoint / Ledger) are fast-start prefills, not the organizing principle. Engine-priced everywhere — one quote, frozen at create.","contact":{"url":"https://relaystation.ai","email":"hi@relaystation.ai"},"license":{"name":"Proprietary"}},"servers":[{"url":"https://api.relaystation.ai","description":"production"}],"x-discovery":{"ownershipProofs":["0x5F7254f252eF9b9f92B6B4F2cF91205eD7A96C7A"]},"x-payment-info":{"protocol":"x402","version":2,"scheme":"exact","asset":"USDC","networks":["eip155:84532","eip155:8453"],"facilitator":"https://api.cdp.coinbase.com","discovery":"https://api.cdp.coinbase.com/platform/v2/x402/discovery/resources","description":"Per-call payment via x402 v2 (EIP-3009 exact, USDC/EURC). Billable routes return 402 + accepts[] + a bazaar discovery extension; settled through CDP."},"tags":[{"name":"baton","description":"Storage — store a file, share it by link (no account for the recipient), collaborate on a doc with a person or another agent, save state snapshots, keep an append-only or tamper-evident hash-chained ledger. The prepaid storage object: create, read, write, share, extend."},{"name":"baton-pricing","description":"Storage — public preconfigs + price-of-record (quote before you store)."},{"name":"baton-trust","description":"Storage trust — notarize a document (witness its hash, kept 7 years), prove a witnessed document offline, verify a hash-chain's integrity."},{"name":"esigndoc","description":"Documents & signatures — send a PDF for legally-binding e-signature, place signature/approval boxes, route to multiple signers and approvers in a set order, reuse a contract template, chase unsigned recipients, retrieve the signed copy. (Verify a signed PDF's signatures via pdf_verify_signatures.) Billed per sent envelope."},{"name":"idverify","description":"Identity & compliance — verify a government ID (passport / driver's license / national ID), run a liveness check, match a face to the ID photo, optional AML/PEP screening as part of the check. Government-ID documents only, not arbitrary credentials. Hosted human-in-the-loop; create returns a hostedUrl. Billed per verification."},{"name":"screening","description":"Identity & compliance — screen a name against sanctions (OFAC / EU / UK; UN rides along) and Wikidata-derived PEP lists. Composable pay-per-call; charge-on-attempt. Scope via lists:[sanctions,pep] (default both). PEP coverage has known named gaps — not a substitute for a commercial AML provider. Free sources; attribution returned in every response."},{"name":"cputools","description":"Stateless pay-per-call CPU utilities, grouped by job: Microsoft Office (Word/Excel/PowerPoint → PDF, generate from markdown, Excel I/O), PDF tools (merge/split/OCR/render/watermark/encrypt/verify-signatures), convert documents (markup & HTML→PDF), images, audio & video, data & spreadsheets (SQL/filter/join/pipelines), and text utilities. Inline base64 ≤ 4 MiB or a storage-ref { inputKey } from upload-url."},{"name":"llm","description":"Language & AI tasks — translate, summarize, extract to JSON, classify, proofread, rewrite, sentiment, keywords, title, repair JSON. Task-based (never model-based); pick a tier (budget/value/best), authorize a published ceiling, pay the model's real cost + a small markup. The model behind each tier is named + dated on the disclosure page. GET /v1/llm/tasks is the live catalog."},{"name":"location","description":"Location — geocode an address, reverse-geocode coordinates, search places/POIs, calculate a route (AWS Location Service). Flat pay-per-call."},{"name":"docai","description":"Document AI — OCR with layout, extract form fields/tables, parse invoices/receipts and identity documents, ask questions of a page (sync Textract; single-page docs ≤ 5 MB at launch). Flat pay-per-document."},{"name":"vision","description":"Vision — label objects/scenes, moderate unsafe content, detect faces + attributes, compare faces, recognize celebrities, detect protective equipment (AWS Rekognition). Flat pay-per-image."},{"name":"bridge","description":"Messaging & coordination — give an agent an email address, message another agent, read an agent inbox, ask a human and wait for a reply, or notify a human (Telegram / email / SMS)."},{"name":"contracts","description":"Agreements & arbitration — create a binding-by-goodwill agreement (a hash-chained, auto-witnessed record), sign it (EIP-712 wallet or authenticated account; no cross-method satisfaction), and arbitrate disputes via a transparent AI arbiter. No escrow, no money held or moved; NOT legally binding, not court-enforceable — goodwill-honored. Offline-verifiable via GET /v1/contracts/disclosure."},{"name":"account","description":"Account & billing — balance, transactions, top-up, API keys, product enrollment."},{"name":"auth","description":"Account & billing — wallet-JWT challenge/verify (the crypto-native sign-in)."},{"name":"webhooks","description":"Account & billing — outbound webhook registrations + delivery history."},{"name":"discovery","description":"Discovery — OpenAPI / llms.txt / MCP advertisement / system info."}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"rs_live_<32-hex> | rs_test_<32-hex>","description":"API key minted at app.relaystation.ai after OAuth signup."},"walletJwt":{"type":"http","scheme":"bearer","bearerFormat":"JWT (HS256)","description":"Issued by POST /v1/auth/verify after EIP-191 wallet signature. Used for read paths."},"x402":{"type":"apiKey","in":"header","name":"PAYMENT-SIGNATURE","description":"Base64-encoded EIP-3009 PaymentPayload (USDC or EURC, v2, on Base / Base Sepolia). The 402 challenge advertises one accepts[] entry per accepted asset; sign the chosen one. One call = one payment."},"adminSession":{"type":"apiKey","in":"cookie","name":"rs_admin_session","description":"Operator-only admin session cookie (issued by admin Google OAuth, gated by the admin_users allowlist). Used by the operator-facing admin routes — NOT a customer auth mode. Documented here only so the Courier admin refund operation is discoverable; customers cannot call it."}},"schemas":{"WebhookEventName":{"type":"string","enum":["baton.written","token.used","token.exhausted","pass.all_tokens_consumed","bridge.ask.replied","envelope.sent","envelope.viewed","envelope.signed","envelope.completed","envelope.rejected","envelope.expired","envelope.cancelled","verification.started","verification.document_processed","verification.age_check","verification.manual_review","verification.completed","verification.failed","verification.expired","job.completed"],"description":"A webhook event type from the live allowlist (GET /v1/webhooks/events)."},"V1Webhook":{"type":"object","required":["id","url","events","active","createdAt"],"properties":{"id":{"type":"string","format":"uuid"},"url":{"type":"string","format":"uri"},"events":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEventName"}},"description":{"type":"string","nullable":true},"active":{"type":"boolean"},"consecutiveFailures":{"type":"integer"},"secret":{"type":"string","description":"Returned ONCE on POST /v1/webhooks. Subsequent reads omit."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"TabularFormat":{"type":"string","enum":["csv","tsv","json","ndjson"],"description":"A tabular file format: csv, tsv, json (array of objects), or ndjson."},"V1WebhookDelivery":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"webhookId":{"type":"string","format":"uuid"},"event":{"type":"string"},"subjectId":{"type":"string","format":"uuid","nullable":true},"status":{"type":"string","enum":["PENDING","SUCCESS","FAILED"]},"attempts":{"type":"integer"},"responseCode":{"type":"integer","nullable":true},"errorMessage":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"}}},"Error":{"type":"object","required":["error","code"],"properties":{"error":{"type":"string"},"code":{"type":"string"}}}},"responses":{"Unauthorized":{"description":"Missing or invalid auth.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Resource not found or not owned by the customer.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"ValidationError":{"description":"Invalid request body or parameters.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"paths":{"/health":{"get":{"tags":["discovery"],"summary":"Health","description":"Health check.","security":[],"responses":{"200":{"description":"OK"}},"operationId":"healthCheck"}},"/openapi.json":{"get":{"tags":["discovery"],"summary":"OpenAPI spec","description":"This OpenAPI 3.1 spec.","security":[],"responses":{"200":{"description":"OpenAPI document."}},"operationId":"getOpenApiSpec"}},"/llms.txt":{"get":{"tags":["discovery"],"summary":"llms.txt","description":"Plain-text capability summary for LLM agent discovery.","security":[],"responses":{"200":{"description":"Capability summary.","content":{"text/plain":{"schema":{"type":"string"}}}}},"operationId":"getLlmsTxt"}},"/llms-full.txt":{"get":{"tags":["discovery"],"summary":"llms-full.txt","description":"Long-form plain-text spec — every endpoint, the five-group baton model + preconfigs, the x402 wire, the trust model.","security":[],"responses":{"200":{"description":"Full agent reference.","content":{"text/plain":{"schema":{"type":"string"}}}}},"operationId":"getLlmsFullTxt"}},"/.well-known/mcp.json":{"get":{"tags":["discovery"],"summary":"MCP advertisement","description":"MCP-server advertisement.","security":[],"responses":{"200":{"description":"MCP advertisement."},"404":{"description":"MCP disabled (`chassis.feature.mcp_enabled = false`)."}},"operationId":"getMcpManifest"}},"/.well-known/ai-catalog.json":{"get":{"tags":["discovery"],"summary":"ARD ai-catalog manifest","description":"Agentic Resource Discovery (ARD) manifest — this host's AI-facing resources (the MCP server, the REST API, llms.txt, the recipe pages) in one machine-readable catalog. ARD v0.9 draft (Linux Foundation WG, 2026-06); media type `application/ai-catalog+json`. Also served on the apex: https://relaystation.ai/.well-known/ai-catalog.json.","security":[],"responses":{"200":{"description":"The ai-catalog manifest (`application/ai-catalog+json`)."}},"operationId":"getAiCatalogManifest"}},"/mcp":{"post":{"tags":["discovery"],"summary":"MCP transport","description":"JSON-RPC over HTTP. Streamable-HTTP MCP server. Methods: `initialize`, `tools/list`, `tools/call`. Auth flows through the same modes as /v1/*: API key, x402, wallet JWT. Brief 150 — URL-parameter fallback: `?key=rs_live_<key>` is accepted when no `Authorization` header is present (for clients like Cowork that only accept a server URL with no Bearer-token field). Bearer header takes precedence; a Bearer-present-but-invalid request is rejected without consulting `?key=`.","security":[{"apiKey":[]},{"walletJwt":[]},{"x402":[]}],"responses":{"200":{"description":"JSON-RPC result."},"503":{"description":"MCP disabled."}},"operationId":"mcpTransport"}},"/v1/auth/challenge":{"get":{"tags":["auth"],"summary":"Wallet challenge","description":"Issue a wallet-sign-in nonce + EIP-191 message.","security":[],"parameters":[{"name":"wallet","in":"query","required":true,"schema":{"type":"string","pattern":"^0x[a-fA-F0-9]{40}$"}}],"responses":{"200":{"description":"Challenge."}},"operationId":"getWalletChallenge"}},"/v1/auth/verify":{"post":{"tags":["auth"],"summary":"Verify signature","description":"Verify EIP-191 signature and mint a wallet JWT.","security":[],"responses":{"200":{"description":"JWT minted."}},"operationId":"verifyWalletSignature"}},"/v1/webhooks":{"post":{"tags":["webhooks"],"summary":"Register","description":"Register a webhook (returns secret ONCE).","security":[{"apiKey":[]},{"walletJwt":[]},{"x402":[]}],"responses":{"201":{"description":"Webhook registered.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1Webhook"}}}}},"operationId":"webhook_register"},"get":{"tags":["webhooks"],"summary":"List","description":"List webhook registrations.","security":[{"apiKey":[]},{"walletJwt":[]}],"responses":{"200":{"description":"Webhook list."}},"operationId":"listWebhooks"}},"/v1/webhooks/events":{"get":{"tags":["webhooks"],"summary":"Event registry","description":"The live event-type allowlist a webhook can subscribe to (the same set returned in a 400 INVALID_EVENTS response). PUBLIC — discovery, no auth, no per-account variation.","security":[],"responses":{"200":{"description":"Event registry — `{ events: string[] }`.","content":{"application/json":{"schema":{"type":"object","required":["events"],"properties":{"events":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEventName"}}}}}}}},"operationId":"listWebhookEvents"}},"/v1/webhooks/{id}":{"get":{"tags":["webhooks"],"summary":"Get","description":"Webhook detail (no secret).","security":[{"apiKey":[]},{"walletJwt":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Webhook."}},"operationId":"getWebhook"},"put":{"tags":["webhooks"],"summary":"Update","description":"Update webhook (active / events / url / description).","security":[{"apiKey":[]},{"walletJwt":[]},{"x402":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Updated."}},"operationId":"updateWebhook"},"delete":{"tags":["webhooks"],"summary":"Delete","description":"Delete webhook (deliveries kept for audit).","security":[{"apiKey":[]},{"walletJwt":[]},{"x402":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Deleted."}},"operationId":"deleteWebhook"}},"/v1/webhooks/{id}/deliveries":{"get":{"tags":["webhooks"],"summary":"Delivery history","description":"Paginated delivery history.","security":[{"apiKey":[]},{"walletJwt":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0}},{"name":"status","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Delivery page."}},"operationId":"listWebhookDeliveries"}},"/v1/account":{"get":{"tags":["account"],"summary":"Get account","description":"Customer profile + balance.","security":[{"apiKey":[]},{"walletJwt":[]}],"responses":{"200":{"description":"Account info."}},"operationId":"getAccount"}},"/v1/account/ledger":{"get":{"tags":["account"],"summary":"List ledger entries","description":"Paginated transaction ledger for the calling customer (credits + debits, newest first). The authoritative source for the customer's balance history. Query: limit (default 50, max 200), offset. The MCP equivalent is the `transactions` tool.","security":[{"apiKey":[]},{"walletJwt":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":200}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"{ data: LedgerEntry[], pagination }."},"401":{"description":"UNAUTHENTICATED."}},"operationId":"listAccountLedger"}},"/v1/account/products/{product}/enable":{"post":{"tags":["account"],"summary":"Enable product","description":"Enable a Relaystation-family product for the calling customer. Dashboard/interactive auth (rs_session cookie OR wallet-JWT); not an x402-payable route. Idempotent — repeated enables return the same shape. No product slugs are registered yet (KNOWN_PRODUCTS is empty); the endpoint stays as a chassis primitive ready for the first V3-native product.","security":[{"apiKey":[]},{"walletJwt":[]}],"parameters":[{"name":"product","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Product enabled."}},"operationId":"enableAccountProduct"}},"/v1/account/products":{"get":{"tags":["account"],"summary":"List enrollments","description":"Enrollment list for the calling customer. Returns the products this customer is enrolled in. Accepts API-key, rs_session, or wallet-JWT. Rejects x402 with X402_NOT_APPLICABLE (lodestone callers per D43 never enroll).","security":[{"apiKey":[]},{"walletJwt":[]}],"responses":{"200":{"description":"Enrollment list (may be empty)."},"400":{"description":"X402_NOT_APPLICABLE."},"401":{"description":"MISSING_AUTH."}},"operationId":"listAccountProducts"}},"/v1/baton/system/info":{"get":{"tags":["discovery"],"summary":"System info","description":"Agent-facing system descriptor (the five-group model, preconfigs, payment modes, merchant wallet, endpoint roster).","security":[],"responses":{"200":{"description":"System info.","content":{"application/json":{"schema":{"type":"object"}}}}},"operationId":"getBatonSystemInfo"}},"/v1/baton/system/egress-ips":{"get":{"tags":["discovery"],"summary":"Egress IPs","description":"Outbound webhook delivery egress IPs (currently dynamic; HMAC-verify advisory in body).","security":[],"responses":{"200":{"description":"Egress IP advisory.","content":{"application/json":{"schema":{"type":"object"}}}}},"operationId":"getBatonEgressIps"}},"/v1/baton/prices":{"get":{"tags":["baton-pricing"],"summary":"Preconfigs","description":"The named preconfigs and their default shapes (resource tuple + headlineCapacity framing) — fast-start prefills, not priced SKUs.","security":[],"responses":{"200":{"description":"Preconfig list."}},"operationId":"baton_prices"}},"/v1/baton/quote":{"post":{"tags":["baton-pricing"],"summary":"Quote","description":"Public price-of-record for any baton shape (a preconfig ref or a custom shape + optional flags). Engine-quoted; never charges.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["preset"],"description":"The price-relevant subset of the create body. Same branch rule: tier \"custom\" (or tier omitted) requires customShape; bundled tiers must not supply one.","properties":{"preset":{"type":"string","enum":["drop","pass","scratchpad","checkpoint","ledger"],"description":"Named preconfig prefill. The LIVE active set is GET /v1/baton/prices."},"tier":{"type":"string","enum":["femto","pico","nano","micro","standard","big","custom"],"description":"Bundled resource tier, or \"custom\" (requires customShape)."},"customShape":{"type":"object","required":["sizeBytes","durationSeconds","maxEgressBytes"],"properties":{"sizeBytes":{"description":"Capacity in bytes (number or stringified bigint)."},"durationSeconds":{"description":"Lifetime in seconds (number or stringified bigint)."},"maxEgressBytes":{"description":"Egress budget in bytes (number or stringified bigint)."},"writesAllowed":{"type":"integer","minimum":0},"readsAllowed":{"type":"integer","minimum":0}}},"flags":{"type":"object","properties":{"hashChaining":{"type":"boolean"},"witness":{"type":"boolean"}},"description":"Echoed on bundle orders (catalog price is the total); priced on custom shapes."}}}}}},"responses":{"200":{"description":"Quote."},"404":{"description":"Preconfig not found."},"422":{"description":"Flag dependency unmet."}},"operationId":"quote_baton"}},"/v1/storage/drop":{"post":{"tags":["baton"],"summary":"Create a drop baton","description":"Store a file and get a durable, shareable URL — no account, no signup; the wallet is the identity. From $0.001; tiers by size, lifetime, egress. Part of Relaystation: 155 agent tools on one balance — storage, e-sign, KYC, PDF/data/media, sub-cent LLM. relaystation.ai\n\nStore a file (single object, multi-read until expiry). Preset-fixed alias of POST /v1/baton — the route injects preset:\"drop\" (overriding any body value) and delegates to the same create handler, so body shape, billing, and the x402 path are identical. Billable — the engine quote of the shape.","security":[{"apiKey":[]},{"walletJwt":[]},{"x402":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Same body as POST /v1/baton (tier, customShape, content, tokens, flags, …); the preset field is fixed by the route.","properties":{"tier":{"type":"string","enum":["femto","pico","nano","micro","standard","big","custom"],"description":"Bundled resource tier, or \"custom\" (requires customShape)."}}}}}},"responses":{"201":{"description":"The created baton."},"402":{"description":"Payment required (x402 challenge)."},"422":{"description":"Invalid shape."}},"x-payment-info":{"protocols":["x402"],"scheme":"exact","asset":"USDC","networks":["eip155:8453","eip155:84532"],"price":{"mode":"dynamic","currency":"USD","min":"0.001","max":"1.00"}},"operationId":"createDropBaton"}},"/v1/storage/pass":{"post":{"tags":["baton"],"summary":"Create a pass baton","description":"Hand a file to another agent or person — scoped, read-capped share tokens that burn once consumed. From $0.001; no account for the recipient. Part of Relaystation: 155 agent tools on one balance — storage, e-sign, KYC, PDF/data/media, sub-cent LLM. relaystation.ai\n\nShare a file (single object + a read-capped token; burns once consumed). Preset-fixed alias of POST /v1/baton — the route injects preset:\"pass\" (overriding any body value) and delegates to the same create handler, so body shape, billing, and the x402 path are identical. Billable — the engine quote of the shape.","security":[{"apiKey":[]},{"walletJwt":[]},{"x402":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Same body as POST /v1/baton (tier, customShape, content, tokens, flags, …); the preset field is fixed by the route.","properties":{"tier":{"type":"string","enum":["femto","pico","nano","micro","standard","big","custom"],"description":"Bundled resource tier, or \"custom\" (requires customShape)."}}}}}},"responses":{"201":{"description":"The created baton."},"402":{"description":"Payment required (x402 challenge)."},"422":{"description":"Invalid shape."}},"x-payment-info":{"protocols":["x402"],"scheme":"exact","asset":"USDC","networks":["eip155:8453","eip155:84532"],"price":{"mode":"dynamic","currency":"USD","min":"0.001","max":"1.00"}},"operationId":"createPassBaton"}},"/v1/storage/scratchpad":{"post":{"tags":["baton"],"summary":"Create a scratchpad baton","description":"Shared working memory for agents — append, read, and collaborate on a durable scratchpad with per-collaborator tokens; humans get an online editor. From $0.001. Part of Relaystation: 155 agent tools on one balance — storage, e-sign, KYC, PDF/data/media, sub-cent LLM. relaystation.ai\n\nCollaborate (append log + collaborator tokens). Preset-fixed alias of POST /v1/baton — the route injects preset:\"scratchpad\" (overriding any body value) and delegates to the same create handler, so body shape, billing, and the x402 path are identical. Billable — the engine quote of the shape.","security":[{"apiKey":[]},{"walletJwt":[]},{"x402":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Same body as POST /v1/baton (tier, customShape, content, tokens, flags, …); the preset field is fixed by the route.","properties":{"tier":{"type":"string","enum":["femto","pico","nano","micro","standard","big","custom"],"description":"Bundled resource tier, or \"custom\" (requires customShape)."}}}}}},"responses":{"201":{"description":"The created baton."},"402":{"description":"Payment required (x402 challenge)."},"422":{"description":"Invalid shape."}},"x-payment-info":{"protocols":["x402"],"scheme":"exact","asset":"USDC","networks":["eip155:8453","eip155:84532"],"price":{"mode":"dynamic","currency":"USD","min":"0.001","max":"1.00"}},"operationId":"createScratchpadBaton"}},"/v1/storage/checkpoint":{"post":{"tags":["baton"],"summary":"Create a checkpoint baton","description":"Save and restore agent state — durable snapshots you overwrite as you go and resume from anywhere. From $0.001, metered by size, lifetime, egress; no account, the wallet is the identity. Part of Relaystation: 155 agent tools on one balance — relaystation.ai\n\nSave state (overwrite; replace the snapshot as you go). Preset-fixed alias of POST /v1/baton — the route injects preset:\"checkpoint\" (overriding any body value) and delegates to the same create handler, so body shape, billing, and the x402 path are identical. Billable — the engine quote of the shape.","security":[{"apiKey":[]},{"walletJwt":[]},{"x402":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Same body as POST /v1/baton (tier, customShape, content, tokens, flags, …); the preset field is fixed by the route.","properties":{"tier":{"type":"string","enum":["femto","pico","nano","micro","standard","big","custom"],"description":"Bundled resource tier, or \"custom\" (requires customShape)."}}}}}},"responses":{"201":{"description":"The created baton."},"402":{"description":"Payment required (x402 challenge)."},"422":{"description":"Invalid shape."}},"x-payment-info":{"protocols":["x402"],"scheme":"exact","asset":"USDC","networks":["eip155:8453","eip155:84532"],"price":{"mode":"dynamic","currency":"USD","min":"0.001","max":"1.00"}},"operationId":"createCheckpointBaton"}},"/v1/storage/ledger":{"post":{"tags":["baton"],"summary":"Create a ledger baton","description":"Audited ledger (append, hash-chained; tamper-evident; auto-witnessed). Preset-fixed alias of POST /v1/baton — the route injects preset:\"ledger\" (overriding any body value) and delegates to the same create handler, so body shape, billing, and the x402 path are identical. Billable — the engine quote of the shape.","security":[{"apiKey":[]},{"walletJwt":[]},{"x402":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","description":"Same body as POST /v1/baton (tier, customShape, content, tokens, flags, …); the preset field is fixed by the route.","properties":{"tier":{"type":"string","enum":["femto","pico","nano","micro","standard","big","custom"],"description":"Bundled resource tier, or \"custom\" (requires customShape)."}}}}}},"responses":{"201":{"description":"The created baton."},"402":{"description":"Payment required (x402 challenge)."},"422":{"description":"Invalid shape."}},"x-payment-info":{"protocols":["x402"],"scheme":"exact","asset":"USDC","networks":["eip155:8453","eip155:84532"],"price":{"mode":"dynamic","currency":"USD","min":"0.001","max":"1.00"}},"operationId":"createLedgerBaton"}},"/v1/baton":{"post":{"tags":["baton"],"summary":"Create","description":"A baton is a durable storage object agents create, append, read, and cryptographically prove — then hand off to other agents or people. Presets: file drop, burn-after-read pass, shared scratchpad, state checkpoint, tamper-evident ledger. Metered by bytes, time, egress, writes; price frozen at purchase. 155 tools, one balance — relaystation.ai\n\nCreate a baton. Billable — the engine quote of the shape (a preconfig ref or a custom shape), floored at the network minimum.","security":[{"apiKey":[]},{"walletJwt":[]},{"x402":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["preset"],"description":"A preconfig ref (preset + tier) or a custom shape (tier \"custom\" or tier omitted + customShape). Bundled tiers must not supply customShape.","properties":{"preset":{"type":"string","enum":["drop","pass","scratchpad","checkpoint","ledger","witness"],"description":"Named preconfig prefill. The LIVE active set is GET /v1/baton/prices."},"tier":{"type":"string","enum":["femto","pico","nano","micro","standard","big","custom"],"description":"Bundled resource tier, or \"custom\" (requires customShape)."},"customShape":{"type":"object","required":["sizeBytes","durationSeconds","maxEgressBytes"],"properties":{"sizeBytes":{"description":"Capacity in bytes (number or stringified bigint)."},"durationSeconds":{"description":"Lifetime in seconds (number or stringified bigint)."},"maxEgressBytes":{"description":"Egress budget in bytes (number or stringified bigint)."},"writesAllowed":{"type":"integer","minimum":0},"readsAllowed":{"type":"integer","minimum":0}}},"contentType":{"type":"string","maxLength":255},"contentEncoding":{"type":"string","enum":["utf-8","base64","binary"]},"name":{"type":"string","maxLength":255},"description":{"type":"string","maxLength":2000},"tags":{"type":"array","items":{"type":"string","maxLength":64},"maxItems":32},"content":{"type":"string","description":"Inline initial content (base64-encoded when contentEncoding is base64/binary). Omit for an empty baton."},"requestPresignedUpload":{"type":"boolean","description":"Mint a presigned-PUT URL for an out-of-band initial upload instead of inline content."},"acl":{"type":"object","additionalProperties":{"type":"string","enum":["editor","reader"]},"description":"Collaborator ACL keyed by customer UUID."},"eventTriggers":{"type":"array","description":"Webhook event triggers; each { url, events[], description? }. The secret is server-minted and returned ONCE.","items":{"type":"object"}},"tokens":{"type":"array","description":"Create-time collaborator tokens; each entry follows the POST /v1/baton/{id}/tokens body.","items":{"type":"object"}},"flags":{"type":"object","properties":{"hashChaining":{"type":"boolean"},"witness":{"type":"boolean"}},"description":"flags.hashChaining: true auto-commits a prepaid witness (an explicit witness: false alongside it → 422 FLAG_DEPENDENCY_UNMET)."},"onExpiration":{"type":"string","enum":["hard_delete","tombstone_then_delete"]},"deleteOnAllTokensConsumed":{"type":"boolean"},"schemaRef":{"type":"string","maxLength":255},"rateLimits":{"type":"object"}}}}}},"responses":{"201":{"description":"Baton created."},"402":{"description":"Payment required (x402 challenge)."}},"x-payment-info":{"protocols":["x402"],"scheme":"exact","asset":"USDC","networks":["eip155:8453","eip155:84532"],"price":{"mode":"dynamic","currency":"USD","min":"0.001","max":"1.00"}},"operationId":"create_baton"}},"/v1/baton/{id}":{"get":{"tags":["baton"],"summary":"Read","description":"Read a baton (owner-addressed by UUID, OR token-addressed by `tok_<43-char>`).","security":[{"apiKey":[]},{"walletJwt":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Baton."},"410":{"description":"Content gone."}},"operationId":"read_baton"},"post":{"tags":["baton"],"summary":"Write","description":"Write/append (owner-addressed by UUID, OR token-addressed). Append on append / append-chained batons; overwrite on single-object / overwrite batons.","security":[{"apiKey":[]},{"walletJwt":[]},{"x402":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"201":{"description":"Entry appended."},"409":{"description":"Quota exhausted / baton frozen."}},"operationId":"append_to_baton"},"delete":{"tags":["baton"],"summary":"Delete","description":"Soft-delete; sweeper purges per on_expiration.","security":[{"apiKey":[]},{"walletJwt":[]},{"x402":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Delete scheduled."}},"operationId":"delete_baton"}},"/v1/baton/{id}/entries":{"get":{"tags":["baton"],"summary":"List entries","description":"Paginated entries (owner or token-addressed).","security":[{"apiKey":[]},{"walletJwt":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0}},{"name":"since","in":"query","schema":{"type":"string"}},{"name":"until","in":"query","schema":{"type":"string"}},{"name":"writer","in":"query","schema":{"type":"string"}},{"name":"type","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Entries page."}},"operat
# --- truncated at 32 KB (352 KB total) ---
# Full source: https://artifacts.apis.io/relaystation-ai/openapi/_original/relaystation-ai-api-openapi.json