Skip to main content

FreeTranscriptAPI reference

Extract YouTube transcripts with a single HTTP request. No credit card or API key required to get started. Pass a video URL and receive structured JSON data. New to transcript APIs? Read the developer guide.

Introduction

FreeTranscriptAPI provides a REST API for fetching YouTube video transcripts. All requests are made to the base URL below and return JSON responses.

Base URL

https://api.freetranscriptapi.com/v1

The API supports standard HTTP methods. Requests without an API key are limited to 20 requests per hour per IP address.With a free API key, you receive 1,000 credits on signup. Each transcript lookup costs 1 credit, including when no transcript is available.

Quick start

Get your first transcript in two steps. No account, API key, or credit card required:

  1. Send a GET request to the transcript endpoint with your video URL or video ID.
  2. Parse the JSON response in your application.

Need more volume? Create a free account for an API key and signup credits, or buy credits when you need more.

cURL

curl "https://api.freetranscriptapi.com/v1/transcript?video_url=dQw4w9WgXcQ"

JavaScript

const response = await fetch(
  "https://api.freetranscriptapi.com/v1/transcript?video_url=dQw4w9WgXcQ"
);

const data = await response.json();
console.log(data.transcript);

Python

import requests

response = requests.get(
    "https://api.freetranscriptapi.com/v1/transcript",
    params={"video_url": "dQw4w9WgXcQ"},
)

data = response.json()
print(data["transcript"])

Authentication

API keys are optional. Without one, you can make up to 20 requests per hour per IP address.Include an API key in the Authorization header to use your account credits. Signup includes 1,000 free credits:

Authorization: Bearer fta_live_sk_...

cURL

curl -H "Authorization: Bearer fta_live_sk_..." \
  "https://api.freetranscriptapi.com/v1/transcript?video_url=dQw4w9WgXcQ"

API keys are created in your dashboard. The full key is shown only once at creation. Store it securely and never expose it in client-side code.

Get transcript

GET/transcript

Returns the full transcript for a YouTube video. Accepts a video URL or 11-character video ID.

ParameterParameterDescription
video_urlstring · requiredYouTube video URL or video ID (e.g. dQw4w9WgXcQ).
langstringPreferred language code (e.g. en, es, fr). Defaults to en. Falls back to available captions if not found.
formatstringResponse format. Defaults to json. Set to text for plain text output.

cURL

curl "https://api.freetranscriptapi.com/v1/transcript?video_url=dQw4w9WgXcQ"

cURL (plain text)

curl "https://api.freetranscriptapi.com/v1/transcript?video_url=dQw4w9WgXcQ&format=text"

Response

{
  "language": "en",
  "title": "Example Video Title",
  "transcript": [
    {
      "text": "Hello world.",
      "start": 0.0,
      "duration": 2.1
    }
  ]
}

List languages

GET/languages

Returns all available caption languages for a video before fetching the transcript.

ParameterParameterDescription
video_urlstring · requiredYouTube video URL or video ID.

cURL

curl "https://api.freetranscriptapi.com/v1/languages?video_url=dQw4w9WgXcQ"

Response

{
  "languages": [
    {
      "code": "en",
      "name": "English",
      "auto_generated": false
    },
    {
      "code": "es",
      "name": "Spanish",
      "auto_generated": true
    }
  ]
}

Health check

GET/health

Returns the API status. No authentication required. Use this endpoint for uptime monitoring.

cURL

curl "https://api.freetranscriptapi.com/v1/health"

Response

{
  "status": "ok",
  "version": "1.0.0"
}

Model Context Protocol (MCP)

FreeTranscriptAPI exposes a hosted MCP endpoint so AI assistants can fetch YouTube transcripts as tools. Connect it from Cursor, ChatGPT, Claude, Windsurf, or any client that supports remote MCP servers over HTTPS. No local package or npx install required.

MCP endpoint

https://api.freetranscriptapi.com/mcp

Pass your API key in the Authorization header as Bearer fta_live_sk_.... Create a key in your dashboard. The same rate limits apply as the REST API.

Tools exposed on the endpoint:

ParameterParameterDescription
get_youtube_transcripttoolFetch a transcript by video URL or ID. Optional lang and format (json or text).
list_youtube_languagestoolList available caption languages for a video before fetching.

Cursor, Claude Desktop, and Windsurf

Add a remote MCP server in your client config. Replace the API key with yours:

Remote MCP config

{
  "mcpServers": {
    "freetranscriptapi": {
      "url": "https://api.freetranscriptapi.com/mcp",
      "headers": {
        "Authorization": "Bearer fta_live_sk_..."
      }
    }
  }
}

In Cursor: Settings → MCP → Edit config. In Claude Desktop: edit your claude_desktop_config.json. Other editors with MCP support follow the same URL plus headers pattern.

ChatGPT

ChatGPT connects to remote MCP servers over HTTPS (not local stdio). You need a paid plan and Developer Mode enabled.

  1. Open Settings → Apps & Connectors (or Connectors). Enable Developer Mode if prompted.
  2. Click Create (or New connector) and choose a custom MCP connector.
  3. Set the connector URL to https://api.freetranscriptapi.com/mcp.
  4. Set authentication to Token (or API key) and paste your API key, or use a Bearer token in the format fta_live_sk_....
  5. Save the connector, then mention it in a chat (for example with @freetranscriptapi) when you want transcript tools available.

Without an API key, unauthenticated MCP requests follow the same 20 requests per hour per IP limit as the REST API. With an API key, transcript requests use account credits.

Response format

Transcript responses include the detected language, video title, and an array of caption lines.

ParameterParameterDescription
languagestring · requiredISO language code of the returned transcript.
titlestring · requiredTitle of the YouTube video.
transcriptarray · requiredArray of caption line objects.
transcript[].textstring · requiredCaption text for this line.
transcript[].startnumber · requiredStart time in seconds.
transcript[].durationnumber · requiredDuration of this caption line in seconds.

Error codes

Errors return a JSON object with an error field containing a machine-readable code and human-readable message.

Example

{
  "error": {
    "code": "video_not_found",
    "message": "No transcript available for this video."
  }
}
StatusDescription
400invalid_requestMissing or invalid query parameters.
401unauthorizedMissing, invalid, or revoked API key.
404video_not_foundVideo does not exist or has no captions. Authenticated requests still use 1 credit.
402insufficient_creditsAccount credit balance is empty.
429rate_limit_exceededAnonymous hourly request limit reached for this IP address.
429anonymous_daily_cap_exceededPlatform-wide anonymous free tier exhausted for the UTC day. The message includes how long until the daily counter resets.
500internal_errorUnexpected server error. Retry the request.

Credits and limits

Usage depends on how you authenticate. Unauthenticated requests are tracked by IP address. Authenticated transcript requests use account credits:

ParameterParameterDescription
No API keypublic20 requests per hour per IP address, shared with a 100,000-request daily global cap on anonymous traffic.
API keycredits1 credit per transcript lookup, including 404 responses. 1,000 credits on signup.

Credits are charged when the lookup starts, not only when a transcript is returned. A 404 or 500 on /transcript still uses 1 credit if you sent a valid API key.

Anonymous traffic also shares a 100,000-request daily global cap (UTC). When it is exhausted, the API returns anonymous_daily_cap_exceeded with a message like "Daily global free requests have been used up. Try again in X hours."

Authenticated responses include a credit balance header:

ParameterParameterDescription
X-Credits-RemainingintegerCredits remaining on the account.

Anonymous responses include rate limit headers:

ParameterParameterDescription
X-RateLimit-LimitintegerMaximum requests allowed in the current window.
X-RateLimit-RemainingintegerRequests remaining in the current window.
X-RateLimit-ResetintegerUnix timestamp when the limit resets.

When you run out of credits, the API returns a 402 status. Buy more credits on the checkout page.

Learn more

Guides and comparisons for choosing a YouTube transcript API, avoiding scrapers, and wiring captions into AI workflows.

View all articles