Curl
Table of Contents
- Authentication
- Tasks API
- Imports API
- Broadcasts API
- TTS API
- Speakers API
- Summary Templates API
- SSE API
- Utility Scripts
Authentication
Obtain a WebSocket Ticket
WebSocket connections are authenticated using a Ticket mechanism. First obtain a one-time Ticket via the REST API, then use it for the WebSocket connection.
curl -X POST "https://vas-poc.vurbo.ai/api/v1/auth/ticket" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS"
Example response:
{
"ticket": "aBcDeFgHiJkLmNoPqRsTuVwXyZ012345",
"expires_in": 60
}
Note: The Ticket is valid for 60 seconds and can only be used once.
Tasks API
Get the Task List
curl -X GET "https://vas-poc.vurbo.ai/api/v1/tasks" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS"
Example response:
{
"tasks": [
{
"task_id": "550e8400-e29b-41d4-a716-446655440000",
"title": "Meeting Notes",
"type": "transcribe",
"duration_ms": 60000,
"duration_formatted": "1:00",
"source_lang": "zh-TW",
"target_lang": "en-US",
"created_at": "2025-12-13T10:00:00Z",
"audio_status": "success",
"is_pinned": false,
"is_unread": true
}
]
}
Query Active Tasks
curl -X GET "https://vas-poc.vurbo.ai/api/v1/tasks?status=active" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS"
Example response:
{
"tasks": [
{
"task_id": "550e8400-e29b-41d4-a716-446655440000",
"title": "Untitled Recording",
"type": "transcribe",
"duration_ms": 0,
"duration_formatted": "0:00",
"source_lang": "zh-TW",
"target_lang": "en-US",
"created_at": "2026-02-24T10:00:00Z",
"processing_status": "recording",
"is_pinned": false,
"is_unread": true
}
]
}
Delete a Task
curl -X DELETE "https://vas-poc.vurbo.ai/api/v1/tasks/550e8400-e29b-41d4-a716-446655440000" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS"
Example response:
{
}
Update Pin Status
Pin a task:
curl -X PUT "https://vas-poc.vurbo.ai/api/v1/tasks/550e8400-e29b-41d4-a716-446655440000/pin" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS" \
-H "Content-Type: application/json" \
-d '{"is_pinned": true}'
Unpin a task:
curl -X PUT "https://vas-poc.vurbo.ai/api/v1/tasks/550e8400-e29b-41d4-a716-446655440000/pin" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS" \
-H "Content-Type: application/json" \
-d '{"is_pinned": false}'
Example response:
{
"is_pinned": true
}
Mark as Read
curl -X PUT "https://vas-poc.vurbo.ai/api/v1/tasks/550e8400-e29b-41d4-a716-446655440000/read" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS"
Example response:
{
"is_unread": false
}
Update the Task Name
curl -X PATCH "https://vas-poc.vurbo.ai/api/v1/tasks/550e8400-e29b-41d4-a716-446655440000/name" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS" \
-H "Content-Type: application/json" \
-d '{"name": "Product Meeting Discussion"}'
Example response:
{
"message": "Recording name updated",
"data": {
"task_id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Product Meeting Discussion",
"name_source": "user"
}
}
Download the Task Audio File
Download the task's original audio file (always an M4A container, with the .m4a extension). -OJ automatically names the file based on the Content-Disposition returned by the server.
curl -X GET "https://vas-poc.vurbo.ai/api/v1/tasks/550e8400-e29b-41d4-a716-446655440000/audio/export" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS" \
-OJ
Download the Transcript
Five formats are supported: txt (default), srt, sbv, vtt, and csv. The output includes the original text and all translation languages.
# Default TXT format
curl -X GET "https://vas-poc.vurbo.ai/api/v1/tasks/550e8400-e29b-41d4-a716-446655440000/transcript/export" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS" \
-OJ
# SRT subtitles (SubRip, for video subtitle software)
curl -X GET "https://vas-poc.vurbo.ai/api/v1/tasks/550e8400-e29b-41d4-a716-446655440000/transcript/export?format=srt" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS" \
-OJ
# SBV subtitles (YouTube upload)
curl -X GET "https://vas-poc.vurbo.ai/api/v1/tasks/550e8400-e29b-41d4-a716-446655440000/transcript/export?format=sbv" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS" \
-OJ
# VTT subtitles (HTML5 <track>)
curl -X GET "https://vas-poc.vurbo.ai/api/v1/tasks/550e8400-e29b-41d4-a716-446655440000/transcript/export?format=vtt" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS" \
-OJ
# CSV spreadsheet (with UTF-8 BOM, opens directly in Excel)
curl -X GET "https://vas-poc.vurbo.ai/api/v1/tasks/550e8400-e29b-41d4-a716-446655440000/transcript/export?format=csv" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS" \
-OJ
Note: Export is only possible after
processing_status = completed; if it is not yet ready, it returns422 recording_transcript_not_ready.
Imports API
Check Budget
Before uploading an audio file, check whether the monthly budget is sufficient.
curl -X POST "https://vas-poc.vurbo.ai/api/v1/imports/check-quota" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS" \
-H "Content-Type: application/json" \
-d '{"duration_ms": 3600000}'
Example response:
{
"data": {
"allowed": true,
"remaining_budget": 49.72,
"is_exceeded": false
}
}
Upload an Audio File
Basic upload:
curl -X POST "https://vas-poc.vurbo.ai/api/v1/imports" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS" \
-F "file=@meeting.mp3" \
-F 'transcription_languages=["zh-TW"]' \
-F 'translation_languages=["en-US"]' \
-F "recognition_mode=multi_speaker"
Upload with text processing settings:
curl -X POST "https://vas-poc.vurbo.ai/api/v1/imports" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS" \
-F "file=@meeting.mp3" \
-F 'transcription_languages=["zh-TW"]' \
-F 'translation_languages=["en-US"]' \
-F "recognition_mode=multi_speaker" \
-F "summary_template=meeting" \
-F 'terminology={"zh-TW": [{"term": "Speaker Diarization", "boost": 1.5}]}' \
-F 'fuzzy_correction={"zh-TW": [{"correct": "Speaker Diarization", "incorrect": ["Speaker Dictation"]}]}' \
-F 'translation_dict=[{"source": "Speaker Diarization", "translations": {"en-US": "Speaker Diarization"}}]'
Upload an Audio File (with Webhook Callback)
curl -X POST "https://vas-poc.vurbo.ai/api/v1/imports" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS" \
-F "file=@meeting.mp3" \
-F 'transcription_languages=["zh-TW"]' \
-F 'translation_languages=["en-US"]' \
-F "recognition_mode=multi_speaker" \
-F "callback_url=https://your-server.com/webhooks/vas"
Once you set
callback_url, you will receive animport.completedWebhook notification when processing is complete, with no need to poll. See the Webhook Callback Guide for details.
Example response (HTTP 202):
{
"data": {
"import_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "pending",
"stage": null,
"progress": 0,
"message": null,
"original_filename": "meeting.mp3",
"file_size": "15.2 MB",
"task_id": null,
"error_code": null,
"error_message": null,
"created_at": "2025-12-31T10:00:00.000Z",
"updated_at": "2025-12-31T10:00:00.000Z"
}
}
Query Import Status
curl -X GET "https://vas-poc.vurbo.ai/api/v1/imports/550e8400-e29b-41d4-a716-446655440000" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS"
Example response:
{
"data": {
"import_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "processing",
"stage": "transcribing",
"progress": 45,
"message": "Recognizing speech...",
"original_filename": "meeting.mp3",
"file_size": "15.2 MB",
"task_id": null,
"error_code": null,
"error_message": null,
"created_at": "2025-12-31T10:00:00.000Z",
"updated_at": "2025-12-31T10:05:00.000Z"
}
}
Status flow:
pending→processing→completed/failedProcessing stages:converting→transcribing→translating→summarizing
Get the Import List
curl -X GET "https://vas-poc.vurbo.ai/api/v1/imports?per_page=20" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS"
Example response:
{
"data": [
{
"import_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "completed",
"original_filename": "meeting.mp3",
"file_size": "15.2 MB",
"task_id": "660e8400-e29b-41d4-a716-446655440001",
"created_at": "2025-12-31T10:00:00.000Z"
}
],
"meta": {
"current_page": 1,
"last_page": 5,
"per_page": 20,
"total": 100
}
}
Broadcasts API
Create a Broadcast
curl -X POST "https://vas-poc.vurbo.ai/api/v1/broadcasts" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS" \
-H "Content-Type: application/json" \
-d '{
"transcription_language": "zh-TW",
"translation_languages": ["en-US", "ja-JP"],
"name": "My Broadcast Channel",
"access_type": "public",
"max_viewers": 50,
"tts_config": {
"en-US": {"voice": "en-US-JennyNeural", "speaking_rate": 1.0},
"ja-JP": {"voice": "ja-JP-NanamiNeural", "speaking_rate": 1.0}
},
"summary_template": "meeting",
"summary_language": "zh-TW",
"callback_url": "https://your-server.com/webhooks/vas"
}'
Example 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",
"translation_languages": ["en-US", "ja-JP"],
"tts_config": {
"en-US": {"voice": "en-US-JennyNeural", "speaking_rate": 1.0},
"ja-JP": {"voice": "ja-JP-NanamiNeural", "speaking_rate": 1.0}
},
"speaker_diarization": false,
"summary_template": "meeting",
"summary_language": "zh-TW",
"max_viewers": 50,
"access_type": "public",
"pass_code": null,
"status": "pending",
"is_live": false,
"created_at": "2026-01-03T10:00:00.000Z"
}
}
Query Broadcast Status
curl -X GET "https://vas-poc.vurbo.ai/api/v1/broadcasts/550e8400-e29b-41d4-a716-446655440000" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS"
Get the Broadcast List
curl -X GET "https://vas-poc.vurbo.ai/api/v1/broadcasts?per_page=10&page=1" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS"
Update Broadcast Settings
Switch to password protection:
curl -X PATCH "https://vas-poc.vurbo.ai/api/v1/broadcasts/550e8400-e29b-41d4-a716-446655440000" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS" \
-H "Content-Type: application/json" \
-d '{
"access_type": "password",
"pass_code": "mySecret123"
}'
Adjust the maximum number of viewers:
curl -X PATCH "https://vas-poc.vurbo.ai/api/v1/broadcasts/550e8400-e29b-41d4-a716-446655440000" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS" \
-H "Content-Type: application/json" \
-d '{"max_viewers": 200}'
Change the language settings:
curl -X PATCH "https://vas-poc.vurbo.ai/api/v1/broadcasts/550e8400-e29b-41d4-a716-446655440000" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS" \
-H "Content-Type: application/json" \
-d '{
"transcription_language": "en-US",
"translation_languages": ["zh-TW", "ja-JP", "ko-KR"]
}'
Revoke a Broadcast
Only broadcasts in the
pendingstatus can be revoked.
curl -X DELETE "https://vas-poc.vurbo.ai/api/v1/broadcasts/550e8400-e29b-41d4-a716-446655440000" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS"
Example response:
{
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"status": "revoked",
"revoked_at": "2026-01-03T10:05:00.000Z"
}
}
TTS API
Get the Voice List
curl -X GET "https://vas-poc.vurbo.ai/api/v1/tts/voices?language=en-US" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS"
Example response:
{
"data": {
"language": "en-US",
"voices": [
{
"voice_name": "en-US-JennyNeural",
"display_name": "Jenny",
"gender": "Female",
"is_default": true,
"sample_url": "https://vas-poc.vurbo.ai/api/v1/tts/voices/en-US-JennyNeural/sample"
},
{
"voice_name": "en-US-GuyNeural",
"display_name": "Guy",
"gender": "Male",
"is_default": false,
"sample_url": "https://vas-poc.vurbo.ai/api/v1/tts/voices/en-US-GuyNeural/sample"
}
]
}
}
Preview a Voice
curl -X GET "https://vas-poc.vurbo.ai/api/v1/tts/voices/zh-TW-HsiaoChenNeural/sample" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS" \
--output sample.mp3
The response is binary MP3 audio data and does not count toward TTS usage. For the list of languages that support TTS, see Appendix - Supported Languages.
Speakers API
Globally Rename a Speaker
curl -X PATCH "https://vas-poc.vurbo.ai/api/v1/tasks/550e8400-e29b-41d4-a716-446655440000/speakers/rename" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS" \
-H "Content-Type: application/json" \
-d '{
"speaker_id": "Guest-1",
"new_label": "Manager Wang"
}'
Example response:
{
"data": {
"speaker_id": "Guest-1",
"new_label": "Manager Wang",
"affected_sids": [1, 3, 5, 8, 12]
}
}
Reassign a Single Sentence's Speaker
curl -X PATCH "https://vas-poc.vurbo.ai/api/v1/tasks/550e8400-e29b-41d4-a716-446655440000/speakers/reassign" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS" \
-H "Content-Type: application/json" \
-d '{
"sid": 5,
"target_speaker_id": "Guest-2"
}'
Example response:
{
"data": {
"sid": 5,
"old_speaker_id": "Guest-1",
"new_speaker_id": "Guest-2",
"new_speaker_label": "Lisa Lee"
}
}
Summary Templates API
Get the Summary Template List
curl -X GET "https://vas-poc.vurbo.ai/api/v1/summary-templates" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS"
Example response:
{
"data": [
{"slug": "general", "name": "General Summary", "description": "Summary template for general conversations"},
{"slug": "meeting", "name": "Meeting Summary", "description": "Summary template for meeting notes"},
{"slug": "meeting_minutes", "name": "Meeting Minutes", "description": "Detailed meeting minutes template"},
{"slug": "speech", "name": "Speech Summary", "description": "Summary template for speech content"},
{"slug": "interview", "name": "Interview Summary", "description": "Summary template for interview content"},
{"slug": "course", "name": "Course Summary", "description": "Summary template for course content"}
]
}
SSE API
Get History Records
curl -N "https://vas-poc.vurbo.ai/api/v1/sse/history/transcribe/550e8400-e29b-41d4-a716-446655440000" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS"
Note: The
-Nflag disables buffering so that SSE events are received in real time.
Example response (SSE format):
event: connected
data: {"message": "History record service connected (recordingId: 550e8400-e29b-41d4-a716-446655440000)"}
event: init_metadata
data: {"task_id": "550e8400-e29b-41d4-a716-446655440000", "title": "Meeting Notes", "created_at": "2025-12-17T10:00:00Z", "type": "transcribe", "has_speaker_diarization": false, "transcription_languages": ["zh-TW"], "translation_languages": ["en-US"], "summary_template": null, "summary_language": null}
event: init_sentence
data: {"sid": 1, "origin": "Hello, nice to meet you", "translations": {"en-US": "Hello, nice to meet you"}, "start_time": "00:05"}
event: init_sentence
data: {"sid": 2, "origin": "Today let's discuss product planning", "translations": {"en-US": "Today let's discuss product planning"}, "start_time": "00:10"}
event: init_summary
data: {"text": "This is the meeting summary..."}
event: init_done
data: {"totalSentences": 2}
Download Audio
Download the complete audio:
curl -o audio.m4a "https://vas-poc.vurbo.ai/api/v1/sse/audio/550e8400-e29b-41d4-a716-446655440000" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS"
Get partial audio (Range Request):
curl -H "Range: bytes=0-1023" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS" \
-o audio_part.m4a \
"https://vas-poc.vurbo.ai/api/v1/sse/audio/550e8400-e29b-41d4-a716-446655440000"
Retranslate the Full Transcript
curl -N "https://vas-poc.vurbo.ai/api/v1/sse/retranslate/550e8400-e29b-41d4-a716-446655440000?targetLang=ja-JP" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS"
Example response (SSE format):
event: translation
data: {"sid": 1, "text": "こんにちは、お会いできて嬉しいです", "is_final": true}
event: translation
data: {"sid": 2, "text": "今日は製品計画について話し合いましょう", "is_final": true}
event: done
data: {"totalUpdated": 2}
Retranslate the Summary
curl -N "https://vas-poc.vurbo.ai/api/v1/sse/retranslate/summary/550e8400-e29b-41d4-a716-446655440000?targetLang=en-US" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS"
Example response (SSE format):
event: summary_translation
data: {"text": "This is the", "is_final": false}
event: summary_translation
data: {"text": "This is the meeting summary...", "is_final": true}
event: done
data: {"totalUpdated": 1}
TTS Speech Synthesis
curl -N "https://vas-poc.vurbo.ai/api/v1/sse/tts/550e8400-e29b-41d4-a716-446655440000" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS" \
-H "Content-Type: application/json" \
-d '{
"sid": 1,
"language": "en-US",
"voice": "en-US-JennyNeural"
}'
Utility Scripts
Get All Tasks and Format the Output
curl -s "https://vas-poc.vurbo.ai/api/v1/tasks" \
-H "X-API-Key: vas_YOUR_API_KEY_HERE_32_CHARACTERS" \
| jq '.tasks[] | {id: .task_id, title: .title, duration: .duration_formatted}'
Batch Delete All Tasks
#!/bin/bash
API_KEY="vas_YOUR_API_KEY_HERE_32_CHARACTERS"
BASE_URL="https://vas-poc.vurbo.ai/api/v1"
# Get all task IDs
TASK_IDS=$(curl -s "${BASE_URL}/tasks" \
-H "X-API-Key: ${API_KEY}" \
| jq -r '.tasks[].task_id')
# Delete them one by one
for ID in $TASK_IDS; do
echo "Deleting task: $ID"
curl -s -X DELETE "${BASE_URL}/tasks/${ID}" \
-H "X-API-Key: ${API_KEY}"
echo ""
done
echo "Done"
Upload an Audio File and Poll for Status
#!/bin/bash
API_KEY="vas_YOUR_API_KEY_HERE_32_CHARACTERS"
BASE_URL="https://vas-poc.vurbo.ai/api/v1"
FILE="meeting.mp3"
# Step 1: Upload the audio file
echo "Uploading audio file: ${FILE}"
RESPONSE=$(curl -s -X POST "${BASE_URL}/imports" \
-H "X-API-Key: ${API_KEY}" \
-F "file=@${FILE}" \
-F 'transcription_languages=["zh-TW"]' \
-F 'translation_languages=["en-US"]' \
-F "recognition_mode=multi_speaker" \
-F "summary_template=meeting")
IMPORT_ID=$(echo "$RESPONSE" | jq -r '.data.import_id')
echo "Import ID: ${IMPORT_ID}"
# Step 2: Poll for status
while true; do
STATUS_RESPONSE=$(curl -s "${BASE_URL}/imports/${IMPORT_ID}" \
-H "X-API-Key: ${API_KEY}")
STATUS=$(echo "$STATUS_RESPONSE" | jq -r '.data.status')
STAGE=$(echo "$STATUS_RESPONSE" | jq -r '.data.stage')
PROGRESS=$(echo "$STATUS_RESPONSE" | jq -r '.data.progress')
echo "Status: ${STATUS} | Stage: ${STAGE} | Progress: ${PROGRESS}%"
if [ "$STATUS" = "completed" ]; then
TASK_ID=$(echo "$STATUS_RESPONSE" | jq -r '.data.task_id')
echo "Processing complete! Task ID: ${TASK_ID}"
break
fi
if [ "$STATUS" = "failed" ]; then
ERROR=$(echo "$STATUS_RESPONSE" | jq -r '.data.error_message')
echo "Processing failed: ${ERROR}"
break
fi
sleep 5
done
Export Task History Records as JSON
#!/bin/bash
API_KEY="vas_YOUR_API_KEY_HERE_32_CHARACTERS"
BASE_URL="https://vas-poc.vurbo.ai/api/v1"
TASK_ID="550e8400-e29b-41d4-a716-446655440000"
OUTPUT_FILE="task_${TASK_ID}.json"
# Get the history records and save them
curl -s -N "${BASE_URL}/sse/history/transcribe/${TASK_ID}" \
-H "X-API-Key: ${API_KEY}" \
| grep "^data:" \
| sed 's/^data: //' \
> "${OUTPUT_FILE}"
echo "Exported to ${OUTPUT_FILE}"
Version: V1.5.7 Last Updated: 2026-05-20