Email to Webhook

Turn inbound email into webhooks. Get a unique address, and every message you receive is parsed to clean JSON — sender, subject, text, HTML, headers and attachments — and delivered to your endpoint. A developer-friendly inbound email API and email parser, with no SMTP server to run.

See exactly what your endpoint receives

Pick a sample email — Webhook Relay parses it into the JSON on the right and POSTs it to your endpoint. These are real payload fields, not a mock-up.

Incoming email
From Jon Snow <[email protected]>
Subject Can't log in to my account
Hi, I've been unable to log in since this morning — it just says 'invalid credentials'. Thanks, Jon
POST to your endpoint · application/jsonX-Webhookrelay-Source: email
{
  "from": "[email protected]",
  "from_name": "Jon Snow",
  "recipient": "[email protected]",
  "to": [
    "[email protected]"
  ],
  "subject": "Can't log in to my account",
  "date": "Fri, 26 Jun 2026 11:27:41 +0400",
  "message_id": "[email protected]",
  "text": "Hi,\r\n\r\nI've been unable to log in since this morning — it just says 'invalid credentials'.\r\n\r\nThanks,\r\nJon",
  "headers": {
    "From": "Jon Snow <[email protected]>",
    "Subject": "Can't log in to my account",
    "Return-Path": "<[email protected]>"
  },
  "spf": "pass",
  "dkim": "pass",
  "dmarc": "pass"
}

Fields you can use

  • from / from_name — sender address & name
  • subject — the email subject
  • text / html — body parts
  • to / cc / recipient — recipients
  • attachments[] — name, content_type, size, base64 content
  • spf / dkim / dmarc — auth results
  • headers — every raw header

Full payload reference →

Reshape it in flight (optional)

Attach a transform function to turn the email into your own schema — or a Slack/Discord/Teams message:

const e = JSON.parse(r.body);
r.setBody(JSON.stringify({
  text: `📧 ${e.subject} — ${e.from}`
}));

Build it visually with the Slack/Discord/Teams formatter →

How email-to-webhook works

  1. Add an email input to a bucket in the dashboard. You get a unique address like <uuid>@in.webhookrelay-mail.com.
  2. Point mail at it — from a person, an app, a payment provider, an alert, a report.
  3. Webhook Relay parses each message (sender, subject, text, HTML, headers, attachments, SPF/DKIM/DMARC) and POSTs it as JSON to your endpoint.
  4. Optionally transform it first, restrict senders, fan out to several destinations, or deliver to a server behind a firewall.

What you can build

A simpler inbound-email API

If you've used SendGrid Inbound Parse, Mailgun Routes, CloudMailin or the Zapier Email Parser, this will feel familiar — but Webhook Relay gives you the parsed JSON and the full delivery pipeline in one place: transforms, fan-out to multiple destinations, delivery to localhost or private servers, retries and an audit log. No DNS or MX setup to receive on the shared in.webhookrelay-mail.com domain, and a free tier to start.

Frequently asked questions

How do I turn an email into a webhook?

Add an email input to a bucket in the Webhook Relay dashboard. You get a unique address like <uuid>@in.webhookrelay-mail.com; every message sent to it is parsed to JSON and POSTed to your endpoint. See the docs.

What does the JSON payload look like?

A flat object with from, from_name, subject, text, html, to, cc, headers, spf/dkim/dmarc and an attachments array (base64 content). See the payload reference.

Do I need to set up DNS or an MX record?

No. You receive on the shared in.webhookrelay-mail.com domain at the address you are given — nothing to configure. Just send mail to it.

Can I restrict who can email the address?

Yes. Add an allowlist of From addresses to an email input and everything else is silently dropped. You also get per-input rate limiting and SPF/DKIM/DMARC results to check. See filtering & policy.

How are attachments delivered?

Inlined into the JSON as base64 in attachments[].content, with name, content_type and size. You can drop attachments or cap their total size per message.

Is it free?

Webhook Relay has a free tier you can start on. Receiving email works the same as any other input, so it uses your normal bucket quota.