API reference

Every public API method. The reference is generated from the same OpenAPI document as Swagger, so new endpoints appear here automatically.

Overview

The reference contains 97 public endpoints. Base URL: https://ttsapi.ru.

Authentication: the X-Api-Key header or Authorization: Bearer with a key from the cabinet.

Speech

POST /v1/synthesize

Synthesize Russian speech and return an audio file.

API key required Try it

Returns **binary audio** (not JSON). Set `Accept` if you prefer a specific Content-Type; otherwise `format` in the body selects it. Example: POST /v1/synthesize X-Api-Key: YOUR_KEY { "text": "Привет! Это демонстрация синтеза русской речи.", "voice": "preset_anna", "format": "mp3", "sample_rate": 24000, "speed": 1.0, "emotion": "neutral", "effects": "[{\"type\": \"reverb\", \"room_size\": 0.5}]" } `effects` is an optional JSON-encoded string holding an array of effect descriptors (reverb, compressor, eq, distortion, chorus, pitch, timestretch). It requires a Pro/Business plan and is applied to the audio after synthesis, before it is encoded into the requested format. Errors are RFC 7807 Problem Details with a `code` field.

Request body application/json

Schema: SynthesizeRequestDto · Required: —

Field Type Required Description
text string ✓ Text to speak. Required. Max 5000 characters (500 on the public demo).
voice string (enum) | null — Voice id. Default preset_anna. See GET /v1/voices.
format string (enum) | null — Audio format: mp3 (default), wav, ogg (Vorbis), or opus (OGG/Opus).
sample_rate integer (enum) | null — Sample rate in Hz: 8000, 16000, 24000 (default), 48000.
speed number (float) | null — Speaking rate from 0.5 to 2.0. Default 1.0.
pitch number (float) | null — Pitch from 0.5 to 2.0. Default 1.0.
emotion string | null — Accepted for backward compatibility. CosyVoice does not support emotion — this value is ignored.
ssml boolean | null — If true, text is treated as SSML (speak, p, s, break, prosody only).
put_accent boolean | null — Accepted for backward compatibility. CosyVoice consumes plain text through a tokenizer with no phoneme input, so stress marks cannot reach the model — this value is ignored. Use RussianTts.Api.Contracts.SynthesizeRequestDto.Lexicon to fix the pronunciation of individual words.
put_yo boolean | null — Accepted for backward compatibility and ignored: CosyVoice consumes plain text tokens and has no phoneme input, so the letter ё cannot be forced.
normalize boolean | null — Accepted for backward compatibility and ignored: the engine already reads digits correctly, so there is nothing to expand.
model string (enum) | null — Synthesis model: standard (default, preset voices) or premium (cloned voices). Both run on CosyVoice.
language string | null — Language code for multilingual synthesis (CosyVoice; defaults to the voice language).
effects string | null — Optional audio-effects chain applied after synthesis. A JSON-encoded string holding an array of effect descriptors, e.g. "[{\"type\": \"reverb\", \"room_size\": 0.5}]". Requires a plan with audio effects enabled. Not supported for streaming synthesis.
lexicon object | null — Optional pronunciation overrides applied to the engine text before synthesis (up to 200 entries; source words are matched whole-word, case-insensitively). Use it for abbreviations, brands and names the model would read incorrectly, e.g. `{ "ООО": "общество с ограниченной ответственностью" }`. Ignored for SSML requests (a replacement inside a tag would break the markup). Quota is counted on the original text.

Responses

Status Description Schema
200 Binary audio. Content-Type matches the requested format (mp3 → audio/mpeg, wav, ogg). string (binary)
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
413 Text exceeds the plan or request character limit. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
500 Unexpected server error. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse
POST /v1/synthesize/async

Start an asynchronous long-form synthesis job (audiobook / long article).

API key required Swagger

Queue a long text (up to the deployment's long-form character limit) and get a job ID immediately. The text is split into paragraphs, each synthesized through the standard pipeline, and the clips are concatenated into a single sample-accurate **WAV** with a timed audiobook manifest. Poll `GET /v1/synthesize/async/{jobId}` for the manifest, then download the audio from `GET /v1/synthesize/async/{jobId}/audio`. Pass `webhookUrl` as a query parameter to be notified on completion.

Parameters

Name In Type Required Description
webhookUrl query string —

Request body application/json

Schema: SynthesizeRequestDto · Required: —

Field Type Required Description
text string ✓ Text to speak. Required. Max 5000 characters (500 on the public demo).
voice string (enum) | null — Voice id. Default preset_anna. See GET /v1/voices.
format string (enum) | null — Audio format: mp3 (default), wav, ogg (Vorbis), or opus (OGG/Opus).
sample_rate integer (enum) | null — Sample rate in Hz: 8000, 16000, 24000 (default), 48000.
speed number (float) | null — Speaking rate from 0.5 to 2.0. Default 1.0.
pitch number (float) | null — Pitch from 0.5 to 2.0. Default 1.0.
emotion string | null — Accepted for backward compatibility. CosyVoice does not support emotion — this value is ignored.
ssml boolean | null — If true, text is treated as SSML (speak, p, s, break, prosody only).
put_accent boolean | null — Accepted for backward compatibility. CosyVoice consumes plain text through a tokenizer with no phoneme input, so stress marks cannot reach the model — this value is ignored. Use RussianTts.Api.Contracts.SynthesizeRequestDto.Lexicon to fix the pronunciation of individual words.
put_yo boolean | null — Accepted for backward compatibility and ignored: CosyVoice consumes plain text tokens and has no phoneme input, so the letter ё cannot be forced.
normalize boolean | null — Accepted for backward compatibility and ignored: the engine already reads digits correctly, so there is nothing to expand.
model string (enum) | null — Synthesis model: standard (default, preset voices) or premium (cloned voices). Both run on CosyVoice.
language string | null — Language code for multilingual synthesis (CosyVoice; defaults to the voice language).
effects string | null — Optional audio-effects chain applied after synthesis. A JSON-encoded string holding an array of effect descriptors, e.g. "[{\"type\": \"reverb\", \"room_size\": 0.5}]". Requires a plan with audio effects enabled. Not supported for streaming synthesis.
lexicon object | null — Optional pronunciation overrides applied to the engine text before synthesis (up to 200 entries; source words are matched whole-word, case-insensitively). Use it for abbreviations, brands and names the model would read incorrectly, e.g. `{ "ООО": "общество с ограниченной ответственностью" }`. Ignored for SSML requests (a replacement inside a tag would break the markup). Quota is counted on the original text.

Responses

Status Description Schema
202 Accepted SynthesisJobResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
413 Text exceeds the plan or request character limit. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse
GET /v1/synthesize/async/{jobId}

Poll a long-form synthesis job by ID.

API key required Swagger

Parameters

Name In Type Required Description
jobId path string ✓

Responses

Status Description Schema
200 OK SynthesisJobStatusResponse
404 Voice was not found. ErrorResponse
GET /v1/synthesize/async/{jobId}/audio

Download the produced audio for a completed long-form synthesis job.

API key required Swagger

Parameters

Name In Type Required Description
jobId path string ✓

Responses

Status Description Schema
200 OK —
404 Voice was not found. ErrorResponse
409 Conflict ErrorResponse
POST /v1/synthesize/stream

Stream audio chunks as they are produced. Pro and Business plans only.

API key required Swagger

Same body as /v1/synthesize. Response is an unbuffered audio byte stream. Free/Basic receive 403 `streaming_forbidden`. Audio effects (`effects`) are not supported for streaming synthesis.

Request body application/json

Schema: SynthesizeRequestDto · Required: —

Field Type Required Description
text string ✓ Text to speak. Required. Max 5000 characters (500 on the public demo).
voice string (enum) | null — Voice id. Default preset_anna. See GET /v1/voices.
format string (enum) | null — Audio format: mp3 (default), wav, ogg (Vorbis), or opus (OGG/Opus).
sample_rate integer (enum) | null — Sample rate in Hz: 8000, 16000, 24000 (default), 48000.
speed number (float) | null — Speaking rate from 0.5 to 2.0. Default 1.0.
pitch number (float) | null — Pitch from 0.5 to 2.0. Default 1.0.
emotion string | null — Accepted for backward compatibility. CosyVoice does not support emotion — this value is ignored.
ssml boolean | null — If true, text is treated as SSML (speak, p, s, break, prosody only).
put_accent boolean | null — Accepted for backward compatibility. CosyVoice consumes plain text through a tokenizer with no phoneme input, so stress marks cannot reach the model — this value is ignored. Use RussianTts.Api.Contracts.SynthesizeRequestDto.Lexicon to fix the pronunciation of individual words.
put_yo boolean | null — Accepted for backward compatibility and ignored: CosyVoice consumes plain text tokens and has no phoneme input, so the letter ё cannot be forced.
normalize boolean | null — Accepted for backward compatibility and ignored: the engine already reads digits correctly, so there is nothing to expand.
model string (enum) | null — Synthesis model: standard (default, preset voices) or premium (cloned voices). Both run on CosyVoice.
language string | null — Language code for multilingual synthesis (CosyVoice; defaults to the voice language).
effects string | null — Optional audio-effects chain applied after synthesis. A JSON-encoded string holding an array of effect descriptors, e.g. "[{\"type\": \"reverb\", \"room_size\": 0.5}]". Requires a plan with audio effects enabled. Not supported for streaming synthesis.
lexicon object | null — Optional pronunciation overrides applied to the engine text before synthesis (up to 200 entries; source words are matched whole-word, case-insensitively). Use it for abbreviations, brands and names the model would read incorrectly, e.g. `{ "ООО": "общество с ограниченной ответственностью" }`. Ignored for SSML requests (a replacement inside a tag would break the markup). Quota is counted on the original text.

Responses

Status Description Schema
200 Binary audio. Content-Type matches the requested format (mp3 → audio/mpeg, wav, ogg). string (binary)
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
413 Text exceeds the plan or request character limit. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse

Voices

GET /v1/voices

List available voices and supported synthesis settings.

Public Swagger

Responses

Status Description Schema
200 OK array<VoiceDto>
GET /v1/voices/clone

List the caller's cloned voices.

API key required Swagger

Responses

Status Description Schema
200 OK array<CloneVoiceResponse>
401 Missing or invalid API key. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
POST /v1/voices/clone

Create a cloned voice from one reference audio sample and its transcript.

API key required Swagger

Upload one clean audio sample of the speaker (wav/mp3/ogg/flac/m4a/aac, up to 10 MB) together with `prompt_text` — the exact transcript of the reference clip (CosyVoice zero-shot conditioning). The returned id is used as `voice` together with `model=premium` in `/v1/synthesize`. Set `consent=true` only after the speaker has explicitly agreed to voice cloning; the attestation version and expiry are stored with the clone. The service prepares the reference itself: the sample is denoised and normalized, converted to the model's 24 kHz mono, transcribed, and trimmed to a window of complete sentences (8-15 s) when the upload is longer. The stored transcript always matches the stored audio, so a `prompt_text` that drifted from the recording is corrected automatically. `clean` is kept for compatibility and no longer changes anything. After saving, the engine reads a short canary phrase with the new clone. A reference that conditions the engine poorly makes CosyVoice stop speaking before the text ends, so such a clone would return truncated audio for every long request. In that case the clone is removed and the request fails with 400 `clone_samples_invalid`, describing how far the canary got and how to fix the reference (use a clean 8-15 second recording of a single speaker whose transcript matches word for word).

Request body multipart/form-data

Schema: object · Required: —

Field Type Required Description
name string —
prompt_text string —
samples array<string (binary)> —
language string (enum) — Optional language code (ISO 639-1). Omit to auto-detect. Supported values are language codes (ISO 639-1).
clean boolean —
consent boolean —

Responses

Status Description Schema
201 Created CloneVoiceResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
413 Text exceeds the plan or request character limit. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse
DELETE /v1/voices/clone/{id}

Delete a cloned voice (and its reference latents).

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓

Responses

Status Description Schema
204 No Content —
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
GET /v1/voices/clone/{id}

Get one cloned voice by id.

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓

Responses

Status Description Schema
200 OK CloneVoiceResponse
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
GET /v1/voices/{id}

Get one voice by id.

Public Swagger

Parameters

Name In Type Required Description
id path string ✓ Voice id, e.g. preset_anna.

Responses

Status Description Schema
200 OK VoiceDto
404 Voice was not found. ErrorResponse

Transcription

POST /v1/transcribe

Start an asynchronous transcription job.

API key required Swagger

Upload an audio file (wav, mp3, ogg, flac up to 25 MB / 15 min). Returns a job ID immediately. Poll `GET /v1/transcribe/{jobId}` for the result. For short files (≤ 3 min) use the synchronous `POST /v1/transcribe/sync`. For long files (up to 512 MB / 4 h) pass `long_form=true` — the file is split on VAD pauses and transcribed in chunks (Pro/Business plans).

Request body multipart/form-data

Schema: object · Required: —

Field Type Required Description
audio string (binary) —
language string (enum) — Optional language code (ISO 639-1). Omit to auto-detect. Supported values are language codes (ISO 639-1).
diarization boolean —
webhookUrl string —
keyterms string —
clean boolean —
longForm boolean —

Responses

Status Description Schema
202 Accepted TranscriptionJobResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
413 Text exceeds the plan or request character limit. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse
POST /v1/transcribe/sync

Transcribe a short audio file synchronously.

API key required Swagger

Maximum 3 minutes. For longer files use `POST /v1/transcribe` (async) and poll the returned job ID.

Request body multipart/form-data

Schema: object · Required: —

Field Type Required Description
audio string (binary) —
language string (enum) — Optional language code (ISO 639-1). Omit to auto-detect. Supported values are language codes (ISO 639-1).
diarization boolean —
keyterms string —
clean boolean —

Responses

Status Description Schema
200 OK TranscriptionResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
413 Text exceeds the plan or request character limit. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse
GET /v1/transcribe/{jobId}

Poll a transcription job by ID.

API key required Swagger

Parameters

Name In Type Required Description
jobId path string ✓

Responses

Status Description Schema
200 OK JobStatusResponse
404 Voice was not found. ErrorResponse
GET /v1/transcribe/{jobId}/subtitles

Download subtitles (VTT or SRT) for a completed transcription job.

API key required Swagger

Requires the job to be `completed`. Pass `format=vtt` (default) or `format=srt`. Optionally translate the captions with `target_language=en` and mark fast/unclear speech with `hot_marks=true`. Returns subtitle text, not JSON.

Parameters

Name In Type Required Description
jobId path string ✓
format query string —
target_language query string —
hot_marks query boolean —

Responses

Status Description Schema
200 OK —
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
404 Voice was not found. ErrorResponse
409 Conflict ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse
POST /v1/transcribe/{jobId}/translate

Translate a completed transcription job's transcript.

API key required Swagger

Requires the job to be `completed`. The transcript is translated segment by segment (timestamps and speakers are preserved) and billed against the plan's monthly LLM token budget.

Parameters

Name In Type Required Description
jobId path string ✓

Request body application/json

Schema: TranslateTranscriptRequest · Required: —

Field Type Required Description
target_language string — Target language code (e.g. `en`, `de`, `es`).

Responses

Status Description Schema
200 OK TranslateTranscriptResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
404 Voice was not found. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse
POST /v1/vad

Detect speech segments in an audio file (Silero VAD / turn detection).

API key required Swagger

Upload an audio file (wav, mp3, ogg, flac up to 25 MB / 15 min) and get the list of speech intervals. A turn-detection primitive and a pre-step before real-time streaming (`WS /v1/transcribe/stream`).

Request body multipart/form-data

Schema: object · Required: —

Field Type Required Description
audio string (binary) —

Responses

Status Description Schema
200 OK VadResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
413 Text exceeds the plan or request character limit. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse

Analysis

POST /v1/analyze

Start an asynchronous analysis job.

API key required Swagger

Upload an audio file (wav, mp3, ogg, flac up to 25 MB / 15 min). Returns a job ID immediately. Poll `GET /v1/analyze/{jobId}` for the result. For short files (≤ 3 min) use the synchronous `POST /v1/analyze/sync`.

Request body multipart/form-data

Schema: object · Required: —

Field Type Required Description
audio string (binary) —
language string (enum) — Optional language code (ISO 639-1). Omit to auto-detect. Supported values are language codes (ISO 639-1).
diarization boolean —
webhookUrl string —
keyterms string —
clean boolean —

Responses

Status Description Schema
202 Accepted AnalysisJobResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
413 Text exceeds the plan or request character limit. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse
POST /v1/analyze/summarize

Produce an extractive summary of raw text (no audio upload).

API key required Swagger

Text-only operation: returns the summary plus the selected sentences in their original order. No audio upload.

Request body application/json

Schema: SummarizeRequest · Required: —

Field Type Required Description
text string ✓ Text to summarize. Required. Max 5000 characters.
language string | null — Optional source language hint (e.g. "ru").
max_sentences integer (int32) | null — Maximum sentences in the summary (1..10, default 3).

Responses

Status Description Schema
200 OK SummarizeResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse
POST /v1/analyze/sync

Analyze a short audio file synchronously.

API key required Swagger

Upload an audio file (wav, mp3, ogg, flac up to 10 MB / 3 min). Returns transcript, per-segment emotions, overall sentiment, keywords and entities. For longer files use `POST /v1/analyze` (async) and poll the returned job ID.

Request body multipart/form-data

Schema: object · Required: —

Field Type Required Description
audio string (binary) —
language string (enum) — Optional language code (ISO 639-1). Omit to auto-detect. Supported values are language codes (ISO 639-1).
diarization boolean —
emotions boolean —
keywords boolean —
entities boolean —
keyterms string —
clean boolean —

Responses

Status Description Schema
200 OK AnalysisResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
413 Text exceeds the plan or request character limit. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse
POST /v1/analyze/topics

Classify raw text into topic buckets (no audio upload).

API key required Swagger

Text-only operation: returns the most relevant topics with relevance scores. No audio upload.

Request body application/json

Schema: AnalyzeTopicsRequest · Required: —

Field Type Required Description
text string ✓ Text to classify. Required. Max 5000 characters.
language string | null — Optional source language hint (e.g. "ru").

Responses

Status Description Schema
200 OK AnalyzeTopicsResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse
GET /v1/analyze/{jobId}

Poll an analysis job by ID.

API key required Swagger

Parameters

Name In Type Required Description
jobId path string ✓

Responses

Status Description Schema
200 OK AnalysisJobStatusResponse
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
POST /v1/detect-language

Detect the language of a text snippet (no audio upload).

API key required Swagger

Text-only operation: returns the detected language code and confidence. Useful as a pre-step before choosing a voice or forcing a transcription language.

Request body application/json

Schema: LanguageDetectionRequest · Required: —

Field Type Required Description
text string ✓ Text to analyze. Required. Max 5000 characters.

Responses

Status Description Schema
200 OK LanguageDetectionResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse
POST /v1/moderate

Flag profanity, insults and hate speech in raw text (no audio upload).

API key required Swagger

Text-only operation: returns whether the text was flagged, an overall score (0..1) and the matched terms with their categories. No audio upload.

Request body application/json

Schema: ModerateRequest · Required: —

Field Type Required Description
text string ✓ Text to check. Required. Max 5000 characters.
language string | null — Optional source language hint (e.g. "ru").

Responses

Status Description Schema
200 OK ModerateResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse
POST /v1/redact

Redact PII (names, phones, emails, ...) from raw text.

API key required Swagger

Text-only operation: returns the masked text plus the redacted spans with their character offsets. No audio upload.

Request body application/json

Schema: RedactRequest · Required: —

Field Type Required Description
text string ✓ Text to redact. Required. Max 5000 characters.
language string | null — Optional source language hint (e.g. "ru"). Affects NER.

Responses

Status Description Schema
200 OK RedactResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse

Recordings

GET /v1/recordings

List the client's recordings, newest first.

API key required Swagger

Parameters

Name In Type Required Description
source query string —
tag query string —
folder query string —
limit query integer (int32) —
offset query integer (int32) —

Responses

Status Description Schema
200 OK RecordingsListResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
GET /v1/recordings/folders

Distinct folders across the client's recordings (for facets/autocomplete).

API key required Swagger

Responses

Status Description Schema
200 OK RecordingFacetsResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
POST /v1/recordings/from-link

Start a diarized transcription from a public audio URL (Link channel, 7.9). The server downloads the file; the recording is tagged with source "link".

API key required Swagger

Request body application/json

Schema: LinkRecordingRequest · Required: —

Field Type Required Description
url string — Public http(s) URL of an audio file (wav, mp3, ogg, flac).
language string | null — Optional ISO language code hint (e.g. "ru", "en").

Responses

Status Description Schema
202 Accepted TranscriptionJobResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
GET /v1/recordings/tags

Distinct tags across the client's recordings (for facets/autocomplete).

API key required Swagger

Responses

Status Description Schema
200 OK RecordingFacetsResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
DELETE /v1/recordings/{id}

Delete a recording and its stored audio.

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓

Responses

Status Description Schema
204 No Content —
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
GET /v1/recordings/{id}

Fetch a single recording's metadata.

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓

Responses

Status Description Schema
200 OK RecordingResponse
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
PATCH /v1/recordings/{id}

Update a recording's tags and/or folder. Fields are optional and follow PATCH semantics: `null` clears a field, an absent field is left untouched.

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓

Request body application/json

Schema: object · Required: —

Responses

Status Description Schema
200 OK RecordingResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
GET /v1/recordings/{id}/audio

Download a recording's stored audio.

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓

Responses

Status Description Schema
200 OK string (binary)
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
GET /v1/recordings/{id}/export

Export a recording's transcript (txt, md, srt, vtt, docx, pdf).

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓
format query string —

Responses

Status Description Schema
200 OK string (binary)
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
POST /v1/recordings/{id}/push

Push a recording artefact (transcript, protocol or QA report) to a connected CRM/SED. Idempotent per (recording, provider, kind).

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓

Request body application/json

Schema: RecordingCrmPushRequest · Required: —

Field Type Required Description
provider string — Target provider: `bitrix24` | `amocrm` | `s1`.
kind string — Artefact to push: `transcript` | `protocol` | `qa`.
deal_id string | null — Optional CRM deal/lead id to attach the artefact to.
phone string | null — Optional contact phone, used to resolve the deal when no id is given.
email string | null — Optional contact e-mail, used to resolve the deal when no id is given.
source_url string | null — Optional link placed in the pushed comment (e.g. a share URL).

Responses

Status Description Schema
200 OK RecordingCrmPushResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
404 Voice was not found. ErrorResponse
GET /v1/recordings/{id}/pushes

List the CRM/SED pushes recorded for a recording.

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓

Responses

Status Description Schema
200 OK RecordingCrmPushesResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
404 Voice was not found. ErrorResponse
POST /v1/recordings/{id}/pushes/{provider}/{kind}/retry

Retry a previous push, reusing the target stored with it.

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓
provider path string ✓
kind path string ✓

Responses

Status Description Schema
200 OK RecordingCrmPushResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
404 Voice was not found. ErrorResponse
GET /v1/recordings/{id}/share

List the active share links for a recording.

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓

Responses

Status Description Schema
200 OK array<RecordingShareResponse>
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
POST /v1/recordings/{id}/share

Create a public share link for a recording.

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓

Request body application/json

Schema: ShareCreateRequest · Required: —

Field Type Required Description
expires_in_seconds integer (int32) | null — Share lifetime in seconds (optional, defaults to 7 days).
password string | null — Optional password to protect the share link.

Responses

Status Description Schema
200 OK RecordingShareResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
DELETE /v1/recordings/{id}/share/{token}

Revoke a share link.

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓
token path string ✓

Responses

Status Description Schema
204 No Content —
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
GET /v1/recordings/{id}/speakers

Fetch a recording's speakers, timeline and conversation metrics.

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓

Responses

Status Description Schema
200 OK RecordingSpeakersResponse
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
PATCH /v1/recordings/{id}/speakers/{speakerId}

Rename a speaker or assign a role (operator/client/participant).

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓
speakerId path string ✓

Request body application/json

Schema: object · Required: —

Responses

Status Description Schema
200 OK RecordingSpeakerResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
GET /v1/recordings/{id}/transcript

Fetch a recording's transcript.

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓

Responses

Status Description Schema
200 OK TranscriptionResponse
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse

Call QA

GET /v1/qa/analytics

Aggregated QA analytics for the caller over a time window.

API key required Swagger

Parameters

Name In Type Required Description
days query integer (int32) —

Responses

Status Description Schema
200 OK QaAnalyticsResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
POST /v1/qa/evaluate

Evaluate a recording against a QA checklist.

API key required Swagger

Each checklist item has an `id`, a `kind` (`required` or `forbidden`), a `description` and an optional `weight`. The response returns a per-item verdict (`passed|failed|partial`) with a reason, an evidence quote with timestamps, and a weighted 0..100 score.

Request body application/json

Schema: QaEvaluateRequest · Required: —

Field Type Required Description
recording_id string — Recording id to evaluate (32 hex chars).
checklist array<QaChecklistItemRequest> — Checklist to evaluate against.
webhook_url string | null — Optional webhook URL. When the evaluation is flagged as a violation, a `qa.violation` event is POSTed here.

Responses

Status Description Schema
200 OK QaEvaluationResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
404 Voice was not found. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse
GET /v1/qa/evaluations

List the caller's persisted QA evaluations, newest first.

API key required Swagger

Parameters

Name In Type Required Description
limit query integer (int32) —
offset query integer (int32) —

Responses

Status Description Schema
200 OK QaEvaluationsResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
GET /v1/qa/evaluations/export

Export the caller's QA evaluations as CSV or JSON for CRM import.

API key required Swagger

Parameters

Name In Type Required Description
format query string —
days query integer (int32) —

Responses

Status Description Schema
200 OK —
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse

Meetings

GET /v1/meetings/calendar

List the calendar events stored by the pre-trigger pass (roadmap: calendar).

API key required Swagger

Parameters

Name In Type Required Description
limit query integer (int32) —

Responses

Status Description Schema
200 OK CalendarEventsResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
POST /v1/meetings/calendar/sync

Read the client's calendar now instead of waiting for the next pass.

API key required Swagger

Responses

Status Description Schema
200 OK object
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
404 Voice was not found. ErrorResponse
GET /v1/meetings/events

List automatically captured meetings (roadmap: meeting autocapture).

API key required Swagger

Parameters

Name In Type Required Description
limit query integer (int32) —

Responses

Status Description Schema
200 OK MeetingEventsResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
GET /v1/meetings/events/{id}

Fetch one captured meeting.

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓

Responses

Status Description Schema
200 OK MeetingEventResponse
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
POST /v1/meetings/events/{id}/calendar

Write the meeting's protocol into its calendar event on demand.

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓

Responses

Status Description Schema
200 OK CalendarWritebackResponse
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
POST /v1/meetings/events/{id}/retry

Retry a captured meeting: reset its budget and make it due now.

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓

Responses

Status Description Schema
200 OK MeetingEventResponse
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
PUT /v1/meetings/events/{id}/target

Point a captured meeting at a CRM target. A provider webhook has no deal id, so this is how an automation attaches the protocol to a deal.

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓

Request body application/json

Schema: MeetingEventTargetRequest · Required: —

Field Type Required Description
deal_id string | null —
phone string | null —
email string | null —

Responses

Status Description Schema
200 OK MeetingEventResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
POST /v1/meetings/protocol

Generate a meeting protocol from a recording's transcript.

API key required Swagger

The `template` tailors the extraction to a meeting type (`custom`, `standup`, `demo`, `interview`, `retro`, `one_on_one`). The response includes the protocol fields, a Markdown rendering and the LLM model used.

Request body application/json

Schema: MeetingProtocolRequest · Required: —

Field Type Required Description
recording_id string — Recording id to summarise (32 hex chars).
template string | null — Protocol template: `custom` | `standup` | `demo` | `interview` | `retro` | `one_on_one`. Defaults to `custom`.
webhook_url string | null — Optional webhook URL. When set, a `meeting.completed` event is enqueued once the protocol has been generated and persisted.

Responses

Status Description Schema
200 OK MeetingProtocolResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
404 Voice was not found. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse
POST /v1/meetings/protocol/custom

Generate a protocol against a client-defined schema (custom template). The structure comes either inline or from a saved template.

API key required Swagger

Request body application/json

Schema: CustomProtocolRequest · Required: —

Field Type Required Description
recording_id string — Recording id to summarise (32 hex chars).
template_id string | null — Id of a saved template to use instead of an inline schema.
schema object | null — Inline template definition: `{ "title": "…", "sections": [ { "key": "summary", "title": "Итог", "type": "text" } ] }`. Ignored when RussianTts.Api.Contracts.CustomProtocolRequest.TemplateId is set.
webhook_url string | null — Optional webhook URL for the `meeting.completed` event.

Responses

Status Description Schema
200 OK CustomProtocolResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
404 Voice was not found. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse
GET /v1/meetings/protocols

List the client's persisted meeting protocols, newest first.

API key required Swagger

Parameters

Name In Type Required Description
limit query integer (int32) —

Responses

Status Description Schema
200 OK MeetingProtocolsResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
GET /v1/meetings/protocols/{id}

Fetch one persisted meeting protocol.

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓

Responses

Status Description Schema
200 OK MeetingProtocolSummaryResponse
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
PUT /v1/meetings/protocols/{id}

Edit a protocol's Markdown; an edit returns it to draft.

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓

Request body application/json

Schema: UpdateMeetingProtocolRequest · Required: —

Field Type Required Description
markdown string —

Responses

Status Description Schema
200 OK MeetingProtocolSummaryResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
POST /v1/meetings/protocols/{id}/approve

Approve a draft protocol for CRM/SED delivery.

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓

Responses

Status Description Schema
200 OK MeetingProtocolSummaryResponse
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
GET /v1/meetings/protocols/{id}/export

Export a meeting protocol as Markdown, DOCX or PDF.

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓
format query string —

Responses

Status Description Schema
200 OK string (binary)
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
GET /v1/meetings/templates

List the client's saved protocol templates.

API key required Swagger

Responses

Status Description Schema
200 OK ProtocolTemplatesResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
POST /v1/meetings/templates

Create a reusable protocol template.

API key required Swagger

Request body application/json

Schema: ProtocolTemplateRequest · Required: —

Field Type Required Description
name string — Human-readable template name.
schema object | null — Template definition (see `POST /v1/meetings/protocol/custom`).

Responses

Status Description Schema
200 OK ProtocolTemplateResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
DELETE /v1/meetings/templates/{id}

Delete a saved protocol template.

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓

Responses

Status Description Schema
204 No Content —
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
PUT /v1/meetings/templates/{id}

Update a saved protocol template.

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓

Request body application/json

Schema: ProtocolTemplateRequest · Required: —

Field Type Required Description
name string — Human-readable template name.
schema object | null — Template definition (see `POST /v1/meetings/protocol/custom`).

Responses

Status Description Schema
200 OK ProtocolTemplateResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse

Integrations

GET /v1/integrations/connections

List the client's external connections (active and revoked).

API key required Swagger

Responses

Status Description Schema
200 OK IntegrationConnectionsResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
POST /v1/integrations/connections

Connect (or re-connect) an external system. The secret is encrypted at rest and never returned.

API key required Swagger

Request body application/json

Schema: ConnectIntegrationRequest · Required: —

Field Type Required Description
provider string — Provider id: `bitrix24` | `amocrm` | `s1`.
display_name string | null — Optional label shown in the cabinet (e.g. the portal host).
base_url string | null — Optional tenant root URL (portal/instance).
secret string — Credential: incoming-webhook URL or access token. Never echoed back.
refresh_token string | null — Optional OAuth refresh token.
expires_at_utc string (date-time) | null — Optional credential expiry.
scopes string | null — Optional granted scopes, for diagnostics.

Responses

Status Description Schema
200 OK IntegrationConnectionResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
DELETE /v1/integrations/connections/{id}

Revoke a connection.

API key required Swagger

Parameters

Name In Type Required Description
id path string ✓

Responses

Status Description Schema
204 No Content —
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
404 Voice was not found. ErrorResponse
POST /v1/integrations/zoom/webhook

Provider webhook (Zoom). Anonymous but signature-verified: the provider has no API key, and Zoom retries on non-2xx, so unknown events still answer 200.

Public Swagger

Responses

Status Description Schema
200 OK —
POST /v1/integrations/{provider}/authorize

Start an interactive OAuth handshake (roadmap: meeting autocapture). Meeting providers require `consent = true`.

API key required Swagger

Parameters

Name In Type Required Description
provider path string ✓

Request body application/json

Schema: OAuthAuthorizeRequest · Required: —

Field Type Required Description
consent boolean — Required for meeting providers (Zoom): confirms the client is allowed to record and process the meetings being pulled in.

Responses

Status Description Schema
200 OK OAuthAuthorizeResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
GET /v1/integrations/{provider}/callback

OAuth redirect target. Anonymous: the signed `state` proves the flow was started by us, and the browser comes from the provider.

Public Swagger

Parameters

Name In Type Required Description
provider path string ✓
code query string —
state query string —
error query string —

Responses

Status Description Schema
200 OK —

Audio effects

POST /v1/audio/effects

Start an asynchronous audio-effects job.

API key required Swagger

Upload an audio file (wav, mp3, ogg, flac up to 50 MB) plus an `effects` JSON array and an optional `output_format` (wav | mp3 | ogg, default wav). Returns a job ID immediately. Example `effects`: [ {"type": "reverb", "room_size": 0.5, "wet_level": 0.4}, {"type": "compressor", "threshold_db": -20, "ratio": 4}, {"type": "eq", "bands": [{"freq": 8000, "gain_db": 6, "q": 1.0}]} ]

Parameters

Name In Type Required Description
webhookUrl query string —

Request body multipart/form-data

Schema: object · Required: —

Field Type Required Description
audio string (binary) —
effects string —
output_format string —

Responses

Status Description Schema
202 Accepted AudioEffectsJobResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
413 Text exceeds the plan or request character limit. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse
GET /v1/audio/effects/{jobId}

Poll an audio-effects job by ID.

API key required Swagger

Parameters

Name In Type Required Description
jobId path string ✓

Responses

Status Description Schema
200 OK AudioEffectsJobStatusResponse
404 Voice was not found. ErrorResponse
GET /v1/audio/effects/{jobId}/audio

Download the produced audio for a completed audio-effects job.

API key required Swagger

Parameters

Name In Type Required Description
jobId path string ✓

Responses

Status Description Schema
200 OK —
404 Voice was not found. ErrorResponse
409 Conflict ErrorResponse

Audio cleaning

POST /v1/audio/clean

Start an asynchronous audio-cleaning job.

API key required Swagger

Upload an audio file (wav, mp3, ogg, flac up to 50 MB) plus optional `options` JSON and an optional `output_format` (wav | mp3 | ogg, default wav). Returns a job ID immediately. With no `options` the one-click preset is applied: moderate denoise + peak normalization. {"denoise": {"strength": 0.8, "stationary": true}, "normalize": {"target_db": -1.0}, "high_pass": 80, "low_pass": 12000}

Parameters

Name In Type Required Description
webhookUrl query string —

Request body multipart/form-data

Schema: object · Required: —

Field Type Required Description
audio string (binary) —
options string —
output_format string —

Responses

Status Description Schema
202 Accepted AudioCleaningJobResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
413 Text exceeds the plan or request character limit. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse
GET /v1/audio/clean/{jobId}

Poll an audio-cleaning job by ID.

API key required Swagger

Parameters

Name In Type Required Description
jobId path string ✓

Responses

Status Description Schema
200 OK AudioCleaningJobStatusResponse
404 Voice was not found. ErrorResponse
GET /v1/audio/clean/{jobId}/audio

Download the cleaned audio for a completed audio-cleaning job.

API key required Swagger

Parameters

Name In Type Required Description
jobId path string ✓

Responses

Status Description Schema
200 OK —
404 Voice was not found. ErrorResponse
409 Conflict ErrorResponse

Video effects

POST /v1/video/effects

Start an asynchronous video-effects job.

API key required Swagger

Upload a video file (mp4/webm up to the deployment limit) plus an `effects` JSON array, a `mode` (mux | audio) and an optional `output_format` (mp4 | webm for mux, wav | mp3 | ogg for audio). For `mode=mux` an optional `audio` file is applied and muxed into the video; without it the video's own audio track is processed.

Parameters

Name In Type Required Description
webhookUrl query string —

Request body multipart/form-data

Schema: object · Required: —

Field Type Required Description
video string (binary) —
audio string (binary) —
effects string —
mode string —
output_format string —

Responses

Status Description Schema
202 Accepted VideoEffectsJobResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
413 Text exceeds the plan or request character limit. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse
GET /v1/video/effects/{jobId}

Poll a video-effects job by ID.

API key required Swagger

Parameters

Name In Type Required Description
jobId path string ✓

Responses

Status Description Schema
200 OK VideoEffectsJobStatusResponse
404 Voice was not found. ErrorResponse
GET /v1/video/effects/{jobId}/file

Download the produced artifact for a completed video-effects job.

API key required Swagger

Parameters

Name In Type Required Description
jobId path string ✓

Responses

Status Description Schema
200 OK —
404 Voice was not found. ErrorResponse
409 Conflict ErrorResponse

Voice ID

POST /v1/voice-id

Analyze a voice recording and return a voice passport.

API key required Swagger

Upload an audio file (wav, mp3, ogg, flac up to 25 MB / 3 min). Returns language, gender, age group, emotional background, a speaker embedding (fingerprint) and an AI-vs-human probability (beta). The AI-vs-human probability is only present when the anti-spoofing detector is configured; otherwise it is null and `fake_detection_available` is false.

Request body multipart/form-data

Schema: object · Required: —

Field Type Required Description
audio string (binary) —

Responses

Status Description Schema
200 OK VoiceIdResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
413 Text exceeds the plan or request character limit. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse
POST /v1/voice-id/enroll

Enroll an audio clip as a reusable voice profile (voiceprint).

API key required Swagger

Set `consent=true` after obtaining the speaker's explicit consent.

Request body multipart/form-data

Schema: object · Required: —

Field Type Required Description
audio string (binary) —
name string —
consent boolean —

Responses

Status Description Schema
200 OK EnrollVoiceProfileResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
413 Text exceeds the plan or request character limit. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse
POST /v1/voice-id/identify

Identify the closest matching profile for an audio clip (1:N).

API key required Swagger

Request body multipart/form-data

Schema: object · Required: —

Field Type Required Description
audio string (binary) —
profile_ids string —

Responses

Status Description Schema
200 OK VoiceIdentificationResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
413 Text exceeds the plan or request character limit. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse
GET /v1/voice-id/profiles

List the caller's enrolled voice profiles.

API key required Swagger

Responses

Status Description Schema
200 OK array<VoiceProfileResponse>
401 Missing or invalid API key. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
DELETE /v1/voice-id/profiles/{profileId}

Delete an enrolled voice profile by id.

API key required Swagger

Parameters

Name In Type Required Description
profileId path string ✓

Responses

Status Description Schema
204 No Content —
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
POST /v1/voice-id/verify

Verify an audio clip against an enrolled profile (1:1).

API key required Swagger

Request body multipart/form-data

Schema: object · Required: —

Field Type Required Description
audio string (binary) —
profile_id string —

Responses

Status Description Schema
200 OK VoiceVerificationResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
404 Voice was not found. ErrorResponse
413 Text exceeds the plan or request character limit. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse

Batch

POST /v1/batch/analyze

Queue a batch of audio analysis tasks.

API key required Swagger

Up to 10 items, each with inline base64 audio. Returns a batch ID immediately; poll `GET /v1/batch/{batchId}` for per-item analysis.

Request body application/json

Schema: BatchAnalyzeRequest · Required: —

Field Type Required Description
items array<BatchAnalyzeItemDto> ✓ Up to 10 analysis requests. Audio is inline base64.

Responses

Status Description Schema
202 Accepted BatchAcceptedResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
413 Text exceeds the plan or request character limit. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse
POST /v1/batch/synthesize

Queue a batch of synthesis tasks.

API key required Swagger

Up to 20 items. Returns a batch ID immediately; poll `GET /v1/batch/{batchId}` for per-item audio (base64).

Request body application/json

Schema: BatchSynthesizeRequest · Required: —

Field Type Required Description
items array<SynthesizeRequestDto> ✓ Up to 20 synthesis requests. Each item has the same shape as POST /v1/synthesize.

Responses

Status Description Schema
202 Accepted BatchAcceptedResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse
200 Binary audio. Content-Type matches the requested format (mp3 → audio/mpeg, wav, ogg). string (binary)
GET /v1/batch/{batchId}

Poll a batch by ID.

API key required Swagger

Parameters

Name In Type Required Description
batchId path string ✓

Responses

Status Description Schema
200 OK BatchStatusResponse
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse

Billing

GET /v1/billing/balance

Current balance, plan and a page of transactions for the authenticated key.

API key required Swagger

Parameters

Name In Type Required Description
page query integer (int32) —
pageSize query integer (int32) —

Responses

Status Description Schema
200 OK BillingBalanceResponse
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
POST /v1/billing/topup

Create a card top-up payment for the authenticated key.

API key required Swagger

Request body application/json

Schema: TopUpRequest · Required: —

Field Type Required Description
amount_rub number (double) — Top-up amount in rubles, from 100 to 10000.

Responses

Status Description Schema
200 OK TopUpResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
GET /v1/usage

Current monthly character usage for the authenticated key.

API key required Swagger

Responses

Status Description Schema
200 OK UsageResponse
401 Missing or invalid API key. ErrorResponse

Evaluation

POST /v1/eval

Evaluate speech quality against a reference text (WER).

API key required Swagger

Upload an audio file (wav, mp3, ogg, flac up to 25 MB / 3 min) and the text it should contain. The clip is transcribed and the transcript is aligned to the reference with a word error rate. Set `normalize=false` to keep case and punctuation in the comparison. Transcription seconds are billed against the plan's monthly quota.

Request body multipart/form-data

Schema: object · Required: —

Field Type Required Description
audio string (binary) —
reference string —
language string (enum) — Optional language code (ISO 639-1). Omit to auto-detect. Supported values are language codes (ISO 639-1).
normalize boolean —

Responses

Status Description Schema
200 OK EvaluationResponse
400 Invalid request. Body is RFC 7807 with extension field `code`. ErrorResponse
401 Missing or invalid API key. ErrorResponse
403 Plan does not allow this operation (streaming or premium engine). ErrorResponse
413 Text exceeds the plan or request character limit. ErrorResponse
429 Monthly quota exceeded, the request rate limit was hit, or the synthesis queue is saturated. See Retry-After. ErrorResponse
503 The synthesis engine is unavailable, or the premium engine was requested but is not enabled. ErrorResponse

Webhooks

GET /v1/webhooks/secret

Get (or lazily create) the webhook signing secret.

API key required Swagger

Responses

Status Description Schema
200 OK WebhookSecretResponse
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse
POST /v1/webhooks/secret/rotate

Rotate the webhook signing secret. The old secret stops working immediately.

API key required Swagger

Responses

Status Description Schema
200 OK WebhookSecretResponse
401 Missing or invalid API key. ErrorResponse
404 Voice was not found. ErrorResponse