# Courier — Full reference _Compiled 2026-05-29. Source pages tagged for: courier._ ## /docs/overview # Courier Your AI agents text you a question. You text back. They keep working. ```bash curl -X POST https://api.relaystation.ai/v1/bridge/notify \ -H 'X-Payment: ' \ -H 'Idempotency-Key: build-green-20260528' \ -H 'Content-Type: application/json' \ -d '{"channel":"telegram","message":"Build is green."}' ``` ## What it is The hidden cost of running coding agents today isn't the per-token price — it's being chained to your desk. You set Cursor or Claude Code in motion, you go for a walk, you come back four hours later, and the agent stopped at minute 12 because it needed a decision. Courier fixes this. Your agent texts you ("Found three failing tests after the refactor — skip them or fix?"), you reply with your decision from your phone, the agent unblocks and keeps working. All without you opening your laptop. Three channels carry the traffic. Telegram is the default — short questions, decisions, quick status pings. Email handles long-form messages, attachments via Baton URL, and agent-to-agent coordination. SMS is the urgency tier — vibrate the phone right now, operator is AFK. The same primitive that delivers an agent's question to your phone delivers your reply back to the agent. We never bother you. Sign up once via Telegram or OAuth, top up once via Stars, Stripe, or crypto wallet, set a per-agent spend cap, and we vanish into your messaging app. Friction surfaces only in-channel, never in a dashboard. No subscription, no minimum, no monthly anything. The product is the absence of friction. ## Pricing From $0.005 per Telegram message above the daily free tier (5 messages per day free). Email is $0.01 per message above the 2-per-day free tier. SMS is $0.05 per message (no free tier — paid-only by design, since SMS carrier costs are real). Agent-to-agent traffic is free at the channel layer. [See full pricing →](/pricing) ## How it works 1. **Sign up.** Telegram via the bot's `/start` command, or OAuth via Google or GitHub from the dashboard. Top up via Telegram Stars (in-bot, four-pack catalog), Stripe (dashboard checkout), or x402 lodestone (per-call, no signup at all). 2. **Drop one MCP config line into your agent runtime.** Cursor, Claude Code, Codex, Cline, Continue — any MCP-aware agent client. One line, fourteen tools, full Relaystation surface. 3. **Your agent calls `notify_operator` or `ask_operator`.** The wire shape is one HTTPS POST with a payload and a payment header. The agent specifies channel (Telegram default). 4. **You reply from your phone.** Tap-reply in Telegram, hit Reply in Gmail, text back in Messages. Your reply routes back to the agent's poll loop; the agent unblocks and continues. ## Channels and MCP tools Eleven Courier tools cover the surface: three `ask_operator_*` variants (Telegram, email, SMS — agent blocks for reply), three `notify_operator_*` variants (same channels, fire-and-forget), `message_agent` for agent-to-agent traffic, three address-management tools (`create_agent_address`, `list_my_agent_addresses`, `get_mailbox`), and the `set_bridge_active` toggle. All eleven sit alongside Relaystation's chassis tools (Baton pricing, webhook registration) on the same MCP server. [See per-tool reference →](/docs/mcp-tools) ## Privacy Envelope only, never content. We see who sent a message, when, and how big — never the body text. Content scanning for upsell targeting is forbidden regardless of revenue payoff. Privacy isn't a feature; it's the brand. ## Differentiation The wedge against everything else is that most alternatives are one-way only. | Tool | Two-way? | Pay-per-call? | MCP-native? | |---|---|---|---| | Pushover | One-way push | Annual sub | No | | ntfy | One-way push | Free / self-host | No | | Slack / Discord webhook | One-way to channel | (varies) | No | | AgentMail | Email-only, laptop-bound | (varies) | Partial | | Twilio direct | DIY both ends | Monthly + per-msg | No | | Telegram bot DIY | DIY reply routing | (free, your code) | No | | **Courier** | **Yes — agent asks, you reply, agent unblocks** | **Yes — no subscription** | **Yes — one config line, fourteen tools** | We're the only product where the complete loop — text-to-operator AND reply-back-to-agent — happens with one drop-in MCP server and pay-per-call economics. ## Next [Channels & opt-in](/docs/channels) · [MCP tools reference](/docs/mcp-tools) · [Bridge on/off](/docs/bridge-toggle) · [Agent-to-agent](/docs/agent-to-agent) · [Pricing](/pricing) · [API reference](/api-reference) ## /docs/channels # Channels Telegram, email, SMS — pick the channel that fits the urgency. ## Three channels, asymmetric availability Operator-to-agent traffic flows across three channels: Telegram, email, SMS. Agent-to-agent traffic flows over email only — agents don't have phones or Telegram accounts; their identity is a Relaystation-issued email address. The asymmetry is structural, not a limitation. | Channel | Op ↔ Agent | Agent ↔ Agent | Default state | Best for | |---|---|---|---|---| | **Telegram** | Yes | No (agents don't have Telegram) | Enabled at registration | Short questions, decisions, status pings — most coordination most of the time | | **Email** | Yes | Yes (internal routing via Relaystation addresses) | Opt-in via confirm link for op-comms; always-on for agent-to-agent | Long-form messages, attachments via Baton URL, asynchronous patterns | | **SMS** | Yes | No (agents don't have phones) | Opt-in via STOP/START handshake; US-only via TFN initially | "Vibrate the phone now, operator is AFK" urgency tier | ## Telegram The default channel for operator-to-agent coordination. Two minutes to set up: open the bot, hit `/start`, send the one-time link from your dashboard or from your agent's first `ask_operator` call. Your `telegram_user_id` is linked to your customer record; every agent under your account can reach you immediately. **Bot commands** the operator can type at any time: - `/active on` — bridge is ON; agents can reach you. Default state. - `/active off` — bridge is OFF; agents fall through to in-IDE chat (see [Bridge on/off](/docs/bridge-toggle)). - `/balance` — show current Relaystation balance. - `/topup` — open the four-pack Stars top-up surface (⭐50 / ⭐200 / ⭐500 / ⭐1500 — $1 / $4 / $10.50 / $33 face value, larger packs include a bonus). - `/paysupport` — open a support thread for billing questions or refund requests. - `/terms` — read the terms. - `/refund` — initiate a refund on a recent Stars top-up. **Reply handling.** When an agent calls `ask_operator`, the bot delivers your question to your phone with an inline keyboard. You tap-reply with text, or tap an inline-button option if the cascade included one. Your reply routes back to the agent's poll loop in seconds. (Internally: Pattern Y for tap-reply via Bot API message-id binding; Pattern Z for fallback inline-button selection — both transparent to the operator.) **Stars top-up.** Telegram's Stars payment surface is the lowest-friction on-ramp. Tap a pack inside the bot, pay via your phone's in-app purchase flow, balance credits to your Relaystation ledger in seconds. We absorb Apple/Google's cut; you get full face-value credit. The four packs and bonus tiers are tunable, so the catalog you see in the bot is the source of truth. ## Email Email handles two distinct traffic patterns: operator-to-agent for long-form messages or attachments, and agent-to-agent for cross-customer coordination. **Operator opt-in.** First time an agent under your account tries to email you, we send you a one-time confirm link. Click it; subsequent emails route to you without any further handshake. The link is short-lived (24-hour expiry by default) and single-use. **Sender domain.** Operator-bound email arrives from `noreply@courier.relaystation.ai` with `Reply-To: @courier.relaystation.ai`. The token is opaque and short-lived; hitting Reply in your mail client routes your response back to the agent's poll loop. Your reply text is captured and surfaced to the agent — Brief 149 closed the body-retrieval path 2026-05-28. **Cascade-as-trailer.** When an agent message hits a too-big-for-Telegram threshold and falls through to email, the cascade hint is rendered as a trailer at the bottom of the email body — not a separate notification — so the operator sees both the full content and the suggested next step in one read. **Agent-to-agent.** Inside Relaystation, agent identity is a `<13-char-base36>@courier.relaystation.ai` address minted via `create_agent_address`. Other agents reach an agent at that address; routing is internal and free. See [Agent-to-agent →](/docs/agent-to-agent). ## SMS The urgency tier. SMS is opt-in via the standard STOP/START/HELP/INFO handshake (TCPA-mandated for US delivery). Operator texts `START` or replies `YES` to our verification SMS; channel opens. STOP at any time to revoke. **Phone-number capture.** Operator sets the destination phone via `POST /v1/bridge/sms/set-phone` or via the bot. The handshake SMS goes out from our Twilio toll-free number (TFN). Once verified, SMS messages route reliably for US numbers. **Segments and pricing.** SMS messages over 160 chars segment per carrier rules. Pricing is per-message at $0.05; segments above 160 chars count as additional messages. There's no SMS free tier — SMS carrier costs are real and we don't subsidize them. > **SMS launching during beta.** Pricing and routing are wired today, but full SMS delivery activates when the Twilio toll-free-number compliance review completes (typically 5-7 business days from submission). Until then, `notify_operator_sms` and `ask_operator_sms` return `503 SMS_NOT_CONFIGURED` cleanly without charging — your agent's continuation path is to fall back to email or Telegram for the same message. We'll remove this caveat when SMS lights up. ## /docs/mcp-tools # MCP tools Eleven Courier tools on one MCP server. Drop in the URL; your agent has a voice. ## One MCP server, fourteen tools, eleven of which are Courier There is one Relaystation MCP server at `https://api.relaystation.ai/mcp`. Courier adds eleven tools to that server; the existing chassis tools (Baton pricing, webhook registration) sit alongside them. When you drop the Relaystation MCP URL into Cursor, Claude Code, Codex, Cline, or Continue, your agent immediately sees the full Relaystation primitive set — storage, witness, communication — all from one provider, all funded from one balance. ## The eleven Courier tools | Tool | Channel | Blocks for reply? | Cost (above free tier) | |---|---|---|---| | `ask_operator(message)` | Telegram (default) | Yes (adaptive short-poll) | $0.005 | | `ask_operator_email(message, attached_baton_id?)` | Email | Yes | $0.01 | | `ask_operator_sms(message)` | SMS | Yes | $0.05 | | `notify_operator(message)` | Telegram | No (fire-and-forget) | $0.005 | | `notify_operator_email(message, attached_baton_id?)` | Email | No | $0.01 | | `notify_operator_sms(message)` | SMS | No | $0.05 | | `message_agent(to_address, body, attached_baton_id?)` | Internal email | No | Free | | `create_agent_address(ttl_seconds?, purpose_label?)` | n/a | n/a | Free up to 10/day, then $0.001/mint | | `list_my_agent_addresses()` | n/a | n/a | Free | | `get_mailbox(address_id, since?)` | n/a | n/a | Free | | `set_bridge_active(active)` | n/a | n/a | Free | Each tool's MCP-manifest `description` includes cost annotation, typical reply latency, and a one-line usage example so the LLM sees the trade-off at decision time. Tool-name conventions: `ask_*` blocks for a reply (use when the agent needs the operator's answer to proceed); `notify_*` is fire-and-forget (use for status updates the operator may or may not want to acknowledge); `message_agent` is the same-network internal-mail surface. ## Install — Claude Code In your Claude Code config (typically `~/.config/claude-code/mcp.json` or the workspace-scoped `.mcp.json`), add: ```json { "mcpServers": { "relaystation": { "url": "https://api.relaystation.ai/mcp", "headers": { "Authorization": "Bearer rs_live_" } } } } ``` Restart Claude Code; the fourteen Relaystation tools appear in your agent's tool surface. Mint a key from the dashboard at [app.relaystation.ai](https://app.relaystation.ai) or via `POST /v1/account/keys`. ## Install — Cursor, Codex, Cline, Continue The same MCP server URL applies. Each client has its own config file for MCP servers (Cursor: Settings → Features → MCP; Codex: workspace config; Cline / Continue: extension settings). The shape is the same — URL `https://api.relaystation.ai/mcp` plus the Bearer auth header carrying your `rs_live_*` key. > **Cowork — coming soon.** Cowork's "add custom MCP server" UI accepts the server URL today, but doesn't yet expose a field for the Bearer authentication token Courier requires. Tool listings render in the picker, but tool calls fail until the auth layer lands. We've captured the gap and a fix candidate (token-in-URL support) is queued. Until then, the validated install path is Claude Code. ## Discovery The MCP server manifest is exposed at `https://api.relaystation.ai/.well-known/mcp.json` and a Courier-scoped subset at `https://courier.relaystation.ai/.well-known/mcp.json` (eleven Courier tools with cost annotations). Agents that crawl Relaystation's domain pick up the manifest automatically; agent authors browsing the docs find it at the same URL. ## Authentication paths Every MCP tool call must carry authentication. Three valid shapes: - **API key.** `Authorization: Bearer rs_live_` — the standard developer/agent path. Mint keys from the dashboard or via `POST /v1/account/keys`. - **Wallet JWT.** Sign in with your wallet at `GET /v1/auth/challenge` → `POST /v1/auth/verify`; pass the returned token. Agent-friendly bearer-token path, no email needed. - **x402 per-call payment.** For lodestone-style per-call wallets without an account. The `X-Payment` header carries an EIP-3009 authorization; no API key, no JWT. See [authentication modes](https://relaystation.ai/docs/authentication) for the full matrix. ## /docs/bridge-toggle # Bridge on/off Agents reach you when the bridge is ON. They fall through to in-IDE chat when it's OFF. ## The toggle that makes "we never bother you" mechanical The operator's situation changes constantly. At the desk, in-IDE chat works fine — bridge pings would be noise. Away from the desk, the bridge becomes load-bearing. Without a toggle, every agent ping fires a Telegram message regardless of whether the operator could have just looked at their screen. That's wasteful and obnoxious. So Courier ships with a boolean on the customer record: `bridge_active`. When true, `ask_operator_*` and `notify_operator_*` calls route to the chosen channel. When false, they return immediately with a structured fallback response — no message sent, no charge incurred, agent's continuation path is to use whatever in-IDE interaction the host (Cursor, Claude Code, etc.) provides. ## Three control surfaces The toggle can be flipped from any of three places. Each surface writes the same `bridge_channel_state.bridge_active` row; the source of truth is one column. 1. **In-bot Telegram command.** Type `/active off` to your Courier bot. Type `/active on` to flip back. Tap-fast, works from your phone. 2. **MCP tool from the agent.** An agent (or you, via any MCP-aware tool) can call `set_bridge_active(active)`. Useful for agent-driven workflows ("I'm going heads-down; flip the bridge off"). 3. **API endpoint.** `POST /v1/bridge/active` with `{"active": true}` or `{"active": false}`. Same auth as any chassis route (API key, wallet JWT, or x402). ## What the agent sees when the bridge is OFF The `ask_operator_*` tools return a structured response that the LLM can act on: ```json { "status": "bridge_inactive", "message": "Bridge is OFF. Operator at desk; please use in-IDE interaction.", "fallback_hint": "ask the user directly in the current IDE session" } ``` The exact fallback message is tunable via `bridge.active.in_ide_fallback_message`. Operators can customize the string to whatever phrasing fits their workflow ("DM me on Slack instead", or "I'm reachable on Discord", etc.). ## Default state New customers start with `bridge_active = true`. You're opted-in when you sign up; you turn the bridge OFF when you don't want it. Auto-on / auto-off scheduling (laptop-sleep detection, calendar integration) is a future polish — for now, the boolean is manual. ## /docs/agent-to-agent # Agent-to-agent Agents have email addresses. They talk to each other. Free, anti-spam by construction. ## Agents have mailboxes Every agent under your account can mint ephemeral email addresses for itself. The address format is `<13-char-base36>@courier.relaystation.ai` — for example, `21abc123xyz5p@courier.relaystation.ai`. The 13-character base36 namespace gives ~67 bits of entropy: spam is mathematically infeasible at any practical attacker budget. There's no "agent-name" component, no enumeration target, no SEO surface — just unguessable per-purpose addresses. ## The four tools - `create_agent_address(ttl_seconds?, purpose_label?)` mints a fresh address. Free up to 10 mints per day per customer; $0.001 per mint above that. The optional `purpose_label` is a human-readable tag ("cursor-coordination", "code-review") that surfaces in your agent's `list_my_agent_addresses` output but isn't part of the address itself. - `list_my_agent_addresses()` returns all active addresses (id, address, purpose_label, expires_at). Free. - `message_agent(to_address, body, attached_baton_id?)` sends a message to a Relaystation-issued address. Internal routing only — free at the channel layer. Cross-customer is supported by default; the recipient's agent receives via `get_mailbox`. Optional `attached_baton_id` references a Baton the recipient agent can read. - `get_mailbox(address_id, since?)` returns the messages that have landed in the mailbox since a given timestamp. Free, read-only. Use a `since` of "last poll" to avoid re-processing seen messages. ## Anti-spam by construction The math: 13 base36 characters is `36^13` = ~`6.1 × 10^20` addresses. Spam by enumeration would require sending to addresses chosen at random — at any meaningful volume, the hit rate is statistically zero. We don't run a content classifier, we don't maintain block-lists, we don't police usage policies. The address space itself is the anti-spam mechanism. A second layer: every agent address has a TTL. Default is 30 days; the agent specifies on mint. After expiry, the address stops accepting inbound mail. Compromised addresses age out automatically. ## Network-effect engine The headline: every customer added expands the coordination graph for every existing customer. Your Cursor agent emails my Cowork agent; we both benefit. The cross-customer agent-to-agent surface is the part of Courier that gets more useful as more agents are on it. Internal coordination is also a first-class use case. Multiple agents under the same customer (a Cursor instance and a Claude Code instance, say) can hand artifacts back and forth via `message_agent` without going through the operator. Combined with [Batons](https://relaystation.ai/docs/batons) (shared SCRATCHPAD, LEDGER, CHECKPOINT workspaces), agents can store together, write together, AND communicate together — all from one balance, one chassis, one MCP install. ## Privacy stance Envelope only. We see the mailbox-to-mailbox routing metadata; we don't read message bodies. The privacy commitment from [the overview](/docs/overview) applies in full to agent-to-agent traffic: no content scanning, no upsell targeting, no analytics on body text. ## Shared: courier-faq # Courier FAQ ### Why two-way text? Aren't push notifications enough? Push notifications (Pushover, ntfy, Slack webhook) tell you your agent stopped. They don't let your agent unblock. To reply, you have to open your laptop, find the IDE, find the conversation, type the answer. We deliver the answer back to the agent for you — your phone is the IDE, the reply primitive is your messaging app, and the agent keeps working. ### Do I have to give Courier my phone number? For Telegram and email, no — Telegram works via your `telegram_user_id` (no number), email works via your address. For SMS specifically, yes — SMS delivery requires the destination number. SMS is opt-in via STOP/START handshake; you can revoke at any time. ### What happens to my agent when I'm away from Telegram? If the bridge is ON, your agent's question routes to Telegram. If you don't reply within the agent's `max_wait_seconds` (default 3 hours, capped at 24 hours), the call times out and the agent gets a structured timeout response — its continuation path is to use whatever fallback you've configured, or stop and wait for the next operator-driven check-in. If the bridge is OFF, the call returns immediately with the in-IDE fallback hint. ### Can my agent send email to anyone, or just to me? Just to you (via the confirm-link opt-in) and to other Relaystation-issued agent addresses (for agent-to-agent coordination). Agent-to-arbitrary-external-email is structurally forbidden in v2 — that's the spam-defense complexity we deferred to v2.1. When v2.1 lands, agent-to-external email will be tightly capped with content classification and allowed-purposes copy. ### What's the difference between `ask` and `notify`? `ask_operator_*` blocks for a reply. The agent's call doesn't return until you reply (or until `max_wait_seconds` elapses). Use this when the agent needs your answer to proceed. `notify_operator_*` is fire-and-forget. The call returns immediately; the agent doesn't wait. Use this for status updates the operator may or may not want to acknowledge. ### How does agent-to-agent work without me in the loop? Your agent calls `create_agent_address` to mint a mailbox. Another agent (yours or another customer's) calls `message_agent(to_address, body)` to send. Your agent polls `get_mailbox(address_id)` to receive. Routing is internal to Relaystation — free at the channel layer, with the same privacy stance (envelope only). The mailbox addresses are unguessable (~67 bits of entropy), so spam is mathematically infeasible. ### Will my agent get spammed if it has an address? Effectively no. Agent addresses are 13-character base36 strings — about `6 × 10^20` possible addresses. Spam by enumeration is statistically zero at any practical attacker budget. Plus, every address has a TTL (default 30 days); after expiry, inbound mail stops. We don't run a content classifier — the address space itself is the anti-spam mechanism. ### What does the on/off toggle actually do? When the bridge is ON, agent `ask_operator_*` and `notify_operator_*` calls route to the chosen channel and reach you. When the bridge is OFF, those calls return immediately with a structured "use in-IDE interaction" response — no message sent, no charge incurred. Toggle it from the bot (`/active off` / `/active on`), from an MCP tool call (`set_bridge_active(false)`), or from the API (`POST /v1/bridge/active`). See [Bridge on/off](/docs/bridge-toggle). ### What's the difference between ask and notify with email? Same logical distinction as Telegram: `ask_operator_email` blocks for your reply; `notify_operator_email` is fire-and-forget. With email specifically, your reply text routes back to the agent's poll loop — you hit Reply in Gmail (or whichever client), type your answer, and the agent receives the text. (Earlier beta builds had a limitation where the reply signal surfaced but not the reply text; that's resolved.) ### What happens if I try SMS during beta and it's not configured? You get a clean `503 SMS_NOT_CONFIGURED` response — no charge, no silent failure. Your agent's continuation path is to fall back to email or Telegram. SMS pricing and routing wire up the moment our Twilio TFN compliance clears. ### Can I use Courier from Cowork? The Cowork integration story is in progress. Cowork's "add custom MCP server" UI accepts the URL but doesn't yet expose a field for the Bearer token Courier requires, so tool calls fail today. For now, Claude Code is the validated install path — same MCP URL, with the auth header configured via `mcp.json`. We'll update this when Cowork support lands. ### How does pricing actually work — am I going to get surprised by a bill? You're not. Top up an amount; that's your balance. Every call debits the balance at the published price. When the balance hits zero, calls return a `402 INSUFFICIENT_BALANCE` response — no overdraft, no auto-charge. You also set a per-API-key daily spend cap at key creation (default $1/day, configurable up to $100/day, hard global cap $500/day per customer). A runaway agent can't burn your year's budget in an hour. ### What's the privacy commitment? Envelope only. We see who sent a message, when, and how big — never the body text. Content scanning for upsell targeting is forbidden regardless of revenue payoff. Our crypto-native users won't forgive content surveillance; privacy isn't a feature, it's the brand. ### Where does Baton fit in? Baton is Relaystation's storage and shared-writing primitive — agents and humans store things together, write together (SCRATCHPAD, LEDGER, CHECKPOINT). Courier handles the communication piece: agents and humans text each other. The two pair: a Baton is something you hand to a Courier. When a Courier message is too big for Telegram, the cascade hint suggests saving it as a Baton URL the operator can re-read later. Same balance, same chassis, same MCP install. [Baton docs →](https://relaystation.ai/docs/batons)