Invite link endpoints

Create, list and turn off shareable invite links to a workspace or a channel, preview one without signing in, and join with it.

Updated

New in November 2026

Paths are relative to https://api.fishcamp.space/api/v1. Listing, creating and turning off links are admin actions that need the X-Workspace-Id header and a person (requests with an API key get 403 forbidden). Previewing a link needs no token; joining needs a signed-in person. How invite links work in the app is in People and roles.

{
  "id": "d4e5f6a7-b8c9-4d0e-8f1a-2b3c4d5e6f7a",
  "code": "Rk7mPq2xWz9T",
  "url": "https://fishcamp.space/join/Rk7mPq2xWz9T",
  "channelId": null,
  "channelName": null,
  "createdBy": { "id": "7a1c2e3f-4b5d-4e6f-8a9b-0c1d2e3f4a5b", "name": "Maya Lopes" },
  "expiresAt": "2026-12-05T14:00:00.000Z",
  "maxUses": null,
  "uses": 4,
  "createdAt": "2026-11-05T14:00:00.000Z"
}
FieldDescription
code12 letters and digits: the part of the link after /join/.
urlThe link to share.
channelId, channelNameThe channel the link leads to, or null for a link to the workspace.
createdByThe admin who created it, or null.
expiresAtWhen it stops working, or null if it never expires.
maxUses, usesHow many people can join with it (null for no limit), and how many already did.
GET /workspace/invite-links

Admins. The workspace's active links, newest first, up to 100. Links that were turned off, expired, used up, or that lead to an archived channel aren't listed, and links to a private channel only show up for admins who are in it.

POST /workspace/invite-links

Admins. Limit: 20 per minute.

FieldTypeRequiredDescription
channelIdstringNoA channel to lead to: people who join are also added to it, even if it's private. Default: null, the workspace only.
expiresInDays1, 7, 30 or nullNoDays until it expires; null never expires. Default: 30.
maxUsesinteger or nullNoFrom 1 to 1,000 people; null has no limit. Default: null.
reusebooleanNoDefault true: if you already created an active link to the same place with the same settings, and it's still as good as a new one (almost all of its time left and, with a use limit, no uses yet), you get that link back. false always creates a new one.
curl -X POST "https://api.fishcamp.space/api/v1/workspace/invite-links" \
  -H "Authorization: Bearer YOUR_SESSION_TOKEN" \
  -H "X-Workspace-Id: YOUR_WORKSPACE_ID" \
  -H "Content-Type: application/json" \
  -d '{"channelId": "0b6f3c55-2a51-4e0a-a3d6-6a3f1f2e9d10", "expiresInDays": 7, "maxUses": 25}'

Returns 201 Created with the link. For a channel link, you must be able to see the channel: a private channel only if you're in it. A channel you can't see, or that was archived, answers 404. Direct messages, and values of expiresInDays or maxUses outside the list above, get 422.

DELETE /workspace/invite-links/:linkId

Admins. The link stops working at once. Returns 204, or 404 if it doesn't exist or is already off. People who joined with it stay.

GET /invite-links/:code

No token. Limit: 30 per minute. This is what the join page shows before anyone signs in.

{
  "workspaceName": "Northstar Studio",
  "channelName": "design-crit",
  "invitedBy": "Maya Lopes",
  "memberCount": 12,
  "status": "active"
}

status is active, expired, revoked (turned off, or its channel was archived) or used_up. An unknown code answers 404.

POST /invite-links/:code/join

People, signed in. Limit: 20 per minute. No body. Adds the person to the workspace as a Member and, for a channel link, to the channel. The channel gets a "joined with an invite link" pill.

{
  "workspaceId": "9b2f6c1d-3e4a-4f5b-8c7d-1a2b3c4d5e6f",
  "slug": "northstar-studio",
  "channelId": "0b6f3c55-2a51-4e0a-a3d6-6a3f1f2e9d10",
  "joinedWorkspace": true
}

joinedWorkspace is false when the person was already a member. That doesn't use the link up, except for a channel link with a use limit: a member who joins the channel through it uses one. Someone already in the workspace (and, for a channel link, in the channel) gets 200 even after the link stopped working, and nothing changes.

ErrorWhen
410 invite_link_expiredThe link expired.
410 invite_link_revokedThe link was turned off, or its channel was archived.
410 invite_link_used_upThe link reached its limit of uses, also for a member joining the channel through it.
404 not_foundThe code doesn't exist.
401 unauthorizedNobody is signed in.

To invite one person by email instead, see Invite someone.

On this page