Skip to main content

Meetings and Calls API

Meetings are created as meeting rooms through the Chat API. This page documents the media and guest-access APIs used after a meeting room exists.

Unless a route is marked Public invite route, send a Ration bearer token:

Authorization: Bearer <ration_access_token>
Accept: application/json

Meeting and call capabilities require the Collaboration feature for the caller's tenant.

Create or retrieve the media room

POST /apis/v1/call/rooms

{ "chat_room_id": "meeting-room-id" }
Request fieldTypeRequiredDescription
chat_room_idStringYesExisting Ration chat/meeting room ID.

The endpoint creates or reuses the media room associated with the meeting. It returns room_id and a transport payload:

Response fieldTypeDescription
room_idStringMedia-room identifier; retain it for token minting.
transportStringration_realtime for Ration's current managed media transport.
mediaObjectMedia credentials described below.
media.endpointStringMedia endpoint.
media.access_tokenStringShort-lived media access credential.
media.ice_serversArraySTUN/TURN relay configuration.

Mint a meeting token

GET|POST /apis/v1/call/tokens/:room_id/mint

The caller must be authorized to join the call. The server determines the role and media permissions from the meeting and caller; do not attempt to supply these in the request.

NameInTypeRequiredDescription
room_idPathStringYesMedia room ID returned by POST /call/rooms.
hd_video, hdQuery or bodyBooleanNoRequest HD video when the tenant is entitled; otherwise the response uses sd.
video_qualityQuery or bodyStringNohd, high, true, or 1 also request HD video.

Media transport response

FieldTypeDescription
room_idStringMedia room ID.
transportStringration_realtime.
protocolStringControl-channel protocol (call.v1).
control_tokenStringCredential for the meeting control channel.
media.endpointStringMedia endpoint.
media.access_tokenStringShort-lived media access credential.
media.ice_serversArraySTUN/TURN server configuration.
media.video_profileStringsd by default, or hd when explicitly requested and entitled.

For Ration's control-channel transport, the response has room_id, transport, protocol, and control_token.

Errors: 401 unauthorized means user context is missing; 403 call_not_ready means the caller cannot join; 409 room_full means the participant limit was reached; 500 token_mint_failed means credentials could not be generated.

Meeting status and recordings

List currently-live meetings

GET /apis/v1/meetings/live

Response: { "live": { "<chat_room_id>": <participant_count> } }. A room not present in live is not currently active.

List recordings for a meeting

GET /apis/v1/chat/rooms/:id/recordings

The caller must belong to the room.

Response fieldTypeDescription
recordingsArrayRecording metadata.
recordings[].recording_idStringRecording identifier.
recordings[].statusStringCurrent lifecycle status.
recordings[].started_at, completed_atString or nullLifecycle timestamps.
recordings[].duration_seconds, size_bytesNumber or nullDuration and size when known.
recordings[].availableBooleantrue only after the recording is finalized and available.

List the caller's meeting recordings

GET /apis/v1/meetings/recordings

Returns { "recordings": [...] } across meeting rooms visible to the caller. Each entry includes recording_id, room_id, meeting_name, status, started_at, duration_seconds, and available.

Authenticated external-invite administration

The following routes create and administer guest access. Supply either meeting context (chat_room_id) or call context (call_id) as required by the operation.

MethodPathRequestResponse
POST/apis/v1/call/external_invitesGuest details plus chat_room_id or call_id.Invite with invite_url and invite_token.
POST/apis/v1/chat/rooms/:id/external_invitesGuest details for that room.Invite with invite_url and invite_token.
GET/apis/v1/chat/rooms/:id/external_invites/chat_linkOptional external_party_id, reinitiate.Existing/reinitiated guest link.
GET/apis/v1/chat/rooms/:id/external_invites/approvals{ "requests": [...] }.
POST/apis/v1/chat/rooms/:id/external_invites/approvals/:request_idaction (or decision), optional reason, revoke.{ "request": {...} }.
POST/apis/v1/chat/rooms/:id/external_invites/domain_requestguest_email (or email).{ "domain": "…", "status": "…" }.
POST/apis/v1/call/:call_id/external/lockRequired locked Boolean.{ "call_id": "…", "locked": Boolean }.
POST/apis/v1/call/:call_id/external/participants/:guest_id/removeOptional reason.{ "call_id": "…", "guest_id": "…", "removed": true }.

Invite creation accepts guest identity fields such as guest_email, email, guest_name, and name; the returned invite_url is the link to share. It may also send the invitation email when a guest email is provided. The creator/member and room-type policy is enforced server-side.

Public invite routes

These routes do not use a Ration bearer token. Their unguessable invite_token, short-lived session credentials, OTP verification, rate limits, and server-side room policy control access. Do not expose any returned session or media token in logs.

Inspect and verify an invite

MethodPathRequestSuccessful response
GET/apis/v1/call/external/:invite_token/statusCurrent safe invite status.
POST/:invite_token/otp{ "status": "sent", "masked_email": "…", "expires_at": "…" }.
POST/:invite_token/claimdisplay_name/name; OTP as verification_code, verificationCode, otp, or code.Guest claim/session data.
POST/:invite_token/call_sessionGuest chat token, optional OTP field and call_id; optional step_up.Call-session data.

All abbreviated paths in this table are relative to /apis/v1/call/external. OTP and claim attempts are rate-limited. Common responses include 403 invite_expired, invite_revoked, otp_required, or approval_required; 429 signals rate limiting.

Mint a guest media session

POST /apis/v1/call/external/session/mint

{ "session_token": "guest-session-token" }

Response:

FieldTypeDescription
transportStringration_realtime.
media.endpoint, media.access_tokenStringGuest media credentials.
media.ice_serversArraySTUN/TURN configuration.
media.video_profileStringSelected media profile.
room_name, guest_id, call_idStringGuest call context.

Public livestream guests

POST /apis/v1/call/external/:invite_token/livestream_join

{ "display_name": "Guest", "email": "guest@example.com" }

display_name (or name) is required. Successful responses return receive-only media credentials, room_name, guest_id, call_id, leave_token, session_token, and chat_room_id.

To unlock livestream chat and ask-to-speak, request an emailed OTP then verify it:

  1. POST /:invite_token/livestream_verify/request with session_token.
  2. POST /:invite_token/livestream_verify with session_token and code (or otp).

The verification response contains { "status": "verified", "chat_token": "…", "chat_room_id": "…", "guest_id": "…", "guest_name": "…" }.

Finally, POST /apis/v1/call/external/session/leave with leave_token and optional reason records guest departure and returns { "status": "ok" }.

Error guide

StatusMeaning
401Authenticated meeting route has no valid caller context.
403Caller/guest is not allowed, the call is not ready, an invite is expired/revoked, or an approval/step-up check is required.
404Call, room, guest, invite, or approval request was not found.
409Call capacity was reached or an approval was already decided.
422Missing/invalid fields or an operation cannot be applied to the current call/room state.
429OTP, claim, or session-mint rate limit reached.