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.
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:
- Send a GET request to the transcript endpoint with your video URL or video ID.
- 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:
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
/transcriptReturns the full transcript for a YouTube video. Accepts a video URL or 11-character video ID.
| Parameter | Parameter | Description |
|---|---|---|
| video_urlstring · required | YouTube video URL or video ID (e.g. dQw4w9WgXcQ). | |
| langstring | Preferred language code (e.g. en, es, fr). Defaults to en. Falls back to available captions if not found. | |
| formatstring | Response 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
/languagesReturns all available caption languages for a video before fetching the transcript.
| Parameter | Parameter | Description |
|---|---|---|
| video_urlstring · required | YouTube 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
/healthReturns 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.
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:
| Parameter | Parameter | Description |
|---|---|---|
| get_youtube_transcripttool | Fetch a transcript by video URL or ID. Optional lang and format (json or text). | |
| list_youtube_languagestool | List 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.
- Open Settings → Apps & Connectors (or Connectors). Enable Developer Mode if prompted.
- Click Create (or New connector) and choose a custom MCP connector.
- Set the connector URL to
https://api.freetranscriptapi.com/mcp. - Set authentication to Token (or API key) and paste your API key, or use a Bearer token in the format
fta_live_sk_.... - 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.
| Parameter | Parameter | Description |
|---|---|---|
| languagestring · required | ISO language code of the returned transcript. | |
| titlestring · required | Title of the YouTube video. | |
| transcriptarray · required | Array of caption line objects. | |
| transcript[].textstring · required | Caption text for this line. | |
| transcript[].startnumber · required | Start time in seconds. | |
| transcript[].durationnumber · required | Duration 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."
}
}| Status | Description |
|---|---|
| 400invalid_request | Missing or invalid query parameters. |
| 401unauthorized | Missing, invalid, or revoked API key. |
| 404video_not_found | Video does not exist or has no captions. Authenticated requests still use 1 credit. |
| 402insufficient_credits | Account credit balance is empty. |
| 429rate_limit_exceeded | Anonymous hourly request limit reached for this IP address. |
| 429anonymous_daily_cap_exceeded | Platform-wide anonymous free tier exhausted for the UTC day. The message includes how long until the daily counter resets. |
| 500internal_error | Unexpected 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:
| Parameter | Parameter | Description |
|---|---|---|
| No API keypublic | 20 requests per hour per IP address, shared with a 100,000-request daily global cap on anonymous traffic. | |
| API keycredits | 1 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:
| Parameter | Parameter | Description |
|---|---|---|
| X-Credits-Remaininginteger | Credits remaining on the account. |
Anonymous responses include rate limit headers:
| Parameter | Parameter | Description |
|---|---|---|
| X-RateLimit-Limitinteger | Maximum requests allowed in the current window. | |
| X-RateLimit-Remaininginteger | Requests remaining in the current window. | |
| X-RateLimit-Resetinteger | Unix 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.