Inbound Email API

Turn incoming email into webhooks

Point an MX record at Postscale. Every message arrives at your app as a signed JSON webhook — headers, body, attachments, and sender metadata all parsed and ready.

Parsed JSON payload

Headers, plain-text body, HTML body, and every attachment delivered as structured fields. No MIME parsing on your end.

Attachments to S3

Files over 1 MB are streamed to S3-compatible storage with a pre-signed URL in the webhook payload. No base64 bloat.

Catch-all or per-address

Route every @yourdomain.com address to one endpoint, or define patterns like support-+ticket@… for routing inside your app.

HMAC-signed webhooks

Every delivery is signed with HMAC-SHA256. Verify authenticity in one line. Retries with exponential backoff for 4 attempts.

Reply detection

Built-in In-Reply-To / References threading. Know which outbound message a reply belongs to without writing your own heuristics.

EU-hosted MX

Your inbound MX record points at EU infrastructure. Traffic never leaves the jurisdiction. GDPR processor agreement included.

Webhook payload your endpoint receives
{
  "id": "in_01HY...",
  "to": "support@yourapp.com",
  "from": "customer@example.com",
  "subject": "Password reset not working",
  "text_body": "Hi, I'm trying to reset my password...",
  "html_body": "<p>Hi, I'm trying to reset my password...</p>",
  "in_reply_to": "msg_01HY...",
  "attachments": [
    {
      "filename": "screenshot.png",
      "content_type": "image/png",
      "size_bytes": 128432,
      "url": "https://storage.postscale.io/att/...?sig=..."
    }
  ],
  "received_at": "2026-04-16T11:22:00Z"
}

Frequently asked questions

How do I point my domain at Postscale?

Add an MX record pointing at mx.postscale.io with priority 10. We verify ownership via a TXT record. The full setup is four DNS records and takes about five minutes.

What happens to attachments?

Small attachments (≤ 1 MB) are embedded in the webhook payload as base64. Larger ones are uploaded to your configured S3 bucket (or ours) and delivered as pre-signed URLs valid for 24 hours.

Can I filter inbound messages?

Yes. Define rules per domain: block senders, reject by subject pattern, auto-respond, or route to different endpoints. Rules run before the webhook fires.

What's the pricing model?

Pay per processed message. Free tier includes 1,000 inbound/month. See /pricing for paid tiers.

Ready to build?

Free tier includes everything you need to evaluate. No credit card required.

Create a free account