POST
Create Email Send

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Path Parameters

batch_id
string<uuid>
required

Body

application/json

Send these rows. This is the call that mails real people.

scope: "selected" sends exactly recipient_ids. scope: "all" is a standing send: every row of the batch as it reaches draft, including rows not drafted yet — so it mails drafts nobody has read. Everything else defaults to the batch's own setting; window and send_daily_cap accept an explicit null to mean "no window" and "uncapped" rather than "inherit", so the service reads model_fields_set.

The sender applies to THIS send alone and never writes back to the batch.

scope
enum<string>
required

selected sends recipient_ids; all sends every row as it is drafted.

Available options:
all,
selected
from_email
string
from_name
string | null
Maximum string length: 200
recipient_ids
string<uuid>[] | null
Maximum array length: 10000
reply_to
string | null
send_attempts
integer
send_daily_cap
FixedDailyCap · object

The same limit every day.

send_gap_seconds
integer
send_retry_after_minutes
integer
start_at
string<date-time> | null
timezone
string
window
TimeWindow · object | null

The hours a list may run in, on the list's own clock.

Shared rather than duplicated, for the same reason window_state is: a call batch and an email send run store the same three values under the same names and must not each get their own copy of the rules. The field that carries one is named for what it gates — calling_window on a campaign, window on an email batch and its runs.

A window that crosses midnight (21:00-06:00) is valid and means exactly what an evening consumer-calling window means: the day check applies to the start side, so 21:00-06:00 on days: [5] runs Friday 21:00 through Saturday 06:00.

Response

Successful Response

The send that was created, and every row that did not go into it.

Two halves rather than one, because they answer different questions and a caller needs both: what is now scheduled to go out, and which rows it refused and why. If NOTHING in the selection could be sent there is no send to describe, so that case is a 400 naming the reasons instead.

rejected
RejectedRecipient · object[]
required
send
EmailSendResponse · object
required