Send mail from agents and apps.
Quote, confirm, send and track real USPS mail over MCP, REST or CLI. No account, no API key. The sandbox is free.
Connect your agentRead the docs
The math
What it takes to integrate.
| paperplane | |
|---|---|
| Accounts to create | 0 |
| API keys to store | 0 |
| Calls to a first sandbox send | 3: quote, send, track |
| Cost to test | Free; the sandbox mails nothing |
Connect your agent.
Pick your client and paste one config. Your agent quotes the letter, you approve the payment link, USPS does the rest.
Step 1
Connect
claude mcp add --transport http paperplane https://sendpaperplane.com/api/mcpTry it: free, nothing mailed
Tell your agent:
Using the paperplane tools, quote a 1-page certified letter to Property LLC, 1 Main St, Richmond VA 23220, from Alex Rivera, 12 Grove Ave, Richmond VA 23221, then send it in sandbox mode.The benchmark, replayed
Claims about being agent-ready are cheap; transcripts aren't. This is the real captured sandbox run — quote → send → track in 3 calls, zero schema retries — including the part where a replayed request and a reused confirmation token both fail to double-send. Full write-up: agent benchmark.
Captured sandbox run · 2026-08-26
POST /v1/quotes
{
"mail_class": "certified",
"page_count": 1,
"to": {
"name": "Property LLC",
"line1": "1 Main St",
"city": "Richmond",
"state": "VA",
"zip": "23220"
},
"text": "Formal demand for return of my security deposit within 14 days of this notice."
}{
"status": "ok",
"total_cents": 1299,
"total": "$12.99",
"breakdown": [
{
"id": "certified_mail_letter_1_page",
"label": "Certified Mail letter, 1 page",
"amount_cents": 1299
}
],
"confirmation_token": "ppq_eyJ2IjoxLCJqdGkiOiJhNDBlZjFiMzFhZDMxYjMx…",
"expires_in_minutes": 30,
"next": [
"POST /v1/orders with this confirmation_token and the same recipient, content, and options."
]
}The next array tells the agent its own next step.
POST /v1/orders
Idempotency-Key: bench-2026-08-25-a
{
"mail_class": "certified",
"sandbox": true,
"confirmation_token": "ppq_eyJ2IjoxLCJqdGkiOiJhNDBlZjFiMzFhZDMxYjMx…",
"to": {
"name": "Property LLC",
"line1": "1 Main St",
"city": "Richmond",
"state": "VA",
"zip": "23220"
},
"from": {
"name": "Alex Rivera",
"line1": "12 Grove Ave",
"city": "Richmond",
"state": "VA",
"zip": "23221"
},
"text": "Formal demand for return of my security deposit within 14 days of this notice."
}{
"status": "ok",
"order": {
"id": "ord_test_f5ca66ace638fdc1",
"status": "submitted",
"sandbox": true,
"price_cents": 1299,
"tracking_number": "9400MOCK00000001"
},
"corrected_to": {
"name": "Property LLC",
"line1": "1 MAIN ST",
"city": "RICHMOND",
"state": "VA",
"zip": "23220"
},
"capability": {
"cancel_token": "…",
"review_token": "…"
}
}Address USPS-standardized, scoped cancel/review tokens minted — no account, no API key.
GET /v1/orders/ord_test_f5ca66ace638fdc1
{
"status": "ok",
"order": {
"status": "submitted",
"tracking_number": "9400MOCK00000001",
"…": "…"
}
}POST /v1/orders Idempotency-Key: bench-2026-08-25-a
{
"status": "ok",
"replayed": true,
"order": {
"id": "ord_test_f5ca66ace638fdc1",
"…": "…"
}
}Same order id. A retry storm mails one letter.
POST /v1/orders
✕ confirmation_used
This confirmation_token was already used to send a letter. Each quote authorises exactly one letter.
next
- → Quote again — POST /v1/quotes (MCP: quote_letter) — to authorise another letter.
Each quote authorises exactly one letter — a reused token cannot double-send.
POST /v1/orders
✕ confirmation_malformed
confirmation_token is not a paperplane quote token.
next
- → Quote first: POST /v1/quotes (MCP: quote_letter) with the exact parameters you intend to send, then pass the confirmation_token it returns.
Every failure is a { status, code, reason, next[] } envelope.
Every failure that transcript beat could have ended on, rendered the same way: the full error contract, visually.
Services
4 flagship formats shown; full price list
from $0.99
Letter
Typed or uploaded, sealed envelope. Certified Mail and Priority both go this way.
$12.99
Certified Mail
USPS proof of mailing + tracking. Add electronic Return Receipt for $14.99.
from $0.99
Postcard
Message-only, no envelope. 4x6, 6x9, or 6x11 — printing and postage included.
from $1.99
Card
Folded card with handwritten typography; $1 more for a robot-written real-pen version. Enclosed like a greeting card.
Plans
Pay as you go
pay per letter
No account, no plan to choose, no purchase needed up front.
Resources
Agent card preview
{
"name": "paperplane",
"interfaces": {
"mcp": { "transport": "streamable-http", "url": "https://sendpaperplane.com/api/mcp" },
"rest": { "openapi": "https://sendpaperplane.com/v1/openapi.json" }
},
"pricing": {
"model": "per-transaction",
"currency": "USD",
"items": [
{ "sku": "first_class", "price": 0.99, "unit": "letter (1 page B&W)" },
{ "sku": "certified", "price": 12.99, "unit": "letter" }
]
},
"authentication": { "required": false, "scheme": "bearer" }
}Supported payment methods
Card / Apple Pay Payment link
A hosted checkout link the agent’s human approves — the confirmation step every assistant platform requires before a purchase.
Prepaid credit code pp-xxxx-xxxx-xxxx
No card at all: a prepaid code pays for letters directly. Balance lasts 5 years.
USDC on Base x402Coming soon
For an agent holding its own funded wallet: pay per call with no human checkout step at all. Built and tested — staged until a facilitator account is provisioned.
How agents pay
- 01
Get a quote
POST /v1/quotes(or thequote_letterMCP tool) prices any letter, free. Returns aconfirmation_tokenbound to the exact recipient, content, class, and price. - 02
Confirm and pay
POST /v1/orderswith that token returns a paperplane payment link for the human to approve (or, for an agent with its own wallet, settles USDC over x402 once that lane is live — see payment methods above). A send is never the first call. - 03
Track the letter
GET /v1/orders/:id(orget_letter_status) reports the lifecycle fromscreeningtodelivered.
Sandbox: every path below (MCP, CLI, REST) supports sandbox: true (or --sandbox) to run the entire flow — rendering, screening, simulated fulfillment with tracking — instantly and free. An agent's first call can succeed before any human has signed up for anything.
Loading…
Developer console
Sign in to see your letters in one place — live status, tracking, and receipts — even though sending stays keyless.
Sign in
Error contract
Every error is structured for agents: { status, code, reason, next: ["what to do"] }. Address problems return the USPS-corrected candidate. Nothing requires reading HTML or guessing.
Content rules
Every letter is screened before printing (policy). Lawful demand letters and firm legal language are explicitly allowed; threats, fraud, and impersonation are refused and the payment released.
Questions before you integrate
Can my agent spend money without me?
Not in one step. A send needs a single-use confirmation token from the quote step, bound to the exact recipient, content, class and price. A live send returns a paperplane payment link a human approves, or uses a credit code you supplied.
Is the sandbox the real pipeline?
Yes. It runs address checks, content screening and simulated printing, and it mails nothing and charges nothing.
Do I need an API key?
No. Every order carries its own payment: a credit code, or a paperplane payment link a human approves.
Send your first letter.
The sandbox runs the whole pipeline for free and mails nothing. Live sends start at $0.99.
npx paperplane send letter.pdf \
--to "Maria Alvarez, 1 Main St, Richmond VA 23220" \
--from "Alex Rivera, 12 Grove Ave, Richmond VA 23221" \
--sandbox