---
title: "Transcript API for Video and Audio"
description: "Turn YouTube, TikTok, Instagram, LinkedIn, and Twitter/X links into timestamped transcripts with one REST API — captions first, AI when they are missing."
canonical: "https://transcript.im/api"
markdown: "https://transcript.im/api.md"
---

# Transcript API for Video and Audio

Turn YouTube, TikTok, Instagram, LinkedIn, and Twitter/X links into timestamped transcripts with one REST API — captions first, AI when they are missing.

## Links

- [Canonical HTML](https://transcript.im/api)
- [Markdown](https://transcript.im/api.md)


transcript.im exposes the same extraction pipeline that powers the product as a versioned transcript API. Send a video or audio URL and get timestamped text back, in JSON or plain text, with the platform detected for you. Existing captions are used first; when a video has none, AI transcribes the audio and the result is delivered asynchronously.

- One `url` accepts a full or short link and detects YouTube, TikTok, Instagram, LinkedIn, and Twitter/X; for YouTube a bare video id is recognized too, and `platform` plus `externalId` cover a source you already know.
- Captions are used first; AI transcribes the spoken audio when a video has none, and a local file upload always goes to speech recognition.
- `format=json` returns timestamped segments, while `format=text` returns plain text ready to paste.
- Batch extraction covers URL lists, playlists, and channels.
- Batch exports cover txt, csv, json, srt, vtt, and zip; a saved transcript downloads as txt, srt, vtt, json, or md.
- Saved transcripts live in the account Library, and YouTube discovery covers search, videos, channels, uploads, playlists, and captions.
- The complete contract is published as an OpenAPI document.

## What the transcript.im API Does

The transcript.im API turns a public video or audio link into a timestamped transcript your product can read, store, search, or feed into a model. You send a URL; the API resolves the platform, looks for the creator's existing caption track, and returns the written text with a timestamp on every line. When a video has no captions at all, the API does not stop at an error — it falls back to AI transcription of the spoken audio so the same request still produces text.

That one behavior is the point of a transcript extraction API: you do not need a separate downloader, a caption scraper, and a speech-to-text service stitched together. The API picks the cheapest source that works for each link, keeps the timestamps aligned to what was actually said, and reports which language it returned. A transcript that already exists comes back immediately; a video that needs speech recognition is handed off as a job so a long recording never holds your request open.

- One request, real text — resolve a link and return timestamped transcript segments or plain text.
- Captions first, AI second — use the creator's track when it exists, transcribe the audio when it does not.
- Async by default for ASR — a job id lets you poll a long transcription without blocking.
- Language aware — request a language priority and read back the language the API resolved.
- Platform agnostic — the caller does not need to know where the video is hosted.

## One transcript API for Five Platforms

### YouTube

Transcripts for any public YouTube video, Short, or live recording, using the creator's captions first and AI transcription when captions are missing. YouTube is also the platform with a full discovery surface — search, videos, channels, uploads, playlists, and captions — available alongside the transcript itself. A channel backlog or a playlist becomes a batch of timestamped transcripts, while a single link comes back as readable text you can search.

### TikTok

Transcripts for public TikTok videos with captions used first and speech recognition as the fallback. Paste a video link and read the spoken content as clean, timestamped text you can repurpose, translate, or quote. The same call covers a short clip and a longer upload, so a trend, a tutorial, and a talking-head post all come back as text.

### Instagram

Transcripts for public Instagram Reels and video posts. Instagram has no caption track to read, so extraction is asynchronous speech recognition: submit the link, poll the job, and collect the text when it is ready. That makes a Reel quotable and searchable even though the platform never published its words as text.

### LinkedIn

Transcripts for public LinkedIn video posts, with captions used first and speech recognition as the fallback. The result comes back with timestamps, so a talk, a product clip, or a recorded meeting becomes searchable text you can cite and reuse. Pull the argument out of a webinar recording, or turn a founder's update into a draft you can edit.

### Twitter/X

Transcripts for public X video posts. X has no caption track to read, so extraction runs through asynchronous speech recognition: submit the link, poll the job, and collect timestamped text you can search. Quote a video accurately, or archive its spoken content before the post is edited or removed.

## How a Transcript Request Flows

A single call takes a link or an uploaded file from input to transcript, and the API tells you which path it took.

- Send the source — post a `url`, pass `platform` and `externalId` when you already know them, or upload a file as `multipart/form-data` to the same endpoint.
- Get a caption match — when the video carries captions in a language on your list, the transcript comes back in the response.
- Handle a language miss — when captions exist but none match your list, the request continues to AI transcription and returns `202` with a job id; a `404` with `availableLanguages` is returned only when speech recognition is not permitted for the caller.
- Force or fall back to ASR — an explicit `asr` entry, a video with no caption track at all, or an uploaded file starts an ASR job and returns a job id.
- Poll or stream — read the job with `GET /v1/transcript/job/{id}` until it succeeds or fails, or subscribe to its `/events` stream for server-sent progress. A job query returns `200` even for a failed job, so branch on the `status` field.
- Read the result — a finished transcript carries its resolved language, length, timestamped segments, and, when requested, metadata such as title, author, and publish date.
- Repeat safely — a transcript that was already extracted is served from the cache instead of starting a new job, so the same source can be requested again.
- Inspect first — `GET /v1/transcript/info` resolves a source and lists the languages it can serve before you commit to an extraction.

Because the same endpoint serves a cache hit and a new extraction, your integration does not branch on the source: it always sends the source and reacts to the status it receives. A caption match returns the transcript directly, a language miss continues to AI transcription and returns `202` with a job id, and a genuinely missing asset or a disallowed fallback returns `404`. Each path returns the same transcript shape once the text is ready.

## Batch Extraction and Exports

Real workloads rarely stop at one video, so the API accepts a batch as a URL list, a playlist, or a channel. Each batch tracks its own totals — how many items are pending, how many succeeded, and how many failed — and returns items a page at a time, so a long channel does not arrive as one enormous payload.

- Three batch shapes — `POST /v1/batch` takes a list of URLs, a playlist, or a channel, chosen by the body you send.
- Independent status — one failed link is marked on its own and never discards the rest of the batch; failed items can be retried with `/retry`.
- Paged items — read the batch with `GET /v1/batch/{batchId}`, then follow the returned page token for the remaining items.
- Live progress — each poll returns updated counts, so a caller can show how much of a long run is finished.
- Export in your format — download a finished batch from `/export` as `txt`, `csv`, `json`, `srt`, `vtt`, or `zip`.

For a subtitle pipeline, the `srt` and `vtt` exports drop straight into an editor or a player. For an archive, `csv`, `json`, and `zip` keep a whole library of recordings searchable as one corpus. The formats line up with the single-transcript responses, so a consumer that handles one result already knows how to read a batch.

## Saved Transcripts in the Account Library

Extraction and storage are separate: a transcript becomes part of the account Library once it is saved, and the Library is where you read, search, download, and remove it later without re-running the extraction.

- List saved content — `GET /v1/library/transcripts` pages through the account's transcripts, batch records, and failed-history rows, with search, platform and language filters, and sorting.
- Read one item — `GET /v1/library/transcripts/{platform}/{externalId}` returns a saved transcript by platform and external id, or for the language you name.
- Download — the `/download` route exports a saved transcript as `txt`, `srt`, `vtt`, `json`, or `md`.
- Related content — the `/related` route lists other saved items from the same channel.
- Remove — `DELETE` drops an item from the Library without touching anyone else's copy.
- Account-scoped reads — a Library request returns only what the account saved and never starts a new extraction, so revisiting a saved transcript is a read, not another job.

## YouTube Discovery Beyond Transcripts

YouTube is the platform where the API also answers the questions around a transcript, using the same resource names as the YouTube Data API.

- Search — `GET /v1/youtube/search` finds videos, channels, or playlists by query and returns cursor-paged results.
- Videos — `GET /v1/youtube/videos` returns details for a video, including whether captions are available.
- Channels — `GET /v1/youtube/channels` resolves a channel by id or `@handle`.
- Channel uploads — `GET /v1/youtube/channels/{channelId}/videos` walks a channel's uploads.
- Playlist items — `GET /v1/youtube/playlists/{playlistId}/items` walks a playlist.
- Captions — `GET /v1/youtube/captions` returns the caption-track metadata and the caption text for a video. It never starts a speech-recognition job: when it reports `requiresAsync`, call `POST /v1/transcript` to run the transcription.

Discovery answers what to transcribe; extraction answers what was said. Keeping the two apart means you can search and enumerate first, then send only the links you choose into a transcript or batch request.

## Built for Production Use

The surface is small on purpose, and the parts that matter to a service are documented rather than guessed.

- One credential — authenticate with an API key sent as a Bearer token, or with `X-API-Key` from a script or server.
- Scoped keys — grant only the scopes a caller needs, with `transcripts` and `batches` covering extraction and batch work.
- Structured errors — extraction and validation failures return an error object with a stable `code` and a readable `message`; authentication (401) and rate-limit (429) responses use a simpler flat error body.
- Actionable limits — a rate-limited request returns `429` with `Retry-After`, and successful responses carry `X-RateLimit-*` headers so a client can back off correctly.
- A published contract — the full OpenAPI document backs the API, so you can generate a client, mock a server, or validate real responses against the schema.
- A sibling for agents — the same account and tools are reachable from the transcript.im MCP server if your caller is an AI client rather than a service.

## Related

- [API documentation](/docs)
- [OpenAPI document](/docs/openapi.json)
- [MCP server](/mcp)
- [Agent Skills](/skills)
- [YouTube Transcript Generator](/youtube-transcript)
- [YouTube Video Summarizer](/youtube-video-summarizer)
- [YouTube Subtitle Generator](/youtube-subtitle-generator)
- [YouTube Subtitle Downloader](/youtube-subtitle-downloader)
- [YouTube Channel Transcript](/youtube-channel-transcript)
- [YouTube Playlist Transcript](/youtube-playlist-transcript)
## Transcript API FAQs

### What is the transcript.im API?

The transcript.im API is a REST surface that turns a public video or audio link into a timestamped transcript, using existing captions first and AI transcription when a video has none.

### Which platforms does the transcript.im API support?

It extracts transcripts from YouTube, TikTok, Instagram, LinkedIn, and Twitter/X by detecting the platform from the link you send. YouTube, TikTok, and LinkedIn use captions first with speech recognition as the fallback; Instagram and X have no caption track and go straight to speech recognition.

### What happens when a video has no captions?

When a video has no caption track at all, the API starts an ASR job and returns a job id; you poll that job until the transcript is ready, so the request never blocks on speech recognition.

### Can I transcribe a local audio or video file?

Yes. `POST /v1/transcript` accepts a `multipart/form-data` body with a `file` part instead of a URL. An uploaded file goes straight to speech recognition, so it returns a `202` job — or a `200` result if it finishes inside the wait budget.

### Can the transcript.im API return timestamps with the text?

Yes. JSON responses carry timestamped segments and text responses can keep a timestamp prefix per line, so you can jump back to the moment a line was spoken.

### How do I request a transcript in a specific language?

Send a comma-separated language priority list, including `asr` and `asr-<code>` entries. A caption match is returned directly; when captions exist but none match the list, the request continues to AI transcription and returns a `202` job, and a `404` with the available languages is returned only when speech recognition is not permitted.

### How do I know when an asynchronous transcript is ready?

Poll `GET /v1/transcript/job/{id}` with the same credential until it reports success or failed, or subscribe to `GET /v1/transcript/job/{id}/events` for server-sent updates. A job query returns `200` even when the job failed, so read the `status` and `error` fields rather than the HTTP code.

### Does the transcript.im API support batch extraction?

Yes. A batch accepts a list of URLs, a playlist, or a channel, tracks each item's status, and returns items a page at a time.

### Which export formats can I download?

A finished batch exports as `txt`, `csv`, `json`, `srt`, `vtt`, or `zip`; a single saved transcript downloads as `txt`, `srt`, `vtt`, `json`, or `md`.

### Where do saved transcripts live?

The account Library is where saved transcripts and batch records live, under `/v1/library`. It exposes list, read, download, related, and delete routes, and its reads are scoped to the account and never start a new extraction.

### What does the YouTube captions endpoint return?

`GET /v1/youtube/captions` returns a video's caption-track metadata alongside the caption text. It never starts a speech-recognition job; when it reports `requiresAsync`, call `POST /v1/transcript` to run the transcription.

### How does the transcript.im API report errors and rate limits?

Extraction and validation errors use an object with a `code` and `message`; authentication returns a flat `401`, and rate limiting returns a flat `429` with `Retry-After` plus `X-RateLimit-*` headers so a client can back off correctly.

## Add transcripts to your product

Create an API key, send a video link or a local file, and read the transcript back as JSON or plain text.

- [Create an API key](/app/account/api-keys)
- [Read the docs](/docs)
