Topolo Docs Topolo Platform
Open workspace

List enrollments

Discover recent enrollment identifiers and actual lifecycle states.

Outcome

Discover recent enrollment identifiers and actual lifecycle states.

Before you start

  • Verify the environment, credential, authorized organization and the published action permission workspace:read.
  • Discover an accessible Engage workspace and bind resourceType=workspace and its resourceId separately from action input. Fixture identifiers grant no access.

Discover the target

  • Select the authorized workspace. Optionally discover campaignId through campaigns.list and choose an exact enrollment status filter.
topolo whoami --json
topolo actions get app_topolo_engage.enrollments.list --json
topolo workspaces list topolo-engage --json

Input fields

FieldRequiredMeaning and constraints
campaignIdNoOptional campaign id discovered in this workspace, trimmed non-empty string up to 128 characters.
statusNoOptional exact active, completed, stopped, replied or bounced status; omit to read every status within the 500-row limit.

Validate, plan and execute

Set ENGAGE_WORKSPACE_ID to the identifier of your selected workspace. Prepare payload.json from the current input schema and discovered identifiers. Use the same payload for validation, planning and execution.

: "${ENGAGE_WORKSPACE_ID:?Set ENGAGE_WORKSPACE_ID to your selected workspace identifier}"
topolo actions validate app_topolo_engage.enrollments.list --data @payload.json --json
topolo actions plan app_topolo_engage.enrollments.list --resource-type workspace --resource-id "$ENGAGE_WORKSPACE_ID" --data @payload.json --json

Execute the unchanged validated read in the selected workspace.

: "${ENGAGE_WORKSPACE_ID:?Set ENGAGE_WORKSPACE_ID to your selected workspace identifier}"
topolo actions call app_topolo_engage.enrollments.list --resource-type workspace --resource-id "$ENGAGE_WORKSPACE_ID" --data @payload.json --json

For MCP, use topolo_get_action, topolo_validate_action, topolo_plan_action and topolo_call_action. Pass the selected resource context separately; confirm:true is required for mutations.

Worked requests and responses

Captured enrollments.list · HTTP 200

Action input

{}

Actual local response

{
  "enrollments": [
    {
      "id": "eng_enr_1",
      "campaignId": "eng_cmp_1",
      "sequenceVersionId": "eng_seqv_1",
      "contactId": "contact_1",
      "seatId": "eng_seat_1",
      "status": "active",
      "stopReason": null,
      "nextStepPosition": 1,
      "nextSendAt": "2026-10-06T08:30:00.000Z",
      "firstMessageId": null,
      "firstSubject": null,
      "outcome": null,
      "enrolledAt": "2026-10-06T08:30:00.000Z",
      "updatedAt": "2026-10-06T08:30:00.000Z"
    }
  ]
}

Source test: enrollment routes > enrolls eligible contacts, pins the published version and schedules the first message. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured enrollments.list · HTTP 200

Action input

{
  "campaignId": "eng_cmp_1",
  "status": "active"
}

Actual local response

{
  "enrollments": [
    {
      "id": "eng_enr_1",
      "campaignId": "eng_cmp_1",
      "sequenceVersionId": "eng_seqv_1",
      "contactId": "contact_1",
      "seatId": "eng_seat_1",
      "status": "active",
      "stopReason": null,
      "nextStepPosition": 1,
      "nextSendAt": "2026-10-06T08:30:00.000Z",
      "firstMessageId": null,
      "firstSubject": null,
      "outcome": null,
      "enrolledAt": "2026-10-06T08:30:00.000Z",
      "updatedAt": "2026-10-06T08:30:00.000Z"
    }
  ]
}

Source test: enrollment routes > enrolls eligible contacts, pins the published version and schedules the first message. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured enrollments.list · HTTP 200

Action input

{
  "status": "stopped"
}

Actual local response

{
  "enrollments": []
}

Source test: enrollment routes > enrolls eligible contacts, pins the published version and schedules the first message. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Effects and response meaning

  • Reads at most 500 enrollments ordered by enrolledAt descending then id descending. Without status, includes all statuses: active, completed, stopped, replied and bounced. No continuation cursor is presented.
  • A capped result is not a complete organization history. The read does not create, stop, enroll or send anything.

Verify the result

  • Retain enrollments[].id for enrollments.get and messages.list. Check campaignId, contactId, sequenceVersionId and seatId before interpreting or changing any row.

Recover

Retry this read after a transient failure using the same authorized workspace and discovered identifier. Missing data does not authorize creation, re-enrollment or a different resource context.

Refused responses

No refusal response for this action is included in this fixture set. The recovery guidance below is based on the route’s declared permission and input-validation checks.

Error recovery

  • HTTP 403 permission_denied: Stop and inspect the permission required by this action in the current credential. Do not broaden permissions or switch organization automatically.
  • HTTP 422 invalid_action_input: Validate the current strict input schema. Creation requires campaignId, seatId and exactly one of contactIds or listId; do not provide both or neither.

Evidence and limits

  • contracts/sending.mjs

  • apps/api/src/enrollments/enrollments-handlers.ts

  • apps/api/src/enrollments/enrollments-repository.ts

  • apps/api/src/enrollments/enrollments-domain.ts

  • apps/api/src/enrollments/messages-repository.ts

  • apps/api/src/audience/lists-repository.ts

  • apps/api/src/tasks/tasks-repository.ts

  • apps/api/src/sending/outreach-eligibility.ts

  • Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

  • Widget/bootstrap use actual app handler but mocked worker runtime and app identity.

  • No gateway execution, live permissions, external delivery or deployed proof.

The examples are local route captures with synthetic context and simulated providers. They do not prove live authorization, CLI/MCP gateway execution, production state or delivery.