Channel endpoints

List, create, update and archive channels, switch voice, camera, screen and transcription, open direct messages and add people through the REST API.

Updated

Paths are relative to https://api.fishcamp.space/api/v1 and all need the X-Workspace-Id header. See the REST API overview for authentication and errors.

The channel object

{
  "id": "0b6f3c55-2a51-4e0a-a3d6-6a3f1f2e9d10",
  "workspaceId": "9b2f6c1d-3e4a-4f5b-8c7d-1a2b3c4d5e6f",
  "kind": "STANDARD",
  "visibility": "PRIVATE",
  "name": "design-crit",
  "topic": "Weekly design critique",
  "voiceEnabled": true,
  "cameraEnabled": true,
  "screenShareEnabled": true,
  "transcriptionEnabled": false,
  "createdAt": "2026-11-03T10:15:00.000Z",
  "lastMessageAt": "2026-11-05T14:32:08.000Z",
  "directPeer": null,
  "isMember": true,
  "unread": true
}
FieldDescription
kindSTANDARD for channels, DIRECT for direct messages.
visibilityPUBLIC or PRIVATE. Direct messages are always PRIVATE.
nameChannel name, without #. null for direct messages.
topicThe channel's description (called Description in the app), or null.
voiceEnabled, cameraEnabled, screenShareEnabledThe channel's audio room switches.
transcriptionEnabledThe channel's transcription switch. New in November 2026
lastMessageAtTime of the latest message or pill, or null.
directPeerFor direct messages, the other person (id, name, email, avatarUrl). Otherwise null.
isMemberWhether you're a member. In public channels you can read without being one; you become one when you post or mark the channel as read (the app does this when you open it).
unreadWhether there's activity you haven't read.

List channels

GET /channels

Every public channel of the workspace, plus the private channels and direct messages you're in. Archived channels aren't listed. With an AI agent's key, only the agent's channels are listed, and a channel the agent creates with POST /channels is added to them.

Get a channel

GET /channels/:channelId

Returns one channel. A private channel you're not in answers 404.

Create a channel

POST /channels
FieldTypeRequiredDescription
namestringYesUp to 60 characters. Stored in lowercase, with hyphens for spaces and other punctuation dropped (Release 2.5 → release-25).
topicstringNoDescription, up to 250 characters.
visibilityPUBLIC or PRIVATENoDefault: PUBLIC.
curl -X POST "https://api.fishcamp.space/api/v1/channels" \
  -H "Authorization: Bearer cwk_YOUR_KEY" \
  -H "X-Workspace-Id: YOUR_WORKSPACE_ID" \
  -H "Content-Type: application/json" \
  -d '{"name": "release-2-5", "topic": "Checklist and status for release 2.5"}'

Returns 201 Created with the channel. A name already used by another active channel of the workspace gets 409 conflict. The creator becomes the channel's first member, and the timeline gets a "created #release-2-5" pill.

Update a channel

PATCH /channels/:channelId

Send only the fields you want to change.

FieldTypeWho can change it
namestringAdmins and the channel's creator, as people: API keys can't rename. Not for direct messages.
topicstringAnyone who can see the channel. An empty string clears it.
voiceEnabledbooleanAnyone who can see the channel. false closes an open audio room.
cameraEnabledbooleanAnyone who can see the channel.
screenShareEnabledbooleanAnyone who can see the channel.
transcriptionEnabled New in November 2026booleanTurns transcription on or off.
curl -X PATCH "https://api.fishcamp.space/api/v1/channels/0b6f3c55-2a51-4e0a-a3d6-6a3f1f2e9d10" \
  -H "Authorization: Bearer cwk_YOUR_KEY" \
  -H "X-Workspace-Id: YOUR_WORKSPACE_ID" \
  -H "Content-Type: application/json" \
  -d '{"cameraEnabled": false}'

Returns the updated channel. Renames and switch changes add a pill to the timeline, and switch changes apply right away to people already in the audio room.

Archive a channel

DELETE /channels/:channelId

Admins, as people: API keys get 403, even keys an admin created. Archives the channel: it disappears from the list and its audio room closes. Its messages stay stored, but every endpoint answers 404 for the channel afterwards, and there's no endpoint to unarchive it. Returns 204. Direct messages can't be archived (422).

Open a direct message

POST /channels/direct
FieldTypeRequiredDescription
profileIdstringYesThe other person's profile ID, from GET /workspace/members.

Returns the direct message between you and that person, creating it the first time. There's only one per pair.

Add someone to a channel

POST /channels/:channelId/members
FieldTypeRequiredDescription
profileIdstringYesProfile ID of someone in the workspace.

Adds the person to a channel you can see (for private channels, that means one you're in) and returns the channel. Not for direct messages.

Mark as read

POST /channels/:channelId/read

Marks everything in the channel as read for you. Returns 204.

On this page