Transactional
Send a transactional message
POST/v1/transactional/messages
Requires an API key with the transactional:send scope. About keys and scopes
Takes an Idempotency-Key header: a retry with the same key returns the first result instead of acting twice. Derive the key from what you are sending, and reuse it on every retry. About idempotency
Sends a one-off message to one recipient — a receipt, a password reset, a confirmation — bypassing campaigns. It ignores marketing preferences (it is the critical tier) but respects suppression. Agent keys are refused with 403.
Channels. Give email, push, or both. With both, deliver: all (the default) sends each one the contact can receive, and deliver: first sends push when the contact has a reachable device and email otherwise. A channel the contact cannot receive is passed over; only when none is left does the send fail, with that channel's reason. The response lists one message per channel sent.
Email. Inline (subject, from, html, optional text, previewText, replyTo), or a stored template: templateId (its id or alias) with data, readable as {{ data.<key> }}. The template's published version is rendered when the request is accepted and supplies the envelope; each envelope field given overrides it. The result needs a subject and a from (409 TEMPLATE_ENVELOPE_INCOMPLETE), and the from domain must be verified. A template never published is 409 TEMPLATE_NOT_PUBLISHED. Email is tracked only when tracking asks, and never for a contact in the EEA or the UK; threading continues a conversation.
Recipient. to names a contactId, an externalId or an email. With externalId or email, firstName, lastName and attributes create the contact or update it, as POST /v1/contacts/identify does; consent is never changed. A bare email that matches no contact creates one for transactional mail only.
Retries. An Idempotency-Key header is required. A retry with the same key and request returns the first result, with Idempotency-Replay: true, and sends nothing again; the same key with a different request is 409 IDEMPOTENCY_KEY_REUSED. Set correlationId to your own reference: it is echoed on each message's webhooks and its read. sendAt times the send, email and push alike.
Header parameters
Idempotency-Keystringrequired8–255 characters
Request body
toobjectrequiredWho receives it.
One of 3 shapes
- By contact id
1 child attribute
contactIdstringrequiredAn existing contact.
uuid
- By external id
5 child attributes
externalIdstringrequiredYour own id for the contact. Alone it must match an existing contact; with
emailor profile fields the contact is created or updated, as identify does.1–255 characters
emailstringoptionalSets or updates the contact email.
email · up to 320 characters
firstNamestring | nulloptional1–100 characters
lastNamestring | nulloptional1–100 characters
attributesobjectoptionalCustom attributes, merged key by key;
nullremoves one. At most 50 keys and 16 KB.
- By email
4 child attributes
emailstringrequiredThe recipient's address. With profile fields the contact is created or updated, as identify does; alone, an email send creates a transactional-only contact when none has it, and a push-only send needs an existing contact.
email · up to 320 characters
firstNamestring | nulloptional1–100 characters
lastNamestring | nulloptional1–100 characters
attributesobjectoptionalCustom attributes, merged key by key;
nullremoves one. At most 50 keys and 16 KB.
sensitivebooleanoptionalSet when the message carries a secret (a reset link, a one-time code): its content is never kept, whatever
retainContentand the workspace's retention say.correlationIdstringoptionalYour own reference for this send, echoed on its webhooks and its read.
1–255 characters
retainContentbooleanoptionalfalsediscards what was sent as soon as it is sent.emailobjectoptionalInline content (
subject,from,html), or a storedtemplateId.One of 2 shapes
- Stored template
6 child attributes
templateIdstringrequiredThe template's id, or its
alias(such aspassword-reset).dataobjectoptionalValues for the template's
{{ data.* }}merge tags.subjectstringoptionalThe subject line. Merge tags are allowed.
1–998 characters
previewTextstringoptionalShown by inboxes after the subject. Merge tags are allowed; keep it near 100 characters.
1–255 characters
fromstringoptionalThe sender address, on a verified sending domain.
1–320 characters
replyTostringoptionalWhere replies go.
email
- Inline content
6 child attributes
subjectstringrequiredThe subject line. Merge tags are allowed.
1–998 characters
previewTextstringoptionalShown by inboxes after the subject. Merge tags are allowed; keep it near 100 characters.
1–255 characters
htmlstringrequiredThe HTML body. Rendered from the design when one is set.
1–512000 characters
textstringoptionalThe plain-text alternative.
1–512000 characters
fromstringrequiredThe sender address, on a verified sending domain.
1–320 characters
replyTostringoptionalWhere replies go.
email
pushobjectoptionalA push notification to the contact's devices. Give
push,email, or both.2 child attributes
pushProjectIdstringrequiredReaches the contact's devices on every app of the project.
uuid
contentobjectrequired13 child attributes
titlestringrequiredThe notification title (up to 100 characters).
1–100 characters
bodystringrequiredThe notification text (up to 500 characters).
1–500 characters
actionUrlstringoptionalThe HTTPS page opened when the notification is tapped.
uri · up to 2048 characters
imageUrlstringoptionalA large picture: web and Android show it; iOS needs the app's service extension.
uri · up to 2048 characters
iconUrlstringoptionalWeb only; iOS and Android show the app's own notification icon.
uri · up to 2048 characters
dataobjectoptionalUp to 10 string key-value pairs passed to the app untouched, for deep links and in-app routing.
buttonsobject[]optionalUp to 2 action buttons.
at least 1 item · at most 2 items
2 child attributes
titlestringrequiredThe button label.
1–30 characters
urlstringrequiredThe HTTPS page the button opens.
uri · up to 2048 characters
collapseKeystringoptionalA newer notification with the same key replaces the older one on the device.
soundstringoptionalThe name of a sound the app ships; the device's default if unset.
1–64 characters
badgeintegeroptionalThe number shown on the iOS app icon.
min 0 · max 99999
ttlSecondsintegeroptionalSeconds a provider keeps trying an offline device (up to 28 days); defaults to 86400 (one day).
min 0 · max 2419200
urgencystringoptionalhighwakes the device now;normallets it wait for a good moment to save battery. Unset, a transactional push ishighand any othernormal.one of
high,normaloverridesobjectoptionalFields that differ on one platform, each replacing the shared one there (a whole
datamap, not merged key by key). On iOS and AndroidactionUrlmay be an app link such asmyapp://orders; the shared one and the web one must be HTTPS.3 child attributes
iosobjectoptionalReplaces shared fields on iOS.
14 child attributes
titlestringoptionalThe notification title (up to 100 characters).
1–100 characters
bodystringoptionalThe notification text (up to 500 characters).
1–500 characters
actionUrlstringoptionalup to 2048 characters
imageUrlstringoptionalA large picture: web and Android show it; iOS needs the app's service extension.
uri · up to 2048 characters
iconUrlstringoptionalWeb only; iOS and Android show the app's own notification icon.
uri · up to 2048 characters
dataobjectoptionalUp to 10 string key-value pairs passed to the app untouched, for deep links and in-app routing.
buttonsobject[]optionalUp to 2 action buttons.
at least 1 item · at most 2 items
collapseKeystringoptionalA newer notification with the same key replaces the older one on the device.
soundstringoptionalThe name of a sound the app ships; the device's default if unset.
1–64 characters
badgeintegeroptionalThe number shown on the iOS app icon.
min 0 · max 99999
ttlSecondsintegeroptionalSeconds a provider keeps trying an offline device (up to 28 days); defaults to 86400 (one day).
min 0 · max 2419200
urgencystringoptionalhighwakes the device now;normallets it wait for a good moment to save battery. Unset, a transactional push ishighand any othernormal.one of
high,normalinterruptionLevelstringoptionalHow iOS presents it:
passivearrives silently,time-sensitivebreaks through Focus and needs the app's Time Sensitive Notifications capability.one of
passive,active,time-sensitivethreadIdstringoptionalNotifications with the same thread are grouped together in Notification Center.
androidobjectoptionalReplaces shared fields on Android.
13 child attributes
titlestringoptionalThe notification title (up to 100 characters).
1–100 characters
bodystringoptionalThe notification text (up to 500 characters).
1–500 characters
actionUrlstringoptionalup to 2048 characters
imageUrlstringoptionalA large picture: web and Android show it; iOS needs the app's service extension.
uri · up to 2048 characters
iconUrlstringoptionalWeb only; iOS and Android show the app's own notification icon.
uri · up to 2048 characters
dataobjectoptionalUp to 10 string key-value pairs passed to the app untouched, for deep links and in-app routing.
buttonsobject[]optionalUp to 2 action buttons.
at least 1 item · at most 2 items
collapseKeystringoptionalA newer notification with the same key replaces the older one on the device.
soundstringoptionalThe name of a sound the app ships; the device's default if unset.
1–64 characters
badgeintegeroptionalThe number shown on the iOS app icon.
min 0 · max 99999
ttlSecondsintegeroptionalSeconds a provider keeps trying an offline device (up to 28 days); defaults to 86400 (one day).
min 0 · max 2419200
urgencystringoptionalhighwakes the device now;normallets it wait for a good moment to save battery. Unset, a transactional push ishighand any othernormal.one of
high,normalchannelIdstringoptionalThe Android notification channel to post in, which the app creates; it sets the sound and importance a person can tune, e.g. one for offers and one for orders.
webobjectoptionalReplaces shared fields on web.
12 child attributes
titlestringoptionalThe notification title (up to 100 characters).
1–100 characters
bodystringoptionalThe notification text (up to 500 characters).
1–500 characters
actionUrlstringoptionalThe HTTPS page opened when the notification is tapped.
uri · up to 2048 characters
imageUrlstringoptionalA large picture: web and Android show it; iOS needs the app's service extension.
uri · up to 2048 characters
iconUrlstringoptionalWeb only; iOS and Android show the app's own notification icon.
uri · up to 2048 characters
dataobjectoptionalUp to 10 string key-value pairs passed to the app untouched, for deep links and in-app routing.
buttonsobject[]optionalUp to 2 action buttons.
at least 1 item · at most 2 items
collapseKeystringoptionalA newer notification with the same key replaces the older one on the device.
soundstringoptionalThe name of a sound the app ships; the device's default if unset.
1–64 characters
badgeintegeroptionalThe number shown on the iOS app icon.
min 0 · max 99999
ttlSecondsintegeroptionalSeconds a provider keeps trying an offline device (up to 28 days); defaults to 86400 (one day).
min 0 · max 2419200
urgencystringoptionalhighwakes the device now;normallets it wait for a good moment to save battery. Unset, a transactional push ishighand any othernormal.one of
high,normal
attachmentsEmailAttachmentInput[]optionalFiles the email carries (not push): up to 10, 10 MB in all.
at least 1 item · at most 10 items
3 child attributes
filenamestringrequiredIts extension sets the type it is sent as.
1–255 characters
contentstringrequiredThe file, base64-encoded.
base64
contentIdstringoptionalShows an image inside the body instead of attaching it: the HTML refers to it as
<img src="cid:<contentId>">.
threadingEmailThreadingInputoptionalPlaces the email in an existing conversation, as the
In-Reply-ToandReferencesheaders.2 child attributes
inReplyTostringrequiredThe
Message-IDof the email being replied to, angle brackets included.referencesstring[]optionalThe
Message-IDs earlier in the conversation, oldest first (up to 20).at least 1 item · at most 20 items
trackingTransactionalEmailTrackingInputoptionalOpen and click tracking for this email; off unless asked for. Contacts whose
countryis in the EEA or the UK are never tracked.2 child attributes
opensbooleanoptionalTrack opens with a pixel.
default
falseclicksbooleanoptionalRewrite links to track clicks.
default
false
sendAtstringoptionalWhen to send, up to 90 days ahead, with its UTC offset. Suppression and push reachability are checked when the request is accepted and again when it goes;
deliver: firstpicks its channel when accepted.date-time
deliverstringoptionalWith both
pushandemail:allsends each the contact can receive;firstsends push when the contact has a reachable device, else email.one of
all,first· default"all"
Returns
Returns 202 Accepted with a TransactionalSendResult in data. Otherwise returns an error; Errors lists every code and which to retry.
messagesTransactionalMessage[]required6 child attributes
idstringrequireduuid
channelstringrequiredone of
email,pushstatusstringrequiredone of
queued,sending,skipped,sent,failed,delivered,bounced,complainedcorrelationIdstring | nullrequiredThe
correlationIdgiven when it was sent, if any.createdAtstringrequireddate-time
sendAtstring | nullrequiredWhen a timed email goes out; null when it went at once.
date-time