Transcribing Audio and Video

This guide turns an audio or video file into text, word timestamps and WebVTT subtitles with the transcription API. It runs on GPUs, supports about 99 languages and costs $0.02 per hour of audio, charged per started minute of the audio actually transcribed. Only finished transcripts are charged.

Base URL: https://api.mamutecloud.com. Every call uses your organization API key in the Authorization header, without Bearer:

Authorization: mamute-...

Before you start

  • Create an API key (see Authentication) and store it as MAMUTECLOUD_API_KEY.
  • Transcription is paid from your paid balance or with auto-recharge. The free signup credit does not apply. Check what is available with GET /v1/transcripts/balance.

1. Transcribe a file at a public URL

curl -X POST https://api.mamutecloud.com/v1/transcripts \
  -H "Authorization: $MAMUTECLOUD_API_KEY" \
  -H "content-type: application/json" \
  -d '{"url": "https://example.com/class-01.mp4", "language": "pt"}'

The call waits up to about 20 seconds:

  • 200 with "status": "done": the file was short enough, and the text is already in the response.
  • 202 with "status": "queued" or "processing": keep the id and read the result later (step 3), or use a webhook (step 4).

Add ?wait=false to always answer at once.

2. Or upload a local file

Ask for a signed upload URL, PUT the file to it, then create the transcript with the uploadKey:

# Get the upload URL (valid for 1 hour, files up to 2 GB)
curl -X POST https://api.mamutecloud.com/v1/transcripts/upload \
  -H "Authorization: $MAMUTECLOUD_API_KEY"
# -> { "data": { "uploadUrl": "https://...", "uploadKey": "in/uploads/...", "expiresIn": 3600 } }

# Send the file
curl -X PUT --upload-file class-01.mp4 "$UPLOAD_URL"

# Create the transcript
curl -X POST "https://api.mamutecloud.com/v1/transcripts?wait=false" \
  -H "Authorization: $MAMUTECLOUD_API_KEY" \
  -H "content-type: application/json" \
  -d "{\"uploadKey\": \"$UPLOAD_KEY\"}"

Any common audio or video format works (mp3, wav, m4a, mp4, mov, webm and others), up to 6 hours of audio.

3. Read the result

curl https://api.mamutecloud.com/v1/transcripts/$TRANSCRIPT_ID \
  -H "Authorization: $MAMUTECLOUD_API_KEY"
{
  "data": {
    "id": "6c0338e1-4d91-41ae-9735-e678d0df36a4",
    "status": "done",
    "language": "pt",
    "durationSeconds": 160,
    "costUsd": 0.001,
    "text": "Olá pessoal, aqui é o João Pedro...",
    "words": [{ "word": "Olá", "start": 0.42, "end": 0.71, "probability": 0.97 }],
    "vttUrl": "https://...",
    "jsonUrl": "https://...",
    "expiresAt": "2026-10-11T00:21:18.000Z"
  }
}
  • words comes inline up to 4 MB; for longer files read it from jsonUrl.
  • vttUrl and jsonUrl are signed for 1 hour. Ask again for fresh links.
  • Results are deleted 7 days after the transcript ends (expiresAt). Audio is never used to train models.
  • An audio with no speech ends done with an empty text.

4. Get notified with a webhook

Send webhookUrl when you create the transcript. When it ends, MamuteCloud sends one POST to it:

{ "data": { "id": "6c0338e1-...", "status": "done" } }

There is one attempt and no retries, so fetch the full result with GET /v1/transcripts/{id} when it arrives.

Spell names and terms right with a glossary

Pass up to 100 entries of up to 100 characters, as "what it hears": "what to write". The glossary guides the model while it listens and is applied to the text afterwards.

{
  "url": "https://example.com/class-01.mp4",
  "glossary": { "niu era": "New Era", "mamute cloud": "MamuteCloud" }
}

Language

Omit language (or send auto) to detect it. Set an ISO 639-1 code such as pt, en or es when you already know it. The response always carries the detected ISO code.

On Brazilian Portuguese, accuracy is measured on public test sets: 95.9% on read speech and 82.1% on spontaneous interviews. See Transcription Accuracy for the method.

Pricing and balance

Price$0.02 per hour of audio ($0.000333 per minute)
Uniteach started minute of the audio actually transcribed
Charged whenthe transcript is done; failed transcripts cost nothing
Pays withpaid balance or auto-recharge (not the signup credit)

Once a file is decoded and its length is known, its price is held from your balance before it is processed. If the balance cannot cover it, the transcript ends in error with a message starting with insufficient_balance: and nothing is charged. Without any paid balance or auto-recharge, POST /v1/transcripts answers 402.

curl https://api.mamutecloud.com/v1/transcripts/balance -H "Authorization: $MAMUTECLOUD_API_KEY"
# -> { "data": { "totalUsd": 27.98, "reservedUsd": 0.001, "availableUsd": 27.979, "autoRecharge": true } }

List and monitor

# Newest first; page with ?before=<nextBefore>
curl "https://api.mamutecloud.com/v1/transcripts?status=failed&limit=50" -H "Authorization: $MAMUTECLOUD_API_KEY"

# This month's minutes, requests and spend, minutes per day, and health
curl "https://api.mamutecloud.com/v1/transcripts/analytics?days=30" -H "Authorization: $MAMUTECLOUD_API_KEY"

Errors

StatusWhen
400invalid body: missing url/uploadKey, both sent, bad language, glossary over the limits, private URL
401missing or invalid API key (remember: no Bearer before mamute-)
402no paid balance and no auto-recharge
404the transcript does not belong to your organization

Timing

A 3-minute file usually comes back in about 15 seconds, and an hour of audio in a few minutes. When nobody has transcribed anything for an hour the GPUs are turned off, so the first file after a quiet period waits a few extra minutes while they start.

Full reference: Transcription API.


Did this page help you?