Skip to content

Dial Next Batch

POST
/dialer/sessions/{session_id}/next-batch

*** CALLS REAL PEOPLE. *** This is the operation that dials.

Voice’s own words for this handler are “the one-and-only dial path for BE-owned queue sessions” (dialer_sessions.py:2272). It picks the next contacts off the queue and places outbound calls to them, transitioning the session DRAFT -> ACTIVE or PAUSED -> ACTIVE on the way.

parallel_count is HOW MANY PEOPLE ARE CALLED AT ONCE. Sending it with a session configured for one is how a power-dial becomes a parallel dial.

Each attempt reserves credits and each connected minute charges more, so this both spends money and reaches strangers. It is tiered external rather than write for exactly that reason: “dial the next twenty people” must not be grantable by the same scope as “rename a session”.

filter_spec sent here CHANGES WHO IS ELIGIBLE before the batch is picked. It is not a display filter.

Authorizations

Parameters

Path Parameters

session_id
required

Session to dial.

string

Session to dial.

Header Parameters

X-Target-Org-Id
Any of:
string

Request Body

Mirrors NextBatchRequest. THIS REQUEST DIALS PEOPLE.

parallel_count is how many humans are called AT ONCE.

object
agent_id
Any of:
string
campaign_builder_campaign_id
Any of:
string
campaign_id
Any of:
string
dialing_mode
Any of:
string
Allowed values: power parallel
entity_type
Any of:
string
filter_spec
Any of:

Which contacts in the list are eligible to be dialed.

Narrowing this on a RUNNING session changes who gets called next. It is not a display filter.

object
exclude_dispositions
Array<string>
predicates
Array<object>

One clause of a queue filter. conditions nests for AND/OR groups.

conditions is typed as a list of plain objects rather than as a list of FilterPredicate, ON PURPOSE. Voice’s own model IS recursive, and this one was too, which made it the only self-referencing schema in the published contract - and the developer-docs renderer recurses on a self-referencing schema with no depth limit until Node runs out of memory (verify-help-docs and User help coverage and rendering both died with exit 134 on every head that carried it). The wire format is unchanged: each entry has this same shape (field, op, value, values, conditions) and is forwarded to voice as-is, which validates it against its recursive model. The parity test compares field NAMES, so it still pins this model to voice’s.

object
conditions
Any of:
Array<object>
object
key
additional properties
any
field
required
string
op
required
string
value
Any of:
values
Any of:
Array
search
Any of:
string
force_next_contact
Any of:

Jump one specific contact to the front of the next batch.

object
contact_id
required
string
phone_field
required
string
from_phone
Any of:
string
from_phone_scope
Any of:
string
order_spec
Any of:

The order the queue is worked in, and which phone field is tried first.

object
mode
string
default: natural_skip_dialed
Allowed values: natural_skip_dialed dialed_first
phone_priority
Array<string>
sort_model
Array<object>
object
key
additional properties
string
parallel_count
Any of:
integer
previous_batch_id
Any of:
string
resume_intent
boolean
user_email
Any of:
string

Responses

200

Successful Response

object
data
required

An open envelope for one dialer result.

Open because voice owns the shape of a session, a call stub and a queue stat, and it grows them without a contract bump here. A dropped field would otherwise turn an added upstream field into a removed public one.

object
key
additional properties
any
pagination
Any of:
object
has_next
required

Whether there are more pages

boolean
limit
required

Items per page

integer
next_cursor
Any of:
string
page
required

Current page number (1-indexed)

integer
total
required

Total number of items

integer

422

Validation Error

object
detail
Array<object>
object
loc
required
Array
msg
required
string
type
required
string