7 min read

Audio and Video Transcription API for File Uploads

Upload audio and video directly to object storage, queue a transcription job, and retrieve structured text with timestamped segments.

Create your Fast Transcriber API key

Create a Bearer key, queue your first transcription, and poll for structured text with timestamped segments.

Transcribe local, private, or user-submitted media through Fast Transcriber's direct-upload flow. Your application prepares an upload target, sends the bytes directly to object storage, and queues the returned object reference for transcription.

Why uploads go directly to object storage

Large media files should not pass through a framework request body. Fast Transcriber returns a presigned single-part or multipart upload target so your backend can transfer the bytes directly, then submit a small JSON reference to the transcription endpoint.

Step 1: prepare the upload target

Send the exact filename, content type, and byte size. The response identifies the storage provider, object key, and upload instructions that belong to the authenticated account.

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
  }'

For a single-part upload, the response includes a presigned data.upload.url, the required request headers, and the data.storage and data.key values needed in Step 3.

{
  "data": {
    "content_type": "audio/mpeg",
    "key": "transcriptions/account-id/upload-id/interview.mp3",
    "storage": "r2",
    "upload": {
      "headers": { "Content-Type": "audio/mpeg" },
      "method": "PUT",
      "type": "single",
      "url": "https://presigned-storage.example/..."
    }
  }
}

Step 2: upload the media bytes

For a single target, send the file bytes to the returned URL with the returned headers. The URL below is a placeholder for data.upload.url; do not send your Fast Transcriber Bearer key to the storage URL.

UPLOAD_URL="PASTE_DATA_UPLOAD_URL"
curl --request PUT "$UPLOAD_URL" \
  --header "Content-Type: audio/mpeg" \
  --upload-file "./interview.mp3"

For a multipart target, PUT each byte range to its matching data.upload.parts[].url, record every response ETag, then complete the upload before queueing it:

curl --request POST https://fast-transcriber.com/api/v1/uploads/multipart \
  --header "Authorization: Bearer $FAST_TRANSCRIBER_API_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
    "storage": "RETURNED_STORAGE_PROVIDER",
    "key": "RETURNED_STORAGE_KEY",
    "upload_id": "RETURNED_UPLOAD_ID",
    "parts": [
      { "part_number": 1, "etag": "RETURNED_ETAG" }
    ]
  }'

Keep the returned storage and key values unchanged. If any multipart transfer fails, retry that part or abort the multipart upload rather than queueing an incomplete object.

Step 3: queue the uploaded object

Replace the uppercase placeholders below with data.storage and data.key from the upload response rather than hardcoding a provider. The filename, content type, and size must describe the stored object.

curl --request POST https://fast-transcriber.com/api/v1/transcriptions \
  --header "Authorization: Bearer $FAST_TRANSCRIBER_API_TOKEN" \
  --header "Content-Type: application/json" \
  --data '{
    "upload": {
      "storage": "RETURNED_STORAGE_PROVIDER",
      "key": "RETURNED_STORAGE_KEY",
      "filename": "interview.mp3",
      "content_type": "audio/mpeg",
      "size": 1234567
    },
    "speaker_diarization": false
  }'

A successful queue request returns 202 Accepted and a Location header. Set LOCATION_PATH to that path and poll it with any active Bearer key for the same account until the job completes or fails.

LOCATION_PATH="/api/v1/transcriptions/95c3fdd8-..."
curl --request GET "https://fast-transcriber.com$LOCATION_PATH" \
  --header "Authorization: Bearer $FAST_TRANSCRIBER_API_TOKEN"

Ready to run this request? Create an API key, or review every endpoint in the API documentation.

Ownership and media validation

Before queueing, the server verifies that the object belongs to the authenticated account and checks its stored size and media type. An upload key issued to a different account is rejected. This keeps upload references scoped to the account that created them.

Single-part versus multipart uploads

Smaller files can use the returned single upload target. Larger files may receive multipart instructions so an interrupted transfer can retry individual parts. Complete every required part and preserve the returned ETags before calling the multipart completion endpoint.

Work with the completed transcript

Completed jobs contain the transcript text, duration, and timestamped segments available under the account's plan limits. Use the result for searchable archives, caption workflows, interview analysis, meeting notes, or permitted downstream AI processing.

{
  "data": {
    "id": "95c3fdd8-...",
    "filename": "source-video.mp4",
    "status": "completed",
    "duration_seconds": 84,
    "text": "Completed transcript text...",
    "segments": [
      { "start": 0, "end": 3.8, "text": "First segment..." }
    ]
  }
}

When to upload instead of submitting a URL

  • The media is local, user-submitted, or generated inside your application.
  • The source is private but your application is authorized to retrieve and process it.
  • You want a stable object transfer instead of depending on a third-party public link.
  • The original URL requires a session, cookie, or access token that should never be sent to Fast Transcriber.

Frequently asked questions

Does the media pass through a Next.js request body?

No. The upload goes directly to object storage using the target returned by the uploads endpoint.

What does the server validate before queueing?

It validates object ownership, stored size, and media type. References belonging to another account are rejected.

Can uploaded recordings use speaker diarization?

Yes. Set speaker_diarization to true. Speaker diarization requires Pro.

What limits apply to API uploads?

API jobs use the authenticated account's normal plan limits, including file-size and daily-usage rules.

Related API articles

Create your Fast Transcriber API key

Create a Bearer key, queue your first transcription, and poll for structured text with timestamped segments.