Send · Inbound
Let your app read its mail.
Give your product an address. Replies, forwarded invoices and support mail arrive parsed: sender, subject, text, HTML and attachments, with authentication verdicts and a webhook as soon as they land.
01, Set up
ComingThree steps to a working address.
Receiving uses the same domains, API keys and webhooks as sending. Nothing new to learn.
- GET/emails/receiving/{id}, Live
Point an MX record at us
Add an MX record for a subdomain such as
in.nimbu.examplepointing atin.refiremail.com. A ready-made receiving address for each team, with no DNS to set up, is coming.Subscribe a webhook to
email.receivedIt fires once per message, with the sender, recipients, subject and attachment list.
Fetch the full message
GET /emails/receiving/{id}returns the text, HTML, headers, attachments and verdicts.
02, The message
What arrives.
A received email is JSON with everything a MIME parser would give you, plus the things a parser can’t know: who it was really for, and whether the sender is who they say.
| Field | What’s in it |
|---|---|
| from | The sender’s bare address. The display name stays in headers.from. |
| to · cc · bcc | Who the message was addressed to. |
| received_for | Which of your addresses actually received it, taken from the Received headers. |
| subject · text · html | The content. Images referenced by cid: are inlined as data URIs, or kept as cid references with ?html_format=cid. |
| headers | Every header of the message, including in-reply-to for threading. |
| attachments | Id, filename, content type and size of each file. Each downloads through a signed link. |
| raw | A signed link to the original message, to archive it or forward it unchanged. |
| authentication | spf, dkim and dmarc: the results of our own checks when the mail arrived. |
| message_id · created_at | For deduplicating and ordering what you receive. |
03, Verdicts
Verdicts you can trust.
SPF, DKIM and DMARC are checked when the mail reaches our servers. They are never copied from headers the sender wrote.
A forged From fails DMARC here, whatever an Authentication-Results header inside the message claims.
Use the verdicts to decide how far to trust a message before you act on it. Open a ticket for anything, but import a bill only when the supplier’s mail passes DMARC.
{
"from": "[email protected]",
"subject": "Re: Order #1043 has shipped",
"authentication": { "spf": "pass", "dkim": "pass", "dmarc": "pass" }
}{
"from": "[email protected]",
"subject": "Urgent: new bank details for payment",
"headers": {
"authentication-results": "mx.example; spf=pass; dkim=pass; dmarc=pass"
},
"authentication": { "spf": "fail", "dkim": "fail", "dmarc": "fail" }
}04, Routes
Keep it, or turn it away.
Each receiving domain can have routes by address. With none, every message is stored for your app to fetch.
Store (the default)
The message is kept for your app and announced with an email.received webhook. With no routes at all, this is what happens.
Drop
Mail for the address is refused during the SMTP conversation with a 550, so nothing is stored and no bounce message is generated.
05, Use cases
Built for the mail your product gets back.
Three jobs that usually need a mail server, a parser and a cron job. Here each is a webhook handler.
Support replies into your helpdesk
Give each ticket a plus address and file every reply in the right thread.
// [email protected] → ticket 4821 const ticketId = email.to[0].match(/\+(\d+)@/)?.[1]; await helpdesk.addReply(ticketId, { from: email.from, text: email.text });Replies that become comments
People answer a notification from their inbox, and the reply lands in the thread it answers.
// The reply's In-Reply-To names the notification you sent const thread = await threads.byMessageId(email.headers['in-reply-to']); await thread.addComment({ author: email.from, body: email.text });Supplier bills into your books
A bills@ address that files every PDF invoice it is sent.
// [email protected] → your books, one PDF at a time const pdfs = email.attachments.filter((a) => a.content_type === 'application/pdf'); for (const pdf of pdfs) await books.importBill(await download(email.id, pdf.id));
What it costs: each received email counts once on the transactional meter, the same as one you send.See pricing
Give your app an address.
Request early access. Once your account is on, add one MX record and point a webhook at your handler.