Skip to content

ResourcesTransactional senders

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 state or refuse_disposable per 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"
}
FieldTypeDescription
idstringStarts with txbind_.
fromstringThe From address, such as hello@mail.example.com.
display_namestringThe name recipients see.
domain_idstring or nullThe sending subdomain's id.
mailbox_idstringThe mailbox that receives replies.
reply_tostringThat mailbox's address, set on every email.
statestringactive, disabled or revoked. Only an active sender can send.
refuse_disposablebooleanWhether sends to temporary email addresses are refused.
smtp_enabledbooleanWhether the sender may send over SMTP. Its first SMTP credential turns this on, and it stays on after the credentials are revoked.
created_atstringISO 8601 timestamp.

List transactional senders

GET/v1/transactional-sendersscope mailboxes:readtier read

Returns { "object": "list", "data": [...] } without pagination. Pass domain_id=txdom_... to list the senders of one domain.

Create a transactional sender

POST/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

GET/v1/transactional-senders/:idscope mailboxes:readtier read

Returns the sender.

Update a transactional sender

PATCH/v1/transactional-senders/:idscope mailboxes:writetier write
{
  "state": "disabled"
}

Send at least one of these fields:

  • state: active or disabled. 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: true to 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.

Statusdetails[].codeWhen
409transactional_domain_not_verifiedThe sending subdomain is not verified yet.
404transactional_domain_not_founddomain_id is not a sending subdomain of your organization.
404transactional_mailbox_not_foundThe mailbox does not exist, or the API key cannot reach it.
422transactional_mailbox_unavailableThe mailbox is temporary or suspended.
422transactional_local_part_invalidlocal_part is not a valid part before @.
409transactional_sender_unavailableThe address is already in use. Choose another local_part.
409transactional_sender_existsThis sender exists and is turned off. Turn it on with PATCH.
404transactional_sender_not_foundNo sender with this id, or the API key cannot reach its mailbox.
409transactional_sender_removedThe sender was removed and cannot change.
409transactional_sender_mailbox_unavailableThe sender's mailbox is being deleted or archived, so it cannot be turned on.
409transactional_sender_move_unavailableThe sender cannot move to this mailbox now. Try again.
500transactional_sender_setup_failedSetup failed. Send the same request again.
500transactional_sender_state_failedChanging state failed. Try again.
500transactional_sender_move_failedMoving the sender failed. Try again.
500transactional_sender_settings_failedChanging refuse_disposable failed. Try again.
409mailbox_writes_pausedChanges are paused for your organization. Try again later.