Upload a file
Send the audio file as the raw request body and use the returned `id` as `uploadId` when creating the transcript. No `Content-Type` is required. One request carries a file of up to 100 MB, which covers most audio; the edge rejects a bigger request before it reaches the API. Send no body to get an empty upload instead, and fill it with `PUT /v1/uploads/{id}`, 16 MiB at a time, up to 2 GiB: that is the path for a file above 100 MB, and for a long file over a link that may drop.
Send the audio file as the raw request body and use the returned id as uploadId when creating the transcript. No Content-Type is required. One request carries a file of up to 100 MB, which covers most audio; the edge rejects a bigger request before it reaches the API.
Send no body to get an empty upload instead, and fill it with PUT /v1/uploads/{id}, 16 MiB at a time, up to 2 GiB: that is the path for a file above 100 MB, and for a long file over a link that may drop.
Authorization
bearerAuth API key (tk_...)
In: header
Query Parameters
Size of the file in bytes. Declare it and a truncated upload becomes an explicit error instead of a transcript of whatever arrived
SHA-256 of the file, in lowercase hex. Checked against the stored audio before it reaches the GPU, and required by reuseIfIdentical
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/uploads"{ "data": { "id": "string", "receivedBytes": 0, "expectedBytes": 0, "sha256": "string", "createdAt": "string" }}Get limits GET
Every platform limit, plus the ones that depend on this account. Read it at startup instead of hardcoding the numbers: a file above `upload.maxRequestBytes` has to go through the chunked path, and one above `audio.maxDurationSeconds` fails after the upload is already spent. `concurrency.maxRunning` is `null` once the account has topped up at least once.
Get upload GET
Returns `receivedBytes`: use it to resume an interrupted upload from the right byte.