Email for your SaaS app, from one typed call.
Send password resets, receipts, invites, and alerts from your own domain. Change an email without a deploy, see what happened to every send, and get customer replies back as webhooks.
One call out, a signed event back.
A typed send call returns a message id right away. When the recipient's mail server accepts the email, Samva posts a signed message.delivered event to your webhook, and your product database updates from that signal.
POST https://api.samva.dev/v1/messages
idempotency-key: reset-4417
{ to: [{ email: "ada@example.com" }],
channel: "email",
email: { templateSlug: "plan-changed" } }
← { id: "msg_7q2xk9mvt4znw8rh", status: "pending" }POST /webhooks/samva
webhook-signature: v1,SGVsbG8...
{ type: "message.delivered",
timestamp: "2026-07-08T09:42:14Z",
data: { messageId: "msg_7q2xk9mvt4znw8rh",
channel: "email", status: "delivered" } }Product email is a stack nobody signed up to own.
A 200 that tells you nothing
The API accepts the send, and nobody hears about the bounce until a user asks where their reset link went.
Email copy in your codebase
Fixing a typo in a receipt means a pull request and a deploy.
Replies to noreply
Customers answer your receipts and alerts, and the reply goes nowhere.
Send it, change it, hear back.
One typed call, safe to retry.
One typed call from the SDK, REST, or the CLI. Send the same idempotency key and payload within 24 hours and Samva replays the first result instead of sending again.
const message = await samva.email.send({
to: "ada@example.com",
templateSlug: "plan-changed",
}, { idempotencyKey: "receipt:order-4417" });
← msg_7q2xk9mvt4znw8rh · pendingChange the email, skip the deploy.
Templates live in a Git-backed project. Publish a version, roll back, or edit it in the AI email editor, with no deploy.
template plan-changed
v4 draft edited 2h ago
v3 published pinned
v2 archived
v1 archived
send { templateSlug: "plan-changed", templateData: { plan: "Growth" } }
# the pinned version is the version that sendsEvents and replies reach your webhook.
Sent, delivered, bounced, complained, and received events reach your webhook, signed and retried, plus opens and clicks. Unsubscribes arrive as contact.unsubscribed events.
POST /webhooks/samva
webhook-signature: v1,SGVsbG8...
{ type: "message.delivered",
timestamp: "2026-07-08T09:42:14Z",
data: { messageId: "msg_7q2xk9mvt4znw8rh" } }
verify: timingSafeEqual(signature, hmacSha256(secret, body))See the pieces up close.
Questions from developers.
Can I move from Resend or SendGrid?
Yes. Verify your domain in Samva, swap your send call for the SDK, and point your webhook at Samva's events. Each compare page lists the steps. Compare pages
How do customer replies reach my app?
Turn on receiving for your domain. A reply is parsed, attached to the conversation of the email it answers, and posted to your webhook as message.received with its conversationId. Store that id to find your record.
How do I know an email arrived?
Every send has delivery events: sent, delivered, bounced, and complained, plus opens and clicks when tracking is on. They reach your webhook signed and retried, and the dashboard shows a timeline per send. Bounced and complained addresses are suppressed for you.
How does pricing work?
Free covers 3,000 emails a month. Paid plans start at $5 for 15,000. Past your plan, extra emails cost $0.50 per 1,000, up to a spend limit you set.
Send your next product email in minutes.
Create a key and send a typed call.