API reference

Every endpoint, WebSocket command, and event. Full machine-readable spec at /v1/openapi.json.

Base URL & auth

All REST endpoints live at https://kardocloud.com/v1. Every request needs a Bearer token in Authorization:

Some endpoints (/me/channels/token, /me/sessions/:id/token) accept either.

Projects & API keys

MethodPathDescription
GET/me/projectsList projects
POST/me/projectsCreate project
GET/me/projects/:idGet one
PATCH/me/projects/:idUpdate
DELETE/me/projects/:idArchive
PATCH/me/projects/:id/featuresToggle features
GET/me/projects/features/catalogList feature codes
GET/me/projects/:id/keysList keys
POST/me/projects/:id/keysCreate key (returns fullKey ONCE)
DELETE/me/projects/:id/keys/:keyIdRevoke key

Channels (chat)

MethodPathDescription
GET/me/channelsList channels (filter ?projectId, ?type)
POST/me/channelsCreate — type: direct / group / public / stream
GET/me/channels/:idGet + members
PATCH/me/channels/:idUpdate name, avatarUrl, description, externalRef (group/public/stream only)
DELETE/me/channels/:idArchive
POST/me/channels/:id/membersAdd member
DELETE/me/channels/:id/members/:userIdRemove member
POST/me/channels/tokenMint chat JWT for an end-user
POST/me/channels/uploads/urlPre-signed S3 PUT for attachments (25 MB cap)
GET/me/channels/search/messages?q=…Full-text search
GET/me/channels/analytics/summaryKPIs for dashboard

Channel messages

MethodPathDescription
GET/me/channels/:id/messagesList (?limit, ?before, ?parentId)
POST/me/channels/:id/messagesSend (with optional parentId, mentions[], attachments[])
PATCH/me/channels/:id/messages/:msgIdEdit body
DELETE/me/channels/:id/messages/:msgIdSoft delete (redact)
POST/me/channels/:id/readMark channel read up to now

Streams (RTMP/HLS)

MethodPathDescription
GET/me/streamsList
POST/me/streamsCreate (mode: REALTIME / LOW_LATENCY / BROADCAST)
GET/me/streams/:idGet + keys + sessions + recordings
POST/me/streams/:id/rotate-keyRotate publish key
POST/me/streams/:id/sfu-tokenMint SFU JWT (legacy stream-bound)
POST/me/streams/:id/recordings/startStart recording
POST/me/streams/:id/recordings/:recId/stopStop
POST/me/streams/:id/transcription/startEnable live captions
POST/me/streams/:id/transcription/stopDisable

Sessions

MethodPathDescription
GET/me/sessionsList (filter ?type, ?state, ?projectId)
POST/me/sessionsCreate (type: livestream / call / conference / webinar)
GET/me/sessions/:idGet + participants + recordings
PATCH/me/sessions/:idUpdate layout / lock / watermark
POST/me/sessions/:id/startMove waiting → live
POST/me/sessions/:id/endEnd
POST/me/sessions/:id/tokenMint SFU + chat JWT for an end-user
GET/me/sessions/:id/participantsList
POST/me/sessions/:id/participantsAdd invite
PATCH/me/sessions/:id/participants/:userIdChange role / perms
DELETE/me/sessions/:id/participants/:userIdKick
POST/me/sessions/:id/moderate/mute-allMute everyone (except hosts by default)
POST/me/sessions/:id/moderate/spotlightPin a participant (or clear with userId:null)
POST/me/sessions/:id/moderate/hand-raiseRaise hand
POST/me/sessions/:id/moderate/hand-lowerLower hand
POST/me/sessions/:id/moderate/promotePromote to cohost/guest
POST/me/sessions/:id/recording/startComposite recording (layout-aware)
POST/me/sessions/:id/recording/:recId/stopStop recording
GET/me/sessions/:id/recordingsList recordings
POST/me/sessions/:id/breakoutsSpawn N child sessions with optional assignments
GET/me/sessions/:id/breakoutsList child sessions
POST/me/sessions/:id/breakouts/closeEnd all child sessions
GET/me/sessions/:id/summaryFetch AI summary (TLDR + highlights + action items + decisions)
POST/me/sessions/:id/summaryManually set a summary (used by worker)
GET/me/sessions/analytics/summaryKPIs

Calls (1:1)

MethodPathDescription
POST/me/calls/inviteCreate call session + push the callee
POST/me/calls/:sessionId/answerCallee accepts
POST/me/calls/:sessionId/declineCallee declines
POST/me/calls/:sessionId/endEither party ends

Push devices & credentials

MethodPathDescription
POST/me/push/devicesRegister APNs/FCM token for a user
GET/me/push/devices/:userIdList user's devices
DELETE/me/push/devices/:tokenUnregister
GET/me/push/projects/:projectId/credentialsShow push config status
POST/me/push/projects/:projectId/credentials/fcmUpload Firebase service-account JSON
POST/me/push/projects/:projectId/credentials/apnsUpload APNs .p8 + team/key/bundle IDs

Recordings

MethodPathDescription
GET/me/recordingsList
GET/me/recordings/:id/playback-urlGet signed playback URL
POST/me/recordings/:id/transcodeTranscode to other formats
GET/me/transcodes/:jobIdJob status

Webhooks (registration)

MethodPathDescription
GET/me/webhooksList
POST/me/webhooksRegister URL + event list (returns secret ONCE)
DELETE/me/webhooks/:idDelete
GET/me/webhooks/:id/deliveriesRecent deliveries (success + failure)
POST/me/webhooks/deliveries/:id/retryRetry a failed delivery

WebSocket protocol — chat

URL: wss://chat.kardocloud.com/v1/chat/socket?room=<channelId>&token=<jwt>

Envelope: { "type": <command|event>, "data": <payload> }

Client → server commands

chat.send         { id?, body, parentId?, mentions?, attachments? }
chat.edit         { id, body }                            (author only)
chat.delete       { id }
read.mark         { upTo? }
typing.start      {}
typing.stop       {}
reaction.add      { messageId?, emoji }
reaction.remove   { messageId?, emoji }
poll.create       { question, options[], durationSec }   (host)
poll.vote         { pollId, optionIdx }
poll.close        { pollId }                              (host)
qa.ask            { body }
qa.upvote         { qaId }
qa.answer         { qaId, body }                          (host)
gift.send         { kind, amountCents, recipientId? }
superchat.send    { body, amountCents, currency }
mod.timeout       { userId, durationSec }                 (host)
mod.ban / unban   { userId }                              (host)
mod.mute / unmute { userId }                              (host)
mod.delete        { messageId }                           (host)
mod.slowmode      { onSec }                               (host)
mod.bannedwords   { words[] }                             (host)

Server → client events

welcome           { you, room, viewers, slowmode, bannedWords[] }
chat              { id, authorId, authorName, body, parentId?, at }
chat.edited       { id, body, at, by }
chat.deleted      { id, by }
read              { userId, name, upTo }
typing            { userId, name, on }
reaction          { messageId?, emoji, count }
poll              { id, question, options[], state, endsAt? }
qa                { id, authorName, body, upvotes, answer? }
gift              { senderId, kind, amountCents, at }
superchat         { id, senderId, body, amountCents, currency, pinnedUntil }
mod.action        { kind, target?, by, reason? }
presence          { viewers }
system            { body }
error             { code, message }

WebSocket protocol — SFU

URL: wss://sfu.kardocloud.com/?token=<jwt>&room=<sessionId or streamId>

JSON-RPC 2.0-like:

// client → server
{ "id": "1", "type": "request", "method": "getRouterRtpCapabilities", "params": {} }
// server → client (reply)
{ "id": "1", "type": "response", "result": { "rtpCapabilities": {...} } }
// or error
{ "id": "1", "type": "response", "error": { "msg": "..." } }
// server → client (push notify)
{ "type": "notify", "method": "new-producer", "params": { peerId, producerId, kind } }

RPC methods

getRouterRtpCapabilities()
join({ rtpCapabilities, displayName })
createWebRtcTransport({ direction: 'send' | 'recv' })
connectTransport({ transportId, dtlsParameters })
produce({ transportId, kind, rtpParameters })
consume({ producerId, rtpCapabilities })
resumeConsumer({ consumerId })

Notifications

peer-joined      { peerId, displayName }
peer-left        { peerId }
new-producer     { peerId, producerId, kind }
producer-closed  { producerId }

Use mediasoup-client to handle the heavy lifting — see React quickstart.

WHIP / WHEP HTTP

MethodPathDescription
POSThttps://kardocloud.com/rtc/v1/whip/?app=live&stream=<key>SRS WHIP — publish to a stream by key (RTMP-backed)
POSThttps://kardocloud.com/rtc/v1/whep/?app=live&stream=<key>SRS WHEP — sub-2s playback
POSThttps://sfu.kardocloud.com/whip/<roomId>mediasoup WHIP — publish to a session
POSThttps://sfu.kardocloud.com/whep/<roomId>/<peerId>mediasoup WHEP — consume one peer

Body: SDP offer (Content-Type: application/sdp). Response: SDP answer + Location header for the resource.

Machine-readable

For codegen: /v1/openapi.json · Swagger UI: /Live/Developer/swagger.

Next

Back to overview →