Application uploads
Let users submit authorized recordings from your product while the bytes travel directly to the prepared storage target.
Move local media into Fast Transcriber without proxying the full file through the API application. Prepare a short-lived storage destination, transfer the bytes directly, then queue the account-owned upload for transcription.
Use it from your product backend or connect a compatible AI agent over MCP.
curl --request POST https://fast-transcriber.com/api/v1/uploads \
--header "Authorization: Bearer $FAST_TRANSCRIBER_API_TOKEN" \
--header "Content-Type: application/json" \
--data '{
"filename": "interview.mp3",
"content_type": "audio/mpeg",
"size": 1234567
}'POST exact file metadata to /api/v1/uploads first. The server validates the request and returns either a single presigned PUT target or a multipart upload plan. Your client sends bytes to that storage destination without exposing the Fast Transcriber bearer key.
After the upload is complete, create a transcription with the returned key and storage value plus the original filename, size, and content type. The API verifies ownership and stored metadata before the object enters the normal asynchronous transcription lifecycle.
One API family
One source workflow. One predictable job model.
Use the same status lifecycle and transcript fields across supported public URLs and account-owned uploads.
Transcription runs outside the original HTTP request. Save the returned job identity and poll its status instead of submitting duplicate work.
POST filename, size, and optional content_type to /api/v1/uploads, then inspect data.upload.type.
PUT the file to the single target, or upload every multipart part and commit their ETags.
POST the returned key, storage value, and exact file metadata to /api/v1/transcriptions as upload.
Follow the Location header until the transcription status is completed or failed.
Let users submit authorized recordings from your product while the bytes travel directly to the prepared storage target.
Download protected media through your own authorized integration, then use upload rather than exposing the source publicly.
When the server returns multipart, retry an individual part and explicitly complete or abort the session.
Authenticate from your backend, create the job, and store the returned Location header for status retrieval.
curl --request POST https://fast-transcriber.com/api/v1/uploads \
--header "Authorization: Bearer $FAST_TRANSCRIBER_API_TOKEN" \
--header "Content-Type: application/json" \
--data '{
"filename": "interview.mp3",
"content_type": "audio/mpeg",
"size": 1234567
}'curl --include --request POST https://fast-transcriber.com/api/v1/transcriptions \
--header "Authorization: Bearer $FAST_TRANSCRIBER_API_TOKEN" \
--header "Content-Type: application/json" \
--data '{
"upload": {
"filename": "interview.mp3",
"content_type": "audio/mpeg",
"key": "RETURNED_STORAGE_KEY",
"size": 1234567,
"storage": "r2"
},
"speaker_diarization": false
}'Authentication, source rules, request fields, and status handling are covered in the technical guide.
Uploaded-file jobs use the same response as public-link jobs: explicit status, full text on completion, detected duration, and timestamped segments. The upload mechanism does not create a second result model.
{
"data": {
"id": "95c3fdd8-...",
"filename": "source-media.mp4",
"status": "completed",
"created_at": "2026-08-24T16:30:00.000Z",
"duration_seconds": 1842,
"text": "Completed transcript text...",
"segments": [
{ "start": 0, "end": 4.2, "text": "Welcome." }
]
}
}Ready to build?
Create a key, then follow the source guide to queue your first job.