{"openapi":"3.1.0","info":{"title":"YouTube Transcript API - Public","description":"## Authentication\n\nSend your API key in the Authorization header:\n```\nAuthorization: Bearer YOUR_API_KEY\n```\n\nGet an API key at https://transcriptapi.com/dashboard/api-keys\n\n---\n\n## API Parameters\n\n### GET /api/v2/youtube/transcript\n\n**Query Parameters:**\n\n- `video_url` (required): YouTube video URL or 11-character video ID\n- `language` (optional): Comma-separated language priority list (e.g. `de,en,asr`). Omit it to get English, or the video's first available language. `asr` = auto-generated captions; `asr-<code>` = a specific auto language (e.g. `asr-hi`). Codes ignore region (`de` matches `de-DE`). The 200 `language` field is the resolved code — when it comes back as `asr-<code>` you know the auto-generated track was used and the video's language (handy for detecting a video's language).\n- `format` (optional, default: `json`): Output format - `json` or `text`\n- `include_timestamp` (optional, default: `true`): Include timestamps in output\n  - When `true` with `format=json`: Returns segments with `text`, `start`, `duration`\n  - When `false` with `format=json`: Returns segments with only `text`\n  - When `true` with `format=text`: Returns timestamped lines like `[123.45s] text`\n  - When `false` with `format=text`: Returns concatenated plain text\n- `send_metadata` (optional, default: `false`): Include video metadata (title, author, thumbnail)\n\n### GET /api/v2/youtube/info\n\nDiscover a video's metadata and available transcript languages **before** fetching a transcript. Free (no credit consumed), with the same API key and active-plan requirement as the transcript endpoint.\n\n**Query Parameters:**\n\n- `video_url` (required): YouTube video URL or 11-character video ID\n\nReturns `available_languages` as codes you can pass to the transcript endpoint's `language` parameter (e.g. `en`, or `asr-en` for auto-generated English).\n\n---\n\n## Credit Usage & Billing\n\n### Credit Cost\n\n| Endpoint | Credits per Request | Notes |\n|----------|---------------------|-------|\n| `GET /api/v2/youtube/transcript` | 1 credit | Only charged on successful response (200) |\n| `GET /api/v2/youtube/search` | 1 credit | Search videos or channels |\n| `GET /api/v2/youtube/channel/resolve` | **Free** | Requires auth + active credit, no charge |\n| `GET /api/v2/youtube/channel/search` | 1 credit | Search within a channel |\n| `GET /api/v2/youtube/channel/videos` | 1 credit/page | Paginated channel uploads |\n| `GET /api/v2/youtube/channel/latest` | **Free** | Latest 15 videos via RSS |\n| `GET /api/v2/youtube/playlist/videos` | 1 credit/page | Paginated playlist videos |\n\n### When Credits Are Charged\n\n- ✅ **Successful requests** (HTTP 200) - 1 credit\n- ✅ **Cached responses** (HTTP 200) - 1 credit\n- ❌ **Failed requests** (4xx, 5xx errors) - 0 credits\n- ❌ **Rate limited requests** (HTTP 429) - 0 credits\n\nCredits are deducted in real-time only when a transcript is successfully returned.\n\nWhen credits are exhausted, the API returns `HTTP 402 Payment Required`.\n\n---\n\n## Rate Limits\n\nAll API keys are subject to the following rate limits:\n\n- **200 requests per minute** per API key\n\n### Rate Limit Headers\n\nEach response includes rate limit information in the headers:\n\n```\nX-RateLimit-Limit: 200\nX-RateLimit-Remaining: 195\nX-RateLimit-Reset: 1678901234\n```\n\nWhen rate limited, you'll receive `HTTP 429 Too Many Requests` with a `Retry-After` header.\n\n### Best Practices\n\n1. **Implement exponential backoff** on 429 errors\n2. **Respect the `Retry-After` header** value\n3. **Cache responses** when appropriate to reduce API calls\n4. **Don't retry failed requests** more than 2 times within 3 seconds\n5. **Monitor rate limit headers** to avoid hitting limits\n\n---\n\n## Error Handling\n\nThe API uses standard HTTP status codes:\n\n| Status Code | Meaning | Retry? | Action |\n|-------------|---------|--------|--------|\n| `200` | Success | — | Transcript returned, 1 credit charged |\n| `400` | Bad Request | ❌ No | Check your request parameters |\n| `401` | Unauthorized | ❌ No | Check your API key |\n| `402` | Payment Required | ❌ No | Add credits at billing page |\n| `404` | Not Found | ❌ No | Video doesn't exist or has no transcript |\n| `408` | Timeout / Retry | ✅ **Yes** | Temporary failure (bot detection, network) - retry after 1-5s |\n| `429` | Too Many Requests | ✅ **Yes** | Rate limit exceeded - retry after `Retry-After` header |\n| `500` | Server Error | ⚠️ Maybe | Contact support if persistent |\n| `503` | Service Unavailable | ✅ **Yes** | Service temporarily down - retry after 1-5s |\n\n### Retry Strategy\n\nFor retryable errors (`408`, `429`, `503`):\n\n1. **Wait** the recommended delay (1-5s, or `Retry-After` header for 429)\n2. **Retry** up to 2-3 times with exponential backoff\n3. **Give up** after max retries and log/alert the failure\n\nFor non-retryable errors (`400`, `401`, `402`, `404`): Do not retry - fix the request or check your account.\n\n---\n\n## Support\n\nFor questions or issues, contact us at hello@transcriptapi.com\n","version":"1.0.0"},"paths":{"/api/v2/youtube/transcript":{"get":{"tags":["YouTube transcript"],"summary":"Get YouTube transcript (v2)","description":"Get a YouTube video's transcript — pass a video URL or 11-character ID as `video_url`.\n\nBy default you get English, or the video's first available language if there's no English.\n\nTo choose a language, set `language` to a comma-separated list in priority order; we return the first one that's available. Example: `language=de,en,asr` tries German, then English, then the auto-generated captions.\n\n- `asr` = the video's auto-generated captions (ASR = automatic speech recognition).\n- `asr-<code>` = auto-generated captions in a specific language, e.g. `asr-hi`.\n- A plain code like `hi` returns the human-made captions if they exist, otherwise the auto-generated ones (`asr-hi`).\n- Language codes ignore region (`de` matches `de-DE`) and are case-insensitive. Up to 10 codes.\n\nThe `language` field in the response always tells you exactly what you got. Tip: call GET /api/v2/youtube/info first (it's free) to see which languages a video offers.","operationId":"get_transcript_v2_api_v2_youtube_transcript_get","security":[{"bearerAuth":[]}],"parameters":[{"name":"video_url","in":"query","required":true,"schema":{"type":"string","pattern":"^([a-zA-Z0-9_-]{11}|https?://.*)$","description":"YouTube video URL or bare 11-char ID","title":"Video Url"},"description":"YouTube video URL or bare 11-char ID"},{"name":"language","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional comma-separated language priority list (e.g. `de,en,asr`). Omit it to get English, or the video's first available language. We return the first code that's available. `asr` = auto-generated captions; `asr-<code>` = a specific auto language (e.g. `asr-hi`). Codes ignore region (`de` matches `de-DE`). The response's `language` field tells you exactly what you got — ask for `hi` and you'll see `asr-hi` if only auto captions exist.","title":"Language"},"description":"Optional comma-separated language priority list (e.g. `de,en,asr`). Omit it to get English, or the video's first available language. We return the first code that's available. `asr` = auto-generated captions; `asr-<code>` = a specific auto language (e.g. `asr-hi`). Codes ignore region (`de` matches `de-DE`). The response's `language` field tells you exactly what you got — ask for `hi` and you'll see `asr-hi` if only auto captions exist."},{"name":"send_metadata","in":"query","required":false,"schema":{"type":"boolean","description":"Include basic video metadata in response","default":false,"title":"Send Metadata"},"description":"Include basic video metadata in response"},{"name":"format","in":"query","required":false,"schema":{"$ref":"#/components/schemas/TranscriptFormatV2","description":"Response format: json or text","default":"json"},"description":"Response format: json or text"},{"name":"include_timestamp","in":"query","required":false,"schema":{"type":"boolean","description":"Include timestamps in transcript output","default":true,"title":"Include Timestamp"},"description":"Include timestamps in transcript output"}],"responses":{"200":{"description":"Transcript retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APITranscriptResponseV2"},"examples":{"json_with_timestamps":{"summary":"JSON format with timestamps (default)","value":{"video_id":"dQw4w9WgXcQ","language":"en","transcript":[{"text":"Never gonna give you up","start":0.0,"duration":4.12},{"text":"Never gonna let you down","start":4.12,"duration":3.85}],"metadata":{"title":"Rick Astley - Never Gonna Give You Up","author_name":"RickAstleyVEVO","author_url":"https://www.youtube.com/@RickAstley","thumbnail_url":"https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg"}}},"json_without_timestamps":{"summary":"JSON format without timestamps (include_timestamp=false)","value":{"video_id":"dQw4w9WgXcQ","language":"en","transcript":[{"text":"Never gonna give you up"},{"text":"Never gonna let you down"}]}},"text_with_timestamps":{"summary":"Text format with timestamps (default)","value":{"video_id":"dQw4w9WgXcQ","language":"en","transcript":"[0.0s] Never gonna give you up\n[4.12s] Never gonna let you down\n[7.97s] Never gonna run around and desert you"}},"text_without_timestamps":{"summary":"Text format without timestamps (include_timestamp=false)","value":{"video_id":"dQw4w9WgXcQ","language":"en","transcript":"Never gonna give you up Never gonna let you down Never gonna run around and desert you"}}}}},"headers":{"X-Cache-Status":{"description":"Cache status for the request (HIT, PARTIAL-HIT, MISS)","schema":{"type":"string"}}}},"401":{"description":"Unauthorized - invalid Authorization format or API key","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"}}},"headers":{"WWW-Authenticate":{"description":"Authentication scheme for this endpoint","schema":{"type":"string","example":"Bearer"}}}},"402":{"description":"Payment Required - inactive plan or exhausted credits","content":{"application/json":{"schema":{"$defs":{"PaymentActionDetail":{"properties":{"message":{"description":"User-friendly explanation of why payment is required","title":"Message","type":"string"},"reason":{"description":"Machine-readable reason for the payment requirement","enum":["insufficient_credits","no_active_paid_plan"],"title":"Reason","type":"string"},"action_label":{"description":"Short label for the recommended action CTA","title":"Action Label","type":"string"},"action_url":{"description":"URL to take the recommended action (top-up or pricing)","title":"Action Url","type":"string"}},"required":["message","reason","action_label","action_url"],"title":"PaymentActionDetail","type":"object"}},"properties":{"detail":{"$ref":"#/components/schemas/PaymentActionDetail"}},"required":["detail"],"title":"PaymentRequiredResponse","type":"object"},"examples":{"topup":{"summary":"Active paid plan but credits exhausted","value":{"detail":{"message":"You have an active plan, but you've run out of credits.","reason":"insufficient_credits","action_label":"Top up credits","action_url":"https://transcriptapi.com/top-up"}}},"billing":{"summary":"No active paid plan","value":{"detail":{"message":"You don't have an active paid plan yet.","reason":"no_active_paid_plan","action_label":"Go to billing to choose a plan","action_url":"https://transcriptapi.com/billing"}}}}}}},"404":{"description":"**Not Found** - Video doesn't exist or no transcript available. **Do not retry.**\n\nWhen `language` was provided (Mode B), the body also includes a machine-readable `code` and an `available_languages` list so the caller can retry with a language that exists.","content":{"application/json":{"schema":{"$defs":{"AvailableLanguage":{"description":"A language available for a video (PRD §5.2).\n\n`code` is a normalized base code (`en`, `de`, `zh`) or the reserved `asr`\npseudo-code for auto-generated captions.","properties":{"code":{"description":"Normalized language code, or 'asr' for auto-generated","title":"Code","type":"string"},"name":{"description":"Human-readable language name","title":"Name","type":"string"}},"required":["code","name"],"title":"AvailableLanguage","type":"object"}},"description":"Canonical 404 body when a Mode B `language` priority list resolves nothing.\n\nOnly returned when `language` is provided (Mode B). The legacy Mode A 404\n(no `language` param) uses the plain `ErrorResponse` shape with no\n`available_languages`.","properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"description":"Machine-readable error code","title":"Code","type":"string"},"available_languages":{"description":"Languages that ARE available, so the caller can retry","items":{"$ref":"#/components/schemas/AvailableLanguage"},"title":"Available Languages","type":"array"}},"required":["detail","code"],"title":"TranscriptNotFoundResponse","type":"object"},"examples":{"no_transcript_legacy":{"summary":"No `language` param (Mode A) - plain error, no available_languages","value":{"detail":"No transcript available for video ABC123XYZ"}},"video_not_found":{"summary":"Video doesn't exist","value":{"detail":"Video not found or unavailable"}},"no_transcript_for_requested_languages":{"summary":"`language` provided (Mode B) - includes code + available_languages","value":{"detail":"No transcript available for the requested languages: en, de","code":"no_transcript_for_requested_languages","available_languages":[{"code":"hi","name":"Hindi"},{"code":"asr-hi","name":"Hindi (auto-generated)"}]}}}}}},"408":{"description":"**Request Timeout / Retry** - Temporary failure (bot detection, network issues). **Safe to retry** after a short delay (1-5 seconds).","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"retry":{"summary":"Temporary failure - retry recommended","value":{"detail":"Request failed, please retry"}}}}}},"422":{"description":"**Validation Error** - Invalid YouTube URL or video ID format. **Do not retry** with the same input.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"}}}},"429":{"description":"**Too Many Requests** - Rate limit exceeded. **Retry after** the delay in `Retry-After` header.","headers":{"Retry-After":{"description":"Seconds until the limit resets","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Total allowed requests in the window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the window","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"UTC epoch seconds when the window resets","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"}}}},"500":{"description":"**Internal Server Error** - Unexpected error. May retry, but if persistent, contact support.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"server_error":{"summary":"Unexpected server error","value":{"detail":"Internal server error"}}}}}},"503":{"description":"**Service Unavailable** - Service temporarily down or initializing. **Retry** after a short delay.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"unavailable":{"summary":"Service temporarily unavailable","value":{"detail":"Service not initialized"}}}}}}}}},"/api/v2/youtube/info":{"get":{"tags":["YouTube transcript"],"summary":"Get YouTube video info (v2)","description":"Discover a video's metadata and available transcript languages — free (no credit used), with the same API key/plan as the transcript endpoint. Each language is returned as a code you can pass to the transcript endpoint's `language` parameter (e.g. `en`, or `asr-en` for auto-generated English).","operationId":"get_video_info_v2_api_v2_youtube_info_get","security":[{"bearerAuth":[]}],"parameters":[{"name":"video_url","in":"query","required":true,"schema":{"type":"string","pattern":"^([a-zA-Z0-9_-]{11}|https?://.*)$","description":"YouTube video URL or bare 11-char ID","title":"Video Url"},"description":"YouTube video URL or bare 11-char ID"}],"responses":{"200":{"description":"Video metadata and available languages","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VideoInfoResponse"},"examples":{"info":{"summary":"Metadata + available languages","value":{"video_id":"dQw4w9WgXcQ","metadata":{"title":"Rick Astley - Never Gonna Give You Up","author_name":"RickAstleyVEVO","author_url":"https://www.youtube.com/@RickAstley","thumbnail_url":"https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg"},"available_languages":[{"code":"en","name":"English"},{"code":"asr-en","name":"English (auto-generated)"}]}}}}}},"401":{"description":"Unauthorized - invalid Authorization format or API key","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"}}},"headers":{"WWW-Authenticate":{"description":"Authentication scheme for this endpoint","schema":{"type":"string","example":"Bearer"}}}},"402":{"description":"Payment Required - inactive plan or exhausted credits","content":{"application/json":{"schema":{"$defs":{"PaymentActionDetail":{"properties":{"message":{"description":"User-friendly explanation of why payment is required","title":"Message","type":"string"},"reason":{"description":"Machine-readable reason for the payment requirement","enum":["insufficient_credits","no_active_paid_plan"],"title":"Reason","type":"string"},"action_label":{"description":"Short label for the recommended action CTA","title":"Action Label","type":"string"},"action_url":{"description":"URL to take the recommended action (top-up or pricing)","title":"Action Url","type":"string"}},"required":["message","reason","action_label","action_url"],"title":"PaymentActionDetail","type":"object"}},"properties":{"detail":{"$ref":"#/components/schemas/PaymentActionDetail"}},"required":["detail"],"title":"PaymentRequiredResponse","type":"object"},"examples":{"topup":{"summary":"Active paid plan but credits exhausted","value":{"detail":{"message":"You have an active plan, but you've run out of credits.","reason":"insufficient_credits","action_label":"Top up credits","action_url":"https://transcriptapi.com/top-up"}}},"billing":{"summary":"No active paid plan","value":{"detail":{"message":"You don't have an active paid plan yet.","reason":"no_active_paid_plan","action_label":"Go to billing to choose a plan","action_url":"https://transcriptapi.com/billing"}}}}}}},"404":{"description":"**Not Found** - Video doesn't exist or has no caption tracks. **Do not retry.**","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"no_captions":{"summary":"Video has no caption tracks","value":{"detail":"No transcript available for video ABC123XYZ"}}}}}},"408":{"description":"**Request Timeout / Retry** - Temporary failure (bot detection, network issues). **Safe to retry** after a short delay (1-5 seconds).","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"retry":{"summary":"Temporary failure - retry recommended","value":{"detail":"Request failed, please retry"}}}}}},"422":{"description":"**Validation Error** - Invalid input format. **Do not retry** with the same input.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"}}}},"429":{"description":"**Too Many Requests** - Rate limit exceeded. **Retry after** the delay in `Retry-After` header.","headers":{"Retry-After":{"description":"Seconds until the limit resets","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Total allowed requests in the window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the window","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"UTC epoch seconds when the window resets","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"}}}},"500":{"description":"**Internal Server Error** - Unexpected error. May retry, but if persistent, contact support.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"server_error":{"summary":"Unexpected server error","value":{"detail":"Internal server error"}}}}}},"503":{"description":"**Service Unavailable** - Service temporarily down or initializing. **Retry** after a short delay.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"unavailable":{"summary":"Service temporarily unavailable","value":{"detail":"Service not initialized"}}}}}}}}},"/api/v2/youtube/search":{"get":{"tags":["YouTube search"],"summary":"Search YouTube videos or channels","description":"Search YouTube for videos or channels.\n\n- `type=video` (default): Returns video results with titles, thumbnails, view counts, etc.\n- `type=channel`: Returns channel results with handles, subscriber counts, etc.\n\nReturns YouTube's full page (~20 items) per call.\n\n**Pagination:** The response includes `continuation_token` (when `has_more=true`). To fetch the next page, call the endpoint again with `continuation=<token>` and omit `q`/`type` (the token already encodes them).\n\n**Credit cost:** 1 credit per successful request (each page).","operationId":"search_api_v2_youtube_search_get","security":[{"bearerAuth":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":200},{"type":"null"}],"description":"Search query (required for first page)","title":"Q"},"description":"Search query (required for first page)"},{"name":"type","in":"query","required":false,"schema":{"$ref":"#/components/schemas/SearchType","description":"Result type: video or channel","default":"video"},"description":"Result type: video or channel"},{"name":"continuation","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"description":"Continuation token from previous page. When provided, q/type are ignored.","title":"Continuation"},"description":"Continuation token from previous page. When provided, q/type are ignored."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"400":{"description":"**Bad Request** - Invalid parameter combination. Provide either `q` or `continuation`, not both.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"missing":{"summary":"No parameter provided","value":{"detail":"Either 'q' or 'continuation' is required"}},"both":{"summary":"Both parameters provided","value":{"detail":"Provide either 'q' or 'continuation', not both"}}}}}},"401":{"description":"Unauthorized - invalid Authorization format or API key","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"}}},"headers":{"WWW-Authenticate":{"description":"Authentication scheme for this endpoint","schema":{"type":"string","example":"Bearer"}}}},"402":{"description":"Payment Required - inactive plan or exhausted credits","content":{"application/json":{"schema":{"$defs":{"PaymentActionDetail":{"properties":{"message":{"description":"User-friendly explanation of why payment is required","title":"Message","type":"string"},"reason":{"description":"Machine-readable reason for the payment requirement","enum":["insufficient_credits","no_active_paid_plan"],"title":"Reason","type":"string"},"action_label":{"description":"Short label for the recommended action CTA","title":"Action Label","type":"string"},"action_url":{"description":"URL to take the recommended action (top-up or pricing)","title":"Action Url","type":"string"}},"required":["message","reason","action_label","action_url"],"title":"PaymentActionDetail","type":"object"}},"properties":{"detail":{"$ref":"#/components/schemas/PaymentActionDetail"}},"required":["detail"],"title":"PaymentRequiredResponse","type":"object"},"examples":{"topup":{"summary":"Active paid plan but credits exhausted","value":{"detail":{"message":"You have an active plan, but you've run out of credits.","reason":"insufficient_credits","action_label":"Top up credits","action_url":"https://transcriptapi.com/top-up"}}},"billing":{"summary":"No active paid plan","value":{"detail":{"message":"You don't have an active paid plan yet.","reason":"no_active_paid_plan","action_label":"Go to billing to choose a plan","action_url":"https://transcriptapi.com/billing"}}}}}}},"408":{"description":"**Request Timeout / Retry** - Temporary failure (bot detection, network issues). **Safe to retry** after a short delay (1-5 seconds).","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"retry":{"summary":"Temporary failure - retry recommended","value":{"detail":"Request failed, please retry"}}}}}},"422":{"description":"**Validation Error** - Invalid input format. **Do not retry** with the same input.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"}}}},"429":{"description":"**Too Many Requests** - Rate limit exceeded. **Retry after** the delay in `Retry-After` header.","headers":{"Retry-After":{"description":"Seconds until the limit resets","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Total allowed requests in the window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the window","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"UTC epoch seconds when the window resets","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"}}}},"500":{"description":"**Internal Server Error** - Unexpected error. May retry, but if persistent, contact support.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"server_error":{"summary":"Unexpected server error","value":{"detail":"Internal server error"}}}}}},"503":{"description":"**Service Unavailable** - Service temporarily down or initializing. **Retry** after a short delay.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"unavailable":{"summary":"Service temporarily unavailable","value":{"detail":"Service not initialized"}}}}}}}}},"/api/v2/youtube/channel/resolve":{"get":{"tags":["YouTube channel"],"summary":"Resolve channel reference to UC... ID","description":"Resolve any channel reference (@handle, URL, or UC... ID) to a canonical UC... channel ID.\n\n**Credit cost:** FREE (requires auth + at least 1 active credit, but does not charge).","operationId":"resolve_channel_api_v2_youtube_channel_resolve_get","security":[{"bearerAuth":[]}],"parameters":[{"name":"input","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"description":"@handle, channel URL, or UC... ID","title":"Input"},"description":"@handle, channel URL, or UC... ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelResolveResponse"}}}},"400":{"description":"**Bad Request** - Missing or invalid parameters. **Do not retry** with the same input.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"}}}},"401":{"description":"Unauthorized - invalid Authorization format or API key","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"}}},"headers":{"WWW-Authenticate":{"description":"Authentication scheme for this endpoint","schema":{"type":"string","example":"Bearer"}}}},"402":{"description":"Payment Required - inactive plan or exhausted credits","content":{"application/json":{"schema":{"$defs":{"PaymentActionDetail":{"properties":{"message":{"description":"User-friendly explanation of why payment is required","title":"Message","type":"string"},"reason":{"description":"Machine-readable reason for the payment requirement","enum":["insufficient_credits","no_active_paid_plan"],"title":"Reason","type":"string"},"action_label":{"description":"Short label for the recommended action CTA","title":"Action Label","type":"string"},"action_url":{"description":"URL to take the recommended action (top-up or pricing)","title":"Action Url","type":"string"}},"required":["message","reason","action_label","action_url"],"title":"PaymentActionDetail","type":"object"}},"properties":{"detail":{"$ref":"#/components/schemas/PaymentActionDetail"}},"required":["detail"],"title":"PaymentRequiredResponse","type":"object"},"examples":{"topup":{"summary":"Active paid plan but credits exhausted","value":{"detail":{"message":"You have an active plan, but you've run out of credits.","reason":"insufficient_credits","action_label":"Top up credits","action_url":"https://transcriptapi.com/top-up"}}},"billing":{"summary":"No active paid plan","value":{"detail":{"message":"You don't have an active paid plan yet.","reason":"no_active_paid_plan","action_label":"Go to billing to choose a plan","action_url":"https://transcriptapi.com/billing"}}}}}}},"404":{"description":"**Not Found** - Channel does not exist. **Do not retry.**","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"not_found":{"summary":"Channel not found","value":{"detail":"Channel not found"}}}}}},"408":{"description":"**Request Timeout / Retry** - Temporary failure (bot detection, network issues). **Safe to retry** after a short delay (1-5 seconds).","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"retry":{"summary":"Temporary failure - retry recommended","value":{"detail":"Request failed, please retry"}}}}}},"429":{"description":"**Too Many Requests** - Rate limit exceeded. **Retry after** the delay in `Retry-After` header.","headers":{"Retry-After":{"description":"Seconds until the limit resets","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Total allowed requests in the window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the window","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"UTC epoch seconds when the window resets","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"}}}},"500":{"description":"**Internal Server Error** - Unexpected error. May retry, but if persistent, contact support.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"server_error":{"summary":"Unexpected server error","value":{"detail":"Internal server error"}}}}}},"503":{"description":"**Service Unavailable** - Service temporarily down or initializing. **Retry** after a short delay.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"unavailable":{"summary":"Service temporarily unavailable","value":{"detail":"Service not initialized"}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/youtube/channel/search":{"get":{"tags":["YouTube channel"],"summary":"Search videos within a channel","description":"Search for videos within a specific channel.\n\nFirst page: pass `channel` (@handle, URL, or UC... ID) + `q`.\nSubsequent pages: pass `continuation` token from previous response (omit `channel`/`q`).\n\nReturns YouTube's full page (~30 items) per call.\n\n**Pagination:** The response includes `continuation_token` (when `has_more=true`).\n\n**Credit cost:** 1 credit per page.","operationId":"channel_search_api_v2_youtube_channel_search_get","security":[{"bearerAuth":[]}],"parameters":[{"name":"channel","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Channel identifier: @handle, channel URL, or UC... channel ID","title":"Channel"},"description":"Channel identifier: @handle, channel URL, or UC... channel ID"},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":200},{"type":"null"}],"description":"Search query (required for first page)","title":"Q"},"description":"Search query (required for first page)"},{"name":"continuation","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"description":"Continuation token from previous page. When provided, channel/q are ignored.","title":"Continuation"},"description":"Continuation token from previous page. When provided, channel/q are ignored."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelSearchResponse"}}}},"400":{"description":"**Bad Request** - Invalid parameter combination. Provide either (`channel` + `q`) or `continuation`, not both.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"missing":{"summary":"No parameter provided","value":{"detail":"Either 'channel'+'q' or 'continuation' is required"}},"both":{"summary":"Both parameters provided","value":{"detail":"Provide either 'channel'+'q' or 'continuation', not both"}}}}}},"401":{"description":"Unauthorized - invalid Authorization format or API key","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"}}},"headers":{"WWW-Authenticate":{"description":"Authentication scheme for this endpoint","schema":{"type":"string","example":"Bearer"}}}},"402":{"description":"Payment Required - inactive plan or exhausted credits","content":{"application/json":{"schema":{"$defs":{"PaymentActionDetail":{"properties":{"message":{"description":"User-friendly explanation of why payment is required","title":"Message","type":"string"},"reason":{"description":"Machine-readable reason for the payment requirement","enum":["insufficient_credits","no_active_paid_plan"],"title":"Reason","type":"string"},"action_label":{"description":"Short label for the recommended action CTA","title":"Action Label","type":"string"},"action_url":{"description":"URL to take the recommended action (top-up or pricing)","title":"Action Url","type":"string"}},"required":["message","reason","action_label","action_url"],"title":"PaymentActionDetail","type":"object"}},"properties":{"detail":{"$ref":"#/components/schemas/PaymentActionDetail"}},"required":["detail"],"title":"PaymentRequiredResponse","type":"object"},"examples":{"topup":{"summary":"Active paid plan but credits exhausted","value":{"detail":{"message":"You have an active plan, but you've run out of credits.","reason":"insufficient_credits","action_label":"Top up credits","action_url":"https://transcriptapi.com/top-up"}}},"billing":{"summary":"No active paid plan","value":{"detail":{"message":"You don't have an active paid plan yet.","reason":"no_active_paid_plan","action_label":"Go to billing to choose a plan","action_url":"https://transcriptapi.com/billing"}}}}}}},"404":{"description":"**Not Found** - Channel does not exist. **Do not retry.**","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"not_found":{"summary":"Channel not found","value":{"detail":"Channel not found"}}}}}},"408":{"description":"**Request Timeout / Retry** - Temporary failure (bot detection, network issues). **Safe to retry** after a short delay (1-5 seconds).","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"retry":{"summary":"Temporary failure - retry recommended","value":{"detail":"Request failed, please retry"}}}}}},"429":{"description":"**Too Many Requests** - Rate limit exceeded. **Retry after** the delay in `Retry-After` header.","headers":{"Retry-After":{"description":"Seconds until the limit resets","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Total allowed requests in the window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the window","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"UTC epoch seconds when the window resets","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"}}}},"500":{"description":"**Internal Server Error** - Unexpected error. May retry, but if persistent, contact support.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"server_error":{"summary":"Unexpected server error","value":{"detail":"Internal server error"}}}}}},"503":{"description":"**Service Unavailable** - Service temporarily down or initializing. **Retry** after a short delay.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"unavailable":{"summary":"Service temporarily unavailable","value":{"detail":"Service not initialized"}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/youtube/channel/videos":{"get":{"tags":["YouTube channel"],"summary":"Paginated channel uploads","description":"List all videos uploaded to a channel (paginated, ~100 per page).\n\nFirst request: provide `channel` (@handle, URL, or UC... ID). Subsequent requests: provide `continuation` token from previous response.\n\n**Credit cost:** 1 credit per page.","operationId":"channel_videos_api_v2_youtube_channel_videos_get","security":[{"bearerAuth":[]}],"parameters":[{"name":"channel","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Channel identifier: @handle, channel URL, or UC... channel ID","title":"Channel"},"description":"Channel identifier: @handle, channel URL, or UC... channel ID"},{"name":"continuation","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"description":"Continuation token from previous page","title":"Continuation"},"description":"Continuation token from previous page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelVideosResponse"}}}},"400":{"description":"**Bad Request** - Invalid parameter combination. Provide either `channel` or `continuation`, not both.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"missing":{"summary":"No parameter provided","value":{"detail":"Either 'channel' or 'continuation' is required"}},"both":{"summary":"Both parameters provided","value":{"detail":"Provide either 'channel'/'channel_id' or 'continuation', not both"}}}}}},"401":{"description":"Unauthorized - invalid Authorization format or API key","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"}}},"headers":{"WWW-Authenticate":{"description":"Authentication scheme for this endpoint","schema":{"type":"string","example":"Bearer"}}}},"402":{"description":"Payment Required - inactive plan or exhausted credits","content":{"application/json":{"schema":{"$defs":{"PaymentActionDetail":{"properties":{"message":{"description":"User-friendly explanation of why payment is required","title":"Message","type":"string"},"reason":{"description":"Machine-readable reason for the payment requirement","enum":["insufficient_credits","no_active_paid_plan"],"title":"Reason","type":"string"},"action_label":{"description":"Short label for the recommended action CTA","title":"Action Label","type":"string"},"action_url":{"description":"URL to take the recommended action (top-up or pricing)","title":"Action Url","type":"string"}},"required":["message","reason","action_label","action_url"],"title":"PaymentActionDetail","type":"object"}},"properties":{"detail":{"$ref":"#/components/schemas/PaymentActionDetail"}},"required":["detail"],"title":"PaymentRequiredResponse","type":"object"},"examples":{"topup":{"summary":"Active paid plan but credits exhausted","value":{"detail":{"message":"You have an active plan, but you've run out of credits.","reason":"insufficient_credits","action_label":"Top up credits","action_url":"https://transcriptapi.com/top-up"}}},"billing":{"summary":"No active paid plan","value":{"detail":{"message":"You don't have an active paid plan yet.","reason":"no_active_paid_plan","action_label":"Go to billing to choose a plan","action_url":"https://transcriptapi.com/billing"}}}}}}},"404":{"description":"**Not Found** - Channel does not exist. **Do not retry.**","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"not_found":{"summary":"Channel not found","value":{"detail":"Channel not found"}}}}}},"408":{"description":"**Request Timeout / Retry** - Temporary failure (bot detection, network issues). **Safe to retry** after a short delay (1-5 seconds).","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"retry":{"summary":"Temporary failure - retry recommended","value":{"detail":"Request failed, please retry"}}}}}},"429":{"description":"**Too Many Requests** - Rate limit exceeded. **Retry after** the delay in `Retry-After` header.","headers":{"Retry-After":{"description":"Seconds until the limit resets","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Total allowed requests in the window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the window","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"UTC epoch seconds when the window resets","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"}}}},"500":{"description":"**Internal Server Error** - Unexpected error. May retry, but if persistent, contact support.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"server_error":{"summary":"Unexpected server error","value":{"detail":"Internal server error"}}}}}},"503":{"description":"**Service Unavailable** - Service temporarily down or initializing. **Retry** after a short delay.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"unavailable":{"summary":"Service temporarily unavailable","value":{"detail":"Service not initialized"}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/youtube/channel/latest":{"get":{"tags":["YouTube channel"],"summary":"Latest 15 videos via RSS","description":"Get the latest 15 videos from a channel via YouTube RSS feed.\n\nUse the `channel` parameter with an @handle, channel URL, or UC... channel ID.\n\nReturns exact publish timestamps and view counts.\n\n**Credit cost:** FREE (requires auth + at least 1 active credit, but does not charge).","operationId":"channel_latest_api_v2_youtube_channel_latest_get","security":[{"bearerAuth":[]}],"parameters":[{"name":"channel","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Channel identifier: @handle, channel URL, or UC... channel ID","title":"Channel"},"description":"Channel identifier: @handle, channel URL, or UC... channel ID"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelLatestResponse"}}}},"401":{"description":"Unauthorized - invalid Authorization format or API key","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"}}},"headers":{"WWW-Authenticate":{"description":"Authentication scheme for this endpoint","schema":{"type":"string","example":"Bearer"}}}},"402":{"description":"Payment Required - inactive plan or exhausted credits","content":{"application/json":{"schema":{"$defs":{"PaymentActionDetail":{"properties":{"message":{"description":"User-friendly explanation of why payment is required","title":"Message","type":"string"},"reason":{"description":"Machine-readable reason for the payment requirement","enum":["insufficient_credits","no_active_paid_plan"],"title":"Reason","type":"string"},"action_label":{"description":"Short label for the recommended action CTA","title":"Action Label","type":"string"},"action_url":{"description":"URL to take the recommended action (top-up or pricing)","title":"Action Url","type":"string"}},"required":["message","reason","action_label","action_url"],"title":"PaymentActionDetail","type":"object"}},"properties":{"detail":{"$ref":"#/components/schemas/PaymentActionDetail"}},"required":["detail"],"title":"PaymentRequiredResponse","type":"object"},"examples":{"topup":{"summary":"Active paid plan but credits exhausted","value":{"detail":{"message":"You have an active plan, but you've run out of credits.","reason":"insufficient_credits","action_label":"Top up credits","action_url":"https://transcriptapi.com/top-up"}}},"billing":{"summary":"No active paid plan","value":{"detail":{"message":"You don't have an active paid plan yet.","reason":"no_active_paid_plan","action_label":"Go to billing to choose a plan","action_url":"https://transcriptapi.com/billing"}}}}}}},"404":{"description":"**Not Found** - Channel does not exist. **Do not retry.**","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"not_found":{"summary":"Channel not found","value":{"detail":"Channel not found"}}}}}},"408":{"description":"**Request Timeout / Retry** - Temporary failure (bot detection, network issues). **Safe to retry** after a short delay (1-5 seconds).","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"retry":{"summary":"Temporary failure - retry recommended","value":{"detail":"Request failed, please retry"}}}}}},"429":{"description":"**Too Many Requests** - Rate limit exceeded. **Retry after** the delay in `Retry-After` header.","headers":{"Retry-After":{"description":"Seconds until the limit resets","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Total allowed requests in the window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the window","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"UTC epoch seconds when the window resets","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"}}}},"500":{"description":"**Internal Server Error** - Unexpected error. May retry, but if persistent, contact support.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"server_error":{"summary":"Unexpected server error","value":{"detail":"Internal server error"}}}}}},"503":{"description":"**Service Unavailable** - Service temporarily down or initializing. **Retry** after a short delay.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"unavailable":{"summary":"Service temporarily unavailable","value":{"detail":"Service not initialized"}}}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/youtube/playlist/videos":{"get":{"tags":["YouTube playlist"],"summary":"Paginated playlist videos","description":"List videos in a playlist (paginated, ~100 per page).\n\nFirst request: provide `playlist` (YouTube playlist URL or playlist ID). Subsequent requests: provide `continuation` token.\n\n**Credit cost:** 1 credit per page.","operationId":"playlist_videos_api_v2_youtube_playlist_videos_get","security":[{"bearerAuth":[]}],"parameters":[{"name":"playlist","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Playlist identifier: YouTube playlist URL or playlist ID (PL..., UU..., etc.)","title":"Playlist"},"description":"Playlist identifier: YouTube playlist URL or playlist ID (PL..., UU..., etc.)"},{"name":"continuation","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"description":"Continuation token from previous page","title":"Continuation"},"description":"Continuation token from previous page"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlaylistVideosResponse"}}}},"400":{"description":"**Bad Request** - Invalid parameter combination. Provide either `playlist` or `continuation`, not both.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"missing":{"summary":"No parameter provided","value":{"detail":"Either 'playlist' or 'continuation' is required"}},"both":{"summary":"Both parameters provided","value":{"detail":"Provide either 'playlist'/'playlist_id' or 'continuation', not both"}}}}}},"401":{"description":"Unauthorized - invalid Authorization format or API key","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"}}},"headers":{"WWW-Authenticate":{"description":"Authentication scheme for this endpoint","schema":{"type":"string","example":"Bearer"}}}},"402":{"description":"Payment Required - inactive plan or exhausted credits","content":{"application/json":{"schema":{"$defs":{"PaymentActionDetail":{"properties":{"message":{"description":"User-friendly explanation of why payment is required","title":"Message","type":"string"},"reason":{"description":"Machine-readable reason for the payment requirement","enum":["insufficient_credits","no_active_paid_plan"],"title":"Reason","type":"string"},"action_label":{"description":"Short label for the recommended action CTA","title":"Action Label","type":"string"},"action_url":{"description":"URL to take the recommended action (top-up or pricing)","title":"Action Url","type":"string"}},"required":["message","reason","action_label","action_url"],"title":"PaymentActionDetail","type":"object"}},"properties":{"detail":{"$ref":"#/components/schemas/PaymentActionDetail"}},"required":["detail"],"title":"PaymentRequiredResponse","type":"object"},"examples":{"topup":{"summary":"Active paid plan but credits exhausted","value":{"detail":{"message":"You have an active plan, but you've run out of credits.","reason":"insufficient_credits","action_label":"Top up credits","action_url":"https://transcriptapi.com/top-up"}}},"billing":{"summary":"No active paid plan","value":{"detail":{"message":"You don't have an active paid plan yet.","reason":"no_active_paid_plan","action_label":"Go to billing to choose a plan","action_url":"https://transcriptapi.com/billing"}}}}}}},"404":{"description":"**Not Found** - Playlist does not exist. **Do not retry.**","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"not_found":{"summary":"Playlist not found","value":{"detail":"Playlist not found"}}}}}},"408":{"description":"**Request Timeout / Retry** - Temporary failure (bot detection, network issues). **Safe to retry** after a short delay (1-5 seconds).","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"retry":{"summary":"Temporary failure - retry recommended","value":{"detail":"Request failed, please retry"}}}}}},"422":{"description":"**Validation Error** - Invalid playlist identifier. Must be a playlist URL or ID starting with `PL`, `UU`, `LL`, `FL`, or `OL`. **Do not retry** with the same input.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"invalid_playlist_id":{"summary":"Invalid playlist identifier","value":{"detail":"Invalid playlist identifier"}}}}}},"429":{"description":"**Too Many Requests** - Rate limit exceeded. **Retry after** the delay in `Retry-After` header.","headers":{"Retry-After":{"description":"Seconds until the limit resets","schema":{"type":"integer"}},"X-RateLimit-Limit":{"description":"Total allowed requests in the window","schema":{"type":"integer"}},"X-RateLimit-Remaining":{"description":"Remaining requests in the window","schema":{"type":"integer"}},"X-RateLimit-Reset":{"description":"UTC epoch seconds when the window resets","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"}}}},"500":{"description":"**Internal Server Error** - Unexpected error. May retry, but if persistent, contact support.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"server_error":{"summary":"Unexpected server error","value":{"detail":"Internal server error"}}}}}},"503":{"description":"**Service Unavailable** - Service temporarily down or initializing. **Retry** after a short delay.","content":{"application/json":{"schema":{"properties":{"detail":{"description":"Human-readable error message","title":"Detail","type":"string"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional machine-readable error code","title":"Code"}},"required":["detail"],"title":"ErrorResponse","type":"object"},"examples":{"unavailable":{"summary":"Service temporarily unavailable","value":{"detail":"Service not initialized"}}}}}}}}}},"components":{"schemas":{"APITranscriptResponseV2":{"properties":{"video_id":{"type":"string","title":"Video Id","description":"YouTube video ID"},"language":{"type":"string","title":"Language","description":"Language of the returned transcript"},"transcript":{"anyOf":[{"items":{"$ref":"#/components/schemas/TranscriptSegment"},"type":"array"},{"items":{"$ref":"#/components/schemas/TranscriptSegmentTextOnly"},"type":"array"},{"type":"string"}],"title":"Transcript"},"metadata":{"anyOf":[{"$ref":"#/components/schemas/app__api__v2__youtube__schemas__Metadata"},{"type":"null"}]}},"type":"object","required":["video_id","language","transcript"],"title":"APITranscriptResponseV2","description":"Public API response for v2 with a simplified contract.\n\n- When format=json, `transcript` is a list of segments (with or without timestamps).\n- When format=text, `transcript` is a plain string (with or without timestamps).\n- `metadata` is returned only when requested via send_metadata=true."},"AvailableLanguage":{"properties":{"code":{"type":"string","title":"Code","description":"Normalized language code, or 'asr' for auto-generated"},"name":{"type":"string","title":"Name","description":"Human-readable language name"}},"type":"object","required":["code","name"],"title":"AvailableLanguage","description":"A language available for a video (PRD §5.2).\n\n`code` is a normalized base code (`en`, `de`, `zh`) or the reserved `asr`\npseudo-code for auto-generated captions."},"ChannelLatestResponse":{"properties":{"channel":{"anyOf":[{"$ref":"#/components/schemas/RssChannelInfo"},{"type":"null"}]},"results":{"items":{"$ref":"#/components/schemas/RssVideoResult"},"type":"array","title":"Results"},"result_count":{"type":"integer","title":"Result Count","default":0}},"type":"object","title":"ChannelLatestResponse"},"ChannelResolveResponse":{"properties":{"channel_id":{"type":"string","title":"Channel Id"},"resolved_from":{"type":"string","title":"Resolved From"}},"type":"object","required":["channel_id","resolved_from"],"title":"ChannelResolveResponse"},"ChannelResult":{"properties":{"type":{"type":"string","title":"Type","default":"channel"},"channelId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channelid"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handle"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"subscriberCount":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscribercount"},"verified":{"type":"boolean","title":"Verified","default":false},"rssUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rssurl"},"thumbnails":{"items":{"$ref":"#/components/schemas/Thumbnail"},"type":"array","title":"Thumbnails"}},"type":"object","title":"ChannelResult"},"ChannelSearchResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/VideoResult"},"type":"array","title":"Results"},"result_count":{"type":"integer","title":"Result Count","default":0},"continuation_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Continuation Token"},"has_more":{"type":"boolean","title":"Has More","default":false}},"type":"object","title":"ChannelSearchResponse"},"ChannelVideosResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/PlaylistVideoResult"},"type":"array","title":"Results"},"playlist_info":{"anyOf":[{"$ref":"#/components/schemas/PlaylistInfo"},{"type":"null"}]},"continuation_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Continuation Token"},"has_more":{"type":"boolean","title":"Has More","default":false}},"type":"object","title":"ChannelVideosResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"PlaylistInfo":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"numVideos":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Numvideos"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"ownerName":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ownername"},"viewCount":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Viewcount"}},"type":"object","title":"PlaylistInfo"},"PlaylistVideoResult":{"properties":{"videoId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Videoid"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"channelId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channelid"},"channelTitle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channeltitle"},"channelHandle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channelhandle"},"lengthText":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lengthtext"},"viewCountText":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Viewcounttext"},"thumbnails":{"items":{"$ref":"#/components/schemas/Thumbnail"},"type":"array","title":"Thumbnails"},"index":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Index"}},"type":"object","title":"PlaylistVideoResult"},"PlaylistVideosResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/PlaylistVideoResult"},"type":"array","title":"Results"},"playlist_info":{"anyOf":[{"$ref":"#/components/schemas/PlaylistInfo"},{"type":"null"}]},"continuation_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Continuation Token"},"has_more":{"type":"boolean","title":"Has More","default":false}},"type":"object","title":"PlaylistVideosResponse"},"RssChannelInfo":{"properties":{"channelId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channelid"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"author":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"published":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published"}},"type":"object","title":"RssChannelInfo"},"RssStarRating":{"properties":{"average":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Average"},"count":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Count"},"min":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Min"},"max":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Max"}},"type":"object","title":"RssStarRating"},"RssThumbnail":{"properties":{"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"width":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Height"}},"type":"object","title":"RssThumbnail"},"RssVideoResult":{"properties":{"videoId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Videoid"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"channelId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channelid"},"author":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author"},"published":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Published"},"updated":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Updated"},"link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Link"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"thumbnail":{"anyOf":[{"$ref":"#/components/schemas/RssThumbnail"},{"type":"null"}]},"viewCount":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Viewcount"},"starRating":{"anyOf":[{"$ref":"#/components/schemas/RssStarRating"},{"type":"null"}]}},"type":"object","title":"RssVideoResult"},"SearchResponse":{"properties":{"results":{"items":{"anyOf":[{"$ref":"#/components/schemas/VideoResult"},{"$ref":"#/components/schemas/ChannelResult"}]},"type":"array","title":"Results"},"result_count":{"type":"integer","title":"Result Count","default":0},"continuation_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Continuation Token"},"has_more":{"type":"boolean","title":"Has More","default":false}},"type":"object","title":"SearchResponse"},"SearchType":{"type":"string","enum":["video","channel"],"title":"SearchType"},"Thumbnail":{"properties":{"url":{"type":"string","title":"Url"},"width":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Width"},"height":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Height"}},"type":"object","required":["url"],"title":"Thumbnail"},"TranscriptFormatV2":{"type":"string","enum":["json","text"],"title":"TranscriptFormatV2","description":"Available transcript formats for v2 (restricted)."},"TranscriptSegment":{"properties":{"text":{"type":"string","title":"Text"},"start":{"type":"number","title":"Start"},"duration":{"type":"number","title":"Duration"}},"type":"object","required":["text","start","duration"],"title":"TranscriptSegment"},"TranscriptSegmentTextOnly":{"properties":{"text":{"type":"string","title":"Text"}},"type":"object","required":["text"],"title":"TranscriptSegmentTextOnly","description":"Transcript segment without timestamp information."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VideoInfoResponse":{"properties":{"video_id":{"type":"string","title":"Video Id","description":"YouTube video ID"},"metadata":{"anyOf":[{"$ref":"#/components/schemas/app__api__v2__youtube__schemas__Metadata"},{"type":"null"}]},"available_languages":{"items":{"$ref":"#/components/schemas/AvailableLanguage"},"type":"array","title":"Available Languages","description":"Available transcript languages (includes 'asr' if auto-generated captions exist)"}},"type":"object","required":["video_id"],"title":"VideoInfoResponse","description":"Response for `GET /info` — metadata + available languages (non-billable)."},"VideoResult":{"properties":{"type":{"type":"string","title":"Type","default":"video"},"videoId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Videoid"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"channelId":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channelid"},"channelTitle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channeltitle"},"channelHandle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channelhandle"},"channelVerified":{"type":"boolean","title":"Channelverified","default":false},"lengthText":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lengthtext"},"viewCountText":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Viewcounttext"},"publishedTimeText":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Publishedtimetext"},"hasCaptions":{"type":"boolean","title":"Hascaptions","default":false},"thumbnails":{"items":{"$ref":"#/components/schemas/Thumbnail"},"type":"array","title":"Thumbnails"}},"type":"object","title":"VideoResult"},"app__api__v2__youtube__schemas__Metadata":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"author_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Name"},"author_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author Url"},"thumbnail_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumbnail Url"}},"type":"object","title":"Metadata"},"PaymentActionDetail":{"properties":{"message":{"description":"User-friendly explanation of why payment is required","title":"Message","type":"string"},"reason":{"description":"Machine-readable reason for the payment requirement","enum":["insufficient_credits","no_active_paid_plan"],"title":"Reason","type":"string"},"action_label":{"description":"Short label for the recommended action CTA","title":"Action Label","type":"string"},"action_url":{"description":"URL to take the recommended action (top-up or pricing)","title":"Action Url","type":"string"}},"required":["message","reason","action_label","action_url"],"title":"PaymentActionDetail","type":"object"}},"securitySchemes":{"bearerAuth":{"type":"http","description":"Use Authorization: Bearer {your_api_key}","scheme":"bearer"}}},"servers":[{"url":"https://transcriptapi.com"}],"security":[{"bearerAuth":[]}]}