Free tier, no credit card

YouTube Transcript API

One GET request returns the full transcript with timestamps. Routed through residential IPs, so it keeps working after you deploy.

It works locally, then it 404s in production

Everyone starts with a library like Python's youtube-transcript-api. It works instantly on a laptop, which is why every tutorial recommends it. Then it goes to a server and starts raising IpBlocked or RequestBlocked on videos you can watch in your browser.

The reason is not your code. YouTube blocks IP ranges belonging to cloud providers, and AWS, GCP, Azure, DigitalOcean and Vercel are all trivially identifiable by ASN. Your home connection is residential and passes. Your server is not and does not.

Fixing it properly means rotating residential proxies with sticky sessions, plus keeping up with the client changes YouTube ships periodically. That is infrastructure and maintenance, not a config flag. This API is that stack, already built and already running in production for Brevyd itself.

Quickstart

cURL
curl 'https://brevyd.com/api/v1/transcript?url=https://youtu.be/dQw4w9WgXcQ&text=true' \
  -H 'x-api-key: brv_live_...'
Python
import requests

r = requests.get(
    "https://brevyd.com/api/v1/transcript",
    params={"url": "https://youtu.be/dQw4w9WgXcQ", "text": "true"},
    headers={"x-api-key": "brv_live_..."},
)
r.raise_for_status()
print(r.json()["content"])
Node
const res = await fetch(
  "https://brevyd.com/api/v1/transcript?" +
    new URLSearchParams({ url: "https://youtu.be/dQw4w9WgXcQ", text: "true" }),
  { headers: { "x-api-key": "brv_live_..." } }
);
const { content, lang } = await res.json();
Response
{
  "content": "We're no strangers to love, you know the rules...",
  "lang": "en",
  "availableLangs": ["en", "es", "zh-TW"]
}

Reference

Endpoint

GET https://brevyd.com/api/v1/transcript

Authentication

x-api-key: brv_live_...

ParameterTypeDescription
urlstringRequired. YouTube URL or bare video ID.
textbooleanWhen true, content is a plain string. Default false returns timestamped chunks.
langstringOptional ISO 639-1 code. Returns 404 rather than silently serving another language.

Errors

StatuserrorMeaning
400invalid_requestThe url parameter was missing or not a YouTube video.
401unauthorizedMissing, invalid, or revoked API key.
404transcript_unavailableNo caption track for this video.
429limit_exceededMonthly quota or per-minute rate limit reached.
500internal_errorFetch failed upstream. Safe to retry.

Rate limits

LimitValueOn exceed
Requests per minute, per key60429 limit_exceeded
Requests per month, free tier50429 limit_exceeded
Active keys per account5400 on create

The monthly quota resets on the 1st, UTC. Requests we serve from cache count toward it the same as any other, but they return in a fraction of the time.

Migrating from Supadata

Same x-api-key header, same parameters, same response shape with millisecond offsets. Change the base URL and the key. Three differences worth knowing before you switch:

  • ·availableLangs can be empty on some responses. We report what the upstream caption list gave us rather than inventing the field.
  • ·No mode parameter. We never AI-generate a transcript, so behaviour is always equivalent to mode=native.
  • ·No async 202 / jobId path. Every request resolves inline.

Pricing

Free: 50 requests a month

  • No credit card
  • 60 requests per minute
  • Full transcripts, no truncation
  • Timestamped chunks or plain text

Higher volume plans are not published yet. Rather than invent a number, we are measuring real per-request cost first. Tell us what volume you need and we will size a plan with you.

Frequently asked

Why does youtube-transcript-api stop working when I deploy?

YouTube blocks IP ranges that belong to cloud providers. AWS, GCP, Azure, DigitalOcean, and Vercel are all publicly identifiable by ASN lookup, so the same call that works on your laptop throws IpBlocked or RequestBlocked from a server. Nothing about your code is wrong; only the IP changed.

How is this different from just using a proxy myself?

It is the same idea, done properly. You need rotating residential proxies with sticky sessions, plus maintenance every time YouTube changes its client. That is a recurring cost and a recurring chore. This endpoint is that stack, already running.

Is it compatible with Supadata?

The transcript endpoint uses the same x-api-key header, the same url, text, and lang parameters, and the same { content, lang, availableLangs } response with millisecond offsets. For most integrations, switching is a base-URL change. The differences are listed in the reference below rather than papered over.

What happens on videos with no captions?

You get a 404 with transcript_unavailable. We do not silently fall back to AI transcription and bill you for it, because a surprise charge is worse than a clear error.

Is there a free tier?

Yes: 50 requests a month, no credit card. It is a real free tier, not a trial behind a signup wall.

What are the rate limits?

60 requests per minute per key. If you need more, get in touch.

Not a developer? Use the free transcript tool instead, or read how to get a transcript of a YouTube video.