Skip to main content
GET
List a sequence's contacts

Authorizations

X-API-Key
string
header
required

Path Parameters

sequence_id
string<uuid>
required

Query Parameters

status
enum<string> | null

Where one contact stands in one sequence.

ACTIVE rows carry a due_at and are what the tick claims; CLAIMED is the in-flight guard between claim and outcome. PAUSED is a deliberate per-contact hold: unclaimable because the tick claims strictly on ACTIVE, yet still LIVE. It keeps its step and its one-live-sequence slot, and a compliance stop (reply, unsubscribe) reaches it. Everything else is settled: COMPLETED walked off the end; STOPPED was halted (reply, unsubscribe, bounce, manual, company pause); FAILED is terminal; SUPPRESSED was on the do-not-contact list; SKIPPED_DUPLICATE lost the one-live-sequence-per-contact rule, with the reason visible in the grid.

A contact the workspace's recontact rule refuses is STOPPED with StopReason.COOLDOWN. There is deliberately no held state: a cooldown settles a contact rather than parking them, so nothing here waits on a date and nothing lets itself out later.

AWAITING_ACTION is a contact parked behind a task that needs a person or a channel, modelled on PAUSED: live, keeps its step and its one-live-sequence slot, unclaimable because the tick claims strictly on ACTIVE, and a compliance stop reaches it. Unlike PAUSED nobody wakes it by hand: only the outreach-task sweep does, once the task it waits on is decided or delivered. Deliberately not "awaiting approval": an AUTO-mode LinkedIn park is waiting for a browser rather than for anyone's approval, and this value is the word the Contacts tab shows for both.

PENDING is a draft's roster: in, standing on a step, and NOT live. Binding an audience enrols on the spot so the Contacts tab can show who is in, but a sequence nobody has launched must not hold anybody's one-live-sequence slot, or a second sequence written for the same people skips them all. uq_sequence_enrolment_one_live leaves PENDING out, the tick never claims it, and launch turns each row ACTIVE, settling the ones another sequence took meanwhile as SKIPPED_DUPLICATE.

Available options:
pending,
active,
claimed,
paused,
awaiting_action,
completed,
stopped,
failed,
suppressed,
skipped_duplicate
statuses
enum<string>[] | null

Where one contact stands in one sequence.

ACTIVE rows carry a due_at and are what the tick claims; CLAIMED is the in-flight guard between claim and outcome. PAUSED is a deliberate per-contact hold: unclaimable because the tick claims strictly on ACTIVE, yet still LIVE. It keeps its step and its one-live-sequence slot, and a compliance stop (reply, unsubscribe) reaches it. Everything else is settled: COMPLETED walked off the end; STOPPED was halted (reply, unsubscribe, bounce, manual, company pause); FAILED is terminal; SUPPRESSED was on the do-not-contact list; SKIPPED_DUPLICATE lost the one-live-sequence-per-contact rule, with the reason visible in the grid.

A contact the workspace's recontact rule refuses is STOPPED with StopReason.COOLDOWN. There is deliberately no held state: a cooldown settles a contact rather than parking them, so nothing here waits on a date and nothing lets itself out later.

AWAITING_ACTION is a contact parked behind a task that needs a person or a channel, modelled on PAUSED: live, keeps its step and its one-live-sequence slot, unclaimable because the tick claims strictly on ACTIVE, and a compliance stop reaches it. Unlike PAUSED nobody wakes it by hand: only the outreach-task sweep does, once the task it waits on is decided or delivered. Deliberately not "awaiting approval": an AUTO-mode LinkedIn park is waiting for a browser rather than for anyone's approval, and this value is the word the Contacts tab shows for both.

PENDING is a draft's roster: in, standing on a step, and NOT live. Binding an audience enrols on the spot so the Contacts tab can show who is in, but a sequence nobody has launched must not hold anybody's one-live-sequence slot, or a second sequence written for the same people skips them all. uq_sequence_enrolment_one_live leaves PENDING out, the tick never claims it, and launch turns each row ACTIVE, settling the ones another sequence took meanwhile as SKIPPED_DUPLICATE.

Available options:
pending,
active,
claimed,
paused,
awaiting_action,
completed,
stopped,
failed,
suppressed,
skipped_duplicate
stop_reasons
enum<string>[] | null
Available options:
reply,
unsubscribe,
bounce,
manual,
company_reply,
row_left_audience,
row_left_paused,
step_removed,
removed,
cooldown,
rejected,
mailbox_removed
exclude
boolean
default:false
search
string | null
Maximum string length: 255
group
enum<string> | null

Only the contacts under this tab of the Audience tab, as get_audience_eligibility's 'groups' counts them, or count_sequence_contacts_per_group's under the same filters. The Audience tab's tab a contact sits under; every contact is under one.

The tabs used to be counts that overlapped (a bounced contact was both "reachable" and "blocked", so the counts added up past the roster) and opened a list of names over the roster they repeated (Natsuki, 2026-10-02). They partition the roster now and filter it in place, so a tab's count is exactly the rows it shows, and each row's own status chip names the state that put it there.

Derived at read time from the status, the stop reason, the contact's current-step task and whether an address reaches them, never stored.

Available options:
in_progress,
needs_approval,
paused,
done,
blocked
sort
enum<string>
default:created_desc

The orders the Audience tab can list a sequence's contacts in.

Available options:
created_desc,
created_asc,
status,
status_desc,
next_due
created_from
string<date-time> | null
created_to
string<date-time> | null
limit
integer
default:100
Required range: 1 <= x <= 500
offset
integer
default:0
Required range: x >= 0

Response

Successful Response

enrolments
EnrolmentReadSchema · object[]
required
total
integer
required