Skip to main content
POST
Send Email
Send an email using a saved template (by slug) or custom content. The endpoint defaults to transactional delivery. Use emailType: "marketing" for consented lifecycle or promotional messages that need unsubscribe handling. Use emailType to select delivery policy and trackingSettings to opt out of open or click tracking for one send. isMarketing is not a request field.
A successful response means the email was accepted for background processing. Transactional emails bypass subscriber unsubscribe and double opt-in status. Marketing emails honor those statuses. Both modes suppress hard bounces and spam complaints. A suppressed send is recorded instead of delivered. Use the returned emailSendId with the email-send details endpoint to inspect the final status and any provider failure reason.

Safe retries

string
A caller-owned key for one logical email, up to 255 characters. Agents and retrying workflows should generate the key before their first attempt and reuse that exact key for every retry of the same request.
Sequenzy retains the key and the accepted send for 14 days. Retrying with the same key and request returns the original response, includes Idempotent-Replayed: true, and does not create another delivery. The stored response is replayed as it was first returned, so a retry normally succeeds even if the template has since been renamed or disabled, or the sending domain’s verification lapsed. The exception is a send that is still queued and whose delivery job has to be rebuilt to recover it: that retry re-reads the template, so it fails if the template was deleted or disabled in the meantime. Reusing the key with different request content returns 409 IDEMPOTENCY_KEY_REUSED.
Do not generate a new idempotency key inside each retry attempt. A new key represents a new logical email and can create another delivery.

Repeated junk-content rejection

If identical transactional content reaches many distinct recipients within a short window, Sequenzy can review that content for junk/list testing. Identical content or high volume alone does not establish abuse. Sending continues while this review is pending or unavailable. A substantiated junk/list-testing verdict can reject subsequent matching deliveries before they are sent. The original API response still means accepted for background processing. Check Email Send Details for status: "failed" and an errorMessage beginning Transactional content rejected:. This is a terminal failure, not a queued hold: it is not automatically replayed when a decision expires. Correct the content or contact support before deliberately submitting a new logical send. Reusing the original idempotency key returns its original acceptance response and does not resend the failed delivery. Retrying a rejected delivery from the dashboard also fails without sending, including after the review decision expires. Submit corrected content as a new logical send instead. The same accepted-send and delivery-status behavior applies to CLI and MCP sends. This check does not pause your company or ban your account. Normal marketing misuse is advisory for this check; existing phishing and sender-health protections continue independently.

Rate limits

Sends are metered separately from the rest of the API: 1,000 requests per minute and 50 per second per API key, on top of the standard budget described in Rate Limiting. Each request sends to one recipient (or one to list), so a burst of confirmations does not starve the subscriber or campaign calls made on the same key. A 429 response carries Retry-After; queue and retry rather than dropping the send.

Request Body

Recipients

string | string[]
required
Recipient email address(es). Can be a single email string or an array of up to 50 emails. All recipients will receive the same email and can see each other in the To header.
string | string[]
Carbon-copy email address(es), visible to every recipient. A single email string or an array of up to 50. Addresses already present in to are removed. Transactional sends only.
string | string[]
Blind-carbon-copy email address(es), hidden from the other recipients. A single email string or an array of up to 50. Addresses already present in to or cc are removed. Transactional sends only.
cc and bcc are echoed back in the response when the accepted send has them, after the duplicates above are removed. The CLI exposes the same lists as sequenzy send <email...> with repeatable --cc <address> and --bcc <address> flags, and the MCP send_email tool as the to, cc, and bcc arguments.

Option 1: Send via template

string
Canonical transactional template slug (use this OR direct content).
string
Compatibility alias for slug. Despite the field name, pass the saved transactional email’s API slug, not its database ID.

Option 2: Send direct content

string
Email subject (required if no slug)
string
Canonical email HTML body (required if no template slug).
string
Compatibility alias for body, accepted with subject for direct sends.
string
Preview text
slug/body remain canonical. If you provide both slug and templateId, or both body and html, the paired values must match. A differing pair is rejected with 400 instead of silently choosing one.

Common fields

string
default:"transactional"
Delivery policy. Use transactional for messages that are necessary to complete a user-requested action or service. Use marketing for consented lifecycle or promotional messages. Marketing mode requires exactly one to recipient and does not support cc or bcc. It creates or links a minimal subscriber, honors unsubscribe suppression, adds Sequenzy’s standard marketing footer, and emits the RFC 8058 List-Unsubscribe and List-Unsubscribe-Post headers. The caller remains responsible for having a lawful basis or consent to send the message.
object
Template variables for personalization. Values can be scalars, nested objects, or arrays. Repeat blocks read arrays from paths such as items. Raw HTML templates can also use subscriber/custom-attribute conditionals like {{#if subscriber.plan}}...{{else}}...{{/if}} and {{#unless subscriber.plan}}...{{/unless}}. If Sequenzy detects likely variable issues before queueing, the successful response includes diagnostics warnings. Missing required values do not block queueing; the worker renders values without defaults as empty strings and continues sending. For a single recipient, Sequenzy also matches an existing subscriber by subscriberExternalId or email and uses the stored first and last name when those values are omitted from variables. Explicit variables take precedence. Variables are always HTML-escaped. To insert a trusted HTML value unescaped (for example a prerendered order summary), prefix the tag with html. in the template: {{html.prerenderedHtml}}. Injected HTML is sanitized (scripts, event handlers, and dangerous URLs are stripped), only applies in HTML text position, and must not contain end-user input. See Raw HTML variables.
{{ viewInBrowserUrl }} and {{ VIEW_IN_BROWSER_URL }} are reserved variables. Sequenzy replaces either form with a hosted copy URL at send time, so do not include them in variables. The hosted copy remains available while the email body is retained (normally 14 days).
string
Customer-owned subscriber ID for single-recipient sends. If it matches an existing subscriber, analytics, localization, and engagement attach to that subscriber even if the delivery email changed. Sequenzy also stores this value on the send, so outbound email webhooks include it as external_id even when no subscriber record exists. Maximum length: 255 characters.In marketing mode, this ID must either be unused or belong to the same email address. Sequenzy rejects an identity mismatch instead of risking an unsubscribe action against the wrong subscriber.
string
Custom from address. Format: "Name <email>" or just "email". The domain must be verified for your account. If not verified, this field is silently ignored and the default sender profile is used. When the address exactly matches an existing sender identity (the display name disambiguates if several share it), that identity - including its sending route - is used for the send. Mutually exclusive with senderProfileId and fromEmail.
string
Existing sender profile ID. Sends this email as that verified From identity (address and display name) instead of the company default or the saved template’s sender. Get IDs from List Sender Profiles. Mutually exclusive with fromEmail and from.
string
From address of an existing verified sender profile in this company. Mutually exclusive with senderProfileId and from. If the address has several identities, pass fromName to choose one (or senderProfileId). This field does not create a new sender profile.
string
Display name of an existing verified sender identity on fromEmail. Use this when one address has several identities, for example StudyBoost vs StudyBoost News. Requires fromEmail. Mutually exclusive with senderProfileId and from. Does not create a new sender profile.
string
Reply-to address. Format: "Name <email>" or just "email". Can be any valid email address. Mutually exclusive with replyProfileId. Pair a bare address with replyToName instead of embedding the name.When reply tracking is disabled, this is sent as the email’s Reply-To header. When reply tracking is enabled, Sequenzy sends a unique trackable Reply-To address instead and stores this value as the forwarding destination for replies.
string
Display name for a bare replyTo address. Requires replyTo. Mutually exclusive with replyProfileId. Does not create a reply profile.
string
Existing reply profile ID. Sends this email with that Reply-To identity instead of the company default or the saved template’s reply profile. Get IDs from List Sender Profiles. Mutually exclusive with replyTo.
from and replyTo control message identity, not the outbound transport. A mailbox or alias hosted by Hostinger or another provider can be used as from after its domain is verified, and as replyTo without domain verification. Sequenzy still performs delivery through SES or Sequenzy’s MTA; custom outbound SMTP relays are not supported.
Direct-content sends without a reply identity override prefer the effective sending domain’s default reply profile, then the company’s default reply profile, then the first reply profile in the company. Sequenzy retains that resolved address in originalReplyTo. When reply tracking is disabled, it is sent as the Reply-To header; when reply tracking is enabled, Sequenzy sends a unique trackable Reply-To and uses originalReplyTo as the forwarding destination. Template sends prefer the request override, then the template reply profile, then the same domain, company and first-profile fallback order.
array
File attachments to include with the email. Maximum 10 attachments, 7MB total.Each attachment object has:
  • filename (required): The name of the file as it will appear to the recipient
  • content: Base64-encoded file content (use this OR path)
  • path: URL to fetch the file from (use this OR content)
  • contentId: Embeds the file as an inline image instead of attaching it. Reference it from your HTML as <img src="cid:VALUE">
  • contentType: MIME type override. Defaults to the type inferred from filename
You must provide either content or path, but not both.
object
Per-send tracking opt-outs. When a field is omitted, the corresponding Transactional API default from Settings → Tracking applies. Set a field to false to disable that tracking for this send only. These fields can only opt out; they cannot enable tracking disabled by either an account-wide or Transactional API setting.

Example: Send via template

Example: Send a consented lifecycle message

Sequenzy adds the visible unsubscribe footer and signed one-click headers. Do not supply an unsubscribe URL in the request. The successful queue response includes the accepted policy:

Example: Send array data to a repeat block

If a template contains a repeat block with source items and item alias item, child blocks can use merge tags like {{item.title}} and {{item.description}}.

Example: Send to multiple recipients

Example: Send direct content

The same direct send can use the html compatibility alias:

Example: Send with custom from and reply-to

Example: Send with URL-based attachment

Example: Send with Base64 attachment

Example: Send with an inline (CID) image

Set contentId and reference it from your HTML. The image is sent as a multipart/related part rather than a file attachment, which is the only form Gmail renders - it drops data: URI images.
If nothing in the HTML references cid:ticket-qr, the file is sent as a normal attachment instead.

Responses

Emails are queued for background processing. Track the returned emailSendId with GET /api/v1/email-sends/{emailSendId}. For single-recipient sends without cc or bcc, EMAIL resolves from the recipient address. If the recipient matches a stored subscriber, FIRST_NAME, LAST_NAME, and NAME use the saved profile values when the request omits them. Passing name, firstName, lastName, FIRST_NAME, or LAST_NAME in variables overrides the corresponding saved value.
For aggregate Send API open and click rates, call GET /api/v1/metrics?period=30d&emailType=transactional, run sequenzy stats --email-type transactional --period 30d, or call the MCP get_stats tool with emailType: "transactional".
When using multiple to recipients, all recipient addresses are visible to each other. Use single-recipient sends when recipients should not see each other.
Multi-recipient sends produce a single email send record. The full recipient list (to/cc/bcc) is stored on the record and returned as additionalRecipients from the email-sends API. Opens and clicks are tracked for the message as a whole, not per recipient.