---
title: "List Channels"
method: GET
path: "/channels/{platform}"
tags: ["channels"]
---

# List Channels

`GET /channels/{platform}`

## Request

- Base URL: `https://api.traversal.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.traversal.com/channels/{platform}`
- Auth: none declared

## Path parameters

- `platform` 'slack' | 'teams' | 'web', required: A supported chat platform. Values align with ``integration_instances.type`` so a chat install's platform and its integration row stay in lockstep.

## Query parameters

- `integration_id` string, nullable: Chat integration instance to scope inventory to.
- `query` string, nullable: Case-insensitive channel-name substring.
- `page` integer: Page number.
- `limit` integer: Maximum channels returned per page.

## Response `200`

Successful Response

- ListChatPlatformChannelsResponse
  - `channels` APIApiSchemaChatPlatformChannelsChatPlatformChannelResponse[], required
    - `channel_id` string, required
    - `display_name` string, required
    - `platform` 'slack' | 'teams' | 'web', required: A supported chat platform. Values align with ``integration_instances.type`` so a chat install's platform and its integration row stay in lockstep.
    - `integration_id` string, nullable, required
    - `read_only` boolean, required
    - `worker` ChatPlatformChannelWorkerResponse, required
      - `id` string, required
      - `mode` 'incident' | 'alerts' | 'custom', required: The kind of channel the agent lives in — its standing mission. Drives the swappable mode block in the system prompt (and, later, the toolset). ``escalation`` and others land as localized drop-ins (their standing block + tooling) when that work begins. ``incident`` and ``alerts`` each state a mission the worker owns whatever the operator writes. ``custom`` states none: it supplies only the conduct floor the identity block forward-references, and the operator's ``custom_instruction`` is what gives the worker something to do. A channel that is neither working an incident nor triaging alert fires gets this one rather than being told it is in an incident (PRD-3766). The value is what customer-facing surfaces render, so it reads as the operator's own word for it rather than as an internal category. A member's *name* is persisted, in ``resident_agent_workflow.mode`` and ``resident_agent_template.mode`` — plain varchars with no DB-side value set — and read back through this enum, so adding a member is one deploy but removing or renaming one orphans every row holding it. It also makes a member forward-only: code that predates it raises on a row that carries it, rather than degrading. So a new member wants its read deployed everywhere before anything can write it — either landing the member ahead of the paths that create it, or gating creation while it rolls out. The same names are stored in usage policy bodies. Renaming or removing a member stops a body naming it from parsing, and that disables the template's policies.
  - `count` integer, required
  - `next` integer, nullable, required
  - `prev` integer, nullable, required
  - `total` integer, required

## Other responses

- `422`: Validation Error

## Changes

> 66 revisions in range; 9 not diffed.

- **2026-09-24** `2fc80b73eb41`: 1 info
  - added the required property `channels/items/read_only` to the response with the `200` status
- **2026-09-05** `b3082d58954d`: 1 info
  - added the required property `channels/items/worker` to the response with the `200` status
- **2026-08-20** `e0a48df02b41`: 2 info
  - added the new optional `query` request parameter `integration_id`
  - added the required property `channels/items/integration_id` to the response with the `200` status

[Operation history](https://skmtc.dev/traversal/apis/traversal-api/changes/channels/:platform/get.md)

---

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