Submit and track individual transactional emails. The Email API provides full control over email content, tracking, and delivery. Each email goes through a lifecycle: submitted, queued, delivered, with events for opens, clicks, bounces, and unsubscribes. Includes statistics, activity logs, and tag-based organization.
Submit an email
Submit an email to be sent.
Request body
Every request requires a sender and a content object. content must
include a subject and exactly one of html / text (with an encoding)
or a template.
Beyond that, the body comes in one of five shapes. Which one applies is
determined by content.type (marketing or transactional) and how you
identify the recipient — by raw email, or by contact_id within a list:
content.type | Required recipient fields | When to use |
|---|---|---|
transactional | email | To an address, without list management. |
transactional | email + list_id | To an address, with list management. |
transactional | list_id + contact_id | To an existing contact in a list. |
marketing | email + list_id | To an address; marketing always requires a list_id. |
marketing | list_id + contact_id | To an existing contact in a list. |
email and contact_id are mutually exclusive: identify the recipient by
one or the other, never both. tags, tracking, additional_headers and
attachment are optional in every shape.
Email status lifecycle:
submitted: Email has been submitted to the API using this endpoint.queued: Email has been queued for delivery.delivered: Email has been successfully delivered.rejected: Email has been rejected by the API. See thereasoninmetadatafor more information.error: Email has encountered an error. See theerrorinmetadatafor more information.open: Email has been opened.click: Email has been clicked.bounce: Email has bounced.spam: Email has been marked as spam.unsubscribe: Email has been unsubscribed.global_unsubscribe: Email has been globally unsubscribed (suppressed by user request).
Required scope(s): emailapi:send
query Parameters
account_idOptional Account ID to be used for the request
Optional Account ID to be used for the request
Submit an email › Request Body
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = object · requires: sender, content, email +1 more | |
| type = object · requires: sender, content, list_id +1 more | |
| type = object · requires: sender, content, email +1 more | |
| type = object · requires: sender, content, list_id +1 more | |
| type = object · requires: sender, content, email |
emailRecipient's email address
list_idList ID.
tags^[a-zA-Z0-9-_]+$List of tags to apply to the email
Custom mail headers
One or more file attachments
Submit an email › Responses
Successful Response
emailRecipient email address
objectObject type
submittedWhether the email was submitted
Retrieve a submitted email
Retrieve the details and current status of a previously submitted email, including delivery events, timestamps, and rendered content URL.
Required scope(s): emailapi:read
path Parameters
email_idquery Parameters
account_idOptional Account ID to be used for the request
Optional Account ID to be used for the request
Retrieve a submitted email › Responses
Successful Response
email_idUnique identifier of the email
statusAn enumeration.
emailRecipient email address
submitted_timeSubmission timestamp
providerEmail delivery provider
unsubscribedWhether recipient unsubscribed
global_unsubscribedWhether recipient globally unsubscribed
soft_bouncedWhether the email soft bounced
hard_bouncedWhether the email hard bounced
reported_as_spamWhether the email was reported as spam
openNumber of times the email was opened
clickNumber of link clicks in the email
list_idID of the contact list
tagsTags associated with the email
Additional email headers
thumbnail_urlURL to the email thumbnail image
Render a submitted email
Render the HTML content of a submitted email. By default returns the
final rendered version with merge tags replaced. Use as_submitted
to see the original content before rendering.
Required scope(s): emailapi:read
path Parameters
email_idquery Parameters
as_submittedRender the original submitted content of the email
Render the original submitted content of the email
trackingEnable tracking
Enable tracking
account_idOptional Account ID to be used for the request
Optional Account ID to be used for the request
Render a submitted email › Responses
Successful Response
List Email Tags
Email Tags are used to group sent emails into a logical group or category. This endpoint will return a list of all the Email Tags that have been created for the account.
To create a tag, specify its name at send time in the tags field of the email object. If the tag does not exist,
it will be created automatically.
Use the type parameter to filter tags from the emails or events table, optionally combined with
start_time, end_time, and a tags filter for complex queries.
Required scope(s): emailapi:read
query Parameters
typeQuery tags from the emails or events table. Required when using start_time, end_time, or tags filters.
Query tags from the emails or events table. Required when using start_time, end_time, or tags filters.
start_timeend_timeaccount_idOptional Account ID to be used for the request
Optional Account ID to be used for the request
pageper_pagewith_countInclude count in the response
Include count in the response
nameTag name to filter by, with optional operator.
Operators:
==: Exact match (default) !=: Not equal ~~: Like (anywhere in the email) !~: Not like (anywhere in the email)
Tag name to filter by, with optional operator.
Operators:
==: Exact match (default) !=: Not equal ~~: Like (anywhere in the email) !~: Not like (anywhere in the email)
tagsRecursive Filter Query Language
The filter is a JSON object that represents a recursive query structure. It uses the logical operators and, or, not and is as keys, with the following types of values:
-
object: A nested filter object that defines additional conditions. -
string: A condition expressed as a single string. -
array: An array of strings (conditions) or nested filter objects.
-
The
andandoroperators acceptobjectandarray -
The
notoperator acceptsobjectandstring -
The
isoperator acceptsobjectandstring
Examples
1. Simple condition with a string
Code
2. Array of strings
Code
3. Nested filter object
Code
4. Complex recursive query
Code
Recursive Filter Query Language
The filter is a JSON object that represents a recursive query structure. It uses the logical operators and, or, not and is as keys, with the following types of values:
-
object: A nested filter object that defines additional conditions. -
string: A condition expressed as a single string. -
array: An array of strings (conditions) or nested filter objects.
-
The
andandoroperators acceptobjectandarray -
The
notoperator acceptsobjectandstring -
The
isoperator acceptsobjectandstring
Examples
1. Simple condition with a string
Code
2. Array of strings
Code
3. Nested filter object
Code
4. Complex recursive query
Code
List Email Tags › Responses
Successful Response
dataList of email tags
Show Email API activity logs
List individual Email API activity events (deliveries, opens, clicks, bounces, etc.). Filterable by time range, log type, tags, and providers.
Required scope(s): logs:read
query Parameters
log_typeAn enumeration.
email_idiso_timeConvert timestamps to human readable ISO format
Convert timestamps to human readable ISO format
account_idOptional Account ID to be used for the request
Optional Account ID to be used for the request
pageper_pagestart_timeStart time for the report, defaults to 7 days ago.
Start time for the report, defaults to 7 days ago.
end_timeEnd time for the report, defaults to the current time.
End time for the report, defaults to the current time.
tagsRecursive Filter Query Language
The filter is a JSON object that represents a recursive query structure. It uses the logical operators and, or, not and is as keys, with the following types of values:
-
object: A nested filter object that defines additional conditions. -
string: A condition expressed as a single string. -
array: An array of strings (conditions) or nested filter objects.
-
The
andandoroperators acceptobjectandarray -
The
notoperator acceptsobjectandstring -
The
isoperator acceptsobjectandstring
Examples
1. Simple condition with a string
Code
2. Array of strings
Code
3. Nested filter object
Code
4. Complex recursive query
Code
Recursive Filter Query Language
The filter is a JSON object that represents a recursive query structure. It uses the logical operators and, or, not and is as keys, with the following types of values:
-
object: A nested filter object that defines additional conditions. -
string: A condition expressed as a single string. -
array: An array of strings (conditions) or nested filter objects.
-
The
andandoroperators acceptobjectandarray -
The
notoperator acceptsobjectandstring -
The
isoperator acceptsobjectandstring
Examples
1. Simple condition with a string
Code
2. Array of strings
Code
3. Nested filter object
Code
4. Complex recursive query
Code
providersRecursive Filter Query Language
The filter is a JSON object that represents a recursive query structure. It uses the logical operators and, or, not and is as keys, with the following types of values:
-
object: A nested filter object that defines additional conditions. -
string: A condition expressed as a single string. -
array: An array of strings (conditions) or nested filter objects.
-
The
andandoroperators acceptobjectandarray -
The
notoperator acceptsobjectandstring -
The
isoperator acceptsobjectandstring
Examples
1. Simple condition with a string
Code
2. Array of strings
Code
3. Nested filter object
Code
4. Complex recursive query
Code
Recursive Filter Query Language
The filter is a JSON object that represents a recursive query structure. It uses the logical operators and, or, not and is as keys, with the following types of values:
-
object: A nested filter object that defines additional conditions. -
string: A condition expressed as a single string. -
array: An array of strings (conditions) or nested filter objects.
-
The
andandoroperators acceptobjectandarray -
The
notoperator acceptsobjectandstring -
The
isoperator acceptsobjectandstring
Examples
1. Simple condition with a string
Code
2. Array of strings
Code
3. Nested filter object
Code
4. Complex recursive query
Code
sortSort term and direction, using syntax [-|+]term.
Valid terms:
idtimesubmitted_timetypeprovider
Sort term and direction, using syntax [-|+]term.
Valid terms:
idtimesubmitted_timetypeprovider
Show Email API activity logs › Responses
Successful Response
List of Email API log entries
Show Email API activity summary
Get a per-email summary of Email API activity, showing each email's latest status, engagement, and delivery details. Filterable by email address, status, engagement level, tags, and providers.
Required scope(s): logs:read
query Parameters
email_idengagementAn enumeration.
statusAn enumeration.
iso_timeConvert timestamps to human readable ISO format
Convert timestamps to human readable ISO format
account_idOptional Account ID to be used for the request
Optional Account ID to be used for the request
pageper_pagestart_timeStart time for the report, defaults to 7 days ago.
Start time for the report, defaults to 7 days ago.
end_timeEnd time for the report, defaults to the current time.
End time for the report, defaults to the current time.
tagsRecursive Filter Query Language
The filter is a JSON object that represents a recursive query structure. It uses the logical operators and, or, not and is as keys, with the following types of values:
-
object: A nested filter object that defines additional conditions. -
string: A condition expressed as a single string. -
array: An array of strings (conditions) or nested filter objects.
-
The
andandoroperators acceptobjectandarray -
The
notoperator acceptsobjectandstring -
The
isoperator acceptsobjectandstring
Examples
1. Simple condition with a string
Code
2. Array of strings
Code
3. Nested filter object
Code
4. Complex recursive query
Code
Recursive Filter Query Language
The filter is a JSON object that represents a recursive query structure. It uses the logical operators and, or, not and is as keys, with the following types of values:
-
object: A nested filter object that defines additional conditions. -
string: A condition expressed as a single string. -
array: An array of strings (conditions) or nested filter objects.
-
The
andandoroperators acceptobjectandarray -
The
notoperator acceptsobjectandstring -
The
isoperator acceptsobjectandstring
Examples
1. Simple condition with a string
Code
2. Array of strings
Code
3. Nested filter object
Code
4. Complex recursive query
Code
providersRecursive Filter Query Language
The filter is a JSON object that represents a recursive query structure. It uses the logical operators and, or, not and is as keys, with the following types of values:
-
object: A nested filter object that defines additional conditions. -
string: A condition expressed as a single string. -
array: An array of strings (conditions) or nested filter objects.
-
The
andandoroperators acceptobjectandarray -
The
notoperator acceptsobjectandstring -
The
isoperator acceptsobjectandstring
Examples
1. Simple condition with a string
Code
2. Array of strings
Code
3. Nested filter object
Code
4. Complex recursive query
Code
Recursive Filter Query Language
The filter is a JSON object that represents a recursive query structure. It uses the logical operators and, or, not and is as keys, with the following types of values:
-
object: A nested filter object that defines additional conditions. -
string: A condition expressed as a single string. -
array: An array of strings (conditions) or nested filter objects.
-
The
andandoroperators acceptobjectandarray -
The
notoperator acceptsobjectandstring -
The
isoperator acceptsobjectandstring
Examples
1. Simple condition with a string
Code
2. Array of strings
Code
3. Nested filter object
Code
4. Complex recursive query
Code
sortSort term and direction, using syntax [-|+]term.
Valid terms:
submitted_time
Sort term and direction, using syntax [-|+]term.
Valid terms:
submitted_time
emailEmail address to filter by, with optional operator.
Operators:
==: Exact match (default) !=: Not equal ~~: Like (anywhere in the email) !~: Not like (anywhere in the email)
Email address to filter by, with optional operator.
Operators:
==: Exact match (default) !=: Not equal ~~: Like (anywhere in the email) !~: Not like (anywhere in the email)
Show Email API activity summary › Responses
Successful Response
List of email summaries
Show Email API statistics
Generate email statistics for the Email API.
Statistics are aggregated with a minimum granularity of 5 minutes. As a result, the returned intervals may extend beyond the requested time range. Intervals are always whole, except for the last interval if the requested end time is the current time.
Required scope(s): reports:read
query Parameters
intervalAn enumeration.
iso_timeConvert timestamps to human readable ISO format
Convert timestamps to human readable ISO format
account_idOptional Account ID to be used for the request
Optional Account ID to be used for the request
start_timeStart time for the report.
Start time for the report.
end_timeEnd time for the report.
End time for the report.
providersRecursive Filter Query Language
The filter is a JSON object that represents a recursive query structure. It uses the logical operators and, or, not and is as keys, with the following types of values:
-
object: A nested filter object that defines additional conditions. -
string: A condition expressed as a single string. -
array: An array of strings (conditions) or nested filter objects.
-
The
andandoroperators acceptobjectandarray -
The
notoperator acceptsobjectandstring -
The
isoperator acceptsobjectandstring
Examples
1. Simple condition with a string
Code
2. Array of strings
Code
3. Nested filter object
Code
4. Complex recursive query
Code
Recursive Filter Query Language
The filter is a JSON object that represents a recursive query structure. It uses the logical operators and, or, not and is as keys, with the following types of values:
-
object: A nested filter object that defines additional conditions. -
string: A condition expressed as a single string. -
array: An array of strings (conditions) or nested filter objects.
-
The
andandoroperators acceptobjectandarray -
The
notoperator acceptsobjectandstring -
The
isoperator acceptsobjectandstring
Examples
1. Simple condition with a string
Code
2. Array of strings
Code
3. Nested filter object
Code
4. Complex recursive query
Code
tagsRecursive Filter Query Language
The filter is a JSON object that represents a recursive query structure. It uses the logical operators and, or, not and is as keys, with the following types of values:
-
object: A nested filter object that defines additional conditions. -
string: A condition expressed as a single string. -
array: An array of strings (conditions) or nested filter objects.
-
The
andandoroperators acceptobjectandarray -
The
notoperator acceptsobjectandstring -
The
isoperator acceptsobjectandstring
Examples
1. Simple condition with a string
Code
2. Array of strings
Code
3. Nested filter object
Code
4. Complex recursive query
Code
Recursive Filter Query Language
The filter is a JSON object that represents a recursive query structure. It uses the logical operators and, or, not and is as keys, with the following types of values:
-
object: A nested filter object that defines additional conditions. -
string: A condition expressed as a single string. -
array: An array of strings (conditions) or nested filter objects.
-
The
andandoroperators acceptobjectandarray -
The
notoperator acceptsobjectandstring -
The
isoperator acceptsobjectandstring
Examples
1. Simple condition with a string
Code
2. Array of strings
Code
3. Nested filter object
Code
4. Complex recursive query
Code
Show Email API statistics › Responses
Successful Response
Statistics per interval