Receive emails at custom addresses and instantly forward them as structured JSON to your app. No email server required.
Three steps. Five minutes.
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]", ... }
Set your domain's MX record to in.jsonhook.com (or use our default domain).
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", ... }]
}
}
Everything you need to handle inbound email
Emails are parsed and forwarded to your webhook within seconds of receipt. No polling.
HTML body, plain text, headers, attachments (base64), CC, BCC — everything extracted and structured.
Failed webhook deliveries are retried up to 5 times with exponential backoff. Never miss an email.
Every delivery includes an HMAC-SHA256 signature so you can verify it came from JsonHook.
Full audit trail of every email received and every webhook delivery attempt, status codes included.
Create named addresses like support@, receipts@, or generate random ones.
Start free. Scale when you need to.
Simple REST API to manage addresses and view logs
All API requests require your API key via Bearer token:
curl -H "Authorization: Bearer mh_YOUR_API_KEY" \
"https://jsonhook.com/api/usage"
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]"}'
Create a new inbound email address.
| Parameter | Type | Description |
|---|---|---|
name | string | Optional. Custom local part (e.g. "support"). Random if omitted. |
webhook_url | string | Required. URL to POST parsed emails to. |
List all your inbound addresses.
Update an address's webhook URL or active status.
| Parameter | Type | Description |
|---|---|---|
webhook_url | string | New webhook URL |
active | boolean | Enable/disable the address |
Delete an inbound address.
View webhook delivery logs. Optionally filter by address_id.
Check current usage, limits, and plan details.
Every webhook POST includes these headers:
| Header | Description |
|---|---|
X-JsonHook-Signature | HMAC-SHA256 signature of the request body |
X-JsonHook-Delivery | Unique delivery ID |
X-JsonHook-Attempt | Delivery attempt number |
// 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)
);
}
100 emails/month. 1 inbound address. No credit card.