Starts a speaker-labelled transcription of an audio or video file and bills the team's AI Credits. Answers 202 immediately and the work runs in the background; poll GET /api/partner/ai/transcribe/{id} for the result. A recording transcribes at roughly fifteen times faster than real time, so a two-hour demo is typically ready in under ten minutes.
mediaUrl must be an https URL the transcription provider can fetch directly, such as a presigned S3 / Cloudflare R2 link. Keep it valid for at least a few hours — a long recording can take a while — and keep the file under 2 GB. We never download the file ourselves.
Credits. Priced per whole audio minute. maxCredits from GET /api/partner/ai/credits is reserved when the job starts, and the job is settled against the duration the provider actually measures, so creditsCharged is usually lower than the credits reserved and is never higher. Both ends round up to a whole minute, but they round different numbers — the estimate rounds the durationSeconds you sent, the charge rounds the measured audio. Media often measures shorter than its container duration, so on a short clip the charge can come in a whole billable minute below the estimate. Show the estimate as an upper bound rather than a quote.
Send an accurate durationSeconds: the reservation is sized from it, but the charge is for the audio actually transcribed, so a materially understated duration is billed above what was reserved. A job that fails, or that never completes, charges nothing and returns the reservation. While a job is running, its reservation is excluded from the balance reported by GET /api/partner/ai/credits, so that figure is always what you can still spend.
Idempotency. An Idempotency-Key header is required (or idempotencyKey in the body). Retrying with the same key returns the same job instead of starting and charging for a second one. The key's identity ignores the media URL's query string, so re-signing the same object between retries is still the same request; pointing the same key at a different object is a 409.
Scope. Widget and OAuth tokens need use_ai. Manual API tokens with no scope list keep full partner access.
| Time | Status | User Agent | |
|---|---|---|---|
Retrieving recent requests… | |||
