Audio URL transcript API

Your audio is already online — transcribe it where it lives

S3, Cloudflare R2, a CDN, an internal server or a short-lived signed URL. You pass audio_url, the API downloads and transcribes. Nothing to re-upload.

request
# Transcribe an MP3 that already lives in S3 / R2 / a CDN
curl -X POST https://api.techtuel.com/v1/transcriptions \
  -H "Authorization: Bearer $TECHTUEL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
        "audio_url": "https://cdn.example.com/episodes/142.mp3?sig=…",
        "preferred_language": "en"
      }'
# => 202 { "id": "job_4d90", "status": "processing" }

curl "https://api.techtuel.com/v1/transcriptions/job_4d90?format=txt" \
  -H "Authorization: Bearer $TECHTUEL_API_KEY"
response
{
  "id": "job_4d90",
  "status": "completed",
  "title": "Episode 142",
  "language": "en",
  "detected_language": "it",
  "translated": true,
  "minutes": 54.2,
  "source_kind": "url",
  "transcript": "Welcome to this episode…",
  "segments": [
    { "start_seconds": 0, "text": "Welcome to this episode" },
    { "start_seconds": 6.1, "text": "today we're talking infrastructure" }
  ]
}

If you already run storage, re-uploading your media to a transcription API is pure waste: an extra round trip, duplicated bandwidth, and a second place where the file exists. Your MP3s sit in an S3 bucket, a Cloudflare R2 space, a CDN or a NAS behind a reverse proxy — there is no reason for them to move.

The audio_url field exists for exactly that. You pass the file URL as it already is, the API downloads it server-side and transcribes it. You save a full upload and keep your storage as the single source of truth for media.

Short-lived signed URLs work as-is: an S3 presigned URL, a signed R2 link or an access token in the query string are all fetched inside their validity window. Just leave the expiry generous enough to cover the download. And if you have no storage yet, POST /v1/uploads hands you a presigned URL and an upload_id to use instead.

Why this API

No re-upload

The file stays in your bucket. You transmit a URL, not megabytes — one round trip and one egress bill less.

Signed URLs accepted

S3 presigned, signed R2 links, query-string tokens: as long as the URL is downloadable inside its window, the API consumes it.

Or a presigned upload

No storage of your own? POST /v1/uploads returns put_url, put_headers and an upload_id to send instead of audio_url.

Pricing you can read

Free100 credits/month (~50 min of audio), no credit card
Pro2000 credits/month (~1000 min of audio), 120 req/min

Frequently asked questions

Does the file have to be public?+

No. It only has to be downloadable by the API at call time. A short-lived signed URL is fine, as long as the window covers the download.

Which audio formats are supported?+

MP3, M4A, AAC, OGG, Opus, WAV, WebM and FLAC. Common video containers (MP4, MPEG, WebM, QuickTime, MKV) are accepted too — their audio track is extracted.

Can I ask for the transcript in another language?+

Yes, via preferred_language (ISO 639-1). It is a preference: the response exposes detected_language for what was actually spoken, language for the text you were served, and translated to tell you whether a translation happened.

What if I have no storage at all?+

Call POST /v1/uploads with content_type, filename and size_bytes: you get put_url and put_headers for a direct PUT, then create the job with the returned upload_id.

Is the file kept after processing?+

No. Uploaded media is deleted after processing, and a file fetched from your URL is not retained. Only the transcript stays available on the job.

Other ways to use the API

Free trial, no credit card

Generate an API key and transcribe your first source in under a minute. A free monthly quota lets you test under real conditions.

Start with the API