Ship emails as events

Email, meet the
REST API โ€”
no inbox required.

Forward email to a REST endpoint you control. Skip the IMAP polling loops and MIME parsing โ€” treat every message as a structured event and write business logic instead. Your data stays yours: we don't keep your mail.

inbound.log ยท live
incoming email
From: support@acme.io
To:ย ย orders@your.email-webhook.com
Subject: Order #A-2841 confirmed
โ†“ POST /api/inbound
your endpoint receives
{
  "from": "support@acme.io",
  "to": "orders@your...",
  "subject": "Order #A-2841",
  "body": "Your order has...",
  "attachments": [{
    "filename": "receipt.pdf",
    "content": "JVBERi0xLjQ..."
  }]
}

Three steps from inbox to endpoint.

Zero infrastructure. No IMAP polling loops, no MIME parsing quirks, no bounced deliverability headaches.

step_01

Get your address

Sign up and receive a dedicated email address like you@email-webhook.com. Forward mail there and it flows into the pipeline.

โ†’ you@email-webhook.com
step_02

Create a webhook

Point it at any URL. Choose the HTTP method, add custom headers for auth, and optionally filter by sender address. Route as many as you need.

POST --from "*@acme.io"
step_03

Handle the request

We deliver a JSON payload the moment your mail arrives: subject, sender, body, attachments and all. Respond 200 and get back to building.

res.sendStatus(200)

Built the way you'd build it yourself.

Every detail a senior engineer would demand โ€” observability, reliability, security โ€” handled from day one.

{ }

Structured JSON

Sender, recipient, subject, body, and base64-encoded attachments โ€” delivered as clean JSON ready to consume.

โ‡ข

Any HTTP verb

POST is the sensible default, but PUT, PATCH, or DELETE work too. GET with query params is supported for lightweight endpoints.

โކ

Custom headers

Attach API keys, bearer tokens, or anything else your endpoint expects. Set per-webhook, override the defaults we send.

โŒ•

Request IDs

Every request carries an X-email-webhook-Id header โ€” trace any message end-to-end while debugging.

โŸ

Filter by sender

Pin a webhook to mail from a specific address, or leave it open as a catch-all. Run multiple webhooks in parallel.

โˆ…

We don't keep your mail

Message bodies and attachments are never stored. Headers only, for 7 days, then irreversibly deleted.

Drop it in, ship by lunch.

No SDKs to install, no quotas to negotiate, no client library to keep in sync. Just an HTTP POST to whatever you already have running in production.

  • Works withExpressFastAPISinatraand anything that speaks HTTP
  • Authenticate using your own custom headers
  • Parse the JSON, decode the attachments, respond 200 โ€” done
server.ts
main.py
handler.rb
import express from "express";

const app = express();

app.post("/inbound", express.json(), (req, res) => {
  // auth using a header you configured on the webhook
  if (req.headers["x-api-key"] !== process.env.SECRET) {
    return res.sendStatus(401);
  }

  const { from, subject, body, attachments } = req.body;

  // parsed email is ready to use. ship it.
  createTicket({ from, subject, text: body });

  for (const file of attachments) {
    saveFile(file.filename, Buffer.from(file.content, "base64"));
  }

  res.sendStatus(200);
});

We don't keep your mail.

Email carries sensitive things: contracts, invoices, reset links, customer records. We're built around a simple stance โ€” the less we store, the less there is to breach, subpoena, or leak. Message bodies and attachments pass through our pipeline and disappear.

Headers stick around for 7 days so you can debug from the dashboard, then they're irreversibly deleted. We don't sell data, we don't run marketing trackers, and we don't log the responses from your endpoint beyond the status code.

Message body retainednever
Attachments retainednever
Webhook response body storednever
Email headers kept for7 days, then deleted
Data sold or rentednever
Marketing / ad trackersnever
// read the full privacy policy

Priced for side projects and serious ones.

Start free, scale when you need to. No credit card required, no surprise charges, cancel from the dashboard.

Free
$0
forever / self-serve
  • 1 webhook rule
  • 100 invocations / month
  • Logs & monitoring
  • Community support
Start building
Enterprise
$25/mo
billed monthly
  • Unlimited rules
  • 10,000 invocations / month
  • Logs & monitoring
  • Priority support
Go Enterprise

Questions, answered.

What exactly does email-webhook do?

We give you a dedicated email address. Any message sent to it gets forwarded as an HTTP request to a URL you control โ€” with the sender, subject, body, and attachments in a structured JSON payload. You handle the request like any other API call.

Can I authenticate my webhook?

Yes โ€” when you create a webhook, you can attach custom headers that travel with every request. The typical pattern is an X-API-Key or Authorization: Bearer ... header that your endpoint checks before trusting the payload.

Can I route different senders to different endpoints?

Yes. Create a separate webhook for each sender address you care about, plus a catch-all for everything else. Each webhook can point to its own URL with its own method and headers.

How are attachments delivered?

Inline in the JSON body as base64-encoded strings, each with its original filename. Decode with Buffer.from(content, "base64") in Node, base64.b64decode in Python, or the equivalent in your language.

What HTTP methods do you support?

POST is the default, but PUT, PATCH, and DELETE work equally well. If you need something simpler, a GET with query parameters is also supported โ€” though you'll lose attachment support.

How do I trace a specific message?

Every request we send carries an X-email-webhook-Id header with a unique ID. Log it on your side and you can correlate any request back to the original email.

Have a question?

Want to get in touch? We'd love to hear from you.

Stop parsing IMAP. Start shipping features.

Free forever plan. No credit card. Be receiving webhooks in four minutes.