Inbound Email
to Webhook

Receive emails at custom addresses and instantly forward them as structured JSON to your app. No email server required.

How It Works

Three steps. Five minutes.

1

Create an inbound address

Choose a name like support or receipts and point it at your webhook URL.

curl -X POST "https://jsonhook.com/api/addresses" \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"name": "support", "webhook_url": "https://myapp.com/hooks/email"}' # Response: { "address": "[email protected]", ... }
2

Point your MX records

Set your domain's MX record to in.jsonhook.com (or use our default domain).

3

Receive structured JSON

When an email arrives, we parse it and POST the full contents to your webhook as JSON.

// Your webhook receives: { "event": "email.received", "address": "support", "email": { "from": [{ "name": "Jane", "address": "[email protected]" }], "subject": "Help with billing", "textBody": "Hi, I need help with...", "htmlBody": "<p>Hi, I need help with...</p>", "attachments": [{ "filename": "invoice.pdf", ... }] } }

Built for Developers

Everything you need to handle inbound email

Instant Delivery

Emails are parsed and forwarded to your webhook within seconds of receipt. No polling.

📩

Full Email Parsing

HTML body, plain text, headers, attachments (base64), CC, BCC — everything extracted and structured.

🔄

Automatic Retries

Failed webhook deliveries are retried up to 5 times with exponential backoff. Never miss an email.

🔒

Webhook Signatures

Every delivery includes an HMAC-SHA256 signature so you can verify it came from JsonHook.

📋

Delivery Logs

Full audit trail of every email received and every webhook delivery attempt, status codes included.

🎯

Custom Addresses

Create named addresses like support@, receipts@, or generate random ones.

Simple Pricing

Start free. Scale when you need to.

Free

$0/mo
  • 100 emails/month
  • 1 inbound address
  • Webhook signatures
  • Automatic retries
  • 7-day log retention
Get Started

Pro

$39/mo
  • 50,000 emails/month
  • Unlimited addresses
  • Webhook signatures
  • Automatic retries
  • 90-day log retention
  • Priority support
Subscribe

API Documentation

Simple REST API to manage addresses and view logs

Authentication

All API requests require your API key via Bearer token:

curl -H "Authorization: Bearer mh_YOUR_API_KEY" \ "https://jsonhook.com/api/usage"

POST /api/register

Create a free account and get an API key.

curl -X POST "https://jsonhook.com/api/register" \ -H "Content-Type: application/json" \ -d '{"email": "[email protected]"}'

POST /api/addresses

Create a new inbound email address.

ParameterTypeDescription
namestringOptional. Custom local part (e.g. "support"). Random if omitted.
webhook_urlstringRequired. URL to POST parsed emails to.

GET /api/addresses

List all your inbound addresses.

PATCH /api/addresses/:id

Update an address's webhook URL or active status.

ParameterTypeDescription
webhook_urlstringNew webhook URL
activebooleanEnable/disable the address

DELETE /api/addresses/:id

Delete an inbound address.

GET /api/logs

View webhook delivery logs. Optionally filter by address_id.

GET /api/usage

Check current usage, limits, and plan details.

Webhook Payload

Every webhook POST includes these headers:

HeaderDescription
X-JsonHook-SignatureHMAC-SHA256 signature of the request body
X-JsonHook-DeliveryUnique delivery ID
X-JsonHook-AttemptDelivery attempt number

Verifying Signatures

// Node.js signature verification const crypto = require('crypto'); function verifySignature(body, signature, secret) { const expected = crypto .createHmac('sha256', secret) .update(body) .digest('hex'); return crypto.timingSafeEqual( Buffer.from(signature), Buffer.from(expected) ); }

Get Your Free API Key

100 emails/month. 1 inbound address. No credit card.