Topolo Docs Topolo Platform
Open workspace

Get prospect list

Read one discovered prospect list, including archived state and active-contact count.

Outcome

Read one discovered prospect list, including archived state and active-contact count.

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 lists[].id from lists.list or retain the identifier from an earlier authorized list operation. Direct reads can still retrieve an archived list omitted by discovery.
topolo whoami --json
topolo actions get app_topolo_engage.lists.get --json
topolo workspaces list topolo-engage --json

Input fields

FieldRequiredMeaning and constraints
idYesRequired discovered list identifier, trimmed non-empty string up to 128 characters. Archived identifiers must be retained from an earlier authorized operation.

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.lists.get --data @payload.json --json
topolo actions plan app_topolo_engage.lists.get --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.lists.get --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 lists.get · HTTP 200

Action input

{
  "id": "list_1"
}

Actual local response

{
  "list": {
    "id": "list_1",
    "name": "VCs",
    "description": "Seed",
    "memberCount": 0,
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": "2026-10-01T00:00:00.000Z"
  }
}

Source test: audience routes > lists > creates, lists, edits and archives a list. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured lists.get · HTTP 200

Action input

{
  "id": "list_1"
}

Actual local response

{
  "list": {
    "id": "list_1",
    "name": "Founders",
    "description": null,
    "memberCount": 1,
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > lists > adds and removes members, counting only active contacts. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured lists.get · HTTP 200

Action input

{
  "id": "list_1"
}

Actual local response

{
  "list": {
    "id": "list_1",
    "name": "L",
    "description": null,
    "memberCount": 3,
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: audience routes > imports > updates changed contacts, matches unchanged ones and adds both to the list under a new key. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured lists.get · HTTP 200

Action input

{
  "id": "list_1"
}

Actual local response

{
  "list": {
    "id": "list_1",
    "name": "Acme",
    "description": null,
    "memberCount": 2,
    "createdAt": "2026-10-01T00:00:00.000Z",
    "updatedAt": "2026-10-01T00:00:00.000Z",
    "archivedAt": null
  }
}

Source test: ICP filters over the published actions > lists.members.add_from_filter > adds matching contacts idempotently, reports truncation and audits. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Captured lists.get · HTTP 200

Action input

{
  "id": "list_1"
}

Actual local response

{
  "list": {
    "id": "list_1",
    "name": "Target",
    "description": null,
    "memberCount": 3,
    "createdAt": "2026-10-01T09:00:00.000Z",
    "updatedAt": "2026-10-01T09:00:00.000Z",
    "archivedAt": null
  }
}

Source test: sourcing workflows over the published actions > runs now idempotently: tops up new matches only, records runs and audits. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

Effects and response meaning

  • Returns list with name, description, memberCount, timestamps and archivedAt. Missing or cross-workspace identifiers return not_found.
  • memberCount counts active contacts. The response does not contain member contact records; use contacts.list with listId to read them. Reading an archived list does not restore it or permit edits.

Verify the result

  • Compare list.id with the requested id and inspect archivedAt. Retrieve active members through contacts.list and follow its continuation cursor; do not infer a complete audience from one page.

Recover

Retry this read after a transient failure with the same verified workspace and validated input. Rediscover missing identifiers within that workspace; never create or modify a record to make a read succeed.

Refused responses

Captured lists.get · HTTP 404

Action input

{
  "id": "list_1"
}

Actual local response

{
  "error": {
    "code": "not_found",
    "message": "List was not found in this workspace."
  }
}

Source test: audience routes > lists > keeps lists and memberships inside their workspace. Actual route handlers with SQLite repositories; synthetic identity/workspace grants and provider ports.

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: Correct the request against the current input schema and validate it again before planning.
  • HTTP 404 not_found: Rediscover the identifier in the same authorized workspace. An identifier from another workspace is not a valid substitute; retain archived identifiers for direct reads.

Evidence and limits

  • contracts/audience.mjs

  • contracts/audience-filter.mjs

  • apps/api/src/audience/audience-routes.ts

  • apps/api/src/audience/contacts-handlers.ts

  • apps/api/src/audience/contact-search.ts

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

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

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

  • apps/api/src/audience/filter-source.ts

  • apps/api/test/audience-routes.test.ts

  • apps/api/test/segments-routes.test.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.