Examples

Curl

Table of Contents

  1. Authentication
  2. Tasks API
  3. Imports API
  4. Broadcasts API
  5. TTS API
  6. Speakers API
  7. Summary Templates API
  8. SSE API
  9. 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 returns 422 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 an import.completed Webhook 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: pendingprocessingcompleted / failedProcessing stages: convertingtranscribingtranslatingsummarizing


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 pending status 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 -N flag 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

Copyright © 2026