Authentication & Conventions
Use header-based authentication only: Authorization: Bearer <key> or X-Api-Key: <key>.
Base URL
https://mails.now/api
API Key Format
32 characters (alpha-numeric)
Queue Behavior
check_circle
Background jobs return a `task_id`.
check_circle
Poll the matching get-task endpoint until `completed` or `failed`.
check_circle
Bulk domain deletes: up to 10 hostnames per request.
check_circle
Bulk mailbox deletes: up to 100 addresses per request.
check_circle
One bulk-delete request per 5 minutes per API key and IP.
check_circle
HTTP 422 validation errors do not count toward the cooldown.
check_circle
Active pricing plan required (admins exempt).
Success Contract
{
"status": "success"
}
Error Contract
{
"status": "error",
"reason": "Error description"
}
POST
/api/v1/create/domain
Create Domain
Creates a new base domain in your Mails.now workspace and queues provisioning in the background.
Header auth required: `Authorization: Bearer <key>` or `X-Api-Key`.
Field
Type
Required
Description
Domain
string
Yes
Fully qualified hostname (e.g. example.com). Omit http(s)://; single-label names are rejected (same rules as the dashboard Add domain form).
Params
object
No
Optional keys (for example `total_mailbox_allowed`).
Params.total_mailbox_allowed
integer
No
Mailbox slots recorded for the domain (minimum 1, maximum 100; defaults to the app maximum per hostname).
Request Example
curl --fail-with-body --silent --show-error \
-X POST "{{ url('/api/v1/create/domain') }}" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"Domain": "example.com",
"Params": {
"total_mailbox_allowed": 100
}
}'
Success Response
{
"status": "success",
"domain": "example.com",
"task_id": 101
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - An active pricing plan is required before you can create domains, subdomains, or mailboxes via the API.
HTTP 409 - This domain is already registered on Mails.now.
HTTP 422 - First validation error message (invalid body fields).
Notes
Invalid hostnames return HTTP 422 before enqueue; duplicates return HTTP 409.
Poll `GET /api/v1/get/domain?task_id=…`. When `completed`, `results` includes DNS `records` (MX/TXT/A).
Remote mail server defaults apply on provision; quota fields are not accepted on this request.
GET
/api/v1/get/domain?task_id={task_id}
Get Domain Task
Polls a root domain create task created by `POST /api/v1/create/domain`.
Header auth required: `Authorization: Bearer <key>` or `X-Api-Key`.
Field
Type
Required
Description
task_id
integer
Yes
Task identifier returned by Create Domain.
Request Example
curl --fail-with-body --silent --show-error \
"{{ url('/api/v1/get/domain') }}?task_id=101" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Success Response
{
"Task_id": 101,
"total_email": 0,
"domain": "example.com",
"results": {
"domain": "example.com",
"status": "Created successfully.",
"records": [
{
"type": "MX",
"name": "example.com",
"value": "mx1.mails.now",
"priority": "10",
"status": "Not checked"
},
{
"type": "MX",
"name": "example.com",
"value": "mx2.mails.now",
"priority": "20",
"status": "Not checked"
},
{
"type": "TXT",
"name": "_mailapi.example.com",
"value": "<generated-unique-token>",
"priority": "\u2014",
"status": "Not checked"
}
]
},
"status": "completed",
"task_id": "101"
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 404 - Task ID was not found for this API key.
HTTP 422 - Task type does not match this endpoint.
HTTP 422 - Dynamic failure message from the queue job (same shape as other errors).
Notes
`status` may be `queued`, `running`, `completed`, or `failed`. Only `failed` returns HTTP 422 with `reason` from the task.
While `queued` or `running`, `results` is often an empty array until the job finishes.
Responses include `Task_id` (integer) and `task_id` (same value as a string).
POST
/api/v1/create/sub-domain
Create Sub-Domain Batch
Creates up to 10 sub-domains under an existing parent domain in a single queued task.
Header auth required: `Authorization: Bearer <key>` or `X-Api-Key`.
Field
Type
Required
Description
Domain
string
Yes
Existing parent (root) domain owned by your account. Must be a valid dotted hostname (same rules as Create Domain / dashboard).
Params.sub_domains
string[]
Yes
Sub-domain labels (not FQDN), max 10 per request.
Params.total_mailbox_allowed
integer
No
Mailbox slots per created hostname (min 1, max 100; defaults to the app maximum per hostname).
Request Example
curl --fail-with-body --silent --show-error \
-X POST "{{ url('/api/v1/create/sub-domain') }}" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"Domain": "example.com",
"Params": {
"sub_domains": ["team", "support", "billing"]
}
}'
Success Response
{
"status": "success",
"domain": "example.com",
"task_id": 202
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - An active pricing plan is required before you can create domains, subdomains, or mailboxes via the API.
HTTP 404 - Parent domain was not found.
HTTP 422 - Params.sub_domains must be a non-empty array (or validation on labels).
HTTP 422 - Maximum 10 sub-domains are allowed per request.
HTTP 429 - Sub-domain requests are limited to once per 2 minutes for this domain and API key.
Notes
After a successful run: at most one request per 2 minutes per API key and parent domain.
Poll `GET /api/v1/get/sub-domain?task_id=…`. When `completed`, nested `results` are keyed by FQDN.
Provisioning uses the same remote defaults as Create Domain; quota fields are not accepted.
GET
/api/v1/get/sub-domain?task_id={task_id}
Get Sub-Domain Task
Polls a sub-domain batch task from `POST /api/v1/create/sub-domain`.
Header auth required: `Authorization: Bearer <key>` or `X-Api-Key`.
Field
Type
Required
Description
task_id
integer
Yes
Task identifier returned by Create Sub-Domain.
Request Example
curl --fail-with-body --silent --show-error \
"{{ url('/api/v1/get/sub-domain') }}?task_id=202" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Success Response
{
"Task_id": 202,
"total_email": 0,
"domain": "example.com",
"results": {
"domain": "example.com",
"results": {
"team.example.com": {
"status": "Created successfully.",
"records": [
{
"type": "MX",
"name": "team.example.com",
"value": "mx1.mails.now",
"priority": "10",
"status": "Not checked"
},
{
"type": "MX",
"name": "team.example.com",
"value": "mx2.mails.now",
"priority": "20",
"status": "Not checked"
}
]
},
"support.example.com": {
"status": "Created successfully.",
"records": [
{
"type": "MX",
"name": "support.example.com",
"value": "mx1.mails.now",
"priority": "10",
"status": "Not checked"
},
{
"type": "MX",
"name": "support.example.com",
"value": "mx2.mails.now",
"priority": "20",
"status": "Not checked"
}
]
}
}
},
"status": "completed",
"task_id": "202"
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 404 - Task ID was not found for this API key.
HTTP 422 - Task type does not match this endpoint.
HTTP 422 - Dynamic failure message from provisioning.
Notes
`status` values are the same as other task endpoints (`queued`, `running`, `completed`, `failed`).
Responses include `Task_id` (integer) and `task_id` (same value as a string).
List Domains
Returns all domains for the API key owner account, keyed by domain name.
Header auth required: `Authorization: Bearer <key>` or `X-Api-Key`.
Field
Type
Required
Description
Request Example
curl --fail-with-body --silent --show-error \
"{{ url('/api/v1/list/domain') }}" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Success Response
{
"total_domain": 2,
"results": {
"example.com": {
"status": "verified",
"domain_type": "root",
"domain_quota": "0GB",
"mailbox_count": "15",
"created_at": "14-04-2026"
},
"team.example.com": {
"status": "verified",
"domain_type": "sub",
"domain_quota": "0GB",
"mailbox_count": "3",
"created_at": "15-04-2026"
}
},
"status": "success"
}
Error Responses
HTTP 401 - Invalid API key.
Notes
`domain_type` is `root` or `sub`.
`domain_quota` is a string with a `GB` suffix; `0GB` means unlimited in list responses (non-zero may appear on older rows).
POST
/api/v1/delete/domain/bulk
Bulk Delete Domains
Queues removal of up to 10 domains (root or sub-domain hostnames) owned by your account. Deletes run sequentially on the mail server; there is no artificial delay between items.
Header auth required: `Authorization: Bearer <key>` or `X-Api-Key` with `write` permission.
Field
Type
Required
Description
Domains
string[]
Yes
Fully qualified hostnames to remove (1–10 per request). Duplicates are rejected. Same hostname rules as create domain (no scheme; valid dotted hostname).
Request Example
curl --fail-with-body --silent --show-error \
-X POST "{{ url('/api/v1/delete/domain/bulk') }}" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"Domains": ["old.example.com", "legacy.example.com"]
}'
Success Response
{
"status": "success",
"task_id": 801
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - An active pricing plan is required before you can create, bulk-delete, or manage domains, subdomains, or mailboxes via the API.
HTTP 422 - Validation error (empty array, too many domains, invalid hostname, or duplicate entries).
HTTP 429 - Too many requests (bulk domain delete is limited to one successfully enqueued call per 5 minutes per API key and IP).
Notes
Cooldown: one successfully enqueued call per 5 minutes per API key and IP; HTTP 422 does not count. Mailbox bulk delete uses a separate counter of the same length.
Poll `GET /api/v1/get/delete/domain/bulk?task_id=…` until `completed` or `failed`.
When `completed`, `results` entries use `deleted`, `failed`, or `skipped` with optional `reason`; partial failures still yield task `completed`.
Deleting a root domain removes descendant hostnames and their mailboxes in dependency order.
GET
/api/v1/get/delete/domain/bulk?task_id={task_id}
Get Bulk Delete Domains Task
Polls a bulk domain delete task created by `POST /api/v1/delete/domain/bulk`.
Header auth required: `Authorization: Bearer <key>` or `X-Api-Key` with `read` permission.
Field
Type
Required
Description
task_id
integer
Yes
Task identifier returned by Bulk Delete Domains.
Request Example
curl --fail-with-body --silent --show-error \
"{{ url('/api/v1/get/delete/domain/bulk') }}?task_id=801" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Success Response
{
"Task_id": 801,
"total_email": 0,
"domain": "old.example.com",
"results": {
"old.example.com": {
"status": "deleted"
},
"legacy.example.com": {
"status": "failed",
"reason": "Mail server rejected domain removal."
},
"missing.example.com": {
"status": "skipped",
"reason": "Domain not found for this account."
}
},
"status": "completed",
"task_id": "801"
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 404 - Task ID was not found for this API key.
HTTP 422 - Task type does not match this endpoint.
HTTP 422 - Dynamic failure message from `error_message` when the task fails.
Notes
`status` may be `queued`, `running`, `completed`, or `failed`. Only `failed` (task-level) returns HTTP 422 with `reason` from the task.
Per-domain outcomes (`deleted`, `failed`, or `skipped`) appear inside `results` while the overall task can still be `completed`.
POST
/api/v1/create/mailbox/single
Create Single Mailbox
Queues one mailbox creation request for a domain that belongs to your account.
Header auth required: `Authorization: Bearer <key>` or `X-Api-Key`.
Field
Type
Required
Description
Email_fullname
string
Yes
Display name stored on the mailbox (not the email local-part).
single_bulk
string
Yes
Must be `single`.
Domain
string
Yes
Target domain hostname.
Params
object
Yes
Payload object for mailbox provisioning details.
Params.email_id
string
Yes
Mailbox address. Must belong to the provided Domain.
Params.password
string|integer
Yes
Mailbox password string (minimum 8 characters) or numeric `0` to auto-generate a secure password (20+ chars).
Params.reputation_level_id
integer
No
Optional active reputation level ID to assign at create.
Params.send_pattern_id
integer
No
Optional send pattern ID owned by the API key user (see List Send Patterns). Patterns assigned to mailboxes cannot be deleted in Settings until reassigned.
Params.sender_signature_id
integer
No
Optional sender settings (signature) ID owned by the API key user (see List Sender Signatures). Signatures assigned to mailboxes cannot be deleted in Settings until reassigned.
Request Example
curl --fail-with-body --silent --show-error \
-X POST "{{ url('/api/v1/create/mailbox/single') }}" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"Email_fullname": "John Doe",
"single_bulk": "single",
"Domain": "example.com",
"Params": {
"email_id": "john@example.com",
"password": 0
}
}'
Success Response
{
"status": "success",
"task_id": 123
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - An active pricing plan is required before you can create domains, subdomains, or mailboxes via the API.
HTTP 404 - Domain not found for this account.
HTTP 422 - First validation error message (invalid body fields).
Notes
Invalid bodies return HTTP 422 before enqueue. Only numeric `0` for `Params.password` triggers auto-generation (string `"0"` is rejected).
Poll `GET /api/v1/get/mailbox/single?task_id=…`; remote failures return HTTP 422 on that poll.
Create and manage send patterns / sender signatures in the dashboard Settings pages. Use List Send Patterns and List Sender Signatures to discover IDs for assignment.
POST
/api/v1/create/mailbox/bulk
Create Bulk Mailboxes
Queues a bulk mailbox provisioning task and returns a task ID for later retrieval.
Header auth required: `Authorization: Bearer <key>` or `X-Api-Key`.
Field
Type
Required
Description
Email_fullname
string
Yes
Display name used with internal rules to derive unique mailbox local-parts.
single_bulk
string
Yes
Must be `bulk`.
Domain
string
Yes
Target domain hostname.
Params
object
Yes
Payload object for mailbox provisioning details.
Params.mailbox_no
integer
Yes
How many mailboxes to create (must be between 1 and 100).
Params.password
string|integer
Yes
Shared password string for the batch (minimum 8 characters), or numeric `0` to generate a unique secure password (20+ chars) per mailbox.
Params.reputation_level_id
integer
No
Optional active reputation level ID applied to every mailbox in the batch.
Params.send_pattern_id
integer
No
Optional send pattern ID owned by the API key user; applied to every mailbox in the batch. Patterns assigned to mailboxes cannot be deleted in Settings until reassigned.
Params.sender_signature_id
integer
No
Optional sender settings (signature) ID owned by the API key user; applied to every mailbox in the batch. Signatures assigned to mailboxes cannot be deleted in Settings until reassigned.
Request Example
curl --fail-with-body --silent --show-error \
-X POST "{{ url('/api/v1/create/mailbox/bulk') }}" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"Email_fullname": "Team Member",
"single_bulk": "bulk",
"Domain": "example.com",
"Params": {
"mailbox_no": 25,
"password": 0
}
}'
Success Response
{
"status": "success",
"task_id": 456
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - An active pricing plan is required before you can create domains, subdomains, or mailboxes via the API.
HTTP 404 - Domain not found for this account.
HTTP 422 - First validation error message (invalid body fields).
HTTP 429 - Bulk mailbox requests are limited to once per 2 minutes for this domain and API key.
Notes
After a successful run: at most one bulk create per 2 minutes per API key and target hostname.
`Params.mailbox_no` must be between 1 and 100.
If a generated mailbox address already exists, it is skipped and the task continues creating the remaining addresses.
If all requested addresses already exist, the task still completes successfully with `total_email` set to `0` and an empty `results` object.
Only numeric `0` for `Params.password` triggers per-mailbox auto-generation (string `"0"` is rejected).
Poll `GET /api/v1/get/mailbox/bulk?task_id=…`; remote failures return HTTP 422 on that poll.
GET
/api/v1/get/mailbox/single?task_id={task_id}
Get Single Mailbox Task
Fetches status and final result for a single mailbox provisioning task.
Header auth required: `Authorization: Bearer <key>` or `X-Api-Key`.
Field
Type
Required
Description
task_id
integer
Yes
Task identifier returned by create endpoint.
Request Example
curl --fail-with-body --silent --show-error \
"{{ url('/api/v1/get/mailbox/single') }}?task_id=123" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Success Response
{
"Task_id": 123,
"total_email": 1,
"domain": "example.com",
"results": {
"john@example.com": {
"email": "john@example.com",
"password": "SecurePass123",
"quota": "0MB",
"domain": "example.com",
"provisioning": "pending",
"create_date": "2026-04-26 16:45:00"
}
},
"status": "completed",
"task_id": "123"
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 404 - Task ID was not found for this API key.
HTTP 422 - Task type does not match this endpoint.
HTTP 422 - Dynamic failure message from `error_message` when the task fails.
Notes
`status` is `queued`, `running`, `completed`, or `failed`. While pending, `results` is often empty.
Both `Task_id` (int) and `task_id` (string) are returned with the same value.
When `completed`, each entry includes `email`, `password`, `quota`, `domain`, `provisioning`, `create_date`, reputation fields, `send_pattern_id`, and `sender_signature_id` (no per-entry `status`).
If create used `Params.password: 0`, the response `password` is generated per mailbox.
GET
/api/v1/get/mailbox/bulk?task_id={task_id}
Get Bulk Mailbox Task
Fetches status and per-mailbox results for a bulk mailbox provisioning task.
Header auth required: `Authorization: Bearer <key>` or `X-Api-Key`.
Field
Type
Required
Description
task_id
integer
Yes
Task identifier returned by bulk create endpoint.
Request Example
curl --fail-with-body --silent --show-error \
"{{ url('/api/v1/get/mailbox/bulk') }}?task_id=456" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Success Response
{
"Task_id": 456,
"total_email": 25,
"domain": "example.com",
"results": {
"team1@example.com": {
"status": "Created successfully.",
"password": "kL4!pQ9#uD2@xM7&zT8w"
},
"team2@example.com": {
"status": "Created successfully.",
"password": "rN6$hS1*eV0!cB3%yK5m"
}
},
"status": "completed",
"task_id": "456"
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 404 - Task ID was not found for this API key.
HTTP 422 - Task type does not match this endpoint.
HTTP 422 - Dynamic failure message from `error_message` when the task fails.
Notes
`status` follows the same lifecycle as single mailbox tasks.
Responses include `Task_id` (integer) and `task_id` (same value as a string).
When some requested addresses already exist, those addresses are skipped and `total_email` reflects only newly created mailboxes.
If all requested addresses already exist, the task still completes successfully with `total_email` set to `0` and an empty `results` object.
Results include mailbox-by-mailbox status details when `completed`.
If bulk create used numeric `Params.password: 0`, each mailbox result includes its own generated `password` value.
POST
/api/v1/delete/mailbox/bulk
Bulk Delete Mailboxes
Queues removal of up to 100 mailbox addresses owned by your account. Deletes run sequentially; there is no artificial delay between items.
Header auth required: `Authorization: Bearer <key>` or `X-Api-Key` with `write` permission.
Field
Type
Required
Description
Mailboxes
string[]
Yes
Full RFC email addresses (1–100 per request). Duplicates are rejected.
Request Example
curl --fail-with-body --silent --show-error \
-X POST "{{ url('/api/v1/delete/mailbox/bulk') }}" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"Mailboxes": ["a@example.com", "b@example.com"]
}'
Success Response
{
"status": "success",
"task_id": 802
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - An active pricing plan is required before you can create, bulk-delete, or manage domains, subdomains, or mailboxes via the API.
HTTP 422 - Validation error (empty array, too many addresses, invalid email, or duplicate entries).
HTTP 429 - Too many requests (bulk mailbox delete is limited to one successfully enqueued call per 5 minutes per API key and IP).
Notes
Cooldown: one successfully enqueued call per 5 minutes per API key and IP; HTTP 422 does not count. Domain bulk delete uses a separate counter of the same length.
Poll `GET /api/v1/get/delete/mailbox/bulk?task_id=…` until `completed` or `failed`.
When `completed`, `results` entries use `deleted`, `failed`, or `skipped` with optional `reason`.
GET
/api/v1/get/delete/mailbox/bulk?task_id={task_id}
Get Bulk Delete Mailboxes Task
Polls a bulk mailbox delete task created by `POST /api/v1/delete/mailbox/bulk`.
Header auth required: `Authorization: Bearer <key>` or `X-Api-Key` with `read` permission.
Field
Type
Required
Description
task_id
integer
Yes
Task identifier returned by Bulk Delete Mailboxes.
Request Example
curl --fail-with-body --silent --show-error \
"{{ url('/api/v1/get/delete/mailbox/bulk') }}?task_id=802" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Success Response
{
"Task_id": 802,
"total_email": 2,
"domain": "example.com",
"results": {
"a@example.com": {
"status": "deleted"
},
"b@example.com": {
"status": "failed",
"reason": "Mail server rejected mailbox removal."
},
"gone@example.com": {
"status": "skipped",
"reason": "Mailbox not found for this account."
}
},
"status": "completed",
"task_id": "802"
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 404 - Task ID was not found for this API key.
HTTP 422 - Task type does not match this endpoint.
HTTP 422 - Dynamic failure message from `error_message` when the task fails.
Notes
`total_email` mirrors the request size (count of addresses submitted), not the number successfully deleted.
Per-mailbox outcomes (`deleted`, `failed`, or `skipped`) appear inside `results` while the overall task can still be `completed`.
GET
/api/v1/list/mailbox?domain={domain}&include_credentials={0|1}
List Mailboxes
Returns all mailboxes for a specific owned domain, keyed by full email address.
Header auth required: `Authorization: Bearer <key>` or `X-Api-Key`.
Field
Type
Required
Description
domain
string
Yes
Domain to list mailboxes for.
include_credentials
boolean
No
Include `imap_credentials` in each mailbox result when true.
Request Example
curl --fail-with-body --silent --show-error \
"{{ url('/api/v1/list/mailbox') }}?domain=example.com&include_credentials=1" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Success Response
{
"domain": "example.com",
"results": {
"john@example.com": {
"provisioning_status": "active",
"mailbox_quota": "0MB",
"imap_credentials": {
"host": "imap.example.com",
"port": 993,
"encryption": "tls"
},
"created_at": "14-04-2026",
"reputation_level_id": 1,
"level_name": "Starter",
"daily_send_limit": 20,
"hourly_send_limit": 5,
"per_minute_send_limit": 1,
"send_pattern_id": null,
"sender_signature_id": null
}
},
"status": "success"
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 404 - Domain not found for this account.
Notes
`imap_credentials` only when `include_credentials=true`.
`mailbox_quota` is a string with an `MB` suffix; `0MB` means unlimited (non-zero may appear on older rows).
Each mailbox result includes `reputation_level_id`, `level_name`, send limits, `send_pattern_id`, and `sender_signature_id` (nullable).
GET
/api/v1/list/send-pattern
List Send Patterns
Returns send patterns owned by the API key user, including how many mailboxes currently use each pattern.
Header auth required: `Authorization: Bearer <key>` or `X-Api-Key`.
Field
Type
Required
Description
Request Example
curl --fail-with-body --silent --show-error \
"{{ url('/api/v1/list/send-pattern') }}" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Success Response
{
"total": 1,
"results": [
{
"id": 12,
"name": "Warm mailbox",
"daily_send_limit": 20,
"ramp_up_percent_per_day": 10,
"ramp_up_mode": "percent",
"max_send_limit": 100,
"send_interval_seconds": 45,
"assigned_mailbox_count": 2
}
],
"status": "success"
}
Error Responses
HTTP 401 - Invalid API key.
Notes
Create and edit patterns in Settings → Send Pattern. Patterns with `assigned_mailbox_count` > 0 cannot be deleted until mailboxes are reassigned.
Use `id` as `Params.send_pattern_id` when creating mailboxes.
GET
/api/v1/list/sender-signature
List Sender Signatures
Returns sender settings (signatures) owned by the API key user, including how many mailboxes currently use each signature.
Header auth required: `Authorization: Bearer <key>` or `X-Api-Key`.
Field
Type
Required
Description
Request Example
curl --fail-with-body --silent --show-error \
"{{ url('/api/v1/list/sender-signature') }}" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Success Response
{
"total": 1,
"results": [
{
"id": 8,
"name": "Work signature",
"reply_to_email": "replies@example.com",
"first_name": "Alex",
"last_name": "Sender",
"from_name": "Alex Sender",
"assigned_mailbox_count": 1
}
],
"status": "success"
}
Error Responses
HTTP 401 - Invalid API key.
Notes
Create and edit signatures in Settings → Sender Settings. Signatures with `assigned_mailbox_count` > 0 cannot be deleted until mailboxes are reassigned.
Use `id` as `Params.sender_signature_id` when creating mailboxes.
POST
/api/v1/create/alias
Create Alias
Queues an alias or forwarder. `goto` can be a local mailbox or external address(es). Use `Params.catch_all=true` for @domain catch-all.
Header auth required: `Authorization: Bearer <key>` or `X-Api-Key`.
Field
Type
Required
Description
Domain
string
Yes
Owned domain hostname.
Params.address
string
Yes
Alias address on the domain (omit when catch_all is true).
Params.goto
string|array
Yes
Destination mailbox or external email(s). Comma-separated string or JSON array.
Params.catch_all
boolean
No
Create catch-all `@domain`.
Params.sender_allowed
boolean
No
Allow sending as this alias (send-as).
Request Example
curl --fail-with-body --silent --show-error \
-X POST "{{ url('/api/v1/create/alias') }}" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"Domain": "example.com",
"Params": {
"address": "sales@example.com",
"goto": "team@example.com"
}
}'
Success Response
{
"status": "success",
"task_id": 123
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 404 - Domain not found for this account.
HTTP 422 - Alias already exists / goto invalid / plan limit reached.
Notes
Poll `GET /api/v1/get/alias?task_id=` for completion.
External destinations are forwarders; local mailbox destinations are aliases.
POST
/api/v1/create/alias/bulk
Create Bulk Aliases
Queues multiple aliases in one task via `Params.aliases`.
Header auth required: `Authorization: Bearer <key>` or `X-Api-Key`.
Field
Type
Required
Description
Domain
string
Yes
Owned domain hostname.
Params.aliases
array
Yes
Array of `{address, goto}` objects.
Request Example
curl --fail-with-body --silent --show-error \
-X POST "{{ url('/api/v1/create/alias/bulk') }}" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"Domain": "example.com",
"Params": {
"aliases": [
{"address": "a@example.com", "goto": "team@example.com"},
{"address": "b@example.com", "goto": "ops@gmail.com"}
]
}
}'
Success Response
{
"status": "success",
"task_id": 124
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 422 - Validation or capacity error.
Notes
Poll `GET /api/v1/get/alias?task_id=`.
Edit Alias
Queues an update for an existing alias (`goto`, `active`, `sender_allowed`).
Header auth required: `Authorization: Bearer <key>` or `X-Api-Key`.
Field
Type
Required
Description
address
string
Yes
Existing alias address.
goto
string|array
No
Updated destination(s).
active
boolean
No
Enable or disable the alias.
sender_allowed
boolean
No
Allow sending as this alias.
Request Example
curl --fail-with-body --silent --show-error \
-X POST "{{ url('/api/v1/edit/alias') }}" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"address": "sales@example.com",
"goto": "newteam@example.com",
"active": true
}'
Success Response
{
"status": "success",
"task_id": 125
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 422 - Alias not found or goto invalid.
Notes
Poll `GET /api/v1/get/alias?task_id=`.
GET
/api/v1/get/alias?task_id={id}
Get Alias Task
Poll create/edit/bulk alias task status.
Header auth required: `Authorization: Bearer <key>` or `X-Api-Key`.
Field
Type
Required
Description
task_id
integer
Yes
Task id from create/edit endpoints.
Request Example
curl --fail-with-body --silent --show-error \
"{{ url('/api/v1/get/alias') }}?task_id=123" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Success Response
{
"Task_id": 123,
"status": "completed",
"results": [],
"task_id": "123"
}
Error Responses
HTTP 404 - Task ID was not found for this API key.
HTTP 422 - Task type does not match this endpoint.
GET
/api/v1/list/alias?domain={domain}
List Aliases
Lists aliases for an owned domain.
Header auth required: `Authorization: Bearer <key>` or `X-Api-Key`.
Field
Type
Required
Description
domain
string
Yes
Domain hostname.
Request Example
curl --fail-with-body --silent --show-error \
"{{ url('/api/v1/list/alias') }}?domain=example.com" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Success Response
{
"domain": "example.com",
"results": {
"sales@example.com": {
"goto": [
"team@example.com"
],
"active": true,
"is_catch_all": false,
"provisioning_status": "active"
}
},
"status": "success"
}
Error Responses
HTTP 404 - Domain not found for this account.
POST
/api/v1/delete/alias/bulk
Bulk Delete Aliases
Queues deletion of one or more aliases by address.
Header auth required: `Authorization: Bearer <key>` or `X-Api-Key`.
Field
Type
Required
Description
Aliases
array
Yes
Alias addresses to delete.
Request Example
curl --fail-with-body --silent --show-error \
-X POST "{{ url('/api/v1/delete/alias/bulk') }}" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"Aliases": ["sales@example.com"]
}'
Success Response
{
"status": "success",
"task_id": 126
}
Error Responses
HTTP 429 - Bulk delete cooldown.
Notes
Poll `GET /api/v1/get/delete/alias/bulk?task_id=`.
GET
/api/v1/get/delete/alias/bulk?task_id={id}
Get Bulk Delete Aliases Task
Poll bulk alias delete task status.
Header auth required: `Authorization: Bearer <key>` or `X-Api-Key`.
Field
Type
Required
Description
task_id
integer
Yes
Task id from delete endpoint.
Request Example
curl --fail-with-body --silent --show-error \
"{{ url('/api/v1/get/delete/alias/bulk') }}?task_id=126" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Success Response
{
"Task_id": 126,
"status": "completed",
"results": [],
"task_id": "126"
}
Error Responses
HTTP 404 - Task ID was not found for this API key.
POST
/api/v1/mail/inbound
Inbound Email
Accepts inbound payloads for a tenant mailbox and queues processing. Optional fields include `from_name`, `cc`, `bcc`, `body_html`, `attachments`, and `headers`.
Requires API key with `inbound` permission.
Field
Type
Required
Description
message_id
string
Yes
Upstream message identifier. Must be unique per mailbox.
from_email
string
Yes
Sender email address.
to_email
string
Yes
Recipient mailbox address owned by your tenant.
subject
string
Yes
Email subject line.
received_at
ISO datetime
Yes
Inbound receive timestamp.
Request Example
curl --fail-with-body --silent --show-error \
-X POST "{{ url('/api/v1/mail/inbound') }}" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"message_id": "<mail-message-id>",
"from_email": "sender@example.com",
"to_email": "user@example.com",
"subject": "Hello",
"body_text": "Body",
"received_at": "2026-04-28T10:00:00Z"
}'
Success Response
{
"status": "accepted",
"message_id": "<mail-message-id>"
}
Error Responses
HTTP 401 - API key is required or invalid.
HTTP 403 - API key lacks inbound permission.
HTTP 409 - Duplicate message_id.
HTTP 422 - Unknown mailbox or invalid payload.
Notes
Inbound processing is asynchronous.
List Emails
Returns tenant-scoped inbox emails with cursor pagination.
Requires API key with `read` permission.
Field
Type
Required
Description
mailbox_id
integer
No
Filter by mailbox.
unread
boolean
No
Return unread only.
since
ISO datetime
No
Filter received_at lower bound.
before
ISO datetime
No
Filter received_at upper bound.
q
string
No
Search subject, body text, or sender address.
Request Example
curl "{{ url('/api/v1/emails?unread=1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Success Response
{
"data": [],
"meta": {
"next_cursor": null,
"prev_cursor": null
}
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - API key lacks read permission.
Notes
Query is always tenant-isolated.
GET
/api/v1/emails/{email}
Get Email
Returns one tenant-scoped email with attachment metadata.
Requires API key with `read` permission.
Field
Type
Required
Description
email
integer
Yes
Email record ID (route parameter `{email}`).
Request Example
curl "{{ url('/api/v1/emails/123') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Success Response
{
"data": {
"id": 123
}
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 404 - Email not found in your tenant scope.
Notes
Soft-deleted records are not returned from this endpoint.
GET
/api/v1/emails/sync?since=ISO_TIMESTAMP
Sync Emails
Incremental polling endpoint for new, updated, and deleted emails.
Requires API key with `read` permission.
Field
Type
Required
Description
since
ISO datetime
Yes
Sync lower bound using updated markers.
Request Example
curl "{{ url('/api/v1/emails/sync?since=2026-04-28T00:00:00Z') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Success Response
{
"data": [],
"meta": {
"next_cursor": null,
"prev_cursor": null
}
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 422 - The since field is required and must be a valid date.
Notes
Deleted emails are returned with deletion markers to support tombstones.
POST
/api/v1/emails/{email}/read
Mark Email Read
Marks an email as read and emits an email.read webhook event.
Requires API key with `write` permission.
Field
Type
Required
Description
email
integer
Yes
Email record ID (route parameter `{email}`).
Request Example
curl -X POST "{{ url('/api/v1/emails/123/read') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - API key lacks write permission.
HTTP 404 - Email not found in your tenant scope.
Notes
This endpoint is idempotent.
DELETE
/api/v1/emails/{email}
Delete Email
Soft-deletes an email and emits an email.deleted webhook event.
Requires API key with `write` permission.
Field
Type
Required
Description
email
integer
Yes
Email record ID (route parameter `{email}`).
Request Example
curl -X DELETE "{{ url('/api/v1/emails/123') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - API key lacks write permission.
HTTP 404 - Email not found in your tenant scope.
Notes
Record is soft deleted, not permanently removed.
GET
/api/v1/emails/{email}/attachments/{attachment}
Attachment URL
Returns a temporary signed attachment download URL.
Requires API key with `read` permission.
Field
Type
Required
Description
email
integer
Yes
Email record ID (route parameter `{email}`).
attachment
integer
Yes
Attachment record ID (route parameter `{attachment}`).
Request Example
curl "{{ url('/api/v1/emails/123/attachments/456') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Success Response
{
"data": {
"url": "https://signed-url",
"expires_at": "2026-04-28T10:10:00Z"
}
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 404 - Email or attachment not found in your tenant scope.
Notes
URL expires shortly after issuance.
Register Webhook
Creates a tenant-scoped webhook target for email events.
Requires API key with `webhook` permission.
Field
Type
Required
Description
url
url
Yes
Destination webhook URL.
events
array
Yes
Allowed: email.received, email.read, email.deleted, sequencer.email.sent, sequencer.email.opened, sequencer.email.clicked, sequencer.lead.replied, sequencer.lead.bounced, sequencer.lead.unsubscribed, sequencer.campaign.completed.
Request Example
curl -X POST "{{ url('/api/v1/webhooks') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" -H "Content-Type: application/json" -d '{"url":"https://example.com/hook","events":["email.received"]}'
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - API key lacks webhook permission.
HTTP 422 - Invalid URL or event selection.
Notes
Deliveries are queued and signed using the webhook secret and timestamp headers.
List Webhooks
Returns tenant-scoped webhook endpoints.
Requires API key with `webhook` permission.
Field
Type
Required
Description
Request Example
curl "{{ url('/api/v1/webhooks') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Success Response
{
"data": [
{
"id": 1,
"url": "https://example.com/hook",
"events": [
"email.received"
],
"is_active": true
}
]
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - API key lacks webhook permission.
Notes
Each row includes `last_triggered_at` when the webhook has fired.
PATCH
/api/v1/webhooks/{webhook}
Update Webhook
Updates URL, events, or active state.
Requires API key with `webhook` permission.
Field
Type
Required
Description
webhook
integer
Yes
Webhook ID (route parameter `{webhook}`).
url
url
No
Destination webhook URL.
events
array
No
Allowed: email.received, email.read, email.deleted, sequencer.email.sent, sequencer.email.opened, sequencer.email.clicked, sequencer.lead.replied, sequencer.lead.bounced, sequencer.lead.unsubscribed, sequencer.campaign.completed.
is_active
boolean
No
Whether webhook should receive deliveries.
Request Example
curl -X PATCH "{{ url('/api/v1/webhooks/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" -H "Content-Type: application/json" -d '{"is_active":false}'
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - API key lacks webhook permission.
HTTP 404 - Webhook not found in your tenant scope.
HTTP 422 - Invalid URL or event selection.
Notes
Include at least one of `url`, `events`, or `is_active`.
DELETE
/api/v1/webhooks/{webhook}
Delete Webhook
Deletes a tenant webhook endpoint.
Requires API key with `webhook` permission.
Field
Type
Required
Description
webhook
integer
Yes
Webhook ID (route parameter `{webhook}`).
Request Example
curl -X DELETE "{{ url('/api/v1/webhooks/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - API key lacks webhook permission.
HTTP 404 - Webhook not found in your tenant scope.
Notes
Permanent delete; queued delivery rows for this webhook are removed.
GET
/api/v1/sequencer/campaigns
List Sequencer Campaigns
Returns paginated campaigns for the tenant.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
status
string
No
Filter by status (draft, active, paused).
q
string
No
Search campaign name.
Request Example
curl -X GET "{{ url('/api/v1/sequencer/campaigns') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
POST
/api/v1/sequencer/campaigns
Create Campaign
Creates a draft campaign. Omitting sequence_id auto-provisions a linked sequence with default schedule.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
name
string
Yes
Campaign name.
sequence_id
integer
No
Existing sequence ID. Omitted values auto-provision a new sequence.
lead_list_id
integer
No
Optional default lead list.
mailbox_ids
array
No
Sender mailbox IDs for rotation. Required before enroll.
settings
object
No
daily_send_limit, ramp_up_percent_per_day, ramp_up_mode (percent|count), track_opens, track_clicks, schedule_mode (now|future).
sending_window
object
No
days[], start_hour, start_minute, end_hour, end_minute.
sending_timezone
string
No
IANA timezone (default UTC).
Request Example
curl -X POST "{{ url('/api/v1/sequencer/campaigns') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" -H "Content-Type: application/json" -d '{}'
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
Notes
Auto-provisioned campaigns include a default Mon–Fri 08:00–18:00 UTC sending window.
Assign mailbox_ids before calling enroll.
GET
/api/v1/sequencer/campaigns/{campaign}
Show Campaign
Returns campaign details with sequence and mailboxes.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
campaign
integer
Yes
Campaign ID.
Request Example
curl -X GET "{{ url('/api/v1/sequencer/campaigns/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
PATCH
/api/v1/sequencer/campaigns/{campaign}
Update Campaign
Updates campaign settings, schedule, mailboxes, or activates a draft campaign.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
campaign
integer
Yes
Campaign ID.
name
string
No
Campaign name.
status
string
No
Set to active on draft campaigns to launch (runs readiness checks).
mailbox_ids
array
No
Mailbox IDs for sender rotation. Active campaigns may add mailboxes but cannot drop existing ones (pause first).
settings
object
No
daily_send_limit, ramp_up_percent_per_day, ramp_up_mode (percent|count), track_opens, track_clicks, schedule_mode.
sending_window
object
No
Active days and hours for sending.
sending_timezone
string
No
IANA timezone.
Request Example
curl -X PATCH "{{ url('/api/v1/sequencer/campaigns/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" -H "Content-Type: application/json" -d '{}'
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
Notes
Activation from draft requires email steps, mailboxes, daily_send_limit > 0, enrolled leads, and a valid sending_window.
Active campaigns cannot remove sender mailboxes via mailbox_ids; pause the campaign first.
HTTP 422 responses include failures[] with human-readable reasons.
DELETE
/api/v1/sequencer/campaigns/{campaign}
Delete Campaign
Deletes a campaign.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
campaign
integer
Yes
Campaign ID.
Request Example
curl -X DELETE "{{ url('/api/v1/sequencer/campaigns/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
POST
/api/v1/sequencer/campaigns/{campaign}/enroll
Enroll Leads in Campaign
Enrolls lead IDs or an entire lead list into a campaign.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
campaign
integer
Yes
Campaign ID.
lead_ids
array
No
Lead IDs to enroll.
lead_list_id
integer
No
Lead list ID to bulk enroll.
Request Example
curl -X POST "{{ url('/api/v1/sequencer/campaigns/1/enroll') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" -H "Content-Type: application/json" -d '{}'
Success Response
{
"status": "completed",
"enrolled": 2,
"skipped": 0
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
Notes
Returns HTTP 422 when the campaign has no mailboxes configured.
Provide lead_ids or lead_list_id (not both required, but at least one).
POST
/api/v1/sequencer/campaigns/{campaign}/pause
Pause Campaign
Pauses an active campaign.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
campaign
integer
Yes
Campaign ID.
Request Example
curl -X POST "{{ url('/api/v1/sequencer/campaigns/1/pause') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" -H "Content-Type: application/json" -d '{}'
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
POST
/api/v1/sequencer/campaigns/{campaign}/resume
Resume Campaign
Resumes a paused campaign. Runs the same readiness checks as draft activation (email steps, mailboxes, daily limit, leads, schedule).
Requires API key with `sequencer` permission.
Field
Type
Required
Description
campaign
integer
Yes
Campaign ID.
Request Example
curl -X POST "{{ url('/api/v1/sequencer/campaigns/1/resume') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" -H "Content-Type: application/json" -d '{}'
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
Notes
HTTP 422 when readiness checks fail; response includes reason and failures[].
GET
/api/v1/sequencer/campaigns/{campaign}/analytics
Campaign Analytics
Returns funnel metrics, engagement rates, and breakdowns by mailbox, step, and domain.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
campaign
integer
Yes
Campaign ID.
Request Example
curl -X GET "{{ url('/api/v1/sequencer/campaigns/1/analytics') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Success Response
{
"data": {
"campaign_id": 1,
"funnel": {
"total_enrolled": 100,
"sent": 80,
"opened": 40,
"clicked": 12,
"replied": 5,
"bounced": 2
},
"rates": {
"open_rate": 50,
"click_rate": 15,
"reply_rate": 6.25,
"bounce_rate": 2.5
},
"by_mailbox": [],
"by_step": [],
"by_domain": []
}
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
GET
/api/v1/sequencer/sequences
List Sequences
Returns paginated email sequences for the tenant.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
q
string
No
Search sequence name.
Request Example
curl -X GET "{{ url('/api/v1/sequencer/sequences') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
POST
/api/v1/sequencer/sequences
Create Sequence
Creates a sequence with optional initial steps.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
name
string
Yes
Sequence name.
steps
array
No
Initial step definitions.
Request Example
curl -X POST "{{ url('/api/v1/sequencer/sequences') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" -H "Content-Type: application/json" -d '{}'
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
GET
/api/v1/sequencer/sequences/{sequence}
Show Sequence
Returns a sequence with steps.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
sequence
integer
Yes
Sequence ID.
Request Example
curl -X GET "{{ url('/api/v1/sequencer/sequences/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
PATCH
/api/v1/sequencer/sequences/{sequence}
Update Sequence
Updates sequence metadata and optional steps.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
sequence
integer
Yes
Sequence ID.
name
string
No
Sequence name.
Request Example
curl -X PATCH "{{ url('/api/v1/sequencer/sequences/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" -H "Content-Type: application/json" -d '{}'
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
PUT
/api/v1/sequencer/sequences/{sequence}/steps
Sync Sequence Steps
Replaces sequence steps in one request.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
sequence
integer
Yes
Sequence ID.
steps
array
Yes
Ordered step payloads.
Request Example
curl -X PUT "{{ url('/api/v1/sequencer/sequences/1/steps') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" -H "Content-Type: application/json" -d '{}'
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
DELETE
/api/v1/sequencer/sequences/{sequence}/steps/{step}
Delete Sequence Step
Deletes a single sequence step.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
sequence
integer
Yes
Sequence ID.
step
integer
Yes
Sequence step ID.
Request Example
curl -X DELETE "{{ url('/api/v1/sequencer/sequences/1/steps/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
DELETE
/api/v1/sequencer/sequences/{sequence}
Delete Sequence
Deletes a sequence.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
sequence
integer
Yes
Sequence ID.
Request Example
curl -X DELETE "{{ url('/api/v1/sequencer/sequences/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
GET
/api/v1/sequencer/leads
List Sequencer Leads
Returns tenant-scoped leads with cursor pagination.
Requires API key with `sequencer` permission and sequencer_enabled plan feature.
Field
Type
Required
Description
status
string
No
Filter by lead status.
list_id
integer
No
Filter by lead list ID.
tag
string
No
Filter by tag name.
saved_filter_id
integer
No
Apply a saved filter.
q
string
No
Search email, name, or company.
cursor
string
No
Cursor for pagination.
Request Example
curl -X GET "{{ url('/api/v1/sequencer/leads') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
POST
/api/v1/sequencer/leads
Create Sequencer Lead
Creates or updates a lead by email address.
Requires API key with `sequencer` permission and sequencer_enabled plan feature.
Field
Type
Required
Description
email
string
Yes
Lead email address.
first_name
string
No
First name. Nullable.
last_name
string
No
Last name. Nullable.
company
string
No
Company name. Nullable.
title
string
No
Job title. Nullable.
job_level
string
No
Job level (e.g. manager, vp). Nullable.
department
string
No
Department. Nullable.
experience
string
No
Experience range (e.g. 5-10 years). Nullable.
person_address
string
No
Person street address. Nullable.
person_city
string
No
Person city. Nullable.
person_state
string
No
Person state/region. Nullable.
person_country
string
No
Person country. Nullable.
phone
string
No
Phone number. Nullable.
linkedin_url
string
No
Person LinkedIn URL. Nullable.
website
string
No
Website URL. Nullable.
company_domain
string
No
Company domain. Nullable.
industry
string
No
Industry. Nullable.
employee_count
string
No
Employee count or range (e.g. 51-200). Nullable.
annual_revenue
string
No
Annual revenue or range (e.g. $10M-$50M). Nullable.
company_linkedin_url
string
No
Company LinkedIn URL. Nullable.
company_address
string
No
Company street address. Nullable.
company_city
string
No
Company city. Nullable.
company_state
string
No
Company state/region. Nullable.
company_country
string
No
Company country. Nullable.
technologies
array
No
List of technology strings. Nullable.
email_provider
string
No
Email provider (e.g. google, microsoft). Nullable.
timezone
string
No
IANA timezone. Nullable.
source
string
No
Lead source. Nullable; defaults to api when omitted.
last_updated
string
No
Enrichment freshness timestamp (parseable datetime). Nullable.
lead_score
integer
No
Lead score (unsigned integer). Nullable.
custom_fields
object
No
Arbitrary key/value bag for non-standard fields. Nullable.
Request Example
curl -X POST "{{ url('/api/v1/sequencer/leads') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" -H "Content-Type: application/json" -d '{}'
Success Response
{
"status": "created",
"data": {
"email": "lead@example.com"
}
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
POST
/api/v1/sequencer/leads/import
Import Sequencer Leads
Bulk import leads via multipart file, raw CSV string, or leads[] array. ≤50 rows sync (201); >50 rows queued ApiTask (202).
Requires API key with `sequencer` permission and sequencer_enabled plan feature.
Field
Type
Required
Description
file
file
No
Multipart upload field. Accepts csv, txt, xlsx, xls. Max 10 MB. Use multipart/form-data (omit Content-Type: application/json).
csv
string
No
Raw CSV string in JSON body. Max 10 KB. First row must be headers including email.
leads
array
No
Lead objects (max 1000). Each row requires email; optional first_name, last_name, company, title, phone, and other lead fields.
defaults.source
string
No
Optional default source applied to imported rows.
Request Example
curl -X POST "{{ url('/api/v1/sequencer/leads/import') }}" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" \
-F "file=@/path/to/folder/leads.csv"
Success Response
{
"status": "completed",
"mode": "sync",
"created": 1
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
Notes
Provide one of file, csv, or leads.
CSV/spreadsheet: first row is headers (case-insensitive); email column required. Unknown columns go into custom_fields.
Recognized columns include first_name, last_name, company, title, phone, linkedin_url, website, company_domain, industry, timezone, source, lead_score.
Async imports return task_id; poll GET /api/v1/sequencer/leads/import/{task}.
GET
/api/v1/sequencer/leads/import/{task}
Import Task Status
Poll async lead import task progress.
Requires API key with `sequencer` permission and sequencer_enabled plan feature.
Field
Type
Required
Description
task
integer
Yes
ApiTask ID from async import.
Request Example
curl -X GET "{{ url('/api/v1/sequencer/leads/import/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
GET
/api/v1/sequencer/leads/{lead}
Show Sequencer Lead
Returns a single lead with tags and metadata.
Requires API key with `sequencer` permission and sequencer_enabled plan feature.
Field
Type
Required
Description
lead
integer
Yes
Lead ID.
Request Example
curl -X GET "{{ url('/api/v1/sequencer/leads/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
PATCH
/api/v1/sequencer/leads/{lead}
Update Sequencer Lead
Updates lead profile fields and status.
Requires API key with `sequencer` permission and sequencer_enabled plan feature.
Field
Type
Required
Description
lead
integer
Yes
Lead ID.
first_name
string
No
First name.
status
string
No
Lead status enum value.
Request Example
curl -X PATCH "{{ url('/api/v1/sequencer/leads/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" -H "Content-Type: application/json" -d '{}'
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
DELETE
/api/v1/sequencer/leads/{lead}
Delete Sequencer Lead
Deletes a lead from the tenant workspace.
Requires API key with `sequencer` permission and sequencer_enabled plan feature.
Field
Type
Required
Description
lead
integer
Yes
Lead ID.
Request Example
curl -X DELETE "{{ url('/api/v1/sequencer/leads/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
GET
/api/v1/sequencer/lead-tags
List Lead Tags
Returns paginated Lead Tags for the tenant.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
Request Example
curl -X GET "{{ url('/api/v1/sequencer/lead-tags') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
POST
/api/v1/sequencer/lead-tags
Create Lead Tag
Creates a Lead Tag.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
name
string
Yes
Tag name.
color
string
No
Hex color.
Request Example
curl -X POST "{{ url('/api/v1/sequencer/lead-tags') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" -H "Content-Type: application/json" -d '{}'
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
GET
/api/v1/sequencer/lead-tags/{leadTag}
Show Lead Tag
Returns a single Lead Tag.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
leadTag
integer
Yes
Lead Tag ID.
Request Example
curl -X GET "{{ url('/api/v1/sequencer/lead-tags/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
PATCH
/api/v1/sequencer/lead-tags/{leadTag}
Update Lead Tag
Updates a Lead Tag.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
leadTag
integer
Yes
Lead Tag ID.
Request Example
curl -X PATCH "{{ url('/api/v1/sequencer/lead-tags/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" -H "Content-Type: application/json" -d '{}'
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
DELETE
/api/v1/sequencer/lead-tags/{leadTag}
Delete Lead Tag
Deletes a Lead Tag.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
leadTag
integer
Yes
Lead Tag ID.
Request Example
curl -X DELETE "{{ url('/api/v1/sequencer/lead-tags/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
GET
/api/v1/sequencer/lead-lists
List Lead Lists
Returns paginated Lead Lists for the tenant.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
Request Example
curl -X GET "{{ url('/api/v1/sequencer/lead-lists') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
POST
/api/v1/sequencer/lead-lists
Create Lead List
Creates a Lead List.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
name
string
Yes
List name.
description
string
No
Optional description.
lead_ids
array
No
Initial member lead IDs.
Request Example
curl -X POST "{{ url('/api/v1/sequencer/lead-lists') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" -H "Content-Type: application/json" -d '{}'
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
GET
/api/v1/sequencer/lead-lists/{leadList}
Show Lead List
Returns a single Lead List.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
leadList
integer
Yes
Lead List ID.
Request Example
curl -X GET "{{ url('/api/v1/sequencer/lead-lists/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
PATCH
/api/v1/sequencer/lead-lists/{leadList}
Update Lead List
Updates a Lead List.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
leadList
integer
Yes
Lead List ID.
Request Example
curl -X PATCH "{{ url('/api/v1/sequencer/lead-lists/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" -H "Content-Type: application/json" -d '{}'
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
DELETE
/api/v1/sequencer/lead-lists/{leadList}
Delete Lead List
Deletes a Lead List.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
leadList
integer
Yes
Lead List ID.
Request Example
curl -X DELETE "{{ url('/api/v1/sequencer/lead-lists/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
GET
/api/v1/sequencer/lead-notes
List Lead Notes
Returns paginated Lead Notes for the tenant.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
Request Example
curl -X GET "{{ url('/api/v1/sequencer/lead-notes') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
POST
/api/v1/sequencer/lead-notes
Create Lead Note
Creates a Lead Note.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
lead_id
integer
Yes
Lead ID.
body
string
Yes
Note body.
Request Example
curl -X POST "{{ url('/api/v1/sequencer/lead-notes') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" -H "Content-Type: application/json" -d '{}'
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
GET
/api/v1/sequencer/lead-notes/{leadNote}
Show Lead Note
Returns a single Lead Note.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
leadNote
integer
Yes
Lead Note ID.
Request Example
curl -X GET "{{ url('/api/v1/sequencer/lead-notes/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
PATCH
/api/v1/sequencer/lead-notes/{leadNote}
Update Lead Note
Updates a Lead Note.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
leadNote
integer
Yes
Lead Note ID.
Request Example
curl -X PATCH "{{ url('/api/v1/sequencer/lead-notes/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" -H "Content-Type: application/json" -d '{}'
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
DELETE
/api/v1/sequencer/lead-notes/{leadNote}
Delete Lead Note
Deletes a Lead Note.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
leadNote
integer
Yes
Lead Note ID.
Request Example
curl -X DELETE "{{ url('/api/v1/sequencer/lead-notes/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
GET
/api/v1/sequencer/saved-filters
List Saved Filters
Returns paginated Saved Filters for the tenant.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
Request Example
curl -X GET "{{ url('/api/v1/sequencer/saved-filters') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
POST
/api/v1/sequencer/saved-filters
Create Saved Filter
Creates a Saved Filter.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
name
string
Yes
Filter name.
filters
object
Yes
Filter criteria (status, q, tag, list_id).
Request Example
curl -X POST "{{ url('/api/v1/sequencer/saved-filters') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" -H "Content-Type: application/json" -d '{}'
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
GET
/api/v1/sequencer/saved-filters/{savedFilter}
Show Saved Filter
Returns a single Saved Filter.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
savedFilter
integer
Yes
Saved Filter ID.
Request Example
curl -X GET "{{ url('/api/v1/sequencer/saved-filters/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
PATCH
/api/v1/sequencer/saved-filters/{savedFilter}
Update Saved Filter
Updates a Saved Filter.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
savedFilter
integer
Yes
Saved Filter ID.
Request Example
curl -X PATCH "{{ url('/api/v1/sequencer/saved-filters/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" -H "Content-Type: application/json" -d '{}'
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
DELETE
/api/v1/sequencer/saved-filters/{savedFilter}
Delete Saved Filter
Deletes a Saved Filter.
Requires API key with `sequencer` permission.
Field
Type
Required
Description
savedFilter
integer
Yes
Saved Filter ID.
Request Example
curl -X DELETE "{{ url('/api/v1/sequencer/saved-filters/1') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
POST
/api/v1/sequencer/leads/webhook
Webhook Create Lead
Creates a lead from an inbound webhook payload.
Requires API key with `sequencer` permission and sequencer_enabled plan feature.
Field
Type
Required
Description
email
string
Yes
Lead email address.
list_id
integer
No
Optional lead list to attach.
Request Example
curl -X POST "{{ url('/api/v1/sequencer/leads/webhook') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" -H "Content-Type: application/json" -d '{}'
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Plan does not include Email Sequencer or key lacks permission.
HTTP 404 - Resource not found in tenant scope.
HTTP 422 - Validation error.
POST
/api/v1/transactional/send
Send Transactional Email
Queues a transactional email from a dashboard-saved message template. Subject and HTML come from the template after `{{token}}` substitution. Recipients are not stored as contacts.
Requires API key with `transactional` permission and plan feature `transactional_enabled`.
Field
Type
Required
Description
transactional_message_id
integer
Yes
Tenant template ID. Must be enabled and have a saved subject plus HTML.
to
object
Yes
`email` (required), `name` (optional).
from
object
Yes
`email` must match a tenant mailbox (case-insensitive). `name` optional; defaults to mailbox display name.
variables
object
No
Key/value map for `{{token}}` substitution in the saved template.
reply_to
string
No
Optional reply-to address.
headers
object
No
Custom headers. Only names starting with `X-` / `x-` are stored; others are dropped.
idempotency_key
string
No
Client-chosen unique key per logical send (max 191), e.g. order id or UUID. Same tenant + key + same payload replays the original send. Same key with a different payload returns HTTP 409. Omit to always create a new outbound. Never use a human description.
attachments
array
No
Optional base64 attachments (`filename`, `content_type`, `content`). Count/size/MIME limits in `config/transactional.php`.
Request Example
curl --fail-with-body --silent --show-error \
-X POST "{{ url('/api/v1/transactional/send') }}" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"transactional_message_id": 1,
"to": { "email": "user@example.com", "name": "Ada" },
"from": { "email": "noreply@yourdomain.com" },
"variables": { "first_name": "Ada" },
"idempotency_key": "order-42-welcome"
}'
Success Response
{
"status": "success",
"data": {
"id": 101,
"transactional_message_id": 1,
"status": "queued",
"channel": "transactional",
"from_address": "noreply@yourdomain.com",
"from_name": "Acme",
"to_addresses": [
"user@example.com"
],
"subject": "Hello Ada",
"message_id": null,
"idempotency_key": "order-42-welcome",
"failure_reason": null,
"queued_at": "2026-09-04T12:00:00.000000Z",
"sent_at": null,
"delivered_at": null,
"last_deferred_at": null,
"created_at": "2026-09-04T12:00:00.000000Z",
"delivery_events": []
},
"idempotent_replay": false
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - Your current plan does not include Transactional Email.
HTTP 403 - API key does not have transactional permission.
HTTP 409 - This idempotency_key was already used for a different send. Use a unique key per logical send, or omit idempotency_key.
HTTP 422 - Do not send subject; it is taken from the saved message template.
HTTP 422 - This message has no saved template.
HTTP 422 - The from email must belong to one of your mailboxes.
Notes
HTTP 202 on a new queue; HTTP 200 when `idempotency_key` replays an existing matching send (job is not dispatched again); HTTP 409 when the key was used for a different payload.
`status` is queue/SMTP acceptance; inbox confirmation is `delivered_at` / `delivery_events`.
Do not send `subject`, `message`, or `text`; they are prohibited. Design the template under Transactional → Email Templates.
No List-Unsubscribe headers are injected for transactional sends.
Open/click tracking follows the template `track_opens` / `track_clicks` flags.
Throttled at 60 requests/min per API key (`api-v1-transactional`).
GET
/api/v1/transactional/messages
List Transactional Messages
Lists transactional templates for the authenticated tenant (enabled and disabled). Bodies are not included.
Requires API key with `transactional` permission and plan feature `transactional_enabled`.
Field
Type
Required
Description
per_page
integer
No
Page size (1–100, default 50).
Request Example
curl "{{ url('/api/v1/transactional/messages') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Success Response
{
"data": [
{
"id": 1,
"name": "Password Reset",
"slug": null,
"description": null,
"subject": "Reset your password",
"enabled": true,
"required_variables": [],
"track_opens": true,
"track_clicks": true,
"source": "manual"
}
]
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - API key does not have transactional permission.
HTTP 403 - Your current plan does not include Transactional Email.
Notes
Create and edit templates in the dashboard under Transactional → Email Templates. There is no REST create/update for templates.
Response is a Laravel paginated resource (`data`, `links`, `meta`), not `{status: success}`.
`slug` is nullable; send/list identify templates by `id`.
Dashboard-created rows use `source` `manual`. HTML and plaintext are omitted from this list.
MCP `list_transactional_messages` returns enabled templates only; this REST list includes disabled rows.
GET
/api/v1/transactional/sends/{outboundEmail}
Get Transactional Send
Shows a single transactional outbound send for the tenant.
Requires API key with `transactional` permission and plan feature `transactional_enabled`.
Field
Type
Required
Description
outboundEmail
integer
Yes
Outbound email ID.
Request Example
curl "{{ url('/api/v1/transactional/sends/101') }}" -H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY"
Success Response
{
"status": "success",
"data": {
"id": 101,
"transactional_message_id": 1,
"status": "sent",
"channel": "transactional",
"from_address": "noreply@yourdomain.com",
"from_name": "Acme",
"to_addresses": [
"user@example.com"
],
"subject": "Hello Ada",
"message_id": "<abc@mail.example>",
"idempotency_key": "order-42-welcome",
"failure_reason": null,
"queued_at": "2026-09-04T12:00:00.000000Z",
"sent_at": "2026-09-04T12:00:03.000000Z",
"delivered_at": "2026-09-04T12:00:05.000000Z",
"last_deferred_at": null,
"created_at": "2026-09-04T12:00:00.000000Z",
"delivery_events": [
{
"event_type": "delivered",
"provider": "mailcow",
"occurred_at": "2026-09-04T12:00:05.000000Z",
"diagnostic": null
}
]
}
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - API key does not have transactional permission.
HTTP 404 - Send not found in your tenant scope or not transactional.
Notes
Non-transactional outbound rows (compose, sequencer, SMTP gateway) return 404.
`status` is queue/SMTP acceptance; `delivered_at` and `delivery_events` reflect provider delivery webhooks.
POST
/api/v1/transactional/variables
Create or Overwrite Variable
Registers a typed variable in the tenant Variable Manager. Duplicate keys return HTTP 409 unless `overwrite=true`.
Requires API key with `transactional` permission and plan feature `transactional_enabled`.
Field
Type
Required
Description
key
string
Yes
Variable key used in `{{key}}` tokens (letters, numbers, `_`, `.`, `-`; max 64).
data_type
string
Yes
One of: string, integer, date, url, boolean, email, currency.
default_value
string
No
Applied when the send payload omits the variable (max 2000).
overwrite
boolean
No
When true, replaces an existing key instead of returning 409.
Request Example
curl --fail-with-body --silent --show-error \
-X POST "{{ url('/api/v1/transactional/variables') }}" \
-H "Authorization: Bearer YOUR_32_CHARACTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"key": "otp",
"data_type": "integer",
"overwrite": false
}'
Success Response
{
"status": "success",
"data": {
"id": 1,
"key": "otp",
"data_type": "integer",
"default_value": null,
"source": "api"
},
"overwritten": false
}
Error Responses
HTTP 401 - Invalid API key.
HTTP 403 - API key does not have transactional permission.
HTTP 403 - Your current plan does not include Transactional Email.
HTTP 409 - A variable with this key already exists. Pass overwrite=true to replace it.
HTTP 422 - The variable key may only contain letters, numbers, underscores, dots, and hyphens.
Notes
HTTP 201 on create; HTTP 200 when overwriting an existing key (`overwritten: true`).
Duplicate keys never silently overwrite without `overwrite=true`.
When any registry rows exist, send rejects unregistered `{{token}}` keys used in the template.