Connect in one command (MCP)
The invariant: a send is never the first call.
send_letter only accepts a
single-use confirmation_token minted by quote_letter, cryptographically
bound to the recipient, content, mail class, and price. Nothing can change
between the quote your agent (or your user) saw and the letter that gets
mailed — and a replayed token returns confirmation_used, not a second letter.
Try it free right now — tell your agent:
Using the paperplane tools, quote a 1-page certified letter to Property LLC, 1 Main St, Richmond VA 23220, then send it in sandbox mode.Sandbox runs the entire pipeline (validation, address correction, mock fulfillment, tracking number) with no payment and nothing mailed.
Or REST, two calls
sandbox — it returns a payment_url for a
human to approve, so an agent can prepare mail it can’t silently pay for.
Or a funded wallet pays directly (x402)
For an agent that holds its own funded crypto wallet rather than a human’s card,POST /v1/x402/credits (MCP: buy_credits) lets it pay USDC on Base
directly, no human checkout step — settle once, get a prepaid credit_code,
spend it with send_letter. Staged: real, tested code that reports
x402_not_configured until a facilitator account is provisioned;
sandbox: true works today with no setup. See
Agent payments (x402).
Why it’s safe to wire into an autonomous loop
- Impossible to double-send.
Idempotency-Keyreplays return the original order ("replayed": true, same id); a reusedconfirmation_tokenis refused withconfirmation_used. Retry storms can’t mail twice or charge twice. - No silent spend. Every paid send requires either an explicit
human-approved
payment_urlor a prepaidcredit_code— plus the confirmation token proving the price was seen. - Errors are recovery playbooks. Every failure returns
{ status, code, reason, next[] }—nextis what a support human would say, machine-readable. Full catalogue: Error contract. - Money comes back on its own. If fulfillment fails after capture, an hourly reconcile loop refunds automatically — recovery is a system property.
- Deterministic surface. The OpenAPI 3.1 spec
is generated from the same Zod schemas the server parses with — the spec
can’t drift from reality.
llms.txtlives at/llms.txt; the agent card at/.well-known/agent.json.
Guardrails in action
The bullets above are claims. Here’s what it actually looks like when the system says no — the same guardrail firing you’d expect a voice-agent platform to log as “Request blocked by guardrail,” except ours is a machine-readable envelope your agent can act on, not just a log line. An agent replays aconfirmation_token that already mailed a letter:
409 Conflict
400 Bad Request
send_letter never mails and no payment is
captured on a blocked call. next is the recovery step, not decoration: the
agent reads it and knows what to do without a human in the loop. Full
catalogue of every code the spend-safety gate can return: Error
contract.