Video transcription API for every video in your library

Send video files or YouTube, Google Drive and Vimeo links and get searchable transcripts with speaker labels and timestamps, in 75 languages with automatic language detection. Transcribe one video or your whole library, then translate the transcripts and captions for global audiences.
Files and video links
Bulk transcription
REST + Python SDK
link in, transcript out
OAuth 2.0
# 1. send the video as a link - YouTube, Google Drive, Vimeo, S3 or direct URL
curl -X POST https://api.rask.ai/api/library/v1/media/link \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"link": "https://youtu.be/...", "name": "camera review"}'

# 2. create the project - the language of the video is detected automatically
curl -X POST https://api.rask.ai/v2/projects \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d "{\"video_id\": \"$VIDEO_ID\", \"dst_lang\": \"es-mx\"}"
GET /v2/projects/{project_id}/transcription
plain text
# The transcript as plain text with timestamps and speakers
curl -s https://api.rask.ai/v2/projects/$ID/transcription -H "Authorization: Bearer $TOKEN" \
  | jq -r '.segments[] | "\(.start) \(.speaker): \(.src.text)"'
Used by global teams
Capabilities

What the video transcription API does

Send video files or links and get a transcript with speakers and timestamps for every video in your library. The same project turns each transcript into translations, captions and a dubbed version.

Transcribe videos from a file or a link

Upload video files or post a YouTube, Google Drive, Vimeo, S3 or direct link. The API fetches the video itself, with no download step on your side.

Multiple speakers, labeled

Interviews, panels and webinars with different speakers come back with a speaker label on every segment, so you always know who said what.

Automatic language detection

Transcribe videos in 75 source languages, including English. Leave the source language empty and each video's language is detected automatically.

Searchable transcripts

Every segment has a start and an end time, so users can search the textual content of a video and jump straight to the moment a phrase is spoken.

Transcripts in multiple languages

Each segment also carries its translation, in any of 135+ language and regional options, so one transcript serves global audiences in other languages.

Captions in .srt and .vtt

Each project also returns caption files in the target language, timed to the segments, for viewers with hearing impairments or with the sound off.

Plain text or structured data

Read the transcript as JSON segments, or join the text into plain text for search indexes, articles, show descriptions and notes.

Correct technical jargon

Fix names, product terms and technical jargon in any segment through the API. A glossary keeps the same terms consistent when the transcript is translated.

Scale without limits

No rate limits, no concurrency quota, no per-key throttle. Run bulk transcription across multiple videos or your whole library in parallel.
See it in action

From one transcript to five language versions

The transcript of this clip became English, French, German, Portuguese and Spanish versions, each with captions and the original background audio.
EN flag
En
FR flag
Fr
DE flag
De
PT flag
Pt
ES flag
Es
Workflow

Three requests from video link to transcript

Creating the project starts transcription, then translation, captions and the dubbed version in the same run. Use the /generate endpoint after you correct the transcript.
1

Send the video

Upload a video file as multipart form data, or post a YouTube, Google Drive, Vimeo, S3 or direct link. You get a media id and the video metadata before you spend anything.

POST /api/library/v1/media/link
2

Create the project

Pass the media id as video_id and a target language. Leave the source language empty for automatic language detection. Transcription starts immediately.video_id

POST /v2/projects
3

Read the transcript

Read transcript segments as soon as they are available, so you can start indexing the recording while the translated media continues processing. Download caption and media files when the project is complete.

GET /v2/projects/{id}/transcription
Transcription works on recorded video, not live streams. Processing time varies with video length and the number of speakers: in one observed run, a 3:47 video was finished in 165 seconds.
Built around you

Transcribing at a volume or in a language we have not listed? Talk to our team

High volume transcription, a source language outside the list, a transcript format your search index expects or delivery to your own storage: our team reviews what you need and the available options.

Languages and voices

Need a source language outside the public catalogue? Talk to our team about your requirements and the available options.

Delivery and integration

Webhooks, push into your own queue, delivery straight to your S3, custom endpoints. Tell us how your pipeline expects to be fed.

Volume and throughput

Batch sizes, target languages per action and processing priority are all contract terms, not fixed product limits.

Security and hosting

Data residency, SSO and SAML, retention rules and security review support are handled as part of enterprise onboarding.
Use cases

Who uses a video transcription API

Platforms with video inside

LMS and customer-education platforms, creator and video platforms, webinar and virtual event tools, video hosting and workflow SaaS, digital adoption platforms, live shopping. Add searchable transcripts and captions to video uploads as a feature of your product.

Localization and production agencies

Transcribe client videos in bulk, give reviewers the transcript with speaker labels, and deliver captions and translations from the same projects.

In-house continuous video production

International retail and e-commerce, global franchises, media publishers, corporate universities, content creators. Make every video searchable and accessible, and reuse the transcripts for articles and descriptions.
Customer stories

Real teams, measurable results

How companies localize video with Rask, in their own numbers.
arrow
arrow
Code

Video transcription API code examples

One complete example in each language: send videos as links or files, wait, then save plain text transcripts or search them by timestamp.
# pip install git+ssh://[email protected]/braskai/rask-sdk.git@main
import asyncio
from rask_sdk import clients, enums, schemas

VIDEOS = ["https://youtu.be/aaa", "https://youtu.be/bbb", "https://vimeo.com/123"]

async def transcribe(client, i, link):
    media = await client.create_media_link(data=schemas.MediaCreateLink(link=link))
    while media.status is enums.MediaStatus.PROCESSING:
        await asyncio.sleep(5)
        media = await client.get_media(media_id=media.id)
    job = await client.create_project(data=schemas.ProjectCreate(video_id=media.id, dst_lang="en-us"))
    while job.status is not enums.ProjectStatus.MERGING_DONE:
        await asyncio.sleep(10)
        job = await client.get_project(project_id=job.id)
    t = await client.get_project_transcription(project_id=job.id)
    with open(f"video_{i}.txt", "w") as f:   # plain text, one segment per line
        f.write("\n".join(f"{s.speaker}: {s.src.text}" for s in t.segments))

async def main():
    client = clients.RaskSDKClient(client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
    await asyncio.gather(*(transcribe(client, i, v) for i, v in enumerate(VIDEOS)))   # no rate limits

asyncio.run(main())
github.com/braskai/rask-sdk
bulk, async
import os, time, requests

AUTH = "https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token"
API  = "https://api.rask.ai"

token = requests.post(AUTH, auth=(CLIENT_ID, CLIENT_SECRET),
                      data={"grant_type": "client_credentials"}).json()["access_token"]
h = {"Authorization": f"Bearer {token}"}

media = requests.post(f"{API}/api/library/v1/media/link", headers=h,
                      json={"link": "https://youtu.be/..."}).json()

project = requests.post(f"{API}/v2/projects", headers=h,
                        json={"video_id": media["id"], "dst_lang": "es-mx"}).json()

while project["status"] != "merging_done":
    time.sleep(10)
    project = requests.get(f"{API}/v2/projects/{project['id']}", headers=h).json()

print(project["translated_video"])
requests
no SDK required
// no dependencies, Node 18+ global fetch
const API = 'https://api.rask.ai';
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
const auth = await fetch('https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token', {
  method: 'POST',
  headers: { Authorization: 'Basic ' + btoa(`${CLIENT_ID}:${CLIENT_SECRET}`) },
  body: new URLSearchParams({ grant_type: 'client_credentials' }),
}).then((r) => r.json());
const h = { Authorization: `Bearer ${auth.access_token}`, 'Content-Type': 'application/json' };
const call = (method, path, body) => fetch(API + path, { method, headers: h, body: body && JSON.stringify(body) }).then((r) => r.json());

let media = await call('POST', '/api/library/v1/media/link', { link: 'https://drive.google.com/file/d/...' });
while (media.status === 'processing') { await sleep(5000); media = await call('GET', `/api/library/v1/media/${media.id}`); }

let p = await call('POST', '/v2/projects', { video_id: media.id, dst_lang: 'fr-fr' });
while (p.status !== 'merging_done') { await sleep(10000); p = await call('GET', `/v2/projects/${p.id}`); }

const { segments } = await call('GET', `/v2/projects/${p.id}/transcription`);
const index = segments.map((s) => ({ t: s.start, speaker: s.speaker, text: s.src.text, fr: s.dst.text }));
console.log(JSON.stringify(index, null, 2));   // ready for your search index
fetch, Node 18+
plain HTTP
# 1. token (valid 1 hour - cache and reuse it)
TOKEN=$(curl -s -X POST https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token \
  -u "$CLIENT_ID:$CLIENT_SECRET" -d "grant_type=client_credentials" | jq -r .access_token)

# 2. upload a local video file
VIDEO_ID=$(curl -s -X POST "https://api.rask.ai/api/library/v1/media?kind=video" \
  -H "Authorization: Bearer $TOKEN" -F "[email protected]" | jq -r .id)

# 3. create the project once the media status is ready
ID=$(curl -s -X POST https://api.rask.ai/v2/projects \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d "{\"video_id\": \"$VIDEO_ID\", \"dst_lang\": \"de-de\", \"num_speakers\": 3}" | jq -r .id)

# 4. when status is merging_done, save the transcript as plain text
curl -s https://api.rask.ai/v2/projects/$ID/transcription -H "Authorization: Bearer $TOKEN" \
  | jq -r '.segments[].src.text' > webinar.txt
local video file
multipart upload
<?php
use GuzzleHttp\Client;

$http = new Client(['base_uri' => 'https://api.rask.ai']);
$json = fn($r) => json_decode($r->getBody(), true);
$auth = $json((new Client)->post('https://rask-prod.auth.us-east-2.amazoncognito.com/oauth2/token',
    ['auth' => [$clientId, $clientSecret], 'form_params' => ['grant_type' => 'client_credentials']]));
$h = ['Authorization' => 'Bearer ' . $auth['access_token']];

$media = $json($http->post('/api/library/v1/media/link', ['headers' => $h, 'json' => [
    'link' => 'https://vimeo.com/123456']]));
while ($media['status'] === 'processing') {
    sleep(5);
    $media = $json($http->get("/api/library/v1/media/{$media['id']}", ['headers' => $h]));
}

$p = $json($http->post('/v2/projects', ['headers' => $h, 'json' => [
    'video_id' => $media['id'], 'dst_lang' => 'pt-br']]));
while ($p['status'] !== 'merging_done') {
    sleep(10);
    $p = $json($http->get("/v2/projects/{$p['id']}", ['headers' => $h]));
}

$t = $json($http->get("/v2/projects/{$p['id']}/transcription", ['headers' => $h]));
file_put_contents('video.txt', implode("\n", array_map(fn($s) => $s['src']['text'], $t['segments'])));
Guzzle 7
plain HTTP
Python is the official SDK. The Node, PHP and cURL tabs are plain HTTP examples against the same endpoints.
Progress

How a video transcription project reports progress

Each video becomes a project with documented statuses, so you can show progress for every video in a bulk run. You only need to act on three groups.

Success, stop here

merging_done
The final media and caption files are ready. You can read and index the transcript earlier, as soon as its segments are available.

In progress, keep polling

created
uploading
transcription_started
separate_background_started
determine_speakers_started
translation_started
voiceover_started
merging_started
Plus the matching _done states. These map cleanly onto a staged progress UI.

Failure, stop and report

failed
upload_failed
transcription_failed
translation_failed
voiceover_failed
merging_failed
no_audio
no_words
forbidden_link
no_audio, no_words and forbidden_link are specific enough to show directly to your own user, for example a video without speech.
Plain text transcript, two speakers
jq -r on /transcription
00:00:00,320  SPEAKER_00  Welcome back. Today we test three cameras in low light.
00:00:06,180  SPEAKER_01  I brought the footage from last week's night shoot.
00:00:10,940  SPEAKER_00  Let's start with the smallest sensor, the hardest case.
00:00:15,500  SPEAKER_01  At ISO 6400 the noise is visible, but the colors hold up.

Or skip polling entirely

Point us at a webhook endpoint and every state transition arrives as a POST, so your queue reacts to each change the moment it happens. Webhook delivery is part of enterprise onboarding.
Read the docs
preserveAspectRatio="xMidYMid meet" aria-hidden="true" role="img">
Output

What you get for every video

Each finished project exposes the transcript as JSON segments, caption files in SRT and VTT in the target language, and the translated video and audio. Download links are presigned and valid for one hour.
Field
Format
What it is
/transcription
JSON
Speaker label, timestamps, source text and translation for every segment
translation_srt_path
.srt
Captions in the target language, timed to the segments
translation_vtt_path
.vtt
The same captions as WebVTT, for web players
translated_video
MP4
The translated video with voiceover
translated_audio
WAV
Translated speech mixed with the original background audio
original_video
MP4
Your source video as stored, for reference
Control

Fix names and jargon in the transcript

Automatic transcription handles most of a video. Names, accents and technical jargon sometimes need a person. Correct the text, timing or speaker of a segment with one request, then regenerate the translated version, billed on the changed segments with a one-minute minimum per run.

Segment-level editing

Segment-level editing
Every project exposes its transcript as addressable segments, so a misheard name is one patch request instead of manual transcription.
Fetch the transcript and its segments
Patch the source text and we re-translate it
Patch the translated text directly to keep your own wording
Adjust timestamps, add segments, delete segments
Reassign the voice attached to any speaker

Glossaries for terminology

Glossaries for terminology
Attach a glossary and product names and technical terms read the same in every translated transcript, or stay in the original language on purpose.

A glossary covers one language pair and applies across all regional variants of that target language, so one Spanish glossary serves es-mx and es-es alike. The project records glossary_version, so later edits never silently change finished work.
Input

Supported file formats

Transcribe video files in seven formats and audio recordings in four, or send a link from a major platform such as YouTube, Google Drive or Vimeo. Unsupported files are rejected before any minutes are charged.

Video

7 formats
.mp4
.mov
.mkv
.avi
.webm
.m4v
.3gp

Audio

4 formats
.mp3
.wav
.flac
.m4a

Metadata before you spend

The media endpoint returns duration, file size, video codec, frame rate, resolution, audio codec, sample rate and channel layout. Validate a file and estimate cost in advance, because projects are billed by the minute of video.
Security and compliance

Your videos and transcripts under audited controls

Brask Inc holds SOC 2 Type II and operates under GDPR, and publishes live control status in its Trust Center for your security team.

Certifications

SOC 2 Type II
GDPR
CAI and C2PA member

Encryption

TLS 1.2 in transit
AES-256 at rest
SSE-S3 managed keys
Key rotation at least every 12 months

Your content

Closed AI environment
Never used to train general models
Full export, no lock-in

Access

SSO and SAML
Role-based access control
OAuth 2.0 client credentials

Enterprise

Data residency options
Custom SLAs
Dedicated account manager

Voice rights

Synthetic voices with usage rights
Consent-based voice cloning
AI safety controls, human in the loop
Comparison

Rask API vs a transcription workflow assembled from parts

A transcript of a video is rarely the end result. Teams also need speaker labels, captions and other languages. Here is the same work, assembled two ways.
What you need
Rask API
Assembled from parts
Video links from YouTube, Drive, Vimeo or S3
Accepted directly
Download and convert first
Speaker labels for multiple speakers
Included
A diarization add-on or manual tagging
The language of each video
Detected automatically
Set per file or detected separately
Transcripts in other languages
135+ language and regional options
A translation API per language
Captions in .srt and .vtt
Included
A subtitle tool or your own file writer
Fixing technical jargon
One patch request per segment
Edit copies in every tool
A dubbed version of the video
Included in the same project
A TTS vendor plus your own mixing
Rate limits
None
Whatever each provider enforces
Real-time captions for live meetings
Use a streaming speech to text API
Built into some providers
A language nobody supports yet
We build it
Not available
FAQ

Video transcription API: common questions

Can't find what you're looking for? Contact sales.

Does Rask have a video transcription API?

Can I transcribe a YouTube video or a video link?

Can I transcribe multiple videos at once?

How does it handle multiple speakers?

Which languages are supported?

How accurate is the transcription?

Can I get the transcript as plain text?

Does it generate AI summaries, key topics or sentiment analysis?

Can it transcribe meetings?

Is there a maximum file size?

How is video transcription billed?

Is there a free tier?

How do I get API access and an API key?

Start dubbing in one afternoon

Make your first request today, and talk to us when you need volume terms or a language nobody else has.