What you need
- A user or system API key bound to a workspace:
Authorization: Bearer {id}.{secret} - Voice File Jobs enabled for that workspace by a Tiro administrator
- transcriptLocaleHints: up to 1 (optional)
- If not provided, language will be automatically detected
- translationLocales: up to 5 (optional)
End-to-end checklist
- Create job → receive
{ id, uploadUri } - Upload audio to
uploadUri - Call
PUT /v1/external/voice-file/jobs/{jobId}/upload-complete - Poll job status until completion
- Fetch transcript and (optionally) translations
- Get paragraph summaries for better content understanding
How do you receive updates and delete a job?
Subscribe tovoice_file_job.created, voice_file_job.completed, voice_file_job.failed, or voice_file_job.deleted to receive lifecycle updates without polling. Webhook payloads contain job metadata, not transcript text. Fetch transcript content through the transcript endpoint.
Call DELETE /v1/external/voice-file/jobs/{jobId} to remove a job in any status. Tiro removes the audio and generated results, and ignores processing callbacks that arrive after deletion.
How does Tiro store and protect voice file data?
Tiro stores uploaded audio in Tiro-managed object storage and stores transcripts and translations in the Tiro service database. The API does not provide a configurable automatic retention period. CallDELETE /v1/external/voice-file/jobs/{jobId} when your application no longer needs the data.
A workspace user key can access jobs created by that user in the same workspace. A workspace system key can access jobs in its workspace. Deleting a job removes its uploaded audio, transcript, and translations. The deleted job is no longer available through the API.
Polling strategy (recommended)
- Poll
GET /v1/external/voice-file/jobs/{jobId}with exponential backoff- Start at 1–2s interval, then 4s, 8s, up to 30s cap
- Stop conditions:
- Success:
status=COMPLETED - Failure:
status=FAILED
- Success:
- After success:
- Always fetch transcript:
GET /v1/external/voice-file/jobs/{jobId}/transcript - If you requested translations:
GET /v1/external/voice-file/jobs/{jobId}/translationsor per-locale endpoint - Get paragraph summaries:
- For transcript:
GET /v1/external/voice-file/jobs/{jobId}/transcript/paragraph-summary - For translations:
GET /v1/external/voice-file/jobs/{jobId}/translations/{locale}/paragraph-summary
- For transcript:
- Always fetch transcript:
The final status for successful processing is
COMPLETED. This means all processing is complete including transcript, translation (if requested), and paragraph summaries for both.File Limits & Requirements
Supported Audio Formats
Based on industry-standard STT capabilities, Tiro supports the following formats: Audio Formats:
Video Formats (audio extraction):
File Size & Duration Limits
Processing Time Estimates
Processing times are optimized with parallel processing for longer files:Paragraph Summary Feature
The Paragraph Summary feature provides intelligent summarization of audio content, breaking down the transcript or translation into digestible paragraph-level summaries.How it works
- Transcript Processing: After transcription is complete, the text is automatically split into logical paragraphs using the CompositeTextSplitter
- Summary Generation: Each paragraph is processed through the ParagraphSummarizer to create concise summaries
- Translation Integration: When translations are requested, summaries are regenerated based on the translated content for each locale
- Asynchronous Processing: Summary generation happens asynchronously after transcript/translation completion