COMPLETED. Batch and
real-time results share the same History and the same Characters balance.
Everything below uses the existing MyVocal API key. Start by reading
Authentication.
See availability and known limitations before integrating optional
notifications, speaker matching or processing-storage controls.
1. Read capabilities
GET /sound_clone/api/v1/stt/capabilities
Confirms the account state, the rate for this account and the accepted enum values.
2. Upload the audio
Create an upload, send the parts, then complete it. The response gives you anuploadId for the next
step.
POST /sound_clone/api/v1/stt/uploads
Presigned multi-part upload; the server probes the file and builds the canonical audio.
sizeBytes (the response reports the stored size separately). For each returned
part, ask for a presigned URL and upload the bytes:
partSizeBytes; PUT each part to its signed url and collect the
object-storage response ETag. The snippets above show the request sequence; the
complete Python example implements the byte splitting and PUT requests.
See Create an upload, Sign a part
and Complete an upload for the response fields.
Submit only after the completed upload reports READY.
3. Submit the transcription
Send theuploadId (or a public mediaUrl instead) with the options you want. Use an
Idempotency-Key so a retry never pays twice: the same key and the same body return the same task.
POST /sound_clone/api/v1/stt/transcriptions
Quotes, reserves Characters and starts the task in one call.
4. Poll, then download
GET /sound_clone/api/v1/stt/transcriptions/{transcriptionId}
Read the task, transcript and billing summary. Stop polling at
COMPLETED, PARTIAL or FAILED;
inspect the result or error instead of polling a failed task forever.GET /sound_clone/api/v1/stt/transcriptions/{transcriptionId}/download
txt, json, srt, segmented_json, html, docx or pdf.Options and export controls
options controls Batch processing. A representative request:
exportFormats selects the artefacts; each exportOptions entry applies nested
controls to one format and does not change another. An unsupported combination is refused at submit
with INPUT_INVALID rather than silently ignored. Some invalid entity category values currently
fail asynchronously as MEDIA_UNREADABLE; see the known issue.
Completion notifications
Enable a signed completion callback inside the sameoptions block. Notifications concern
COMPLETED tasks; keep polling to detect failures and other terminal outcomes.
Completion delivery is available, but production verification of raw-body signatures, retry delivery
and receiver de-duplication is not yet complete. Use polling as your authoritative completion path
and verify your receiver before relying on notifications.
-
notifyUrlmust be a publichttp/httpsURL; private, loopback, link-local and cloud-metadata addresses are refused on the real connection. -
notificationSigningSecretis write-only: it is stored encrypted and never returned or logged. Changing the URL or the secret under the sameIdempotency-Keyis a different request. -
MyVocal attempts delivery with bounded exponential backoff and a stable
eventId. Delivery can fail after retries are exhausted; a receiver can also receive duplicates. Each signed delivery carries three MyVocal headers:Read the timestamp fromX-MyVocal-Timestamp, then compute the HMAC over the concatenation of the timestamp, a.and the raw request body bytes:Verify against the raw bytes exactly as received; do not re-serialize the JSON, and do not sign the body without the timestamp prefix. Then de-duplicate byX-MyVocal-Event-Id. - Polling is the authoritative result. A missed or failed callback never changes the task; do not retry the transcription because a callback was missed.
Complete example
The runnable Batch client implements upload, submit, poll and download, then deletes the test transcription. Running it again after completion creates a new billable task:examples/stt/stt_batch_minimal.py.
Read Characters and quotes for how the charge and the shared balance
work, and Asynchronous jobs and retries for retry rules.