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.
# 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"{
"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
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