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
| Field | Required | Meaning and constraints |
|---|---|---|
campaignId | No | Optional campaign id discovered in this workspace, trimmed non-empty string up to 128 characters. |
status | No | Optional 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.
Related actions
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.