Skip to the documentation
API

Sending

Every operation in this group: what it accepts, what it returns and the errors it can answer with.

Operations

How mail leaves the workspace. It travels in two lanes, so a newsletter cannot hold up or harm app mail: transactional for password resets, receipts and codes, and broadcast for newsletters. Each lane has its own queue and its own reputation numbers. The broadcast lane pauses itself when too many of its messages bounce or are reported as spam, and app mail keeps going out. A workspace with the dedicated IP add-on also sends from its own IP address.

GET/sending/streams

List the sending lanes

Scopesemails:readReads

Both lanes with their state and their numbers for the last 7 days: recipients, bounces and complaints, the rates, and the limits the broadcast lane is held to. A paused lane says when and why. The count starts again when a lane is resumed.

Requires the emails:read scope.

Returns

The two lanes.

Errors

The errors every operation can return400401403404422500Error catalog

Also available in

TypeScript
sending.listStreams()
Python
sending.list_streams()
Ruby
sending.list_streams
PHP
sending->listStreams
Go
Sending.ListStreams
Java
sending().listStreams
C#
Sending.ListStreamsAsync
CLI
openemail sending list-streams
MCP
getSendingStreams

POST/sending/streams/{stream}/resume

Resume a paused lane

Scopesdomains:writeChanges data
Asks for a verification code

Resumes the broadcast lane after it was paused for too many bounces or complaints. Broadcasts and messages that were on hold continue at once, and the 7 day count starts again from now, so clean the audience first. Only the workspace owner may do it, and an app acting for a person is asked for a verification code.

Requires the domains:write scope.

Path parameters

streamstringRequired

The lane, transactional or broadcast.

One of"transactional""broadcast"

Returns

The lane, active again.

Errors

403

The key lacks the scope, or may not send as that address.

step_up_required: the call was made with an OAuth access token that has not been verified in the last 60 minutes. Ask for a code with POST /security/step-up, send it to POST /security/step-up/verify, then repeat the call. The person can also choose Allow changes for 60 minutes on the app in Account settings, Connected apps, on the OpenEmail website. An API key is never asked for a code.

409

stream_not_paused: the lane is not paused, so there is nothing to resume.

The errors every operation can return400401404422500Error catalog

Also available in

TypeScript
sending.resumeStream()
Python
sending.resume_stream()
Ruby
sending.resume_stream
PHP
sending->resumeStream
Go
Sending.ResumeStream
Java
sending().resumeStream
C#
Sending.ResumeStreamAsync
CLI
openemail sending resume-stream
MCP
resumeSendingStream

GET/sending/dedicated-ips

List dedicated IPs

Scopesdomains:readReads

The dedicated sending IPs of the workspace, bought as an add-on with POST /billing/add-ons/checkout. A new IP is warmed up over several weeks: warmupPercent says how far it is, and until it reaches 100 part of the mail still leaves through the shared IPs. A workspace without the add-on gets an empty list and sends through the shared IPs.

Requires the domains:read scope.

Returns

The dedicated IPs.

Errors

The errors every operation can return400401403404422500Error catalog

Also available in

TypeScript
sending.listDedicatedIps()
Python
sending.list_dedicated_ips()
Ruby
sending.list_dedicated_ips
PHP
sending->listDedicatedIps
Go
Sending.ListDedicatedIPs
Java
sending().listDedicatedIps
C#
Sending.ListDedicatedIpsAsync
CLI
openemail sending list-dedicated-ips
MCP
listDedicatedIps

GET/sending/dedicated-ips/{ip}

Read a dedicated IP

Scopesdomains:readReads

One dedicated IP of the workspace with its status and how far its warm-up has come.

Requires the domains:read scope.

Path parameters

ipstringRequired

The IP address, as the list returns it.

Returns

The dedicated IP.

Errors

404

resource_not_found: the workspace has no dedicated IP with that address.

The errors every operation can return400401403422500Error catalog

Also available in

TypeScript
sending.getDedicatedIp()
Python
sending.get_dedicated_ip()
Ruby
sending.get_dedicated_ip
PHP
sending->getDedicatedIp
Go
Sending.GetDedicatedIP
Java
sending().getDedicatedIp
C#
Sending.GetDedicatedIpAsync
CLI
openemail sending get-dedicated-ip

Objects

DedicatedIpobject

objectstringRequired
One of"dedicated_ip"
ipstringRequired
statusstringRequired

warming while the IP is being warmed up, ready once all of the workspace's mail leaves through it.

One of"available""warming""ready""released"
poolstringRequired

The pool the IP sends through.

Can be null
poolStatusstringRequired
Can be nullOne of"pending""warming""active""releasing""released""failed"
warmupPercentintegerRequired
At least 0At most 100
assignedAtstringRequired
Can be nullFormatdate-time
readyAtstringRequired
Can be nullFormatdate-time
checkedAtstringRequired

When the warm-up was last read.

Can be nullFormatdate-time

DedicatedIpListobject

objectstringRequired
One of"list"
dataDedicatedIp[]Required

SendingStreamobject

objectstringRequired
One of"sending_stream"
streamstringRequired
One of"transactional""broadcast"
statusstringRequired

paused holds every new message on the lane until it is resumed. Only the broadcast lane pauses.

One of"active""paused"
pausedAtstringRequired
Can be nullFormatdate-time
pausedReasonstringRequired

Which limit was passed, or null on an active lane.

Can be nullOne of"bounce_rate""complaint_rate"
resumedAtstringRequired

When the lane was last resumed. The count in window starts no earlier than this.

Can be nullFormatdate-time
windowobjectRequired
sincestringRequired
Formatdate-time
untilstringRequired
Formatdate-time
recipientsintegerRequired

Recipients the lane handed over for delivery in the window.

bouncedintegerRequired
complainedintegerRequired

Recipients who reported the mail as spam.

bounceRatenumberRequired

Bounced over recipients, from 0 to 1.

complaintRatenumberRequired

Complained over recipients, from 0 to 1.

limitsobjectRequired
bounceRatenumberRequired

The broadcast lane pauses above this bounce rate.

complaintRatenumberRequired

The broadcast lane pauses above this complaint rate.

minimumRecipientsintegerRequired

The rates are only judged once the lane reached this many recipients in the window.

windowDaysintegerRequired

SendingStreamListobject

objectstringRequired
One of"list"
dataSendingStream[]Required