Set a rule. Your inbox does the rest.
Every message that lands is parsed, categorized, and extracted automatically — search for the text that matters, then forward it or fire a webhook. Open source and self-hostable, so your mail never leaves your infrastructure.
No credit card required · AGPL v3 license · Community supported
// 1. Create a programmable address
const inbox = await api.createEmailInbox({
createEmailInboxRequest: {
email: '[email protected]',
name: 'Signup flow',
},
})
// 2. Mail arrives. We parse it before you ever see it.
// 3. Query it as structured data — not raw MIME
const [message] = await api.getEmailInboxMessages({ id: inbox.id, limit: 1 })
console.log(message)
// {
// subject: 'Your verification code',
// from: '[email protected]',
// categories: ['otp'],
// extractedOtp: '418902',
// extractedLinks: [],
// }
// → parsed, tagged, extracted. No MIME parsing. No regex.
// 4. Or skip the API — set a rule to act on arrival
{
"when": { "contains": "invoice", "category": "notifications" },
"then": [{ "webhook": "https://your-app.com/ingest" }]
}
// → searched, filtered, and routed. No server to run.- Address provisioned
- < 1s
- Last code, one call
- /otp
- Auto categories
- 5+
- Open source license
- AGPL v3
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
Turn alert emails into webhooks
Built for legacy services that only speak email. Programmable Inbox categorizes every alert automatically, lets you search the subject and body for the keywords that matter, and routes matches straight to a webhook — turning notification-only email into automation your systems can act on.
- Secondary inbox
A clean inbox for signups & noise
Point your signups and subscriptions at one address and keep the promo, notification, and update noise out of your primary inbox. Everything is categorized and queryable over the API — self-host it for full control, or run it on our managed cloud.
- Agent builders
An MCP server for your agents
Give any agent its own mailbox over MCP — create addresses, read and reply to mail, and pull extracted codes and links, all through tool calls instead of custom email plumbing. Grab an API key and connect it to any MCP-compatible framework in minutes.
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.
import { Configuration, EmailInboxesApi } from '@programmableinbox/sdk'
const config = new Configuration({ accessToken: 'sk_live_...' })
const api = new EmailInboxesApi(config)
const inbox = await api.createEmailInbox({
createEmailInboxRequest: {
email: '[email protected]',
name: 'CI signup',
},
})
console.log(inbox.data)
// {
// id: 'inbox-1',
// organizationId: 'org-1',
// email: '[email protected]',
// name: 'CI signup',
// createdAt: '2026-07-13T12:00:00Z',
// updatedAt: '2026-07-13T12:00:00Z'
// }const otp = await api.getEmailInboxOtp({
id: inbox.data.id,
withinMinutes: 10, // defaults to 15 — a stale code fails silently wherever it's used
})
console.log(otp.data.otp)
// "418902" ✓ no polling, no regexconst page = await api.getEmailInboxMessages({
id: inbox.data.id,
limit: 25,
q: 'verification code',
tags: ['signup'],
})
console.log(page.data.messages[0])
// {
// id: 'msg-1',
// subject: 'Your verification code',
// from: '[email protected]',
// categories: ['otp'],
// extractedOtp: '418902',
// createdAt: '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 AGPL v3 license — fork it, extend it, own it.
- AGPL v3 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.
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 sign up for managed cloud — either way, you own your data.
No credit card required · AGPL v3 license · Community supported