REST API

Imports

Endpoint Overview

MethodEndpointDescription
POST/api/v1/imports/check-quotaCheck budget
POST/api/v1/importsUpload audio file
GET/api/v1/imports/{importId}Query import status
GET/api/v1/importsGet import list

POST /api/v1/imports/check-quota

Description

Check whether the user's monthly budget is sufficient to upload an audio file of a given duration. We recommend calling this API for a pre-check before uploading, so you avoid discovering that the budget is insufficient only after uploading a large file.

Authentication

Header: X-API-Key (see Authentication)

Request Parameters

ParameterLocationTypeRequiredDescription
duration_msbodyintegerYesAudio duration (milliseconds, 1 second to 10 hours)

Request Example

curl -X POST "https://vas-poc.vurbo.ai/api/v1/imports/check-quota" \
  -H "X-API-Key: vas_aB3dE5fG7hI9jK1lM3nO5pQ7rS9tU1vW" \
  -H "Content-Type: application/json" \
  -d '{"duration_ms": 3600000}'

Success Response

HTTP 200

{
  "data": {
    "allowed": true,
    "remaining_budget": 48.48,
    "is_unlimited": false,
    "duration_minutes": 25,
    "estimated_cost": 0.4236,
    "remaining_minutes": 2864
  }
}

Response Field Description

FieldTypeDescription
data.allowedbooleanWhether the upload is allowed (true when the budget is not exceeded)
data.remaining_budgetfloat | nullRemaining monthly budget (USD); null when there is no budget limit
data.is_unlimitedbooleanWhether there is no budget limit
data.duration_minutesintegerEstimated audio duration (minutes, rounded up)
data.estimated_costfloatEstimated STT processing cost (USD)
data.remaining_minutesinteger | nullEquivalent STT minutes available within the remaining budget; null when there is no budget limit

Specific Error Codes

This endpoint has no specific error codes; it may only return common authentication errors.


POST /api/v1/imports

Description

Upload an audio file for speech recognition and translation. After a successful upload, processing runs in the background, and you can track progress through the Query import status API.

Authentication

Header: X-API-Key (see Authentication)

Request Parameters (multipart/form-data)

ParameterTypeRequiredDescription
filefileYesAudio file (mp3/wav/m4a, max 500MB)
transcription_languagesstringYesTranscription languages (JSON array string, e.g. '["zh-TW"]')
translation_languagesstringNoTranslation languages (JSON array string, e.g. '["en-US"]')
recognition_modestringYesRecognition mode: single (single speaker) / multi_speaker (multiple speakers)
summary_templatestringNoSummary template identifier (max 50 characters; must be an enabled summary category slug)
terminologystringNoTerminology list (JSON object string; see format below)
fuzzy_correctionstringNoFuzzy correction rules (JSON object string; see format below)
translation_dictstringNoTranslation dictionary (JSON array string; see format below)
callback_urlstringNoWebhook callback URL (notifies on completion/failure, max 2048 characters)

Webhook Notification: Once callback_url is set, you receive an import.completed event when the import finishes and an import.failed event when it fails. See the Webhook Guide.

Text Processing Parameter Formats

Terminology (terminology): Improves recognition accuracy for specific terms

{
  "zh-TW": [
    { "term": "Speaker Diarization", "boost": 1.5 },
    { "term": "Real-time Transcription", "boost": 1.5 }
  ]
}
  • Use the language code as the key and the term array as the value
  • term: Term text (required, max 100 characters)
  • boost: Weight (optional, default 1.0)
  • Up to 500 terms per language

Fuzzy Correction (fuzzy_correction): Automatically corrects common recognition errors

{
  "zh-TW": [
    { "correct": "Speaker Diarization", "incorrect": ["Speaker Diorization", "Speaker Diarizaion"] }
  ]
}
  • Use the language code as the key and the correction rule array as the value
  • correct: Correct term (required, max 200 characters)
  • incorrect: List of incorrect variants (required, each item max 200 characters)

Translation Dictionary (translation_dict): Specifies how proper nouns are translated

[
  { "source": "Speaker Diarization", "translations": { "en-US": "Speaker Diarization" } }
]
  • source: Source term (required, max 200 characters)
  • translations: Translation for each language (use the language code as the key; each translation text max 200 characters)
  • Up to 50 entries

Request Example

Basic Request

curl -X POST "https://vas-poc.vurbo.ai/api/v1/imports" \
  -H "X-API-Key: vas_aB3dE5fG7hI9jK1lM3nO5pQ7rS9tU1vW" \
  -F "file=@meeting.mp3" \
  -F 'transcription_languages=["zh-TW"]' \
  -F 'translation_languages=["en-US"]' \
  -F "recognition_mode=multi_speaker"

Request with Text Processing Settings

curl -X POST "https://vas-poc.vurbo.ai/api/v1/imports" \
  -H "X-API-Key: vas_aB3dE5fG7hI9jK1lM3nO5pQ7rS9tU1vW" \
  -F "file=@meeting.mp3" \
  -F 'transcription_languages=["zh-TW"]' \
  -F 'translation_languages=["en-US"]' \
  -F "recognition_mode=multi_speaker" \
  -F 'terminology={"zh-TW": [{"term": "Speaker Diarization", "boost": 1.5}]}' \
  -F 'fuzzy_correction={"zh-TW": [{"correct": "Speaker Diarization", "incorrect": ["Speaker Diorization"]}]}' \
  -F 'translation_dict=[{"source": "Speaker Diarization", "translations": {"en-US": "Speaker Diarization"}}]'

Request with Webhook Callback

curl -X POST "https://vas-poc.vurbo.ai/api/v1/imports" \
  -H "X-API-Key: vas_aB3dE5fG7hI9jK1lM3nO5pQ7rS9tU1vW" \
  -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"

Success 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": "2026-02-23T10:00:00.000Z",
    "updated_at": "2026-02-23T10:00:00.000Z"
  }
}

Response Field Description

FieldTypeDescription
data.import_idstringImport ID (UUID)
data.statusstringStatus: pending
data.stagestring | nullProcessing stage (initially null)
data.progressintegerProgress percentage (initially 0)
data.messagestring | nullProcessing message
data.original_filenamestringOriginal file name
data.file_sizestringFile size (formatted)
data.task_idstring | nullTask ID (populated only after processing completes)
data.error_codestring | nullError code (populated only on failure)
data.error_messagestring | nullError message (populated only on failure)
data.created_atstringCreation time (ISO 8601)
data.updated_atstringLast update time (ISO 8601)

Specific Error Codes

Error CodeHTTP StatusDescriptionRecommended Action
import_file_too_large413File size exceeds the 500MB limitCompress or split the file
import_invalid_format415Unsupported audio formatUse mp3/wav/m4a format
stt_quota_exceeded402STT quota exceededWait for the next month's quota reset or adjust your plan

GET /api/v1/imports/{importId}

Description

Query the processing status and progress of a specific import task.

Authentication

Header: X-API-Key (see Authentication)

Request Parameters

ParameterLocationTypeRequiredDescription
importIdpathstringYesImport ID (UUID)

Request Example

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

Success Response

HTTP 200

{
  "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": "2026-02-23T10:00:00.000Z",
    "updated_at": "2026-02-23T10:05:00.000Z"
  }
}

Response Field Description

FieldTypeDescription
data.statusstringStatus: pending / processing / completed / failed
data.stagestring | nullProcessing stage: converting / transcribing / translating / summarizing
data.progressintegerProgress percentage (0-100)
data.task_idstring | nullTask ID after processing completes (can be used with the Tasks API)
data.error_codestring | nullError code on failure
data.error_messagestring | nullError message on failure

The remaining fields are the same as the POST /api/v1/imports response.

status Transitions

pending → processing → completed
                    → failed

stage Processing Stages

StageDescription
convertingConverting audio format
transcribingRecognizing speech
translatingTranslating
summarizingGenerating summary

Edge Case for the completed Status (v1.3.5)

When an audio file produces no recognizable speech content—due to silence, low volume, noise, or a recognition language that does not match the audio—the system still finishes with completed (not failed), and task_id is generated normally, but the transcript entries for the corresponding task are an empty array. The client should load the data via GET /api/v1/sse/history/transcribe/{taskId} and then decide whether to show an empty state based on the sentence count. See File Import Guide – Behavior When Audio Cannot Be Recognized.

Specific Error Codes

Error CodeHTTP StatusDescriptionRecommended Action
import_not_found404Import task not foundVerify that importId is correct

GET /api/v1/imports

Description

Get the user's list of import tasks (paginated).

Authentication

Header: X-API-Key (see Authentication)

Request Parameters

ParameterLocationTypeRequiredDescription
per_pagequeryintegerNoItems per page (default 20)

Request Example

curl -X GET "https://vas-poc.vurbo.ai/api/v1/imports?per_page=20" \
  -H "X-API-Key: vas_aB3dE5fG7hI9jK1lM3nO5pQ7rS9tU1vW"

Success Response

HTTP 200

{
  "data": [
    {
      "import_id": "550e8400-e29b-41d4-a716-446655440000",
      "status": "completed",
      "stage": null,
      "progress": 100,
      "message": null,
      "original_filename": "meeting.mp3",
      "file_size": "15.2 MB",
      "task_id": "660f9500-f30c-52e5-b827-557766550000",
      "error_code": null,
      "error_message": null,
      "created_at": "2026-02-23T10:00:00.000Z",
      "updated_at": "2026-02-23T10:15:00.000Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "last_page": 3,
    "per_page": 20,
    "total": 55
  }
}

Response Field Description

FieldTypeDescription
dataarrayList of import tasks (each field is the same as the Query import status response)
meta.current_pageintegerCurrent page number
meta.last_pageintegerLast page number
meta.per_pageintegerItems per page
meta.totalintegerTotal number of items

Specific Error Codes

This endpoint has no specific error codes; it may only return common authentication errors.


Version: V1.5.7 Last Updated: 2026-05-20

Copyright © 2026