Relaystation Api API

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 principl

Operations 244

GET /health Health #
GET /openapi.json OpenAPI spec #
GET /llms.txt llms.txt #
GET /llms-full.txt llms-full.txt #
GET /.well-known/mcp.json MCP advertisement #
GET /.well-known/ai-catalog.json ARD ai-catalog manifest #
POST /mcp MCP transport #
GET /v1/auth/challenge Wallet challenge #
POST /v1/auth/verify Verify signature #
POST /v1/webhooks Register #
GET /v1/webhooks List #
GET /v1/webhooks/events Event registry #
GET /v1/webhooks/{id} Get #
PUT /v1/webhooks/{id} Update #
DELETE /v1/webhooks/{id} Delete #
GET /v1/webhooks/{id}/deliveries Delivery history #
GET /v1/account Get account #
GET /v1/account/ledger List ledger entries #
POST /v1/account/products/{product}/enable Enable product #
GET /v1/account/products List enrollments #
GET /v1/baton/system/info System info #
GET /v1/baton/system/egress-ips Egress IPs #
GET /v1/baton/prices Preconfigs #
POST /v1/baton/quote Quote #
POST /v1/storage/drop Create a drop baton #
POST /v1/storage/pass Create a pass baton #
POST /v1/storage/scratchpad Create a scratchpad baton #
POST /v1/storage/checkpoint Create a checkpoint baton #
POST /v1/storage/ledger Create a ledger baton #
POST /v1/baton Create #
GET /v1/baton/{id} Read #
POST /v1/baton/{id} Write #
DELETE /v1/baton/{id} Delete #
GET /v1/baton/{id}/entries List entries #
GET /v1/baton/{id}/tail Tail #
POST /v1/baton/{id}/add Add resources #
POST /v1/baton/{id}/extend Extend #
GET /v1/baton/{id}/meta Read metadata #
POST /v1/baton/{id}/meta Update metadata #
GET /v1/baton/{id}/event-logs Audit log #
POST /v1/baton/{id}/tokens Share a file or add a collaborator (mint an access token) #
GET /v1/baton/{id}/tokens List tokens #
POST /v1/baton/{id}/tokens/{tokenId} Modify or revoke #
POST /v1/baton/{id}/trust/document-witness Witness #
POST /v1/baton/{id}/trust/verify-chain Verify chain #
POST /v1/baton/{id}/trust/challenge Challenge #
GET /v1/baton/{id}/trust/proof Get proof #
POST /v1/cputools/upload-url Mint a storage-ref upload URL #
GET /v1/outputs/{key} Re-fetch a stored op output #
POST /v1/pdf/merge Merge PDFs #
POST /v1/pdf/split Split a PDF #
POST /v1/pdf/rotate Rotate pages #
POST /v1/pdf/pages Delete / reorder / insert pages #
POST /v1/pdf/extract-text Extract text #
POST /v1/pdf/metadata Get / set metadata #
POST /v1/pdf/watermark Watermark / stamp #
POST /v1/pdf/form Form-fill / flatten #
POST /v1/pdf/encrypt Password-protect a PDF #
POST /v1/pdf/compress Compress a PDF #
POST /v1/pdf/render Render PDF pages to images #
POST /v1/pdf/ocr OCR a PDF #
POST /v1/pdf/ocr-searchable Make a scanned PDF searchable (OCR text layer) #
POST /v1/image/ocr OCR an image #
POST /v1/pdf/repair Repair a damaged PDF #
POST /v1/pdf/verify-signatures Verify PDF digital signatures (structural) #
POST /v1/pdf/from-html Generate a PDF from HTML (headless Chromium) #
POST /v1/pdf/images Extract embedded images from a PDF #
POST /v1/pdf/diff Text-compare two PDFs #
POST /v1/pdf/bookmarks Read a PDF outline / bookmarks #
POST /v1/pdf/attachments List / extract PDF attachments #
POST /v1/qr Generate a QR code #
POST /v1/barcode Generate a barcode #
POST /v1/image/resize Resize an image #
POST /v1/image/convert Convert image format #
POST /v1/image/compress Compress an image #
POST /v1/image/rotate Rotate / flip an image #
POST /v1/image/metadata Read image metadata #
POST /v1/image/crop Crop an image region #
POST /v1/image/blur Blur an image #
POST /v1/image/sharpen Sharpen an image #
POST /v1/image/grayscale Grayscale an image #
POST /v1/image/exif-strip Strip image metadata #
POST /v1/image/dominant-color Dominant color of an image #
POST /v1/image/composite Composite / watermark images #
POST /v1/image/contact-sheet Thumbnail-grid contact sheet #
POST /v1/image/from-html Render HTML to an image (Chromium screenshot) #
POST /v1/image/adjust Adjust image color/tone #
POST /v1/image/trim Auto-crop uniform borders #
POST /v1/image/extend Pad (extend) an image #
POST /v1/csv/convert Convert tabular formats #
POST /v1/csv/dedupe Drop duplicate rows #
POST /v1/csv/select Project / reorder columns #
POST /v1/utils/hash Hash data #
POST /v1/utils/hmac HMAC data #
POST /v1/utils/uuid Generate UUIDs #
POST /v1/utils/jwt-decode Decode a JWT (no verification) #
POST /v1/utils/jwt-verify Verify a JWT signature #
POST /v1/utils/base64 Base64 encode / decode #
POST /v1/generate/og-image Render an OG / social-card image #
POST /v1/generate/mock-data Generate fake / mock data #
POST /v1/generate/invoice Render an invoice PDF #
POST /v1/generate/chart Render a bar / line / pie chart #
POST /v1/generate/favicon Generate a favicon set #
POST /v1/generate/placeholder Render a placeholder image #
POST /v1/generate/identicon Render a deterministic identicon #
POST /v1/archive/zip Create a zip archive #
POST /v1/text/case Recase text #
POST /v1/text/slugify Slugify text #
POST /v1/text/diff Unified text diff #
POST /v1/text/apply-patch Apply a unified diff to a source string #
POST /v1/text/merge3 Three-way merge #
POST /v1/text/count Count characters / words / lines #
POST /v1/text/regex-extract Extract regex matches (ReDoS-guarded) #
POST /v1/text/template Render a logic-less template (no eval) #
POST /v1/text/markdown-to-html Markdown → sanitized HTML #
POST /v1/text/html-to-text HTML → plain text #
POST /v1/text/sanitize-html Sanitize HTML (whitelist) #
POST /v1/codes/qr-decode Decode a QR code from an image #
POST /v1/codes/color-convert Convert a color (hex/rgb/hsl) #
POST /v1/data/filter Filter rows by a structured predicate #
POST /v1/data/sort Sort rows by columns #
POST /v1/data/groupby Group rows and aggregate #
POST /v1/data/join Join two tables #
POST /v1/data/union Concatenate tables #
POST /v1/data/profile Profile a table #
POST /v1/data/sql Run SQL over a file (DuckDB) #
POST /v1/pipeline Run a pipeline of cputools transforms in one call #
POST /v1/data/cast Coerce column types #
POST /v1/data/pivot Pivot / unpivot a table #
POST /v1/data/schema-infer Infer a schema from a table #
POST /v1/data/validate Validate a table against a structured schema #
POST /v1/data/diff Diff two tables (row-level changeset) #
POST /v1/data/from-xlsx Parse Excel (.xlsx) → table #
POST /v1/data/to-xlsx Emit a table as Excel (.xlsx) #
POST /v1/data/derive Add computed columns (structured, no-eval) #
POST /v1/data/fillna Fill empty/null cells #
POST /v1/data/dropna Drop rows with empty cells #
POST /v1/data/rename Rename columns #
POST /v1/data/slice Slice / sample rows #
POST /v1/data/explode Explode a list cell into rows #
POST /v1/data/sample Sample rows from a dataset #
POST /v1/account/api-keys/regenerate Regenerate API key #
POST /v1/bridge/ask Ask (blocking) #
GET /v1/bridge/ask/{ticket}/check Check ask status #
GET /v1/bridge/missed List recently-replied tickets since a timestamp #
POST /v1/bridge/notify Notify (fire-and-forget) #
GET /v1/bridge/active Read bridge_active toggle #
POST /v1/bridge/active Set bridge_active toggle #
POST /v1/bridge/cascade/{action} Dispatch cross-product cascade action #
POST /v1/bridge/cascade/dismiss Dismiss a cascade template #
GET /v1/bridge/email/confirm Confirm operator email opt-in #
POST /v1/bridge/agent-address Mint an ephemeral agent address #
GET /v1/bridge/agent-addresses List my agent addresses #
POST /v1/bridge/message-agent Message another agent #
GET /v1/bridge/mailbox/{address_id} Read an agent mailbox #
POST /v1/admin/courier/refund-star-payment Refund a Telegram Stars payment (admin) #
POST /v1/esigndoc/envelopes Send a document for signature #
GET /v1/esigndoc/envelopes List envelopes #
POST /v1/esigndoc/envelopes/from-template Send a document for signature from a reusable template #
POST /v1/esigndoc/envelopes/{id}/send Send a prepared draft for signature #
GET /v1/esigndoc/envelopes/{id} Get an envelope (cached) #
DELETE /v1/esigndoc/envelopes/{id} Cancel an unsigned document #
GET /v1/esigndoc/envelopes/{id}/status Check who has signed #
GET /v1/esigndoc/envelopes/{id}/download Download the PDF (binary) #
GET /v1/esigndoc/envelopes/{id}/signed-document Get the signed copy #
POST /v1/esigndoc/envelopes/{id}/resend Chase recipients who have not signed #
POST /v1/esigndoc/envelopes/{id}/fields Place signature and approval boxes in the document #
DELETE /v1/esigndoc/envelopes/{id}/fields/{fid} Remove a signature or approval box #
POST /v1/esigndoc/templates Save a reusable contract template #
GET /v1/esigndoc/templates List templates #
GET /v1/esigndoc/templates/{id} Get a template #
PUT /v1/esigndoc/templates/{id} Update a template #
DELETE /v1/esigndoc/templates/{id} Delete a template #
POST /v1/idverify/verifications Verify a government ID, run a liveness check, or match a face (by type) #
GET /v1/idverify/verifications List verifications #
GET /v1/idverify/verifications/{id}/status Check verification status #
GET /v1/idverify/verifications/{id} Get a verification (cached) #
POST /v1/screening/match Screen a name against sanctions + PEP watchlists #
POST /v1/location/geocode Geocode a free-text address #
POST /v1/location/reverse-geocode Reverse-geocode coordinates to an address #
POST /v1/location/route Calculate a route between two points #
POST /v1/doc/ocr-layout OCR a document with line/word layout #
POST /v1/doc/extract-form Extract form key→value pairs #
POST /v1/doc/extract-tables Extract tables from a document #
POST /v1/doc/parse-invoice Parse an invoice/receipt into structured fields #
POST /v1/doc/parse-id Parse a government identity document #
POST /v1/doc/ask-document Ask natural-language questions of a document #
POST /v1/doc/analyze-async Analyze a multi-page document asynchronously #
GET /v1/jobs/{id} Poll an async job #
POST /v1/vision/detect-labels Detect objects/scenes in an image #
POST /v1/vision/moderate Detect unsafe content in an image #
POST /v1/vision/detect-faces Detect faces + attributes in an image #
POST /v1/vision/compare-faces Compare faces between two images #
POST /v1/vision/detect-celebrities Recognize celebrities in an image #
POST /v1/vision/detect-ppe Detect protective equipment on persons #
POST /v1/llm/embed Generate text embedding vectors #
POST /v1/data/sql-large Run SQL over a large stored file (Athena) #
POST /v1/baton/{id}/vectors Batch-write vectors into a vector baton's index #
POST /v1/baton/{id}/vectors/query Top-k similarity search over a vector baton #
POST /v1/rag/answer Grounded answer over a vector baton (RAG in one call) #
POST /v1/bundles/rag-ingest One-call RAG ingest (chunk → embed → vector-write; create-if-absent) #
POST /v1/bundles/rag-query One-call RAG query (vector query → optional grounded answer) #
POST /v1/bundles/ingest-document One-call document ingest (OCR-searchable + tables → xlsx → drops) #
POST /v1/web/pdf Render a URL to PDF #
POST /v1/web/screenshot Screenshot a URL #
POST /v1/web/readability Extract clean article text from a URL #
POST /v1/contracts Create a binding agreement (terms + parties) #
GET /v1/contracts List your contracts #
GET /v1/contracts/disclosure Public offline-verification disclosure #
GET /v1/contracts/{id} Check whether all parties have signed #
POST /v1/contracts/{id}/sign Sign a binding agreement #
POST /v1/contracts/{id}/extend-signing Extend the signing window #
POST /v1/contracts/{id}/arbitrate Open a dispute and get a decision #
POST /v1/pdf/from-office Convert an Office document to PDF #
POST /v1/office/rescue Rescue an exotic/legacy office file to PDF (best-effort) #
GET /v1/office/formats Office conversion roster #
POST /v1/media/probe Probe media metadata (ffprobe) #
POST /v1/media/trim Trim a media time range (stream-copy) #
POST /v1/media/convert Convert media container/codec (re-encode) #
POST /v1/media/thumbnail Grab a video frame (thumbnail) #
POST /v1/media/audio-extract Extract the audio track #
POST /v1/media/gif Video segment → animated GIF #
POST /v1/media/loudnorm Normalize audio loudness (EBU R128) #
POST /v1/media/audio-convert Transcode audio (standalone re-encode) #
POST /v1/media/speed Change playback speed (pitch-preserving) #
POST /v1/media/subtitle-extract Extract an embedded subtitle track #
POST /v1/media/concat Concatenate clips (stream-copy) #
POST /v1/media/overlay Overlay an image onto a video (watermark) #
POST /v1/media/subtitle-burn Burn subtitles into a video (libass) #
POST /v1/media/waveform Render a waveform / spectrogram PNG #
POST /v1/media/silence Detect or trim silence #
POST /v1/media/audio-mix Mix N audio inputs → 1 #
POST /v1/media/storyboard Build a thumbnail sprite sheet #
POST /v1/media/metadata Read or write container metadata #
POST /v1/media/frames Extract frames → presigned manifest #
GET /v1/doc/formats Document conversion matrix #
POST /v1/doc/convert Convert a document (pandoc) #
GET /v1/llm/tasks See the live task catalog (tasks, tiers, prices) #
POST /v1/llm/{task} Run a language task (translate, summarize, extract, classify, proofread, and more) — pick a tier #
GET /v1/catalog/products Product catalog #
GET /v1/account/activity Account activity stream #
GET /v1/account/metrics Account home metrics #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/relaystation-ai:relaystation-api-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

relaystation-ai-api-openapi.json Raw ↑
{"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