---
title: "Get sequence enrollment"
method: GET
path: "/sequences/{sequenceId}/enrollments/{enrollmentId}"
tags: ["Sequences"]
---

# Get sequence enrollment

`GET /sequences/{sequenceId}/enrollments/{enrollmentId}`

Reads one enrollment token, including how it entered, which branches it already took, and the bounded recorded graph walk from ClickHouse. Use this when list enrollments shows a completed token with enteredVia unknown or sitting on the completion node and you need to know why the first branch took its else path. Compared values are summaries (missing, empty, nonempty, equals_expected), never the raw field or event-property value. Legacy node-completion metadata that stored an unredacted evaluation reason is redacted on read. Check nodeHistoryTruncated and branchDecisionsTruncated before treating either history as complete.

## Path parameters

- `sequenceId` string, required
- `enrollmentId` string, required

## Response `200`

Enrollment and recorded node history

- SequenceEnrollmentGetResponse
  - `success` boolean
  - `sequenceId` string
  - `sequenceName` string
  - `stopCondition` SequenceStopCondition — Auto-stop condition, re-evaluated before every step including the first one. has_tag, added_to_list, entered_segment, field_changed, and event_received stop the run once the thing happens. event_received only counts events received after enrollment - the enrolling event and earlier history never satisfy the stop. does_not_have_tag and removed_from_list stop the run whenever the subscriber lacks that tag or list membership, so they act as a required-tag or required-list allowlist and cancel everyone else before any step sends. Guarded-out contacts still enroll and are then cancelled at the trigger node, so they appear as cancellations there rather than in the active or waiting enrollment counts. Clearing the guard does not retry them: they only receive the sequence if the trigger fires for them again, and on the one_time enrollment mode not even then.
    - `type` 'none' | 'has_tag' | 'does_not_have_tag' | 'added_to_list' | 'removed_from_list' | 'entered_segment' | 'field_changed' | 'event_received'
    - `value` string, nullable — Tag name, list ID, segment ID, field path, or event name. For the does_not_have_tag and removed_from_list guards this is the tag or list a subscriber must have to keep receiving the sequence. Null with entry_audience matching means the tag or list that enrolled each contact is used.
    - `matchConfig` union — Optional typed match rule. event_received uses event_property_filter propertyFilters (stop only when an event received after enrollment matches every filter, e.g. quota_used greater_than 1) or event_property rules (stop only when the stop event's field equals the same field captured on the enrolling event); field_changed uses a field_value comparison. Tag/list defaults use entry_audience to resolve the required tag or list per enrollment. Tag entry matching requires a tag_added trigger; list entry matching requires a contact_added trigger scoped to at least one specific list.
      - object
        - `mode` 'event_property_filter', required
        - `propertyFilters` object[], required — Filters an event received after enrollment must all match for the stop to fire. Same shape as event trigger propertyFilters.
          - `path` string, required — Dot-path into the stop event's properties.
          - `operator` 'exists' | 'not_exists' | 'equals' | 'not_equals' | 'one_of' | 'contains' | 'greater_than' | 'less_than', required
          - `value` unknown
      - object
        - `mode` 'event_property', required
        - `rules` object[], required
          - `entryFieldPath` string, required
          - `eventFieldPath` string, required
      - object
        - `mode` 'field_value', required
        - `operator` 'equals' | 'not_equals' | 'greater_than' | 'less_than' | 'contains' | 'not_contains', required
        - `value` string, required
      - object
        - `mode` 'entry_audience', required
        - `audience` 'tag' | 'list', required — Use the tag or list recorded when this contact enrolled.
  - `enrollment` Items — unresolved $ref
  - `nodeHistory` object[] — ClickHouse graph-walk events for this token, oldest first.
    - `nodeId` string
    - `nodeType` string
    - `nodeLabel` string
    - `eventType` string
    - `eventTime` string, date-time
    - `branchDecision` SequenceEnrollmentBranchDecision — One if/else or random-split verdict. Compared values are summaries, never the raw recipient value.
      - `nodeId` string
      - `decidedAt` string, date-time
      - `splitMode` 'condition' | 'random'
      - `selectedPath` 'matched' | 'else'
      - `matchedBranchId` string, nullable
      - `matchedBranchIndex` integer
      - `routedEdgeBranchId` string, nullable
      - `evaluations` object[]
        - `branchId` string, nullable
        - `branchIndex` integer
        - `conditionType` string, nullable
        - `fieldName` string, nullable
        - `outcome` 'pass' | 'fail' | 'skip'
        - `compared` object, nullable
          - `present` boolean
          - `summary` 'missing' | 'empty' | 'nonempty' | 'equals_expected'
          - `kind` 'string' | 'number' | 'boolean' | 'object' | 'array' | 'null' | 'null', nullable
        - `reason` string — Human-readable, already redacted. Never includes the compared value.
  - `nodeHistoryTruncated` boolean — Whether additional node events exist beyond the returned bounded history.
  - `nodeHistoryLimit` integer — Maximum number of node events returned.
  - `historySource` 'node_events' | 'token_context' | 'both' | 'none' — Where the branch history came from.

## Other responses

- `401` — Unauthorized
- `403` — No company selected
- `404` — Sequence or enrollment not found
- `503` — The database was temporarily unavailable. The request may be retried after the delay in Retry-After.

## Changes

- **2026-09-08** `f1d8cfd9faaf` — 1 warning, 4 info
  - added the new `undefined` enum value to the `enrollment/branchDecisions/items/evaluations/items/compared/kind` response property for the response status `200`
  - removed `#/components/schemas/SequenceEnrollmentBranchDecision` from the `nodeHistory/items/branchDecision` response property `allOf` list for the response status `200`
  - added `subschema #1, subschema #2` to the `nodeHistory/items/branchDecision` response property `anyOf` list for the response status `200`
  - added `subschema #1, subschema #2` to the `stopCondition/matchConfig` response property `anyOf` list for the response status `200`
  - …1 more
- **2026-08-31** `7437ab141d51` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/sequenzy/apis/sequenzy-api/changes/sequences/:sequenceId/enrollments/:enrollmentId/get.md)

---

[API](https://skmtc.dev/sequenzy/apis/sequenzy-api.md) · [All operations](https://skmtc.dev/sequenzy/apis/sequenzy-api/llms.txt) · [OpenAPI document](https://skmtc.dev/sequenzy/apis/sequenzy-api/revisions/e93563b0d37e?raw)
