A secondary inbox built for developers
Spin up a programmable email address in seconds. Programmable Inbox receives, categorizes, and extracts every message — grab the OTP over an API, route mail with a rule, or read it in the UI. Open source and self-hostable, so your mail never leaves your infrastructure.
// 1. Create a programmable address
const inbox = await client.inboxes.create({
address: '[email protected]',
})
// 2. Your test triggers a signup email…
// 3. Grab the verification code in one call
const { code } = await client.inboxes.otp(inbox.id)
// → "418902" ✓ no polling, no regex- Address provisioned
- < 1s
- Last code, one call
- /otp
- Auto categories
- 5+
- Open source license
- MIT
What you get
The inbox layer, done once and done right
Stop rebuilding the same receive → parse → store → automate plumbing on top of a forwarder. Programmable Inbox is a real, persistent secondary inbox you address in code.
Addresses in seconds
Create real, persistent receiving addresses via API or UI — one per test, environment, service, or signup. No DNS headaches, no MX wrangling, no per-inbox onboarding.
Everything extracted
Every message is mined for the useful bits — OTP and verification codes, magic links, and CTA links — surfaced as structured fields. No regex, no parsing raw MIME on your side.
Categorized automatically
Inbound mail is classified out of the box — OTP, promotional, time-sensitive, updates, notifications — so you can filter and route on meaning, not brittle keyword matches.
Automate on arrival
Set rules that run on every message: when the subject or body matches, contains a code, or lands in a category — forward it to an address or fire a webhook. No server to stand up.
API-first, always
Every message is available over a clean REST API — anything the UI shows, you can pull. Plus convenience endpoints like /otp to grab the last verification code in a single call.
Own your data
Open source and self-hostable. Run the whole pipeline on your own infrastructure so OTPs, receipts, and PII never leave your box. No lock-in, no paywalled core features.
Use cases
What developers build with it
One programmable secondary inbox — receive, filter, extract, automate — for tests, automations, and the mail you'd rather keep out of your primary inbox.
- CI & testing
Automate 2FA & OTP signup flows
Give every test run its own address, trigger the signup, and read the verification code straight back with a single GET /otp — no mailbox scraping, no polling, no regex. End-to-end auth tests that just work in CI.
- Parse & route
Receipts, alerts & vendor mail
Point invoices, infrastructure alerts, and vendor notifications at a persistent address. Programmable Inbox categorizes each message and — via a rule — forwards it or fires a webhook so your systems stay in sync automatically.
- Secondary inbox
A clean inbox for signups & noise
Hand every service its own address and keep the promo, notification, and update noise out of your primary inbox. Everything stays queryable over the API — and self-hosted, so it's genuinely yours.
- Also for agents
A mailbox your AI agent can operate
Because it's API-first, the same inbox doubles as an agent's mailbox — created programmatically, read and replied to over REST. Not our headline, but it works: agents get threading, categories, and extracted codes for free.
REST API
Every message, one API call away
Everything the UI shows is available over a documented REST API — with the codes and links already extracted, and convenience endpoints like /otp for the exact thing you came for.
POST /api/v1/emailInbox
Authorization: Bearer YOUR_API_KEY
{
"name": "CI signup",
"address": "[email protected]",
"organizationId": "org_abc123"
}
// Response
{
"data": {
"id": "inbox_xyz789",
"address": "[email protected]",
"createdAt": "2026-07-13T12:00:00Z"
}
}GET /api/v1/emailInbox/inbox_xyz789/otp
Authorization: Bearer YOUR_API_KEY
// Response — the latest verification code,
// extracted from the most recent message.
{
"data": {
"code": "418902",
"messageId": "msg_002",
"receivedAt": "2026-07-13T12:00:42Z"
}
}
// One call. No polling, no regex.GET /api/v1/emailInbox/inbox_xyz789/messages
?page=1&limit=20&grouped=true
Authorization: Bearer YOUR_API_KEY
// Response — codes & links already extracted
{
"data": [
{
"id": "msg_002",
"subject": "Your verification code",
"from": "[email protected]",
"category": "otp",
"codes": ["418902"],
"links": ["https://example.com/verify?t=…"],
"receivedAt": "2026-07-13T12:00:42Z"
}
]
}// A rule that runs on every received message
{
"name": "Route receipts to accounting",
"when": {
"category": "notifications",
"from_contains": "receipts@"
},
"then": [
{ "forward": "[email protected]" },
{ "webhook": "https://your-app.com/ingest" }
]
}
// Conditions: contains · has code · category
// Actions: forward · fire webhookWhy us
Not a forwarder. A real inbox.
The big providers are built to send — inbound is a stateless forwarder that POSTs your mail once and forgets it. Programmable Inbox keeps, categorizes, extracts, and lets you query and automate every message. And you can self-host the whole thing.
| Capability | Programmable Inbox | Postmark | SendGrid | Mailosaur |
|---|---|---|---|---|
| Receive-first (inbound is the product) | ||||
| Persistent, queryable inbox (not a 3-day buffer) | ||||
| Auto-categorization (OTP, promo, updates…) | ||||
| OTP / code / link extraction | ||||
| /otp ‘last code’ endpoint | ||||
| Automations: forward + webhook | ||||
| Self-hosted / open source | ||||
| Managed SaaS option |
Open source forever
Your infra, your rules
We will always maintain a fully open source, self-hosted version of Programmable Inbox for the community. No lock-in. No paywalled features. No surprises.
Self-hosted
Deploy on your own infrastructure — Postgres, Next.js, and an inbound email pipe is all you need. Your OTPs, receipts, and PII never leave your box. Full source on GitHub under an MIT license — fork it, extend it, own it.
- MIT licensed, forever
- No feature gating
- Bring your own domain
- Community support on GitHub
Managed SaaS
Skip the ops. We'll handle uptime, backups, and scaling while you focus on your product. Every feature from the open source version, plus managed deliverability and priority support.
- Zero-ops deployment
- Managed uptime & backups
- Priority support
- Usage-based pricing
Community first. The self-hosted version will always be free, feature-complete, and actively maintained. That's a promise, not a pricing tier.
Pricing
Simple, honest pricing
Open source is free forever. SaaS pricing will be usage-based with a generous free tier.
Open Source
Self-host on your own infrastructure. Everything you need, nothing you don't.
- Unlimited addresses & messages
- OTP / code / link extraction
- Auto-categorization
- Automations: forward + webhook
- Full REST API + /otp endpoint
- MIT license, self-hosted
- Community support
SaaS
We run it. You build with it. All the power, none of the ops.
- Everything in Open Source
- Zero-ops managed hosting
- AI-powered extraction & automations
- Extended retention & higher volume
- Managed shared domain, quick start
- Uptime SLA & priority support
- Usage-based pricing
Spin up your secondary inbox
Create a programmable address, grab your first OTP, and wire up a rule in minutes. Self-host for free, or join the waitlist for managed cloud — either way, you own your data.
No credit card required · MIT license · Community supported