sequences:read or sequences:write. Two exceptions are called out below: audience discovery returns contact data and needs contacts:read, and reply previews need chat-sessions:read.
Lifecycle
A sequence has three stored statuses:- Launch moves
drafttoactiveand arms every eligible candidate. Launching an already active sequence is idempotent: it only arms candidates added since. Launching a paused sequence is refused, resume it instead. - Pause and resume only touch the sequence itself. People keep their cursors; on resume, overdue steps go first.
- There is no stored “done”.
finishedon the stats is derived (nothing left in flight and something already went out), so enrolling more people revives a finished sequence with no status change.
Recommended flow
The API is built for enroll first, author later: land a real audience, then write the steps for it.1
Create the shell
Create with a name and a plain-text brief. Steps can wait.
2
Enroll people
Add contacts by contact id, phone, email or WhatsApp user id, with any facts you know about them in
extra_data. Read the per-person outcomes; a successful call never implies everyone was enrolled. Use batch_key to label the wave. List contacts to review who landed.3
Author steps and bind senders
Set steps on the draft. Set senders per channel; the email and voice catalogs tell you which senders are eligible and why not.
4
Preview, then launch
Launch preview mirrors launch clause for clause: who would start, who is held and why, and what would refuse the launch. Then launch.
5
Keep feeding it
Keep calling add contacts. On an active sequence with steps, new people arm the moment they are enrolled, so a CRM can push leads without anyone pressing launch again. Remove a person to stop every remaining step.
People
Every person in a sequence has one status:
Park reasons are always something a person must fix:
needs_data (a step variable has no value and no fallback), unsendable_person (their own data cannot go on the wire), or template_broken (the step’s template is missing, rejected or mismatched for everyone).
A removal through exit contact is a deletion, not an exit reason. The person leaves every read, and adding them again later starts them fresh from the first step. What was already sent is kept.
Each person also carries a journey: one stamp per step (not_reached, waiting, parked, deferred, skipped, sent, delivered, read, replied, answered, no_answer, busy, failed) with the inbox session of the send when one exists. For the raw event log behind those stamps, read contact events.
Enrollment outcomes
Add contacts answers per person, index-aligned with what you sent:
Phone numbers must be in international format, emails are lowercased, and duplicates inside one call are reported with
detail.in_batch.
Steps
A step is a channel, its content, anddelay_minutes: how long to wait after the previous step actually sent. The first step must have a delay of zero because launch and enrollment arm it, not a timer.
WhatsApp step
WhatsApp step
References an approved message template by
template_name and template_language. variables is keyed by the template’s positional index ("1", "2"), each bound to a person column (display_name, phone, email) with an optional fallback. No value and no fallback parks the person; the engine never sends generic filler. A template still under review does not block a launch: armed people wait and send the moment it is approved. A rejected or disabled template refuses the launch.Voice step
Voice step
The call brief:
extra_instructions rendered per person and handed to the bound phone agent as call-only guidance. The agent carries the persona (voice, language, tone, tools); the step never overrides it. Both fields are optional for an agent whose persona already holds the whole mission. One step is one dial attempt per person, ever: to retry no-answers, author further voice steps with delays. An answered call is the reply and exits the journey.Email step
Email step
Inline
subject, html and text (all three required). Every {{name}} placeholder must have a binding in variables; an unbound placeholder is refused at authoring time rather than shipped. {{signature}} is a system token filled from the sending mailbox and needs no binding.Senders
Each channel needs at least one bound sender before launch: WhatsApp numbers, AI phone agents for calls, mailboxes for email. Set senders replaces the binding for one channel. Unbinding the last sender of a channel while an active sequence still has sends pending on it is refused; pause first. The email and voice catalogs report eligibility and the reason when a sender cannot be bound. Email health numbers are information beside eligibility, never a gate.Settings
Settings are read live by the engine, so a change applies to the next send decision in any status.
Qualification
A sequence can also carry qualification criteria and run an enrich and judge pass over its people. Those endpoints exist for the assistant-driven authoring flow and are not needed to run a sequence from the API: people you enroll and never judge always arm. The endpoint pages under Qualification describe them.Consent
The engine enforces the outbound blocklist at enrollment, at launch, and again before every single send. If the blocklist cannot be read, the send is held rather than released.Available endpoints
Create sequence
Create a draft with brief, criteria and settings
List sequences
Every sequence with its live numbers
Get sequence
One sequence’s definition
Update sequence
Name, brief, criteria, reply instructions, settings
Set steps
Replace the step list of a draft
Edit steps
Update, append or remove steps in any status
Update step delay
Change one step’s wait
Add contacts
Enroll people with per-person outcomes
List contacts
Paginated people with status, fit and journey
Get contact
Full judgment and enrichment for one person
Get contact events
The per-person ledger
Update contact
Correct a name or handle
Include anyway
Override a below-cutoff judgment
Remove contact
Stop every remaining step for one person
Launch preview
What launching would do
Launch
Arm eligible candidates
Pause
Stop sending, keep places
Resume
Make people sendable again
Get stats
Numbers plus who is stuck and why
List replies
Who answered, newest first
List senders
Senders bound per channel
Set senders
Replace one channel’s senders
List email senders
Mailboxes with eligibility and health
List voice senders
Phone agents with eligibility and persona
Enrich contacts
Snapshot what the org knows about people
Judge contacts
Score people against the criteria
List qualification runs
Enrich and judge runs, latest first
Get qualification run
One run’s counts and aggregates
Set columns
Project evidence into the People table
Enrichment catalog
Paths a column may project
Discover contacts
Find an audience from what customers said