The two‑wayemail API
Send receipts, password resets and notifications from your own domain, and read the replies back through the same API. Templates are edited in the dashboard, not in the codebase.
import { Faivelo } from 'faivelo'
const faivelo = new Faivelo(API_KEY)
await faivelo.emails.send({
from: 'receipts@acme.com',
to: 'anna@kellerpaper.com',
templateAlias: 'receipt',
variables: { firstName: 'Anna', … }
})- Events
- requestaccepted09:12:04.118
- email.sentto kellerpaper.com09:12:04.611
- email.delivered250 OK09:12:05.402
- webhookapi.acme.com 20009:12:05.647
Waiting for the email
Acme Supply09:12
Your order is confirmed
Thanks for your order, Anna
Here's what's on the way. We'll email tracking as soon as it ships.
Acme Supply, 400 Market St, Portland
Templates that ship with your account
Dozens of transactional emails, each designed for the message it carries. Pick one in the dashboard, change the words, and reference it by alias from your code.
Every reply comes back as a webhook
Every address you send from is a real mailbox on your domain. When a customer answers a receipt, the reply lands there and a message.received webhook is POSTed to your endpoint, with the thread id, so your code can read the whole conversation.
- A webhook for every replymessage.received
- message.received fires with the sender, subject, snippet and attachments, signed with your endpoint secret.
- Read the thread from your codeGET /messages/{id}
- List messages, fetch one in full, or pull the conversation by thread id. The same endpoints work for search, folders and attachments.
- Or let an agent handle itget_thread
- The MCP server exposes the same mailbox to Claude and to your own agents, with read_message and get_thread among thirty tools.
Anna Keller09:41
Re: Thanks for your order, Anna · Could you ship the tote to the studio address instead? 12 Alder Street, second floor. Thanks!
{ "type": "message.received", "data": { "mailbox": "receipts@acme.com", "from": { "address": "anna@kellerpaper.com" }, "subject": "Re: Thanks for your order, Anna", "snippet": "Could you ship the tote to the studio…", "thread_id": "th_01j8x4kq…", "message_id": "msg_01j8x4kr…" } }
Signed with your endpoint secret. Retried if your server is down.
Delivery logs and webhooks
Every email has an id, a status and an event history. Read it from the API or the dashboard, or receive events by webhook.
anna@kellerpaper.com
receipt
email.sent09:12:04.118
Accepted for delivery.
email.delivered09:12:05.402
Accepted by the receiving server. 250 OK.
webhook09:12:05.647
Posted to api.acme.com, answered 200.
| Id | To | Template | Status | Sent |
|---|---|---|---|---|
| cmf2k7q1x0003l9a1tz8 | anna@kellerpaper.com | receipt | delivered | 09:12:04 |
| cmf2k7pzt0002l9a1m4q | ben.wright@northline.io | password-reset | delivered | 09:11:58 |
| cmf2k7pw10001l9a1c7e | billing@ostermann.de | invoice | bounced | 09:11:41 |
| cmf2k7pt80000l9a1v2k | tom@beckerprint.com | welcome | sent | 09:11:36 |
What the API handles for you
Validation, idempotency, signed webhooks, attachments and suppression, handled on every send.
Strict template rendering
If a required variable is missing, the request fails with 422 and names the field. Nothing is sent.
422 UnprocessableIdempotency keys
Send the same Idempotency-Key twice and only one email goes out. The second request returns the first response.
Idempotency-KeySigned webhooks
Delivered, bounced and complained events are posted to your endpoint with an HMAC-SHA256 signature and timestamp.
HMAC-SHA256Attachments
Up to 10 files and 10 MB per email, as base64 over REST or a Buffer in the SDK.
10 files, 10 MBMultiple recipients
to, cc and bcc accept a single address or an array of up to 50. The from address is any address on a verified domain.
to, cc, bccSuppression list
Addresses that hard-bounced or reported spam are removed from the recipient list automatically.
automatic
Three ways to build the email
Send the HTML from your code, build the whole thing in the editor, or design the frame in the editor and pass the message from your code. Switch between them to see who owns which part.
Thanks for reaching out, Anna
We received your message on 16 September and someone from the Northwind team will get back to you within one business day. Here is a copy of what you sent us.
Your message
Subject: Bulk order for canvas totes
Quantity: 250
Message: Do you print custom logos on the canvas totes, and what is the lead time for 250?
You are receiving this because you filled in the contact form at northwind.com.
Northwind Supply Co., 400 Market Street, Portland, OR 97201
A hybrid of the two
Design any part of the email in the editor and pass the rest as HTML from your code. Here the header, button and footer are designed and the message comes from code, but the split is yours: one block or most of the email, anywhere in the layout, in any order.
- HTML from your code
- Designed in the editor
Deliverability from your own domain
Your domain's own records, written and checked for you. Nothing to warm up.
- SPF Verified
- DKIM Verified
- DMARC Verified
See what happened after you sent
Every send counted, per day and per template.
4,790
emails delivered in the last 14 days
19 bounced and 3 complaints, each with its event history.
Included in every plan
Transactional email comes with the plan that already covers your mailboxes and domain. There is no per-email pricing.
Starter
3,000
emails a month
$6/mo
10 recipients a minute
Growth
20,000
emails a month
$12/mo
60 recipients a minute
Pro
50,000
emails a month
$24/mo
120 recipients a minute
Business
100,000
emails a month
$49/mo
240 recipients a minute
Start sending from your domain
Included on every paid plan, from $6 a month.