Error Codes
Table of Contents
- Error Response Format
- Severity Levels
- Authentication Errors
- Ticket Authentication Errors
- Session Errors
- Speech Recognition Errors
- Audio Processing Errors
- Speaker Diarization Errors
- Speaker Errors
- Configuration Errors
- Translation Service Errors
- TTS Synthesis Errors
- Recording Errors
- File Import Errors
- Storage Errors
- SSE Errors
- Broadcast Errors
- Conversation Errors
- Summary Errors
- Retranslation Errors
- Language Switch Errors
- Recording Name Errors
- General Errors
- Frontend Error Handling Example
Error Response Format
All API errors use a unified format:
{
"type": "error",
"data": {
"error_code": "auth_invalid_api_key",
"severity": "fatal",
"message": "Invalid API key",
"context": "auth",
"request_id": "req_abc123xyz789",
"timestamp": "2025-12-25T10:30:45.123Z",
"details": null
}
}
| Field | Type | Description |
|---|---|---|
error_code | string | Error code (for programmatic handling) |
severity | string | Severity level: fatal / error / warning |
message | string | Human-readable error message |
context | string | Error source category |
sid | int | Optional. Sentence number for sentence-level errors (e.g., when a sentence fails to translate); not included for non-sentence-level errors |
request_id | string | Request tracking ID |
timestamp | string | Time the error occurred (ISO 8601) |
details | object | Additional debugging information; common keys in translation scenarios: provider, translation_language, source_lang |
Severity Levels
| severity | Description | Recommended Handling |
|---|---|---|
fatal | Fatal error | Stop the service and require reconnection |
error | Operation failed | Show an error prompt and allow retry |
warning | Warning | Show a warning without blocking the operation |
Sentence-level error rule (important): When an error message includes the
sidfield, regardless of theseverity, it should be treated as a sentence-level error (a single sentence failed). The client only needs to mark that sentence as failed and continue; it should not disconnect. Afatal+sidcombination only means "this sentence failed severely"; the session as a whole can still continue operating.In other words, the "stop the service / require reconnection" recommendation applies only to session-level fatal errors that do not include
sid.
Authentication Errors
| Error Code | HTTP | severity | Description | Recommended Handling |
|---|---|---|---|---|
auth_missing_api_key | 401 | fatal | API Key is missing | Make sure the request includes an API Key |
auth_invalid_api_key | 401 | fatal | Invalid API key | Make sure the API Key is correct |
auth_invalid_key_format | 401 | fatal | Invalid API key format | Make sure the API Key starts with vas_ |
auth_key_expired | 401 | fatal | API Key has expired | Request a new API Key |
auth_key_disabled | 401 | fatal | API Key is disabled | Contact technical support |
auth_user_disabled | 403 | fatal | Account is disabled | Contact technical support |
auth_budget_exceeded | 402 | fatal | Monthly budget exceeded | Wait for the next month's budget reset or adjust the budget |
auth_account_expired | 401 | fatal | Account service has expired | Contact technical support or renew |
auth_service_error | 500 | fatal | Authentication service temporarily unavailable | Retry later |
Ticket Authentication Errors
| Error Code | HTTP | severity | Description | Recommended Handling |
|---|---|---|---|---|
ticket_invalid | 401 | fatal | Ticket invalid or expired | Obtain a new Ticket |
ticket_expired | 401 | fatal | Ticket has expired | Obtain a new Ticket |
ticket_already_used | 401 | fatal | Ticket already used | Each Ticket can be used only once |
ticket_validation_failed | 401 | fatal | Ticket validation failed | Make sure the Ticket format is correct |
Session Errors
| Error Code | HTTP | severity | Description | Recommended Handling |
|---|---|---|---|---|
session_not_found | 404 | error | Session not found | Make sure the session ID is correct |
session_expired | 400 | error | Session expired | Create a new session |
session_not_started | 400 | error | Recording not started yet | Call start first |
session_already_paused | 400 | warning | Already paused | You can ignore this error |
session_not_paused | 400 | warning | Not paused | You can ignore this error |
service_shutdown | — | warning | Service shutting down, please reconnect | Broadcast to all active WebSocket clients during a graceful server shutdown; clients should display a maintenance notice and reconnect after a brief backoff |
Speech Recognition Errors
| Error Code | HTTP | severity | Description | Recommended Handling |
|---|---|---|---|---|
stt_init_failed | 503 | fatal | Service initialization failed | Retry later |
stt_start_failed | 500 | fatal | Unable to start speech recognition | Retry later |
stt_auth_failed | 500 | fatal | Service authentication failed | Contact technical support |
stt_quota_exceeded | 503 | fatal | Usage limit reached | Retry later |
stt_connection_lost | 500 | fatal | Connection lost | Stop the service and reconnect |
Audio Processing Errors
| Error Code | HTTP | severity | Description | Recommended Handling |
|---|---|---|---|---|
audio_invalid_format | 400 | error | Invalid audio data format | Make sure the audio format is correct |
audio_process_failed | 500 | error | Audio processing failed | Retry later |
audio_format_unsupported | 400 | error | Unsupported audio format | Use a supported format |
audio_decode_failed | 500 | error | Audio decoding failed | Verify the integrity of the audio file |
Speaker Diarization Errors
| Error Code | HTTP | severity | Description | Recommended Handling |
|---|---|---|---|---|
diarization_init_failed | 503 | fatal | Diarization service initialization failed | Retry later |
diarization_start_failed | 500 | fatal | Diarization session failed to start | Retry later |
diarization_failed | 500 | error | Diarization processing failed | Retry later |
diarization_unavailable | 503 | fatal | Diarization service unavailable | Verify the service status |
diarization_multilang_conflict | 400 | error | Speaker diarization does not support multiple languages (start rejected) | Provide only one source language, or disable speaker diarization |
Speaker Errors
| Error Code | HTTP | severity | Description | Recommended Handling |
|---|---|---|---|---|
speaker_not_found | 404 | error | The specified speaker was not found | Make sure the speaker ID is correct |
speaker_sid_not_found | 404 | error | The specified sentence was not found | Make sure the sentence ID is correct |
speaker_name_empty | 400 | error | Speaker name cannot be empty | Provide a speaker name |
speaker_name_duplicate | 400 | error | Speaker name already in use | Use a different name |
merge_speakers_same_id | 400 | error | Source and target speaker cannot be the same | Provide different speaker IDs |
Configuration Errors
| Error Code | HTTP | severity | Description | Recommended Handling |
|---|---|---|---|---|
config_empty | 400 | error | No configuration provided | Provide at least one configuration item |
config_term_too_long | 400 | error | Term exceeds 100 characters | Shorten the term |
config_too_many_entries | 400 | error | More than 500 terminology entries | Reduce the number of terms |
config_too_many_dict_entries | 400 | error | More than 50 translation dictionary entries | Reduce the dictionary entries |
config_terminology_locked | 400 | error | Terminology locked (recording in progress) | Stop the recording before updating |
Translation Service Errors
| Error Code | HTTP | severity | Description | Recommended Handling |
|---|---|---|---|---|
llm_init_failed | 503 | fatal | Translation service initialization failed | Retry later |
llm_timeout | 504 | error | Translation timeout | Retry later |
llm_rate_limit | 429 | warning | Requests too frequent | Reduce the request frequency |
llm_request_failed | 500 | error | Translation request failed | Retry later |
llm_provider_error | 503 | error | Translation service temporarily unavailable | Retry later |
llm_content_filtered | 400 | warning | Content cannot be translated | Modify the input content |
llm_auth_failed | 500 | fatal | Translation service authentication failed | Contact technical support |
llm_deployment_not_found | 500 | fatal | Translation service configuration error | Contact technical support |
llm_quota_exceeded | 503 | fatal | Translation usage limit reached | Retry later |
translation_service_unavailable | - | error | Translation service has failed consecutively up to the threshold (session-level, no sid) | Show a global notice that translation is temporarily unavailable; no need to disconnect; STT continues to run |
translation_service_unavailabletrigger rules (backend behavior):
- Cumulative escalation: escalates after
llm_timeout/llm_provider_error/llm_rate_limit/llm_request_failedfail 5 times consecutively- Immediate escalation:
llm_auth_failed/llm_deployment_not_found/llm_quota_exceededescalate on the first occurrence (configuration/billing issues)- Not counted:
llm_content_filtered(a content issue, not a service issue)- Deduplication: each session is notified only once; any successful sentence translation resets the counter, and the event can be triggered again
- payload:
type: "error", withoutsid;detailscontainsprovider,last_error_code,fail_count- Viewer notification: in broadcast mode, all viewers (regardless of language) also receive this event (through the SSE/WS broadcast channel)
TTS Synthesis Errors
| Error Code | HTTP | severity | Description | Recommended Handling |
|---|---|---|---|---|
tts_init_failed | 503 | fatal | TTS service initialization failed | Retry later |
tts_not_enabled | 400 | warning | TTS not enabled | Make sure tts_enabled is set on start |
tts_invalid_language | 400 | error | TTS language invalid | Make sure the language is in translation_languages |
tts_invalid_voice | 400 | error | Invalid voice name | Query /api/v1/tts/voices |
tts_segment_not_found | 400 | warning | The specified sentence was not found | Make sure the SID exists |
tts_translation_not_found | 400 | warning | No translation found for that language | Make sure a translation exists for that language |
tts_synthesis_failed | 500 | error | TTS synthesis failed | Retry later |
tts_voice_not_found | 404 | error | The specified voice was not found | Make sure the voice name is correct |
tts_sample_generation_failed | 500 | error | Voice sample generation failed | Retry later |
tts_quota_exceeded | 503 | fatal | TTS usage limit reached | Retry later |
Recording Errors
| Error Code | HTTP | severity | Description | Recommended Handling |
|---|---|---|---|---|
recording_not_found | 404 | error | Recording not found | Make sure the taskId is correct |
recording_unauthorized | 403 | error | Not authorized to operate on this recording | Make sure the task belongs to the user |
recording_audio_not_ready | 422 | error | Audio file not ready yet | Retry later |
recording_transcript_not_ready | 422 | error | Transcript not yet generated or empty | Make sure processing_status = completed before exporting |
recording_not_completed | 422 | error | Recording has not finished processing; retranslation/editing/summary regeneration is not allowed while in progress | Wait until processing_status = completed, then retry |
entry_not_found | 404 | error | The specified sentence was not found (sid does not exist in the transcript) | Make sure the sid is correct |
entry_text_empty | 422 | error | Sentence source text is empty | Provide a non-empty original_text |
entry_text_too_long | 422 | error | Sentence source text exceeds the 2000-character limit | Shorten the content and retry |
transcript_revision_conflict | 409 | error | Transcript was modified by another request (optimistic lock conflict) | Re-read the transcript to get the latest revision, then retry |
invalid_processing_status | 422 | error | Processing status does not meet the operation requirement | See the "Processing Status Mismatch (invalid_processing_status)" section below |
Processing Status Mismatch (invalid_processing_status)
This error code is used by POST /api/v1/tasks/{taskId}/force-fail and POST /api/v1/tasks/{taskId}/retry, returned when the recording status does not meet the operation's prerequisites. The details field helps further identify the trigger reason:
| Endpoint | Trigger Condition | Fields in details | Recommended Handling |
|---|---|---|---|
force-fail | Recording is already in a terminal state (completed / failed) | current_status, message | For completed tasks, use DELETE /api/v1/tasks/{taskId} instead; failed tasks do not need to be force-failed again |
retry | Recording is not in the failed state | current_status, message | Only failed tasks can be retried |
retry | Audio file or transcript has not finished uploading | current_status, audio_status, transcript_status, message | Make sure the source file is complete; if the recording source is corrupted, use force-fail to close it out instead |
File Import Errors
| Error Code | HTTP | severity | Description | Recommended Handling |
|---|---|---|---|---|
import_not_found | 404 | error | Import task not found | Make sure the import_id is correct |
import_file_too_large | 413 | error | File size exceeds the limit | Compress or split the file |
import_invalid_format | 415 | error | Unsupported audio format | Use mp3/wav/m4a format |
import_download_failed | 500 | error | Download failed | Retry later |
import_conversion_failed | 500 | error | Conversion failed | Verify the integrity of the audio file |
import_stt_timeout | 504 | error | Speech recognition timeout | Retry later |
import_stt_failed | 500 | error | Speech recognition failed | Retry later |
import_translation_failed | 500 | error | Translation processing failed | Retry later |
import_summary_failed | 500 | warning | Summary generation failed | Retry later |
import_upload_failed | 500 | error | Result upload failed | Retry later |
import_callback_failed | 500 | warning | Failed to report progress | Does not affect processing; can be ignored |
import_invalid_request | 500 | error | Invalid request format | Make sure the request format is correct |
Note: If the monthly budget has been exceeded at upload time, the
auth_budget_exceedederror (HTTP 402) is returned.
Storage Errors
| Error Code | HTTP | severity | Description | Recommended Handling |
|---|---|---|---|---|
storage_connection_failed | 503 | error | Storage service connection failed | Retry later |
storage_upload_failed | 500 | error | Upload failed | Retry later |
storage_download_failed | 500 | error | Download failed | Retry later |
storage_queue_full | 500 | warning | Upload queue full | Retry later |
SSE Errors
| Error Code | HTTP | severity | Description | Recommended Handling |
|---|---|---|---|---|
sse_transcript_not_found | 404 | error | Transcript not found | The recording may not have finished processing |
sse_missing_target_lang | 400 | error | Missing target language parameter | Provide targetLang |
sse_unsupported_language | 400 | error | Unsupported target language | Use a valid language code |
sse_translation_failed | 500 | error | Translation failed | Retry later |
sse_summary_not_found | 404 | error | Summary not found | This recording has no summary |
sse_summary_translation_failed | 500 | error | Summary translation failed | Retry later |
sse_summary_regeneration_failed | 500 | error | Summary regeneration failed | Retry later |
sse_template_not_found | 404 | error | Summary template not found | Make sure the template slug is correct |
Broadcast Errors
| Error Code | HTTP | severity | Description | Recommended Handling |
|---|---|---|---|---|
broadcast_not_enabled | 500 | error | Broadcast not enabled for the session | Verify the broadcast settings |
broadcast_token_invalid | 401 | fatal | Invalid share link | Stop the service and verify the share link |
broadcast_token_revoked | 401 | fatal | Share link revoked | Stop the service and create a new broadcast |
broadcast_token_already_used | 422 | error | Token already used by another Session | Close the other tabs and retry |
broadcast_token_required | 400 | error | Broadcast mode requires broadcast_token | Provide the broadcast_token parameter |
broadcast_session_not_found | 404 | error | Broadcast session not found | Make sure the broadcast Token is correct |
broadcast_session_not_started | 500 | error | Broadcast not started yet | Wait for the host to start the broadcast |
broadcast_not_ready | 503 | warning | Live translation service not started yet | Retry later |
broadcast_session_ended | 410 | error | Broadcast session ended | Wait for the host to start again |
broadcast_capacity_exceeded | 503 | warning | Maximum number of viewers exceeded | Wait in the queue or retry later |
broadcast_queue_timeout | 408 | error | Queue timeout | Try reconnecting |
broadcast_viewer_kicked | 403 | error | Removed by the host | Contact the host |
broadcast_unauthorized | 401 | error | Unauthorized access to the viewer management API | Verify your authentication information |
broadcast_password_required | 422 | error | This broadcast requires password verification | Provide the correct password |
broadcast_password_incorrect | 422 | error | Incorrect password | Verify the password and retry |
broadcast_not_in_standby | 500 | warning | Not currently in the standby phase | Wait for the host to switch to the standby phase |
broadcast_cannot_revoke | 422 | error | Only broadcasts in the pending state can be revoked | Stop the broadcast before revoking |
broadcast_cannot_start | 422 | error | Cannot start the broadcast | Make sure the broadcast status is pending |
broadcast_already_live | 422 | error | A broadcast is already live | Stop the current broadcast first |
broadcast_not_live | 422 | error | No broadcast currently live | Start a broadcast first |
broadcast_max_viewers_exceeded | 422 | error | The viewer limit exceeds the system maximum | Lower the viewer limit |
Conversation Errors
| Error Code | HTTP | severity | Description | Recommended Handling |
|---|---|---|---|---|
conversation_requires_two_languages | 400 | error | Conversation mode requires exactly two languages | Provide exactly 2 transcription_languages |
conversation_languages_identical | 400 | error | The two conversation languages cannot be the same | Provide two different languages |
conversation_invalid_language | 400 | error | Invalid conversation language | Make sure the language is one of the transcription_languages |
conversation_same_language | 400 | warning | Already the current language | You can ignore this warning |
conversation_speaking | 400 | error | Currently speaking; cannot perform this action | Call stop_speaking to finish speaking first |
conversation_not_speaking | 400 | warning | Not currently speaking | You can ignore this warning |
conversation_invalid_speaker | 400 | error | Invalid speaker number | Use 1 or 2 |
conversation_invalid_mode | 400 | error | Invalid conversation mode | Use auto or manual |
conversation_not_manual_mode | 400 | error | This action requires manual mode | Switch to manual mode first |
conversation_missing_speakers | 400 | error | Conversation mode requires speakers configuration | Provide the speakers parameter on start |
conversation_invalid_speakers | 400 | error | Invalid speakers format | Make sure exactly 2 speaker configurations are provided |
conversation_language_change_failed | 500 | error | Language change failed (STT rebuild failed) | Retry later |
conversation_language_same_as_peer | 400 | error | New language is the same as the other user's | The two users cannot use the same language |
Handling strategy:
| Error Code | Retry? | Handling |
|---|---|---|
conversation_requires_two_languages | ❌ | Show "Please provide exactly 2 languages" |
conversation_languages_identical | ❌ | Show "The two languages cannot be the same" |
conversation_invalid_language | ❌ | Show "Invalid language" and use the language from start |
conversation_same_language | ❌ | Can be ignored; already the current language |
conversation_speaking | ❌ | Show "Please finish speaking first" |
conversation_not_speaking | ❌ | Can be ignored; not currently speaking |
conversation_invalid_speaker | ❌ | Show "Invalid speaker number" |
conversation_invalid_mode | ❌ | Show "Invalid mode" |
conversation_not_manual_mode | ❌ | Show "Please switch to manual mode first" |
conversation_missing_speakers | ❌ | Show "Please provide speakers configuration" |
conversation_invalid_speakers | ❌ | Show "Invalid speakers format" |
conversation_language_change_failed | ✅ | Retry later; if it keeps failing, reconnect |
conversation_language_same_as_peer | ❌ | Show "Cannot use the same language as the other user" |
conversation_requires_two_languages error details:
This error occurs in the start action of type: "conversation" when the number of transcription_languages is not 2.
{
"type": "error",
"data": {
"error_code": "conversation_requires_two_languages",
"severity": "error",
"message": "Conversation mode requires exactly 2 languages",
"context": "session",
"request_id": "req_abc123xyz",
"timestamp": "2026-03-04T10:30:45.123Z",
"details": {
"received_count": 1,
"expected_count": 2
}
}
}
conversation_languages_identical error details:
This error occurs in the start action of type: "conversation" when the two provided transcription_languages are the same.
{
"type": "error",
"data": {
"error_code": "conversation_languages_identical",
"severity": "error",
"message": "Conversation languages must be different",
"context": "session",
"request_id": "req_abc123xyz",
"timestamp": "2026-03-04T10:30:45.123Z",
"details": {
"languages": ["zh-TW", "zh-TW"]
}
}
}
conversation_invalid_language error details:
This error occurs during switch_language when the specified language is not in the conversation language pair.
{
"type": "error",
"data": {
"error_code": "conversation_invalid_language",
"severity": "error",
"message": "Language not in conversation languages",
"context": "session",
"request_id": "req_abc123xyz",
"timestamp": "2026-03-04T10:30:45.123Z",
"details": {
"language": "ja-JP",
"conversation_languages": ["zh-TW", "en-US"]
}
}
}
Summary Errors
| Error Code | HTTP | severity | Description | Recommended Handling |
|---|---|---|---|---|
summary_text_empty | 400 | error | Text content cannot be empty | Provide text content |
summary_text_too_long | 400 | error | Text content exceeds the limit (100,000 characters) | Shorten the text content |
summary_failed | 500 | error | Summary generation failed | Retry later |
summary_timeout | 504 | error | Summary generation timeout | Retry later |
custom_prompt_too_long | 400 | error | custom_prompt exceeds the 2000-character limit | Shorten the custom_prompt length |
custom_prompt_slug_too_long | 400 | error | custom_prompt_slug exceeds the 64-character limit | Shorten the custom_prompt_slug length |
custom_prompt_slug_invalid | 400 | error | custom_prompt_slug contains control characters | Remove control characters such as line breaks / Tab / NULL |
template_not_found | 404 | error | The summary template with the specified slug does not exist or is disabled | Use GET /api/v1/summary-templates to list available templates |
Retranslation Errors
| Error Code | HTTP | severity | Description | Recommended Handling |
|---|---|---|---|---|
retranslate_sid_not_found | 404 | error | The specified sentence number was not found | Make sure the SID exists |
retranslate_session_not_active | 400 | error | Session not started | Verify the session status |
retranslate_no_target_lang | 400 | error | No target language provided | Provide the target_lang parameter |
retranslate_no_text | 400 | error | No text to translate provided | Provide text content |
retranslate_llm_not_ready | 503 | error | Translation service not ready | Retry later |
retranslate_llm_failed | 500 | error | Translation failed | Retry later |
retranslate_failed | 500 | error | Retranslation failed | Retry later |
Language Switch Errors
| Error Code | HTTP | severity | Description | Recommended Handling |
|---|---|---|---|---|
switch_language_no_target | 400 | error | No target language provided | Provide the target language parameter |
switch_language_in_progress | 400 | warning | Language switch in progress | Wait for the switch to complete |
switch_language_same_target | 400 | warning | Target language unchanged | You can ignore this warning |
batch_retranslate_partial_failed | 500 | warning | Some sentences failed to retranslate | Can be ignored; does not affect the main flow |
batch_retranslate_failed | 500 | warning | A single sentence failed during batch retranslation (persisted in transcript.translation_errors) | Failed sids are reported in the failed_sids summary; individual sentences can be retried later |
Recording Name Errors
| Error Code | HTTP | severity | Description | Recommended Handling |
|---|---|---|---|---|
set_name_empty | 400 | error | Recording name cannot be empty | Provide a name |
set_name_too_long | 400 | error | Name exceeds the length limit | Shorten the name |
set_name_not_ready | 400 | error | Session not started | Start speech recognition first |
General Errors
| Error Code | HTTP | severity | Description | Recommended Handling |
|---|---|---|---|---|
invalid_json | 422 | error | Invalid JSON format | Make sure the JSON format is correct |
invalid_data | 422 | error | Invalid data format | Make sure the data conforms to the API specification |
validation_failed | 422 | error | Request validation failed | Make sure required parameters are provided |
internal_error | - | error | The server panicked while processing a single WebSocket message (recovered) | The connection is kept; it should not disconnect; treat it as a failure of that message and optionally retry the operation. details.message_type and details.action indicate the specific failed operation (see WebSocket API: Per-Message Errors) |
missing_transcription_languages | 400 | error | No speech recognition language provided | Provide transcription_languages |
invalid_transcription_language | 400 | error | Invalid language code | Use a valid BCP 47 language code |
invalid_translation_language | 400 | error | Invalid translation language code | translation_languages must use supported BCP 47 codes (see languages.md) |
too_many_languages | 400 | error | Too many languages | Up to 2 languages |
invalid_recording_type | 400 | error | Invalid recording type | Use a valid type |
invalid_summary_template | 400 | error | Invalid summary template | Verify the template identifier |
name_too_long | 400 | error | Name too long | Shorten the name length |
Frontend Error Handling Example
function handleError(error) {
const { error_code, severity, message } = error.data;
switch (severity) {
case 'fatal':
// Fatal error: stop the service and show an error page
showErrorPage(message);
disconnectWebSocket();
break;
case 'error':
// Operation failed: show an error prompt and allow retry
showErrorToast(message);
break;
case 'warning':
// Warning: show a warning without blocking the operation
showWarningToast(message);
break;
}
// Log the error for debugging
console.error(`[${error_code}] ${message}`);
}
Version: V1.5.7 Last Updated: 2026-05-20