Tools provides a queue-based Whisper transcription service for media URLs and uploaded audio/video files.
This guide focuses on the public contract: what the feature does, how users interact with it, which endpoints exist, and what clients should expect in requests and responses.
Whisper in Tools can:
The ordinary Whisper UI and authenticated API use:
POST /api/account/loginUser permission requirements:
whisper.use for ordinary queue accesswhisper.manage for full-queue/admin actions such as run-now and all-user visibilityprovider_openai when transcript analysis/translations should run for a non-admin userTools now also exposes a separate server-to-server transcription API for token-based integrations.
Auth requirements:
provider_whisper_apiAuthorization: Bearer YOUR_API_TOKENwhisper.apiwhisper.use)Legacy X-Api-Key or apikey transport may still exist for backwards compatibility, but new integrations should use the Authorization header.
Whisper jobs are processed asynchronously.
Job statuses:
queueddownloadingtranscribingfinalizingcompletedfailedJobs can also expose a queue origin:
queue_channel="web"queue_channel="api"Signed-in queue/detail views and authenticated /api/whisper/jobs* payloads can therefore show whether a job came from the regular user queue or the token-authenticated API queue.
Admin-owned jobs are prioritized ahead of non-admin jobs when queued work is claimed.
/whisperThe signed-in queue UI lets users:
/whisper/jobs/{jobId}The signed-in detail page shows:
Completed jobs can create a public transcript share page.
Completed transcripts can be exposed through a tokenized public page under:
/shared/whisper/transcript/{token}The share page is intended for reading/transcript sharing, not queue administration.
For token-authenticated API submissions, Tools can now create that share automatically when the transcript completes successfully, and the callback payload includes the direct share URL.
/api/whisper/*)These endpoints use signed-in web/JWT auth, not the dedicated Whisper API token.
GET /api/whisper/statusReturns queue counters and capability flags.
Typical response shape:
{
"ok": true,
"summary": {
"queued": 3,
"processing": 1,
"completed": 21,
"failed": 2
},
"can_manage_all": false,
"config": {
"enabled": true,
"default_model": "large",
"upload_max_mb": 64,
"upload_limit": {
"configured_mb": 200,
"php_upload_max_mb": 64,
"php_post_max_mb": 128,
"effective_max_mb": 64,
"effective_max_label": "64 MB",
"limited_by_php": true
},
"ytdlp_configured": true
}
}
upload_max_mb now reflects the practical/effective limit for uploaded Whisper media on the current host, and additive config.upload_limit can explain when PHP upload/body limits are lower than Whisper's own configured cap.
GET /api/whisper/jobs?limit=100Returns visible Whisper jobs for the authenticated user.
POST /api/whisper/jobsQueues a new Whisper job.
Supported request styles:
source_urlmultipart/form-data with media_fileImportant rule:
source_url or media_file, not both422 validation error under media_file instead of only the generic “failed to upload” wordingExample JSON body:
{
"source_url": "https://example.com/audio.mp3",
"source_label": "Interview with customer",
"source_note": "Recorded support follow-up call.",
"model": "large",
"language": "sv",
"analysis_language": "sv",
"translation_target_languages": ["en"]
}
GET /api/whisper/jobs/{jobId}Returns one visible Whisper job.
Additive job fields now include:
queue_channelqueue_channel_labelsource_typesource_labelsource_notesource_mimesource_size_bytessource_duration_secondssource_duration_humanstage_labelstage_detailruntime_log[]livenessanalysistranslations[]diarizationsharecallback (primarily relevant for API-queue jobs)POST /api/whisper/jobs/{jobId}/analyzeRuns transcript analysis for a completed transcript.
Guardrails:
POST /api/whisper/jobs/{jobId}/cancelRequests cooperative cancellation for an actively processing job.
POST /api/whisper/jobs/{jobId}/restartQueues a failed/queued job for retry.
DELETE /api/whisper/jobs/{jobId}Deletes a non-processing job.
POST /api/whisper/run-nowAdmin/manager helper endpoint.
Request body can include:
{
"limit": 1,
"reset_failed": true
}
/api/whisper/transcribe/*)This is the dedicated server-to-server callback API.
GET /api/whisper/transcribe/statusReturns queue counters for the token-authenticated API queue channel.
GET /api/whisper/transcribe/jobs?limit=100Returns visible jobs from the API queue channel.
GET /api/whisper/transcribe/jobs/{jobId}Returns one visible API-queue job.
POST /api/whisper/transcribeQueues a new token-authenticated Whisper job.
Required field:
callback_urlSupported submission styles:
source_urlmedia_fileUpload validation guidance:
422 with errors.media_file[] explaining the effective Whisper upload limitmedia_file validation path is also used for partial uploads, missing temp-folder failures, write failures, and other PHP upload transport errors before the job is queuedThe token API accepts the same additive metadata as the ordinary queue endpoint, including:
source_labelsource_notemodellanguageanalysis_languagetranslation_target_languages[]disable_diarizationExample JSON body:
{
"source_url": "https://example.com/audio.mp3",
"callback_url": "https://api.example.test/whisper/callback",
"source_label": "Customer interview",
"source_note": "Transcribe and send the final result back to our integration.",
"model": "large",
"language": "en",
"analysis_language": "en",
"translation_target_languages": ["sv"]
}
Example success response:
{
"ok": true,
"message": "Whisper API job queued. A callback will be sent when the job reaches a terminal state.",
"job": {
"id": 123,
"queue_channel": "api",
"queue_channel_label": "API queue",
"status": "queued",
"callback": {
"url": "https://api.example.test/whisper/callback",
"status": "pending",
"http_status": null,
"last_attempt_at": null,
"delivered_at": null,
"error": null
},
"share": null
}
}
When a token-authenticated Whisper API job reaches terminal completed or failed, Tools sends one JSON POST to the submitted callback_url.
Callback envelope:
{
"ok": true,
"event": "whisper.job.completed",
"job": {
"job_id": 123,
"status": "completed",
"status_label": "Completed",
"queue_channel": "api",
"queue_channel_label": "API queue",
"source": "Customer interview",
"model": "large",
"language": "en",
"job_url": "https://tools.example.test/whisper/jobs/123",
"share_url": "https://tools.example.test/shared/whisper/transcript/example-token-redacted",
"transcript_text": "...",
"analysis_text": "...",
"translations": [],
"share": {
"url": "https://tools.example.test/shared/whisper/transcript/example-token-redacted"
}
}
}
Failure callbacks use event="whisper.job.failed" and can include failure_error instead of transcript/share data.
Client guidance:
job.job_idTypical error classes:
401 unauthenticated / token rejected403 missing permission404 job not found or not visible to the caller422 validation or business-rule failure429 throttled5xx temporary backend/provider failureWhisper API routes use a general throttle:120,1 policy.
Clients should still implement normal backoff for repeated polling or transient failures.
Authorization: Bearer YOUR_API_TOKENcallback_url as required for token-authenticated submissionsqueue_channel and queue_channel_label in operator/debug UIstranscript_text as the primary result and speaker_aware_transcript as additive helper outputshare.url as public access and handle it carefully