Transactional
Send Email
Send a transactional or consented marketing email
POST
Send Email
Send an email using a saved template (by slug) or custom content. The endpoint
defaults to transactional delivery. Use
Sequenzy retains the key and the accepted send for 14 days. Retrying with the
same key and request returns the original response, includes
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:
The same direct send can use the
If nothing in the HTML references
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.
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.
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 forstatus: "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 oneto 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 recipientcontent: Base64-encoded file content (use this ORpath)path: URL to fetch the file from (use this ORcontent)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 fromfilename
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
Example: Send array data to a repeat block
If a template contains a repeat block with sourceitems 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
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
SetcontentId 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.
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.