Transactional senders
A transactional sender is a From address on a verified transactional domain, such as hello@mail.example.com, with the name recipients see and the mailbox that gets replies. Your app sends from it with POST /v1/messages or an SMTP credential.
Last updated
Before you start
- The transactional domain must be
verified. - Writes need
mailboxes:write, and the key must act for an Owner or Admin with access to every mailbox. The key must also reach the reply mailbox and, to create a sender, its transactional domain: a key limited to mailboxes cannot create one. - Lists and reads show only senders whose reply mailbox the key can reach. Any other sender reads as not found.
- Setup steps have their own limits per key: 30 creates and 30 moves per hour, and 60 changes of
stateorrefuse_disposableper hour.
The transactional sender object
{
"object": "transactional_sender",
"id": "txbind_0123456789abcdefghjkmnpq",
"from": "hello@mail.example.com",
"display_name": "Acme",
"domain_id": "txdom_0123456789abcdefghjkmnpq",
"mailbox_id": "550e8400-e29b-41d4-a716-446655440000",
"reply_to": "support@example.com",
"state": "active",
"refuse_disposable": false,
"smtp_enabled": false,
"created_at": "2026-11-08T09:00:00.000Z"
}| Field | Type | Description |
|---|---|---|
| id | string | Starts with txbind_. |
| from | string | The From address, such as hello@mail.example.com. |
| display_name | string | The name recipients see. |
| domain_id | string or null | The sending subdomain's id. |
| mailbox_id | string | The mailbox that receives replies. |
| reply_to | string | That mailbox's address, set on every email. |
| state | string | active, disabled or revoked. Only an active sender can send. |
| refuse_disposable | boolean | Whether sends to temporary email addresses are refused. |
| smtp_enabled | boolean | Whether the sender may send over SMTP. Its first SMTP credential turns this on, and it stays on after the credentials are revoked. |
| created_at | string | ISO 8601 timestamp. |
List transactional senders
/v1/transactional-sendersscope mailboxes:readtier readReturns { "object": "list", "data": [...] } without pagination. Pass domain_id=txdom_... to list the senders of one domain.
Create a transactional sender
/v1/transactional-sendersscope mailboxes:writetier write{
"domain_id": "txdom_0123456789abcdefghjkmnpq",
"mailbox_id": "550e8400-e29b-41d4-a716-446655440000",
"local_part": "hello",
"display_name": "Acme"
}local_part is the part before @, so hello on mail.example.com sends as hello@mail.example.com. display_name is 1 to 100 characters without line breaks. mailbox_id is the mailbox that gets replies: its address becomes the sender's Reply-To for every send that sets none. Returns 201 with the sender, which can send at once.
To check it, send yourself one email from it with POST /v1/messages. It counts as one live send.
Retrieve a transactional sender
/v1/transactional-senders/:idscope mailboxes:readtier readReturns the sender.
Update a transactional sender
/v1/transactional-senders/:idscope mailboxes:writetier write{
"state": "disabled"
}Send at least one of these fields:
state:activeordisabled. A disabled sender refuses sends, and its SMTP credentials cannot send, until you turn it back on.mailbox_id: move replies to another mailbox. The sender's Reply-To changes with it.refuse_disposable:trueto refuse sends to temporary email addresses.
Shipmail applies a move first, then state, then refuse_disposable. Each is its own step: if one fails, the earlier ones stay applied. Returns the updated sender.
There is no delete. Turn a sender off with state set to disabled.
Errors
Errors use the standard error envelope. Branch on details[0].code, not on the message.
| Status | details[].code | When |
|---|---|---|
| 409 | transactional_domain_not_verified | The sending subdomain is not verified yet. |
| 404 | transactional_domain_not_found | domain_id is not a sending subdomain of your organization. |
| 404 | transactional_mailbox_not_found | The mailbox does not exist, or the API key cannot reach it. |
| 422 | transactional_mailbox_unavailable | The mailbox is temporary or suspended. |
| 422 | transactional_local_part_invalid | local_part is not a valid part before @. |
| 409 | transactional_sender_unavailable | The address is already in use. Choose another local_part. |
| 409 | transactional_sender_exists | This sender exists and is turned off. Turn it on with PATCH. |
| 404 | transactional_sender_not_found | No sender with this id, or the API key cannot reach its mailbox. |
| 409 | transactional_sender_removed | The sender was removed and cannot change. |
| 409 | transactional_sender_mailbox_unavailable | The sender's mailbox is being deleted or archived, so it cannot be turned on. |
| 409 | transactional_sender_move_unavailable | The sender cannot move to this mailbox now. Try again. |
| 500 | transactional_sender_setup_failed | Setup failed. Send the same request again. |
| 500 | transactional_sender_state_failed | Changing state failed. Try again. |
| 500 | transactional_sender_move_failed | Moving the sender failed. Try again. |
| 500 | transactional_sender_settings_failed | Changing refuse_disposable failed. Try again. |
| 409 | mailbox_writes_paused | Changes are paused for your organization. Try again later. |