TranscriptFetch
DevelopmentTurn YouTube, TikTok, and Instagram videos into transcripts and structured data. Timestamped, LLM-ready, one API call.
π Documentation & Examples
Everything you need to integrate with TranscriptFetch
π Quick Start Examples
// TranscriptFetch API Example
const response = await fetch('https://transcriptfetch.com', {
method: 'GET',
headers: {
'Content-Type': 'application/json'
}
});
const data = await response.json();
console.log(data);TranscriptFetch
TranscriptFetch turns a video URL into timestamped, structured text in one call. It reads published captions where they exist and transcribes the audio when they don't, returning the same JSON shape either way β across YouTube, TikTok, Instagram, X, Facebook and direct media files (mp4, mp3, wav). Built for RAG pipelines, research datasets and agents that need primary spoken sources.
Base URL: https://transcriptfetch.com/api/v2/transcripts/ Β· Docs: transcriptfetch.com/docs Β· OpenAPI: api/v2/openapi.json Β· MCP: https://transcriptfetch.com/mcp
How to Get a TranscriptFetch API Key
- Create an account at transcriptfetch.com/sign-up β no card required.
- Open Manage API keys and create a key (they look like
tf_live_β¦). - Store it server-side as
TRANSCRIPTFETCH_API_KEYand send it as a bearer token. Requests without a valid key return401.
Free tier: 50 credits every month, no card. Failed, blocked or empty results are never billed, and neither is job polling.
First Request
curl https://transcriptfetch.com/api/v2/transcripts/video \
-H "Authorization: Bearer $TRANSCRIPTFETCH_API_KEY" \
-H "Content-Type: application/json" \
-d '{"video":"dQw4w9WgXcQ"}'
The video field accepts a bare 11-character YouTube ID, any YouTube / TikTok / Instagram URL, or a direct media file URL.
{
"ok": true,
"request_id": "req_β¦",
"data": {
"kind": "transcript",
"video_id": "dQw4w9WgXcQ",
"platform": "youtube",
"title": "Example video",
"segments": [
{ "start": 0, "duration": 3.5, "text": "We're no strangers to love" }
]
},
"usage": { "credits_spent": 1, "balance": 49, "bytes": 14233 }
}
Every response uses the same envelope: { ok, request_id, data, usage }. A synchronous transcript carries either joined text or timestamped segments, depending on the timestamps flag; job and batch results include both.
Endpoints
All under https://transcriptfetch.com/api/v2/transcripts/:
| Endpoint | What it does |
|---|---|
POST /video |
One video β timestamped transcript |
POST /batch |
Up to 50 videos in one request (500 on Mega and Scale) |
POST /search |
Find videos by keyword (YouTube, TikTok, Instagram) |
POST /channel |
Resolve a channel or profile into a paginated video list, newest first |
POST /playlist |
Playlist listing (YouTube and TikTok) |
Every listed row carries a url the transcript endpoint accepts as-is. Instagram profiles use the channel endpoint. v1 (/api/v1/...) is still served for existing integrations under a 12-month deprecation policy β new work should use v2.
When There Are No Captions
mode: "auto" transcribes the audio automatically on the same endpoint. Short media may finish inline within about 45 seconds; longer work returns HTTP 202 with a job_id and poll_url, or you can supply a callback_url to receive the finished result instead of polling.
Their published coverage: captions exist for 82% of YouTube, 41% of TikTok and 38% of Instagram URLs; with audio transcription the API returns text for 99% / 96% / 94% of the same URLs.
Python
import os, requests
res = requests.post(
"https://transcriptfetch.com/api/v2/transcripts/video",
headers={"Authorization": f"Bearer {os.environ['TRANSCRIPTFETCH_API_KEY']}"},
json={"video": "https://youtu.be/dQw4w9WgXcQ", "timestamps": True},
)
data = res.json()
for seg in data["data"]["segments"]:
print(seg["start"], seg["text"])
JavaScript
const res = await fetch('https://transcriptfetch.com/api/v2/transcripts/video', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.TRANSCRIPTFETCH_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ video: 'https://www.tiktok.com/@user/video/123', timestamps: true }),
});
const { data, usage } = await res.json();
console.log(data.segments.length, 'segments Β·', usage.credits_spent, 'credits');
Official Python and Node SDKs read the key from TRANSCRIPTFETCH_API_KEY, and there's a prebuilt n8n community node.
Credits and Pricing
| Plan | Price | Credits / month |
|---|---|---|
| Free | $0 | 50 (no card) |
| Basic | $5 | 1,000 |
| Pro | $15 | 10,000 |
| Mega | $45 | 50,000 |
| Scale | $229 | 300,000 |
A successful caption transcript or a YouTube listing call costs 1 credit. AI transcription costs 1 credit per started minute (minimum 1) and is billed only on delivery. Unused plan credits roll over up to 2Γ the monthly allowance; top-ups never expire. Annual billing is 10 months for 12.
Rate limits: 10 requests/minute on free, 60 on Basic, 300 on Pro, 900 on Mega and Scale.
Error Codes
400 invalid input Β· 401 invalid key Β· 402 insufficient credits Β· 409 idempotency conflict Β· 422 input must change Β· 429 respect Retry-After Β· 500/502/503 server or transient upstream failure.
MCP Server
https://transcriptfetch.com/mcp (streamable HTTP, OAuth or API key) exposes five tools β get_transcript, search_videos, list_channel_videos, list_playlist_videos and get_credits β so Claude, ChatGPT, Cursor, Perplexity and other MCP clients can fetch primary sources themselves with no glue code. A machine-readable server card is published at /.well-known/mcp/server-card.json.
Use Cases
- RAG and AI pipelines β ground answers in what people actually said, with timestamps to cite
- Channel monitoring β poll a channel or playlist with
since_video_id; a page with nothing new costs no credits - Research datasets β normalise interviews, reviews, demos and lectures into one timestamped schema
- Agent tooling β let an assistant retrieve the original spoken source itself over MCP






