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
}| Field | Description |
|---|---|
kind | STANDARD for channels, DIRECT for direct messages. |
visibility | PUBLIC or PRIVATE. Direct messages are always PRIVATE. |
name | Channel name, without #. null for direct messages. |
topic | The channel's description (called Description in the app), or null. |
voiceEnabled, cameraEnabled, screenShareEnabled | The channel's audio room switches. |
transcriptionEnabled | The channel's transcription switch. New in November 2026 |
lastMessageAt | Time of the latest message or pill, or null. |
directPeer | For direct messages, the other person (id, name, email, avatarUrl). Otherwise null. |
isMember | Whether 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). |
unread | Whether there's activity you haven't read. |
List channels
GET /channelsEvery 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/:channelIdReturns one channel. A private channel you're not in answers 404.
Create a channel
POST /channels| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Up to 60 characters. Stored in lowercase, with hyphens for spaces and other punctuation dropped (Release 2.5 → release-25). |
topic | string | No | Description, up to 250 characters. |
visibility | PUBLIC or PRIVATE | No | Default: 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/:channelIdSend only the fields you want to change.
| Field | Type | Who can change it |
|---|---|---|
name | string | Admins and the channel's creator, as people: API keys can't rename. Not for direct messages. |
topic | string | Anyone who can see the channel. An empty string clears it. |
voiceEnabled | boolean | Anyone who can see the channel. false closes an open audio room. |
cameraEnabled | boolean | Anyone who can see the channel. |
screenShareEnabled | boolean | Anyone who can see the channel. |
transcriptionEnabled New in November 2026 | boolean | Turns 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/:channelIdAdmins, 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| Field | Type | Required | Description |
|---|---|---|---|
profileId | string | Yes | The 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| Field | Type | Required | Description |
|---|---|---|---|
profileId | string | Yes | Profile 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/readMarks everything in the channel as read for you. Returns 204.
Invite link endpointsNew
Create, list and turn off shareable invite links to a workspace or a channel, preview one without signing in, and join with it.
Message endpoints
Read a channel's messages page by page, send messages, edit and delete them through the REST API, and understand the message object and pills.