Skip to Content
API ReferenceSend Email

Send Email

POST /v1/emails

Queues a transactional email from one of your verified domains. The request returns as soon as the email is validated and stored; a worker sends it moments later, respecting the platform’s provider rate limit and retrying transient failures automatically. For many emails at once, use Send Batch.

Request body

FieldTypeRequiredDescription
fromstringYesSender. Either address@domain.com or Name <address@domain.com>. The domain must be registered and verified on your account.
tostring | string[]YesRecipient(s). 1–50 addresses.
ccstring | string[]NoCC recipient(s). 1–50 addresses.
bccstring | string[]NoBCC recipient(s). 1–50 addresses.
reply_tostring | string[]NoReply-To address(es).
subjectstringYes1–998 characters.
htmlstringYes*HTML body, up to 1,000,000 characters.
textstringYes*Plain-text body, up to 1,000,000 characters.

* At least one of html or text is required; you can provide both.

Example

import { Retransmit } from "retransmit.dev"; const retransmit = new Retransmit(process.env.RETRANSMIT_API_KEY); const { data, error } = await retransmit.emails.send({ from: "Acme <hello@yourdomain.com>", to: ["user@example.com"], replyTo: "support@yourdomain.com", subject: "Your receipt", html: "<p>Thanks for your order!</p>", text: "Thanks for your order!", });

The SDK  uses camelCase field names (replyTo); the raw HTTP API uses reply_to.

Response

202 Accepted

{ "id": "em_xxxxxxxxxxxx", "status": "queued", "created_at": "2026-09-01T12:00:00.000Z" }

Keep the id — it’s how you look the email up and how webhook events reference it (emailId). The status moves from queued to sent once the worker hands it to the provider (usually within seconds), then onward as delivery events arrive. If every send retry fails, it ends up as failed with the provider error recorded — you’ll get an email.failed webhook if you subscribe to it.

Errors

StatusCodeCause
400invalid_jsonBody is not valid JSON.
422validation_errorA field failed validation; the message names the field.
403domain_not_foundThe from domain is not registered on your account.
403domain_not_verifiedThe from domain exists but is not verified yet.
401unauthorizedMissing, malformed, or revoked API key.
Last updated on