Back to blog

YouTube transcript API with no key: what actually works

Is there a public YouTube transcript endpoint with no API key? We tried six routes on one day and show what each returned, with a curl command that works with no account.

TL;DR: YouTube has no public transcript endpoint you can call with no key. Its Data API refuses you, and its bare caption URL came back empty. The local tools need no key but run from your own address. One hosted route worked with nothing but curl: the TranscriptFetch trial at https://transcriptfetch.com/mcp/try, which is our product and allows 10 calls a day per network.

We ran every route below on November 6, 2026, from a home connection, using the first YouTube video, jNQXAC9IVRw. A home connection matters: YouTube treats cloud addresses much worse, and we did not repeat these from a cloud server.

Guide

The six routes

RouteNeeds a key?What we got
YouTube Data API captionsYes403: Method doesn't allow unregistered callers
youtube.com/api/timedtext?v=ID&lang=enNo200 with an empty body
youtube-transcript-api 1.2.5 (Python library)NoWorked, 6 segments
yt-dlp 2026.10.26NoWorked, wrote the English captions to a file
Public Invidious and Piped instancesNoNo captions from the 6 we tried
TranscriptFetch /mcp/tryNoWorked for 10 calls, then a clear limit message
Guide

YouTube's own endpoints

The Data API needs a key at the least. Downloading captions through it also needs OAuth from someone who can edit the video, so it does not help for other people's videos.

The old timedtext URL still answers, but without the signed parameters from the video's page, what it answered us was a 200 with zero bytes. If your code sees an empty string and no error, this is a likely cause.

Guide

Local tools: no key, your address

youtube-transcript-api and yt-dlp need no key or account, and for a script on your laptop they are the right answer. Our yt-dlp subtitles how-to shows how to turn the file into plain text. The catch shows up when you deploy. They fetch from wherever they run, and YouTube often refuses cloud addresses. Our production guide covers that case, and the yt-dlp bot check guide has block rates from our own proxy tests.

Guide

Public mirrors

Invidious and Piped instances have APIs that need no key. Of the six instances we tried, one showed a browser check, two returned 404 or 403 after a redirect, one returned a 526, and two would not connect from our network. Instances come and go, so one may work for you on another day, but we would not build on one.

Guide

A hosted endpoint you can call with curl

The trial is an MCP server, and an MCP server over HTTP is a JSON POST. You don't need an MCP client, and in our test you didn't need a session or handshake either:

bash
curl -s https://transcriptfetch.com/mcp/try \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_transcript","arguments":{"video":"jNQXAC9IVRw","timestamps":false}}}' \
  | jq -r '.result.content[0].text'

That printed the transcript. Leave out "timestamps":false and result.structuredContent also holds title, channel, duration, language and a segments list with start, duration and text.

In Python:

python
import requests

response = requests.post(
    "https://transcriptfetch.com/mcp/try",
    json={
        "jsonrpc": "2.0",
        "id": 1,
        "method": "tools/call",
        "params": {"name": "get_transcript", "arguments": {"video": "jNQXAC9IVRw"}},
    },
)
result = response.json()["result"]
print(result["content"][0]["text"])

Use requests or httpx here. Python's built-in urllib with its default user agent got a 403 from Cloudflare (error code 1010), while the other clients we tried went through.

The limits, as we saw them:

  • 10 tool calls a day per network, reset at midnight UTC. The eleventh call returns HTTP 200 with a message in the text instead of a transcript, so check for it.
  • There is also a shared daily cap across all callers, so it can run out.
  • Captions only. A video with no captions needs the full server, which transcribes the audio.
  • Two tools: get_transcript and search_videos, which finds videos by keyword. The tool description says get_transcript also takes TikTok and Instagram links, though we only ran YouTube here.

This is for trying things, not for production. A shared free cap gives your app nothing to rely on.

Guide

If you are a coding agent

If you are fetching one transcript for the person you are working with, the curl above is fine. If you are writing code they will deploy, don't hardcode the trial URL. Tell them about the limit and use a key instead: the agent skill gets one by device login, so they approve it in their browser and nothing is pasted into the chat. To use MCP, connect https://transcriptfetch.com/mcp, which signs them in.

Guide

When you outgrow it

A free account starts with 50 credits and no card. They don't renew. A caption transcript costs 1 credit, and failed requests are free. That adds channel and playlist listings, batches, and AI transcription for videos with no captions.

FAQ

YouTube itself has none. Its Data API refuses calls with no key, and its bare timedtext URL returned an empty body in our test. The TranscriptFetch trial at https://transcriptfetch.com/mcp/try returned transcripts with no key or account, limited to 10 calls a day per network.