Skip to content

REST API

Every path is prefixed /api. Authentication is a bearer token, or the session cookie the web app sets:

Authorization: Bearer slk_...

Responses are JSON. Errors are { "error": "..." } with a matching status.

Method Path Notes
GET /setup { needsSetup }. True on a fresh install
POST /setup Creates the first owner and workspace. Fails once set up
POST /auth/login { email, password }, returns a token and sets a cookie
POST /auth/logout Revokes the current session
GET /me The signed-in user, their workspaces, settings, and capabilities
PATCH /me { displayName?, avatarFileId? }
PATCH /me/settings Merges a partial settings object
Method Path Notes
POST /workspaces Subject to WORKSPACE_CREATION
PATCH /workspaces/:id Name, icon, accent. Admin
DELETE /workspaces/:id Owner only. Body must echo the workspace name
GET /workspaces/:id/members
PATCH /workspaces/:id/members/:userId Change role. Admin
DELETE /workspaces/:id/members/:userId Remove, or leave if it is you
GET /workspaces/:id/bootstrap One-shot state for a cold start
Method Path Notes
GET /workspaces/:id/invites Admin
POST /workspaces/:id/invites { role, email? }, returns a code
POST /workspaces/:id/invites/email Mails invites. Needs SMTP
DELETE /workspaces/:id/invites/:inviteId Revoke
GET /invites/:code Public. Preview before accepting
POST /invites/:code/accept Creates the account and signs in
Method Path Notes
GET /workspaces/:id/channels Channels you can see
POST /workspaces/:id/channels { name, type }
PATCH /channels/:id Name, topic
POST /channels/:id/join Public channels
POST /channels/:id/leave
POST /channels/:id/members { userIds }
POST /channels/:id/archive
POST /workspaces/:id/dms { userIds }. Reuses an existing conversation
GET /channels/:id/notes The shared channel note
PUT /channels/:id/notes Last write wins
Method Path Notes
GET /channels/:id/messages Cursor paginated, newest first
POST /channels/:id/messages { id, content, threadRootId?, fileIds? }
PATCH /channels/:id/messages/:messageId Edit your own
DELETE /channels/:id/messages/:messageId Soft delete
GET /messages/:rootId/thread Replies to a root
PUT /messages/:id/reactions { emoji }
DELETE /messages/:id/reactions { emoji }
PUT /channels/:id/read Mark read up to a message

The id on send is yours to generate. Mint a ULID client side and reuse it on retry: the server ignores a duplicate rather than posting twice.

Method Path Notes
POST /workspaces/:id/uploads Multipart. Returns a file record
GET /files/:fileId/:name Authenticated. Supports Range and ETag

Upload first, then reference the returned id in fileIds when sending. An upload that is never attached is cleaned up after 24 hours.

Method Path Notes
GET /workspaces/:id/search?q= Supports the filter syntax
Method Path Notes
GET /workspaces/:id/bots Admin
POST /workspaces/:id/bots { name }, returns a token once
DELETE /workspaces/:id/bots/:tokenId Revokes immediately
Method Path Notes
GET /workspaces/:id/webhooks Admin. Never includes the secret
POST /workspaces/:id/webhooks { url, events, includePrivate? }; returns the secret once
DELETE /workspaces/:id/webhooks/:webhookId
POST /workspaces/:id/webhooks/:webhookId/enable Re-enable after failures, resuming from now

See Outbound webhooks for the payload and signature.

Method Path Notes
GET /ice ICE servers with fresh, expiring TURN credentials
GET /push/key VAPID public key
POST /push/subscriptions Register a browser subscription
DELETE /push/subscriptions { endpoint }
Method Path Notes
PUT /devices Publish a device’s public keys
GET /channels/:id/devices Devices to seal a channel key to
GET /channels/:id/keys Sealed envelopes for your device
POST /channels/:id/keys Publish a rotated channel key

The server stores public keys and sealed blobs. It holds nothing that can decrypt a message.