Skip to main content
GET
List Sequence Enrollments

List Sequence Enrollments

List the contacts enrolled in one sequence, with the node each one is currently sitting on. Use this when sequence stats gives you enrollmentCounts and you need the actual subscribers behind a number - for example, everyone waiting at one step. By default the response includes only active and waiting enrollments, which is every contact still moving through the sequence.

Request

string
required
Sequence ID.
string
Comma-separated enrollment statuses to include: active, waiting, completed, failed, or cancelled. Defaults to active,waiting.
string
Comma-separated sequence node IDs. Only enrollments currently sitting on one of these nodes are returned. Node IDs come from Get Sequence or from enrollmentCounts.byCurrentNode in sequence stats.
string
Comma-separated subscriber IDs. Use this to check where specific contacts stand.
string
Exact email address to match, case-insensitive.
string
Result order: enrolled_at_desc (default), enrolled_at_asc, wait_until_asc, or wait_until_desc. Use wait_until_asc to see which contacts resume next; enrollments with no scheduled resume sort last.
boolean
Annotate each returned active or waiting enrollment with whether the sequence’s stop condition already matches for that contact right now. Defaults to false. Caps the page at 100 regardless of limit. See Confirming a stop condition.
number
Enrollments per page, 1-500. Defaults to 50. Values above 500 are capped, and above 100 when stopConditionMatch is true.
number
Number of enrollments to skip. Page until pagination.hasMore is false.

Exporting the full list

Page with limit and offset until pagination.hasMore is false. The CLI does this loop for you and writes a CSV:
CSV exports flatten the entry source into enteredViaKind, enteredViaValue (the raw list/segment ID, tag, or event), and enteredViaName (the resolved list/segment display name when available).

Response fields

Each enrollment is one run through the sequence, identified by enrollmentId.
  • waitUntil is when a waiting enrollment is scheduled to resume, or null when nothing is scheduled.
  • lastUpdatedAt is the last change to the enrollment. For a waiting enrollment this is when it arrived at its current node; the platform does not separately track node entry time.
  • currentNodeMissing is true when the node an enrollment sits on has been deleted from the sequence graph. currentNodeType and currentNodeLabel are omitted in that case.
  • email falls back to the address captured at enrollment when the subscriber record no longer exists.
  • failedReason explains why a failed enrollment stopped, and is null for every other status. Failures are terminal - the enrollment is not retried - so this is the only record of what went wrong.
  • movedFromNodeId, movedAt, and moveReason record a release performed by move enrollments. They are null for an enrollment that reached its current step on its own, so they are how you tell a released wave apart from organic arrivals.
  • stopCondition echoes the sequence’s single configured stop condition and is always returned. Its matchConfig contains event-property filters, field comparisons, or entry_audience for a tag/list default; in that last case value is null because each enrollment resolves its own entry tag or list. stopConditionMatches and stopConditionMatchReason are only filled in when you pass stopConditionMatch=true.
  • enteredVia records what put the contact into the sequence: kind is one of list, tag, segment, event, inactivity, frequency, manual, test_run, or unknown, and value carries the list ID, tag name, segment ID, or monitored event name behind it. For a list or segment, name resolves the ID for display and is null when the referenced resource has since been deleted. inactivity and frequency distinguish time-based evaluation from an ordinary received-event trigger. This is how you tell entrants apart when a trigger covers several lists or tags. manual means a dashboard or API enrollment that bypassed the trigger; unknown covers enrollments recorded before this field existed.
  • entryContext is the event or manual-enrollment context captured at entry: triggerType, eventId, eventName, and property keys only. Payload values are never returned.
  • branchDecisions is the bounded retained if/else (or random split) history. branchDecisionCount is the total and branchDecisionsTruncated says whether older decisions were omitted. Compared values are summaries (missing, empty, nonempty, equals_expected), never the raw field value. Empty on enrollments recorded before this field existed; use get enrollment to reconstruct those from ClickHouse.
For the ClickHouse graph walk of one token, including legacy branch metadata that was never copied onto the token, call get enrollment.

Confirming a stop condition

A stop condition does not cancel a waiting enrollment at the moment its event arrives. It is re-evaluated when the enrollment next runs a step, so an enrollment parked on a three-day delay keeps reporting waiting for the full three days even though its stop event already landed. When the delay expires the enrollment is cancelled before the next step runs, so nothing sends - but until then status alone cannot tell you whether the stop registered. Pass stopConditionMatch=true to run the same evaluation the worker will run:
stopConditionMatches: true means the condition matches at the time of this read. null means the match was not determined - the flag was not passed, the sequence has no stop condition, the enrollment is no longer active or waiting, or it fell outside the evaluated window. It never means “does not match”; stopConditionMatchEvaluatedCount tells you how many rows were actually checked. This is a non-atomic reading of the current state, not a cancellation lock or a promise of a future exit. The condition can change again before the enrollment runs, a paused sequence may not run at its scheduled time, and a step that already passed its stop check may still finish. The worker stays authoritative.
If you need the enrollment to read as cancelled immediately rather than at its next step, call cancel enrollments directly.

Diagnosing a failing step

Filter to failures and group them by currentNodeId:
The same failedReason on the same currentNodeId across several enrollments points at that step’s configuration or content, not at the contacts. GET /v1/sequences/{sequenceId}/stats reports the same reasons per step as steps[].failedCount and steps[].failedSubscribers[].

Responses