What you need
- An account or workspace API key:
Authorization: Bearer {id}.{secret} - A key with scopes needs
voice_file_job:writeto create a job, notify upload completion, and delete, andvoice_file_job:readto read.writeincludesread, and a key without scopes can do everything. - A workspace with an Enterprise plan contract and the Voice File Job policy enabled
- An account or organization API key that is not bound to a workspace must send
workspaceGuidwhen it creates a job - 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 - Receive the
voice_file_job.completedorvoice_file_job.failedwebhook (recommended). Poll job status if you cannot receive webhooks - Fetch transcript and (optionally) translations
- Get paragraph summaries for better content understanding
How do you know when a job finishes? Webhooks (recommended)
Use webhooks to learn when a job finishes. Processing typically takes 45 seconds to 18 minutes depending on file duration, and can take longer when the queue is busy. With a webhook subscription, Tiro sends avoice_file_job.completed or voice_file_job.failed event when processing ends, so you do not query the job status repeatedly while you wait.
- Subscribe to
voice_file_job.completedandvoice_file_job.failed. A workspace webhook receives events for every job created in that workspace, and an organization webhook receives events for every job created in any workspace of the organization. Unlike note events, folder sharing does not limit these events. An account webhook receives events only for jobs the user created with an account API key in the workspace where the webhook is registered. See Webhooks overview to register an endpoint. data.resourceIdis the job ID, anddata.resource.statusisCOMPLETEDorFAILED. See Event Structure for every field.- Webhook payloads contain job metadata, not transcript text. Fetch transcript content with
GET /v1/external/voice-file/jobs/{jobId}/transcript. - If every delivery retry fails, Tiro does not send that event again. When a job passes its expected processing time without an event, check its status with
GET /v1/external/voice-file/jobs/{jobId}.
voice_file_job.created and voice_file_job.deleted to track job creation and deletion.
Polling strategy (fallback)
Poll the job status when you cannot run a webhook endpoint or a webhook event does not arrive.- 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.Can you get the transcript when a job is FAILED?
Sometimes. A job also becomesFAILED when only summary generation fails. In that case, when transcriptAvailable in the GET /v1/external/voice-file/jobs/{jobId} response is true, you can fetch the transcript with GET /v1/external/voice-file/jobs/{jobId}/transcript.
The failure reason is in errorMessage. The voice_file_job.failed webhook carries the same value in data.resource.errorMessage.
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.
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.
An account API key can access only the jobs it created; a workspace API key can access every job in the same workspace. Deleting a job also removes its audio, transcript, and translations, and the job can no longer be retrieved.
File Limits & Requirements
Supported Audio Formats
The supported file formats are as follows. Audio Formats:
Video Formats (audio extraction):