๐Ÿ“จ Outbox

Outbox#

Open source email API and dashboard. A self-hostable Resend.

Outbox implements the Resend API surface โ€” the same paths, request bodies, response shapes, and error envelope โ€” plus the dashboard that goes with it. Point any Resend SDK at your Outbox host and it works unchanged.

ts
import { Resend } from "resend"

// The only change is the base URL.
const resend = new Resend("ob_yourapikey", { baseUrl: "https://outbox.example.com" })

await resend.emails.send({
  from: "Acme <[email protected]>",
  to: ["[email protected]"],
  subject: "Hello World",
  html: "<strong>It works!</strong>",
})

What's in it#

Sending โ€” transactional email, batch send (100 per call), scheduling with natural language (in 1 hour) or ISO 8601, attachments, inline images, custom headers, tags, idempotency keys, and cancel/reschedule of queued sends.

Domains โ€” per-domain DKIM keypairs, generated SPF/DKIM/DMARC/MX/tracking records, live DNS verification, open and click tracking, custom return path, opportunistic or enforced TLS.

Audience โ€” contacts with typed custom properties, segments, topics with per-contact opt-in and opt-out, and a suppression list that bounces feed automatically.

Broadcasts โ€” fan out to a segment with per-contact personalisation, scheduling, and per-broadcast metrics including clicked links.

Templates โ€” versioned, with typed variables and fallbacks, a draft/publish workflow, duplication, and addressing by id or alias.

Automations โ€” event-triggered workflows as a step graph: conditions with branching, delays, waiting on an event, sending email, and mutating contacts.

Webhooks โ€” 19 event types, Svix-compatible signatures, delivery attempt history, and exponential-backoff retries.

Receiving โ€” an inbound SMTP server that parses MIME, stores attachments, and fires email.received.

Accounts โ€” the first account created on an instance owns it; later signups get their own team. Sessions are cookie-based and revocable.

Why it exists#

Resend is a good product with an API worth copying. Outbox exists for the cases where sending someone else's servers your customers' email is the wrong answer: air-gapped deployments, data-residency requirements, high volume where per-email pricing stops making sense, or simply wanting the thing you depend on to be inspectable.

The compatibility is the point. You should be able to develop against Resend and deploy against Outbox, or the reverse, without a rewrite.

How it differs#

Outbox is not a proxy in front of SES โ€” it delivers mail itself, so a few things necessarily differ:

ResendOutbox
API key prefixre_ob_
DNS record valuesPoint at SESPoint at your host
BillingMeteredNone โ€” it's your server
RegionsRoutedStored and returned, single region

The record set is the same shape, the API is the same, and errors use the same envelope. See Migrate from Resend for the full list.

For agents#

The docs are available as plain text: llms.txt for an index, and llms-full.txt for everything in one file. Any page also serves its raw markdown by appending .md to the URL.