inbound receives email on your domain, sends each message to your application as JSON, and lets you reply in the same thread through one REST API. Sending, receiving and replies share one account, one API key and one set of domains.
A customer writes to support@yourdomain.com. inbound receives the message, parses it, and POSTs it to your webhook with the sender, subject, text and HTML bodies, attachments with download links, and a thread ID.
Your application decides what to do: open a ticket, run an agent, or store the message. When you are ready to answer, you reply by email ID or thread ID. inbound sets the In-Reply-To and References headers so the reply lands in the customer's existing conversation.
const { email } = await request.json();
await fetch(`https://inbound.new/api/e2/emails/${email.id}/reply`, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.INBOUND_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": `ack-${email.id}`,
},
body: JSON.stringify({
from: "support@yourdomain.com",
text: "Thanks, we have your request and will follow up shortly.",
}),
});Setup takes a few API calls or a few clicks in the dashboard. You can use a subdomain such as mail.yourdomain.com if your main domain already receives mail elsewhere.
Each received message arrives as one JSON POST with the event email.received. The payload includes parsed fields, the raw MIME source, sanitized HTML, thread information and authenticated attachment download URLs. The email parsing API page lists every field.
These are the operational details worth knowing before you commit. Plans start at $9/month and include both sending and receiving volume; see the pricing page for current plans.
Receiving email usually takes one of three shapes. Pick the one that matches who owns the address and where the conversation lives.
If you already send through another provider and only need email converted to HTTP, a receive-focused service such as CloudMailin can be a reasonable fit. inbound is most useful when you want receiving, sending and threaded replies in one place.
Email to webhook is one part of it. inbound turns each received message into a JSON webhook, and also stores the message, groups it into threads and lets you reply through the API. If you only need the webhook, you can ignore the rest.
Webhooks are the main delivery method, but you can also poll. GET /api/e2/emails with type=received lists received messages, and GET /api/e2/mail/threads lists conversations. IMAP access is available as well. An address with no endpoint still stores its mail.
Yes. Each attachment in the webhook payload includes its filename, content type, size and a downloadUrl. You download the file from that URL with your API key. You can also attach files when sending or replying, up to 25 MB per file and 40 MB per email.
Yes, receiving always uses a domain you own, or a subdomain of it. You add MX and verification records, and a subdomain inherits verification from a verified parent domain.
The delivery is recorded as failed with the response code or error. inbound does not retry it automatically. Once your endpoint is healthy, retry the delivery from the dashboard or with POST /api/e2/emails/:id/retry.
Add a domain, point an address at your webhook, and get structured JSON for every message.
Get started