Skip to content

API Reference

The Meet backend exposes a REST API at /api/v1.0/. All endpoints use JSON.

Authentication

Session authentication (browser)

Standard Django session authentication. Used by the frontend after OIDC login.

Bearer token (external integrations)

Server-to-server integrations use Bearer token authentication:

Authorization: Bearer <token>

External JWT exchange

For embedding Meet in third-party applications:

POST /api/v1.0/auth/token/
{"token": "<external-jwt>"}


Rooms

List rooms

GET /api/v1.0/rooms/

Response:

{
  "count": 2,
  "results": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "slug": "my-meeting-room",
      "name": "My Meeting Room",
      "access_level": "public",
      "created_at": "2026-01-01T10:00:00Z"
    }
  ]
}

Create a room

POST /api/v1.0/rooms/
{
  "name": "My Meeting Room",
  "slug": "my-meeting-room",
  "access_level": "public",
  "configuration": {"recording_enabled": true}
}

Get a room

GET /api/v1.0/rooms/{id}/

Update a room

PATCH /api/v1.0/rooms/{id}/

Delete a room

DELETE /api/v1.0/rooms/{id}/

Room tokens (LiveKit access)

Returns the LiveKit JWT and server URL that the browser uses to connect to the media server.

GET /api/v1.0/rooms/{id}/token/?username=Alice

Response:

{
  "token": "<livekit-jwt>",
  "url": "https://livekit.example.com"
}


Room participants

List waiting participants (lobby)

GET /api/v1.0/rooms/{id}/waiting-participants/

Admit a participant from the lobby

POST /api/v1.0/rooms/{id}/waiting-participants/{participant_id}/admit/

Request entry (attendee → lobby)

POST /api/v1.0/rooms/{id}/request-entry/

Recordings

List recordings for a room

GET /api/v1.0/recordings/?room={room_id}

Start recording

POST /api/v1.0/recordings/
{
  "room": "<room-id>",
  "mode": "room_composite"
}

Stop recording

DELETE /api/v1.0/recordings/{id}/

Storage webhook (internal — called by Garage/S3)

POST /api/v1.0/recordings/storage-hook/
Authorization: Bearer <storage-webhook-token>

LiveKit webhook (internal — called by LiveKit)

POST /api/v1.0/webhook/livekit/

Files

List files in a room

GET /api/v1.0/files/?room={room_id}

Upload a file

POST /api/v1.0/files/
Content-Type: multipart/form-data

Delete a file

DELETE /api/v1.0/files/{id}/

Users

Get current user

GET /api/v1.0/users/me/

Response:

{
  "id": "...",
  "email": "user@example.com",
  "name": "Alice",
  "language": "en"
}

Update current user

PATCH /api/v1.0/users/me/
{"language": "fr"}


Frontend configuration

Returns feature flags and configuration for the frontend.

GET /api/v1.0/config/

Response:

{
  "silence_livekit_debug": false,
  "is_silent_login_enabled": true,
  "analytics": {},
  "feedback": {}
}


Health check

GET /healthz/

Returns HTTP 200 if the application is running. Used by load balancers and monitoring.


Pagination

List endpoints support cursor-based pagination:

GET /api/v1.0/rooms/?page=2&page_size=20

Default page_size is 20.


Error responses

All errors return a JSON body:

{"detail": "Human-readable error message"}
Code Meaning
400 Bad request — invalid input
401 Unauthorized — missing or invalid auth
403 Forbidden — lacking permission
404 Not found
429 Rate limited
500 Internal server error

Rate limiting

The API applies per-user rate limiting. Rate limit errors return HTTP 429 with a Retry-After header.


OpenAPI / Swagger

Interactive API explorer (available when USE_SWAGGER=True):

GET /api/v1.0/swagger.json        # OpenAPI schema
GET /api/v1.0//swagger/           # Swagger UI
GET /api/v1.0//redoc/             # ReDoc UI