Skip to content

Tenants

Create Tenant

POST /api/v1/tenants

Request

{
"name": "Acme University",
"max_concurrent_rooms": 50,
"max_participants_per_room": 25,
"max_recording_duration_minutes": 180
}
FieldTypeRequiredDefaultDescription
namestringYes-Tenant display name
max_concurrent_roomsintNo100Maximum rooms running simultaneously
max_participants_per_roomintNo10Maximum participants per room
max_recording_duration_minutesintNo120Maximum recording duration in minutes

Response

{
"data": {
"id": "tenant_abc123",
"name": "Acme University",
"api_key": "sk_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"max_concurrent_rooms": 50,
"max_participants_per_room": 25,
"max_recording_duration_minutes": 180,
"created_at": "2026-01-06T10:00:00Z"
}
}

Get Tenant

GET /api/v1/tenants/{id}

Requires X-API-Key header. Tenants can only access their own data.

Response

{
"data": {
"id": "tenant_abc123",
"name": "Acme University",
"max_concurrent_rooms": 50,
"max_participants_per_room": 25,
"max_recording_duration_minutes": 180,
"config": {
"force_recording": false,
"auto_start_recording": false,
"allow_early_join": true,
"empty_room_timeout_minutes": 30,
"recording_retention_days": 30,
"duplicate_participant_policy": "reject",
"transcription_enabled": true,
"transcription_language": "en-US"
},
"created_at": "2026-01-06T10:00:00Z"
}
}

Update Tenant

PATCH /api/v1/tenants/{id}

Request

{
"name": "Acme Education",
"max_concurrent_rooms": 100,
"max_participants_per_room": 50
}

All fields are optional. Only provided fields are updated.

Response

{
"data": {
"id": "tenant_abc123",
"name": "Acme Education",
"max_concurrent_rooms": 100,
"max_participants_per_room": 50,
"max_recording_duration_minutes": 180,
"updated_at": "2026-01-06T12:00:00Z"
}
}

Delete Tenant

DELETE /api/v1/tenants/{id}

Permanently deletes the tenant and all associated data.

Response

{
"data": {
"id": "tenant_abc123",
"deleted": true
}
}

Rotate API Key

POST /api/v1/tenants/{id}/rotate-key

Generates a new API key and invalidates the previous one.

Response

{
"data": {
"api_key": "sk_live_yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"
}
}

Update Tenant Config

PATCH /api/v1/tenants/{id}/config

PATCH merges with existing config — only provided fields are updated.

Request

{
"force_recording": true,
"auto_start_recording": true,
"allow_early_join": false,
"empty_room_timeout_minutes": 15,
"recording_retention_days": 90,
"duplicate_participant_policy": "disconnect_existing",
"transcription_enabled": true,
"transcription_language": "es-ES",
"transcription_profanity_filter": true,
"transcription_keywords": ["chemistry", "equation", "formula"],
"allowed_origins": [
"https://app.acme.edu",
"https://learn.acme.edu"
],
"post_meeting_webhook": {
"enabled": true,
"url": "https://api.acme.edu/webhooks/chalk",
"secret": "whsec_xxxxxxxxx",
"include_recording": true,
"include_transcript": true,
"include_summary": true,
"include_action_items": true,
"transcription": {
"provider": "deepgram",
"api_key": "dg_xxxxxxxxx"
},
"ai": {
"provider": "openai",
"api_key": "sk-xxxxxxxxx",
"model": "gpt-4o"
}
}
}

Config Fields

FieldTypeDefaultDescription
force_recordingboolfalseForce recording for all rooms
auto_start_recordingboolfalseStart recording when room begins
allow_early_joinbooltrueAllow joining before scheduled time
empty_room_timeout_minutesint30Minutes before empty room closes
recording_retention_daysint30Days to retain recordings
duplicate_participant_policystring”reject”How to handle duplicate participants
transcription_enabledbooltrueEnable live transcription
transcription_languagestring”en-US”Transcription language code
transcription_profanity_filterboolfalseFilter profanity in transcripts
transcription_keywordsstring[][]Keywords for transcription accuracy
allowed_originsstring[][]CORS origins (max 20, valid URLs only)
post_meeting_webhookobjectnullPost-meeting webhook configuration

Allowed Origins

  • Maximum 20 origins
  • Must be valid http:// or https:// URLs
  • Wildcards not allowed except for localhost

Post-Meeting Webhook Object

FieldTypeDescription
enabledboolEnable webhook delivery
urlstringWebhook endpoint URL
secretstringSignature verification secret
include_recordingboolInclude recording URL
include_transcriptboolInclude transcript data
include_summaryboolInclude AI summary
include_action_itemsboolInclude extracted action items
transcription.providerstringTranscription provider
transcription.api_keystringProvider API key
ai.providerstringAI provider for summaries
ai.api_keystringAI provider API key
ai.modelstringAI model to use

Response

{
"data": {
"id": "tenant_abc123",
"config": {
"force_recording": true,
"auto_start_recording": true,
"allow_early_join": false,
"empty_room_timeout_minutes": 15,
"recording_retention_days": 90,
"duplicate_participant_policy": "disconnect_existing",
"transcription_enabled": true,
"transcription_language": "es-ES",
"transcription_profanity_filter": true,
"transcription_keywords": ["chemistry", "equation", "formula"],
"allowed_origins": [
"https://app.acme.edu",
"https://learn.acme.edu"
]
},
"updated_at": "2026-01-06T12:00:00Z"
}
}