# Send email in one typed call.

URL: https://samva.dev/features/transactional-email

Transactional email API

Password resets, receipts, invites, and alerts go out from your domain with one call. Every send comes back as events you can act on, so a missing login link is something you see, not something a user reports.

[Start sending free](https://samva.dev/signup?entry=marketing_page)

[Read the send docs](https://samva.dev/docs/channels/email/send-an-email)

A POST to /v1/messages returns 201 Created with a message id. The message moves from queued to sent to delivered.

A 200 from the API only means the request was accepted. What your user needs is the email in their inbox, and what you need is to know when it didn't get there.

## Send, retry, schedule, and hear back.

TypeScript example in send.ts:
import { createClient } from "samva";

const samva = createClient({ apiKey: process.env.SAMVA_API_KEY! });

const message = await samva.email.send(
  {
    to: "ada@example.com",
    subject: "Reset your password",
    html: "<p>Use this link to choose a new password.</p>",
    text: "Use this link to choose a new password.",
  },
  { idempotencyKey: "password-reset-4417" },
);

Comparing providers? [Read the transactional email API checklist](https://samva.dev/guides/transactional-email-api).

1. **Call send.** From the TypeScript SDK (async/await or Effect), REST, the CLI, or hosted MCP. Other languages use the public OpenAPI document.
2. **Retry without doubles.** Send an idempotency key. A retried request inside 24 hours returns the first result.
3. **Schedule it if it can wait.** Set a send time. Cancel or resume it before it goes.
4. **Hear what happened.** Sent, delivered, bounced, complained, and failed events reach your webhook, signed and retried up to 8 times. Opens and clicks on tracked sends do too.
5. One typed call
6. 24-hour idempotency
7. Signed events with 8 retries
8. OpenAPI 3.1 at /v1/openapi.json

Read next: [Send email with Node.js](https://samva.dev/guides/send-email-nodejs) · [Send email with Python](https://samva.dev/guides/send-email-python) · [Replace Amazon SES](https://samva.dev/guides/replace-amazon-ses) · [Samva vs Amazon SES](https://samva.dev/compare/amazon-ses) · [Changelog](https://samva.dev/changelog)

## Common questions.

### What counts as transactional email?

Email a person triggers or expects: sign-in links, password resets, receipts, invites, and alerts. Samva also sends announcements to a list through campaigns.

### Which languages can I use?

The TypeScript SDK, plain REST from any language, or a client generated from the OpenAPI document.

### What happens if my request times out and I retry?

Use an idempotency key. Samva returns the original result for 24 hours instead of sending a second email.

### How do I know an email arrived?

Subscribe to delivery webhooks. Each event is signed so you can verify it came from Samva.

## The rest of the email API.

- [Send email in one typed call](https://samva.dev/features/transactional-email): Transactional email from the SDK, REST, CLI, or your agent through MCP. Retries are safe.
- [Replies land in your app](https://samva.dev/features/inbound-email): Receive on your domain, parsed and threaded to the email it answers, delivered as a signed webhook.
- [Change the email without a deploy](https://samva.dev/features/templates): Versioned templates in Git. Review the diff, publish that version.
- [Know why an email did or didn't land](https://samva.dev/features/deliverability): SPF and DKIM on your domain, suppression you can see, events for every send.
- [Send the announcement too](https://samva.dev/features/campaigns): Campaigns go to a list of contacts from the same templates and domain.
- [An inbox for your AI agent](https://samva.dev/features/mailboxes): A mailbox your agent reads and replies from, with a key that reaches only it.

## Send your first email in minutes.

[Start sending free](https://samva.dev/signup?entry=marketing_page)
