PostalForm Projects
Provision postal mail like cloud infrastructure. Upload a PDF and PostalForm prints it close to its destination, tracks the piece, and streams signed webhooks back to your app — one workspace for developers and their agents.
Cost and tracking fit select the highlighted standard-letter path.
Express handling changes the decision from cheapest tracked mail to the speed-first route.
High page count skips the small-letter path and uses the fallback built for larger packets.
The control plane for developers and agents that need to print, mail, and observe documents.
PostalForm Projects gives every app or Stripe Project its own workspace, keys, test credits, live credits, webhook endpoints, and mail timelines. Agents can provision it, humans can govern it, and both can see what happened.
Four calls from PDF to mailbox.
Upload a document, quote it, send it, and listen for signed webhooks. Test mode runs the whole flow against simulated fulfillment — free, with no credit card.
- Idempotency keys make retries safe — duplicate physical mail is impossible.
- Quotes are final prices, locked before you commit an order.
- Every status change arrives as a signed webhook with automatic retries.
export POSTALFORM_API_KEY="pf_test_..."
BASE="https://projects.postalform.com/api/v1"
curl -s "$BASE/letters/quotes" \
-H "Authorization: Bearer $POSTALFORM_API_KEY" \
-d '{"document_id":"doc_8f21c4","certified":true}'
# -> {"quote_id":"quote_a92d1b","price_cents":1020,...}
curl -s "$BASE/letters" \
-H "Authorization: Bearer $POSTALFORM_API_KEY" \
-H "Idempotency-Key: invoice-1042" \
-d '{"quote_id":"quote_a92d1b","recipient":{"name":"Ada Lovelace","line1":"1 Analytical Way","city":"San Francisco","state":"CA","postal_code":"94105"}}'
# -> {"id":"ord_c99ef3","status":"queued","mode":"test"}
const base = 'https://projects.postalform.com/api/v1'
const headers = {
'Authorization': 'Bearer ' + process.env.POSTALFORM_TEST_API_KEY,
'Content-Type': 'application/json',
}
const quote = await fetch(base + '/letters/quotes', {
method: 'POST', headers,
body: JSON.stringify({ document_id: doc.id, certified: true }),
}).then((res) => res.json())
const letter = await fetch(base + '/letters', {
method: 'POST',
headers: { ...headers, 'Idempotency-Key': 'invoice-1042' },
body: JSON.stringify({ quote_id: quote.quote_id, recipient }),
}).then((res) => res.json())
// letter.status -> 'queued', then webhooks take over
import os, requests
base = "https://projects.postalform.com/api/v1"
auth = {"Authorization": "Bearer " + os.environ["POSTALFORM_TEST_API_KEY"]}
quote = requests.post(base + "/letters/quotes", headers=auth,
json={"document_id": doc_id, "certified": True}).json()
letter = requests.post(base + "/letters",
headers={**auth, "Idempotency-Key": "invoice-1042"},
json={"quote_id": quote["quote_id"], "recipient": recipient}).json()
# letter["status"] -> "queued", then webhooks take over
- queuedorder accepted by the API
- document_preparedPDF normalized for print
- submittedhanded to fulfillment
- in_transitcarrier scan received
- deliveredfinal scan at the mailbox
postalform.letter.delivered · PostalForm-Signature: t=…,v1=…
These are exactly the states and webhooks your integration receives — test mode simulates fulfillment end to end.
The unglamorous parts are already done.
Free test mode
pf_test_ keys run uploads, quotes, sends, and webhooks against simulated fulfillment. No card required.
Signed webhooks
Every status change ships with a Stripe-style PostalForm-Signature header, retries, and replay.
Idempotent by default
Order creation requires an Idempotency-Key, so network retries can never print duplicate mail.
Proof mail built in
USPS Certified Mail, Canada Post Registered Mail, and European registered options with return receipt where eligible.
11 destination countries
The U.S. and Canada plus nine destinations from Austria to India, with route-aware pricing per piece.
Prepaid credits
Live mail spends a balance you control. Top up, set auto-refill, and read the ledger by API.
One mail API for documents, postcards, proof mail, and tracking.
PostalForm evaluates each mailpiece against destination, speed, proof-mail, postcard, and document-size requirements, then routes it to a print-and-mail facility as close to the destination as those options allow. Your app gets reliability, delivery visibility, and destination-aware performance without juggling multiple mailing APIs.
Built on the same mail-routing intelligence that powers PostalForm.com.
A full workspace from one terminal command.
stripe projects add postalform/mail instantly provisions a free test workspace — or a paid live one — and syncs its keys into your project. No signup form, no dashboard round-trip. Direct signup is always there when you prefer it.
$ stripe projects add postalform/mail
created workspace pfws_...
synced POSTALFORM_TEST_API_KEY
synced POSTALFORM_WEBHOOK_SECRET
$ pf-projects test e2e --pdf sample.pdf
uploaded document
quoted mailpiece
queued mail job
received signed webhook
Agents can provision, pay, and mail — end to end.
Everything a developer can do here, an agent can do too: create a workspace through Stripe Projects, read the whole API from one context file, and settle live mail with a scoped payment token. Humans govern all of it from the same dashboard.
One CLI command creates a free or paid workspace and syncs keys into the project’s secret store — no signup flow.
stripe projects add postalform/mail
A single GET serves a compact summary of provisioning and the mail API, written for LLM tool use.
GET /llm-context.txt
Stripe SPT contracts carry a currency, ceiling, and expiry — an agent’s mailing budget is bounded by design.
payment_credentials.type=stripe_payment_token
PostalForm was a launch service for Stripe’s Machine Payments Protocol — agents have paid it to send mail since day one.
postalform/mail · MPP launch, March 2026
Provision
Stripe Projects, the mock CLI, or direct signup creates a workspace, test key, claim path, and local env values.
Observe
Every document, quote, order, timeline event, tracking update, and webhook attempt is visible from the dashboard.
Scale
Live credits, auto-refill, key rotation, and fulfillment controls let mailing become a building block instead of an ops queue.
Quotes are final prices. No subscriptions, no minimums — prepaid credits only.
Open the pricing calculatorAnswers before you ask.
Anything else? Write to support@postalform.com — a human reads every message.
Is test mode really free?
Yes. Test keys (pf_test_…) run the entire flow — PDF uploads, quotes, orders, status timelines, and signed webhooks — against simulated fulfillment. There is no charge and no time limit.
Do I need a credit card to start?
No. You only add prepaid credits when you are ready to send real mail, and top-ups are the only charge that ever happens before a mailpiece is accepted for fulfillment.
Which countries can you deliver to?
The United States and Canada, plus Austria, Belgium, France, Germany, India, Luxembourg, the Netherlands, Switzerland, and the United Kingdom — with route-aware pricing and per-destination options like registered mail.
Who physically prints and mails the letters?
PostalForm routes every mailpiece across vetted commercial print-and-mail facilities and national postal carriers, selecting a production path as close to the destination as the selected options allow. You integrate one API and one webhook format; PostalForm operates the fulfillment network.
How do I know when something is delivered?
Every fulfillment status change — accepted, in transit, delivered, returned — is sent to your HTTPS endpoint as a webhook signed with a PostalForm-Signature header, with automatic retries. Carrier tracking numbers are attached where available.
How is this different from PostalForm.com?
PostalForm.com is the one-off mailing workflow — for people, and for agents mailing on their behalf as the first service to implement Stripe’s Machine Payments Protocol. PostalForm Projects is the developer platform on the same fulfillment infrastructure and routing intelligence: workspaces, API keys, free test mode, prepaid credits, and signed webhooks for building mail into your own product.
Your first letter is five minutes away.
Test mode is free and simulated end to end — or provision straight from your Stripe project:
stripe projects add postalform/mail