REST API

Broadcasts API

Table of Contents


GET /api/v1/broadcasts (Broadcast List)

Description

Query the broadcast list owned by the current API Key holder (excluding revoked channels), with pagination support.

Authentication

Header: X-API-Key (see Authentication)

Request Parameters

ParameterTypeRequiredDescription
per_pageintegerNoItems per page (default 20)
pageintegerNoPage number (default 1)

Request Example

curl -X GET "https://vas-poc.vurbo.ai/api/v1/broadcasts?per_page=10&page=1" \
  -H "X-API-Key: vas_aB3dE5fG7hI9jK1lM3nO5pQ7rS9tU1vW"

Success Response (HTTP 200)

{
  "data": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "token": "a3f9",
      "name": "My Broadcast Channel",
      "share_url": "https://vas-poc.vurbo.ai/broadcast/a3f9",
      "transcription_language": "zh-TW",
      "transcription_languages": ["zh-TW", "en-US"],
      "translation_languages": ["en-US", "ja-JP"],
      "tts_config": null,
      "speaker_diarization": false,
      "summary_template": null,
      "summary_language": null,
      "max_viewers": 100,
      "access_type": "public",
      "pass_code": null,
      "status": "pending",
      "is_live": false,
      "session_id": null,
      "current_recording_id": null,
      "recordings_count": 0,
      "peak_viewers": 0,
      "total_viewers": 0,
      "duration_ms": 0,
      "duration_formatted": "0:00",
      "started_at": null,
      "ended_at": null,
      "revoked_at": null,
      "created_at": "2026-01-03T10:00:00.000Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "last_page": 5,
    "per_page": 10,
    "total": 50
  }
}

For response field descriptions, see the response field table under Create Broadcast.

Specific Error Codes

Error CodeHTTP StatusDescriptionRecommended Action
auth_missing_api_key401API Key not providedMake sure the header includes the API Key
auth_invalid_api_key401Invalid API KeyVerify the API Key is correct

POST /api/v1/broadcasts (Create Broadcast)

Description

Create a new broadcast session for real-time subtitle streaming. After creation, a share link is generated (with a 4-character short-code token from the character set a-z0-9). Viewers can use this link to receive real-time subtitles and translations.

Authentication

Header: X-API-Key (see Authentication)

Request Parameters

ParameterTypeRequiredDescription
transcription_languagesstring[]Yes (or use the deprecated transcription_language)Array of transcription language codes (max 10, distinct; e.g. ["zh-TW", "en-US"]). Only a single language is supported when speaker_diarization is enabled
transcription_languagestringNo(Deprecated, backward compatible) Equivalent to the first element of transcription_languages
translation_languagesstring[]NoArray of translation language codes (max 12, distinct; e.g. ["en-US", "ja-JP"])
namestringNoChannel name (max 100 characters; cannot be changed after creation and is not used as the recording name)
access_typestringNoAccess type: public (default) or password
pass_codestringConditionalPassword (required when access_type is password, 4-12 characters; letters, digits and common punctuation only (no Chinese characters, no spaces))
max_viewersintegerNoMaximum number of viewers (1 to the account viewer limit; defaults to that limit when omitted)
speaker_diarizationbooleanNoSpeaker diarization (default false; when enabled, only a single transcription language is supported — providing multiple returns 422)
tts_configobjectNoTTS default settings (key is the language code)
tts_config.*.voicestringNoTTS voice name (uses the default voice if not specified)
summary_templatestringNoSummary template slug (max 50 characters; must be an enabled summary category template, which can be queried via the Summary Templates API)
summary_languagestringNoSummary output language; must be a language code from the supported language list (defaults to the first transcription language — the first element of transcription_languages — if not specified)
callback_urlstringNoWebhook callback URL (notifies when broadcast recording processing completes/fails, max 2048 characters)

Webhook Notification: After setting callback_url, you receive a recording.completed event when broadcast recording processing completes, and a recording.failed event when it fails. See the Webhook Guide.

Request Example

curl -X POST "https://vas-poc.vurbo.ai/api/v1/broadcasts" \
  -H "X-API-Key: vas_aB3dE5fG7hI9jK1lM3nO5pQ7rS9tU1vW" \
  -H "Content-Type: application/json" \
  -d '{
    "transcription_languages": ["zh-TW", "en-US"],
    "translation_languages": ["en-US", "ja-JP"],
    "name": "My Broadcast Channel",
    "access_type": "public",
    "max_viewers": 50,
    "tts_config": {
      "en-US": {"voice": "en-US-JennyNeural"},
      "ja-JP": {"voice": "ja-JP-NanamiNeural"}
    },
    "summary_template": "meeting",
    "summary_language": "zh-TW",
    "callback_url": "https://your-server.com/webhooks/vas"
  }'

Success Response (HTTP 201)

{
  "data": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "token": "a3f9",
    "name": "My Broadcast Channel",
    "share_url": "https://vas-poc.vurbo.ai/broadcast/a3f9",
    "transcription_language": "zh-TW",
    "transcription_languages": ["zh-TW", "en-US"],
    "translation_languages": ["en-US", "ja-JP"],
    "tts_config": {
      "en-US": {"voice": "en-US-JennyNeural"},
      "ja-JP": {"voice": "ja-JP-NanamiNeural"}
    },
    "speaker_diarization": false,
    "summary_template": "meeting",
    "summary_language": "zh-TW",
    "max_viewers": 50,
    "access_type": "public",
    "pass_code": null,
    "status": "pending",
    "is_live": false,
    "session_id": null,
    "current_recording_id": null,
    "recordings_count": 0,
    "peak_viewers": 0,
    "total_viewers": 0,
    "duration_ms": 0,
    "duration_formatted": "0:00",
    "started_at": null,
    "ended_at": null,
    "revoked_at": null,
    "created_at": "2026-01-03T10:00:00.000Z"
  }
}

Response Field Descriptions

FieldTypeDescription
idstringBroadcast ID (UUID)
tokenstringShare token (4-character short code, character set a-z0-9)
namestringBroadcast name
share_urlstringDefault share URL (not an openable viewer page; see the Broadcast Guide)
transcription_languagestringTranscription language (backward compatible, equals the first element of transcription_languages)
transcription_languagesstring[]List of transcription languages
translation_languagesarrayList of translation languages
tts_configobjectTTS default settings (key is the language code)
speaker_diarizationbooleanSpeaker diarization toggle
summary_templatestringSummary template slug (null means not set)
summary_languagestringSummary output language (defaults to the first transcription language when null)
max_viewersintegerMaximum number of viewers
access_typestringAccess type: public or password
pass_codestringPlaintext password (has a value when access_type is password, otherwise null)
statusstringStatus (see description below)
is_livebooleanWhether currently live (true when in active or paused status)
session_idstringWebSocket Session ID
current_recording_idstringCurrent recording UUID: has a value only while live, and is the recording of this go-live (the new recording after a takeover); null during standby or when not live
recordings_countintegerNumber of historical recordings
peak_viewersintegerHighest historical viewer count
total_viewersintegerCumulative viewer count
duration_msintegerBroadcast duration (milliseconds)
duration_formattedstringFormatted duration (min:sec)
started_atstringStart time (ISO 8601)
ended_atstringEnd time (ISO 8601)
revoked_atstringRevocation time (ISO 8601)
created_atstringCreation time (ISO 8601)

Broadcast Status Descriptions

StatusDescription
pendingCreated, not yet started
activeIn progress
pausedPaused
endedEnded
revokedRevoked

Specific Error Codes

Error CodeHTTP StatusDescriptionRecommended Action
validation_failed422Parameter validation failedVerify the parameter format is correct
plan_feature_not_allowed403Broadcasting is not included in unlimited plans (always excluded, v1.9.0)Broadcasting is billed by credits; use a credit-based API Key instead

Error codes for language-related violations: exceeding 12 translation languages, exceeding 10 transcription languages, duplicate languages, an empty required array, or "speaker diarization + multiple transcription languages" all return validation_failed (HTTP 422) on REST create/update. The same violations return too_many_languages or diarization_multilang_conflict (HTTP 400, see error-codes.md) on the WebSocket start path. The two paths validate at different layers, which is why the error codes differ.


GET /api/v1/broadcasts/{id} (Query Broadcast Status)

Description

Query the detailed information and current status of a specified broadcast.

Authentication

Header: X-API-Key (see Authentication)

Request Parameters

ParameterTypeRequiredDescription
idstringYesBroadcast ID (UUID, path parameter)

Request Example

curl -X GET "https://vas-poc.vurbo.ai/api/v1/broadcasts/550e8400-e29b-41d4-a716-446655440000" \
  -H "X-API-Key: vas_aB3dE5fG7hI9jK1lM3nO5pQ7rS9tU1vW"

Success Response (HTTP 200)

{
  "data": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "token": "a3f9",
    "name": "My Broadcast Channel",
    "share_url": "https://vas-poc.vurbo.ai/broadcast/a3f9",
    "transcription_language": "zh-TW",
    "transcription_languages": ["zh-TW", "en-US"],
    "translation_languages": ["en-US", "ja-JP"],
    "tts_config": {
      "en-US": {"voice": "en-US-JennyNeural"},
      "ja-JP": {"voice": "ja-JP-NanamiNeural"}
    },
    "speaker_diarization": true,
    "summary_template": "meeting",
    "summary_language": "zh-TW",
    "max_viewers": 100,
    "access_type": "public",
    "pass_code": null,
    "status": "active",
    "is_live": true,
    "session_id": "ws_session_xyz",
    "current_recording_id": "660e8400-e29b-41d4-a716-446655440001",
    "recordings_count": 1,
    "peak_viewers": 25,
    "total_viewers": 30,
    "duration_ms": 1800000,
    "duration_formatted": "30:00",
    "started_at": "2026-01-03T10:00:00.000Z",
    "ended_at": null,
    "revoked_at": null,
    "created_at": "2026-01-03T09:55:00.000Z"
  }
}

For response field descriptions, see the response field table under Create Broadcast.

Specific Error Codes

Error CodeHTTP StatusDescriptionRecommended Action
broadcast_session_not_found404Specified broadcast not foundVerify the broadcast ID is correct

PATCH /api/v1/broadcasts/{id} (Update Broadcast Settings)

Description

Update a broadcast channel's default settings. This API can be called while the broadcast is in progress (active or paused status), and the settings are saved immediately.

Note: Broadcast settings have two layers — pick the interface that matches your intent

A broadcast is a "channel": one channel can go live many times (it returns to pending when it ends and can be started again). Settings therefore split into two layers:

LayerWhat it changesInterface
Channel defaultsThe starting configuration for every future broadcastThis API (PATCH)
The in-progress sessionWhat that session actually usesHost-side WebSocket actions

This API updates the channel defaults, so transcription_languages, translation_languages, speaker_diarization, tts_config, summary_template, and summary_language take effect on the next broadcast; the in-progress broadcast keeps its current transcription, translation, speech synthesis, and end-of-session summary configuration. This lets a host adjust settings for the next broadcast while the current one is still live.

Exception: access_type, pass_code, and max_viewers are viewer access controls and are applied immediately to the in-progress broadcast as well.

To change the summary settings for the current session and have that session's summary use them, use the host-side WebSocket action set_summary instead.

Authentication

Header: X-API-Key (see Authentication)

Request Parameters

ParameterTypeRequiredDescription
idstringYesBroadcast ID (UUID, path parameter)
transcription_languagesstring[]NoNext broadcast only. Array of transcription language codes (max 10, distinct)
transcription_languagestringNoNext broadcast only. (Deprecated, backward compatible) Equivalent to the first element of transcription_languages
translation_languagesstring[]NoNext broadcast only. Array of translation language codes (max 12, distinct; e.g. ["en-US", "ja-JP"])
max_viewersintegerNoMaximum number of viewers (1 to the account viewer limit)
access_typestringNoAccess type: public or password
pass_codestringConditionalPassword (4-12 characters; letters, digits and common punctuation only (no Chinese characters, no spaces), required when access_type is password)
tts_configobjectNoNext broadcast only. TTS default settings (overwrites existing settings, null means clear)
speaker_diarizationbooleanNoNext broadcast only. Speaker diarization toggle (when enabled, only a single transcription language is supported — providing multiple returns 422)
summary_templatestringNoNext broadcast only. Summary template slug (max 50 characters, empty string "" means clear). To change the summary during a live broadcast, use the WebSocket set_summary action
summary_languagestringNoNext broadcast only. Summary output language; must be a language code from the supported language list (empty string "" means clear)

Note: If no updatable field is provided, the request returns 200 and nothing changes. The channel name cannot be changed after creation; a name field is ignored. Passing an empty string "" for summary_template and summary_language clears the setting; passing null for tts_config clears the setting; omitting a field leaves it unchanged.

Request Example

curl -X PATCH "https://vas-poc.vurbo.ai/api/v1/broadcasts/550e8400-e29b-41d4-a716-446655440000" \
  -H "X-API-Key: vas_aB3dE5fG7hI9jK1lM3nO5pQ7rS9tU1vW" \
  -H "Content-Type: application/json" \
  -d '{
    "translation_languages": ["en-US", "ja-JP", "ko-KR"],
    "max_viewers": 200
  }'

Success Response (HTTP 200)

{
  "data": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "token": "a3f9",
    "name": "Tech Talk Live",
    "share_url": "https://vas-poc.vurbo.ai/broadcast/a3f9",
    "transcription_language": "zh-TW",
    "transcription_languages": ["zh-TW", "en-US"],
    "translation_languages": ["en-US", "ja-JP", "ko-KR"],
    "tts_config": {
      "en-US": {"voice": "en-US-JennyNeural"},
      "ja-JP": {"voice": "ja-JP-NanamiNeural"}
    },
    "speaker_diarization": true,
    "summary_template": "meeting",
    "summary_language": "zh-TW",
    "max_viewers": 200,
    "access_type": "public",
    "pass_code": null,
    "status": "active",
    "is_live": true,
    "session_id": "ws_session_xyz",
    "current_recording_id": "660e8400-e29b-41d4-a716-446655440001",
    "recordings_count": 1,
    "peak_viewers": 25,
    "total_viewers": 30,
    "duration_ms": 1800000,
    "duration_formatted": "30:00",
    "started_at": "2026-01-03T10:00:00.000Z",
    "ended_at": null,
    "revoked_at": null,
    "created_at": "2026-01-03T09:55:00.000Z"
  }
}

For response field descriptions, see the response field table under Create Broadcast.

Specific Error Codes

Error CodeHTTP StatusDescriptionRecommended Action
broadcast_session_not_found404Specified broadcast not foundVerify the broadcast ID is correct
validation_failed422Parameter validation failedVerify the parameter format is correct

DELETE /api/v1/broadcasts/{id} (Revoke Broadcast)

Description

Revoke a broadcast that has not yet started. Only broadcasts in pending status can be revoked. After revocation, the status becomes revoked.

Authentication

Header: X-API-Key (see Authentication)

Request Parameters

ParameterTypeRequiredDescription
idstringYesBroadcast ID (UUID, path parameter)

Request Example

curl -X DELETE "https://vas-poc.vurbo.ai/api/v1/broadcasts/550e8400-e29b-41d4-a716-446655440000" \
  -H "X-API-Key: vas_aB3dE5fG7hI9jK1lM3nO5pQ7rS9tU1vW"

Success Response (HTTP 200)

{
  "data": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "token": "a3f9",
    "name": "My Broadcast Channel",
    "share_url": "https://vas-poc.vurbo.ai/broadcast/a3f9",
    "transcription_language": "zh-TW",
    "transcription_languages": ["zh-TW", "en-US"],
    "translation_languages": ["en-US", "ja-JP"],
    "tts_config": null,
    "speaker_diarization": false,
    "summary_template": null,
    "summary_language": null,
    "max_viewers": 100,
    "access_type": "public",
    "pass_code": null,
    "status": "revoked",
    "is_live": false,
    "session_id": null,
    "current_recording_id": null,
    "recordings_count": 0,
    "peak_viewers": 0,
    "total_viewers": 0,
    "duration_ms": 0,
    "duration_formatted": "0:00",
    "started_at": null,
    "ended_at": null,
    "revoked_at": "2026-01-03T10:05:00.000Z",
    "created_at": "2026-01-03T10:00:00.000Z"
  }
}

For response field descriptions, see the response field table under Create Broadcast.

Specific Error Codes

Error CodeHTTP StatusDescriptionRecommended Action
broadcast_session_not_found404Specified broadcast not foundVerify the broadcast ID is correct
broadcast_cannot_revoke422Only pending status can be revokedCheck the current broadcast status

DELETE /api/v1/broadcasts/batch (Batch Revoke Broadcasts)

Description

Batch revoke multiple broadcasts. Only broadcasts in pending status are revoked; IDs in other statuses are ignored. A single request can operate on up to 100 entries.

Authentication

Header: X-API-Key (see Authentication)

Request Parameters

ParameterLocationTypeRequiredDescription
idsbodyarrayYesArray of broadcast IDs (each element is a UUID, max 100 entries)

Request Example

curl -X DELETE "https://vas-poc.vurbo.ai/api/v1/broadcasts/batch" \
  -H "X-API-Key: vas_aB3dE5fG7hI9jK1lM3nO5pQ7rS9tU1vW" \
  -H "Content-Type: application/json" \
  -d '{
    "ids": [
      "550e8400-e29b-41d4-a716-446655440000",
      "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
    ]
  }'

Success Response

HTTP 200

{
  "data": {
    "affected_count": 2
  }
}

Response Field Descriptions

FieldTypeDescription
data.affected_countnumberNumber of broadcasts actually revoked (counts only pending status)

Specific Error Codes

Error CodeHTTP StatusDescriptionRecommended Action
validation_failed422Parameter validation failedVerify ids is a UUID array with no more than 100 entries

Version: V1.24.1 Last Updated: 2026-10-07

Copyright © 2026