Sequences
List Sequence Enrollments
List the individual contacts currently enrolled in a sequence
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 youenrollmentCounts 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 withlimit and offset until pagination.hasMore is false. The CLI does this loop for you and writes a CSV:
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 byenrollmentId.
waitUntilis when a waiting enrollment is scheduled to resume, ornullwhen nothing is scheduled.lastUpdatedAtis 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.currentNodeMissingistruewhen the node an enrollment sits on has been deleted from the sequence graph.currentNodeTypeandcurrentNodeLabelare omitted in that case.emailfalls back to the address captured at enrollment when the subscriber record no longer exists.failedReasonexplains why afailedenrollment stopped, and isnullfor every other status. Failures are terminal - the enrollment is not retried - so this is the only record of what went wrong.movedFromNodeId,movedAt, andmoveReasonrecord a release performed by move enrollments. They arenullfor an enrollment that reached its current step on its own, so they are how you tell a released wave apart from organic arrivals.stopConditionechoes the sequence’s single configured stop condition and is always returned. ItsmatchConfigcontains event-property filters, field comparisons, orentry_audiencefor a tag/list default; in that last casevalueisnullbecause each enrollment resolves its own entry tag or list.stopConditionMatchesandstopConditionMatchReasonare only filled in when you passstopConditionMatch=true.enteredViarecords what put the contact into the sequence:kindis one oflist,tag,segment,event,inactivity,frequency,manual,test_run, orunknown, andvaluecarries the list ID, tag name, segment ID, or monitored event name behind it. For a list or segment,nameresolves the ID for display and isnullwhen the referenced resource has since been deleted.inactivityandfrequencydistinguish time-based evaluation from an ordinary received-event trigger. This is how you tell entrants apart when a trigger covers several lists or tags.manualmeans a dashboard or API enrollment that bypassed the trigger;unknowncovers enrollments recorded before this field existed.entryContextis the event or manual-enrollment context captured at entry:triggerType,eventId,eventName, and property keys only. Payload values are never returned.branchDecisionsis the bounded retained if/else (or random split) history.branchDecisionCountis the total andbranchDecisionsTruncatedsays 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.
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 reportingwaiting 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 bycurrentNodeId:
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[].