Maya
maya@example.com
To: support@reply.example.com
Re: Your order A-1042
Could you update the delivery address?
I've attached the details.
Thanks,
Maya
delivery-address.pdf
PDF · 18 KB
Receive email on your domain, parse it, and get it in your app as a signed webhook, threaded to the email it answers. No shared inbox, no janky script matching replies to users.
A customer replies. Your app gets the email, the sender's address, and the conversation it belongs to.
Maya
maya@example.com
To: support@reply.example.com
Could you update the delivery address?
I've attached the details.
Thanks,
Maya
delivery-address.pdf
PDF · 18 KB
POST /webhooks/samva
Example event · excerpt
{
"type": "message.received",
"data": {
"messageId": "msg_7q2xk9mvt4znw8rh",
"channel": "email",
"direction": "inbound",
"from": "maya@example.com",
"to": "support@reply.example.com",
"subject": "Re: Your order A-1042",
"conversationId": "conv_8r3ym2nkv5xpq9tw",
"hasAttachments": true,
"isAutoReply": false,
"body": "Could you update the delivery address? I've attached the details. Thanks, Maya"
}
}Verify the webhook signature before using these fields. The body contains HTML when available, otherwise text.
Enable receiving on your domain and route incoming email to your registered webhook.
Check the signature, then use messageId and conversationId to connect the reply to your app.
Fetch the email for attachment metadata and content links, or the conversation for its history.
For a domain you send from, or a subdomain like reply.yourapp.com if your team's inbox already lives on the root domain.
Each email arrives parsed as message.received, with the sender, subject, body, an attachments flag, and the conversation id. Verify the signature and dedupe on the webhook id.
Send with inReplyToMessageId. The answer stays on the same conversation in the customer's inbox and in yours.
Headers, text and HTML bodies, and attachments you can download by id.
Matched by reply headers. An email with no reply headers is matched by subject and participants. A new conversation starts when nothing matches.
Out-of-office and other automatic replies are marked, so they don't page your support queue.
Your coding agent can fetch any conversation by id through MCP or the SDK.
The webhook carries from, to, and toEmails, every address of yours the email was routed through. The message details add cc, bcc, and reply-to.
The webhook has subject and a body: the HTML when there is one, otherwise the text. The message details return signed links to the HTML, the text, and the raw MIME.
hasAttachments tells you whether to look. List them by message, with filename, content type, size, and whether each is inline, then fetch any one by id through a time-limited download link.
Message-ID, In-Reply-To, and References are parsed and returned with the message. They place the email in its conversation, and conversationId is in the webhook.
isAutoReply is in the webhook. The message details say why: out-of-office, auto-response, delivery status, or read receipt.
Samva signs the webhook. Your endpoint checks the signature, then hands the reply to whatever needs it.
| Capability | Parse webhook | Samva |
|---|---|---|
| What your app receives | Parse webhookThe email, in the shape that webhook posts | SamvaA signed message.received webhook with the sender, subject, body, and conversation id |
| Which thread it joins | Parse webhookYou match the reply | SamvaFiled on the conversation of the email it answers. Your next send stays there when you pass that conversation or message |
| How you reply | Parse webhookA separate send you thread yourself | SamvaSend with inReplyToMessageId so the answer stays in the customer's thread |
| Attachments | Parse webhookOften included in the payload | SamvahasAttachments on the webhook, then each file by id |
| Automatic replies | Parse webhookYou detect them | SamvaisAutoReply is on the webhook, with the reason on the message |
A parse webhook hands you an email. The inbound email API hands you that email with the sender's address and the conversation it belongs to.
Read next: Parse and reply · Run the inbound replies example · Receive email in Node.js · Receive email in Python · Move SendGrid Inbound Parse · Move Mailgun Routes · inbound.new alternative · Support replies · Email for an agent
It receives email on a domain you control and gives your app the parsed message. Samva delivers each one as a signed message.received webhook, with the sender's address and the conversation of the email it answers. Reply by passing that conversation, or the message it answers, on the next send.
A `message.received` webhook with the sender, the addresses it was routed through, the subject, a body, attachment and auto-reply flags, and the conversation id. The message details add the threading headers, cc and bcc, signed links to the HTML, text, and raw MIME, and each attachment.
Enable receiving on a domain and point it at an HTTPS endpoint that subscribes to `message.received`. Samva accepts the email, parses it, and POSTs it to your endpoint as a signed JSON event. Verify the signature over the raw body before you read it. The Node.js and Python guides show a working handler for each.
Receiving moves the mail records for the domain you pick. Use a subdomain if your team's email already runs on the root domain.
From the reply's headers. An email with no reply headers is matched by subject and participants. Outbound email carries the headers replies need.
Yes. The webhook says whether an email has attachments; fetch each one by id.
Not yet. You get the body as the sender wrote it, including any quoted history.
A parse webhook hands you an email. Samva hands you the email with the sender's address and the conversation id, already threaded to the email it answers.
Transactional email from the SDK, REST, CLI, or your agent through MCP. Retries are safe.
Receive on your domain, parsed and threaded to the email it answers, delivered as a signed webhook.
Versioned templates in Git. Review the diff, publish that version.
SPF and DKIM on your domain, suppression you can see, events for every send.
Campaigns go to a list of contacts from the same templates and domain.
A mailbox your agent reads and replies from, with a key that reaches only it.