Skip to main content

Journeys Enrollment

Tags: journeys, members

Enroll, unenroll, and re-enroll members in journeys

Endpoints

By Member

GET /api/v2/w/{workspace_uuid}/journeys/by-member/{member_id}

Description:

Get journey enrollments for a member (most recent first).

Capped at 200 enrollments until server-side pagination is added in a follow-up PR (tracked by #10014). The adjacent /journeys/\{journey_id}/members endpoint uses the same ceiling.

Authorization: Requires scopes: journeys:read, members:read

Parameters:

  • member_id (Integer)

Response: List of MemberJourneyResponse


Enroll

POST /api/v2/w/{workspace_uuid}/journeys/{journey_id}/enroll

Description:

Enroll one or more members in a journey.

Authorization: Requires journeys:write scope

Parameters:

Response: List of MemberJourneyResponse


Status Log

GET /api/v2/w/{workspace_uuid}/journeys/{journey_id}/enrollments/{member_journey_id}/status-log

Description:

Status history for one enrollment — the per-member journey timeline.

Answers "what did this member's journey actually do", which neither Journey Health (per-Journey aggregate) nor Automations → Executions (per-rule-execution) can. In particular it is where a step that completed having emitted nothing shows up as zeroEmission: true with its PHI-safe reason, instead of being indistinguishable from a step that sent (GRA-7341, #22658).

Newest first. member_journey_id must belong to journey_id or the response is 404 — the cross-journey guard, matching the ownership pre-checks on GET /\{journey_id}/members.

zeroEmissionOnly=true narrows the page to the dropped-send rows. It is what a per-step surface should ask for: "newest first" and "the rows that matter" are different orderings, so on a busy enrollment the zero-emission rows can all fall past page one and a caller rendering only what it loaded would show nothing wrong.

PHI policy: identifiers, closed status codes, operator-authored step names, and timestamps. JourneyStatusLog.reason is returned ONLY for rows on the closed allowlist in :mod:lib.services.journey_status_log_service (today: zero-emission rows, whose text is a fixed template plus integer counts and rule ids). Every other row reports reasonRedacted instead.

Authorization: Requires scopes: journeys:read, members:read

Parameters:

  • journey_id (Integer)
  • member_journey_id (Integer)
  • page (Integer) — min: 1
  • pageSize (Integer) — min: 1, max: 500
  • zeroEmissionOnly (Boolean)

Response: See JourneyStatusLogResponse


Members

GET /api/v2/w/{workspace_uuid}/journeys/{journey_id}/members

Description:

List enrolled members and their progress for a journey (paginated).

Authorization: Requires scopes: journeys:read, members:read

Parameters:

  • journey_id (Integer)
  • page (Integer) — min: 1
  • pageSize (Integer) — min: 1, max: 200
  • search (String)
  • status (String)
  • enrolledAfter (datetime)
  • enrolledBefore (datetime)
  • currentTaskId (Integer)
  • runtimeFailureEdgeId (Integer)
  • memberJourneyId (Integer)

Response: See PaginatedResponse[MemberJourneyResponse]


Delete Members

DELETE /api/v2/w/{workspace_uuid}/journeys/{journey_id}/members/{member_id}

Description:

Hard-delete a canceled or completed enrollment so the member can be re-enrolled fresh.

Authorization: Requires journeys:admin scope

Parameters:

  • journey_id (Integer)
  • member_id (Integer)

Reenroll

POST /api/v2/w/{workspace_uuid}/journeys/{journey_id}/reenroll

Description:

Re-enroll a canceled or completed member back to enrolled status.

Authorization: Requires journeys:write scope

Parameters:

Response: See MemberJourneyResponse


Unenroll

POST /api/v2/w/{workspace_uuid}/journeys/{journey_id}/unenroll

Description:

Unenroll one or more members from a journey.

Authorization: Requires journeys:write scope

Parameters:

Response: List of MemberJourneyResponse