{"openapi": "3.1.0", "info": {"title": "Subtext API", "description": "Transcripts of YouTube videos as JSON, plain text, Markdown, SRT or WebVTT.\n\nSend your key as `Authorization: Bearer <key>`. One credit buys one transcript: every successful transcript request costs a credit, the same video again included (another language, translation or format too), and errors cost nothing. Clients should ignore fields they do not know.\n\nEvery error has the same JSON shape, `{\"error\": {...}}`. Besides the answers listed for each operation, any address may answer 500 `internal_error` (safe to retry), an unknown address answers 404 `not_found`, and any method other than GET answers 405 `method_not_allowed`. The rate limit and credit headers come with every answer of the three operations once the key is accepted; `not_found`, `method_not_allowed` and CORS preflight answers do not carry them and do not count against the limit.", "version": "1.0.0"}, "servers": [{"url": "https://youtubevideototranscript.com/api"}], "paths": {"/v1/transcript": {"get": {"tags": ["Transcripts"], "summary": "Get a transcript", "description": "Costs 1 credit for every transcript returned, the same video again included.", "operationId": "getTranscript", "security": [{"ApiKey": []}], "parameters": [{"name": "video", "in": "query", "required": true, "schema": {"type": "string", "maxLength": 2048, "description": "An 11-character video id or any YouTube URL.", "title": "Video"}, "description": "An 11-character video id or any YouTube URL."}, {"name": "lang", "in": "query", "required": false, "schema": {"type": "string", "pattern": "^([A-Za-z]{2,3}(-[A-Za-z0-9]{2,8}){0,2})?$", "description": "Caption language code; the video's own by default.", "default": "", "title": "Lang"}, "description": "Caption language code; the video's own by default."}, {"name": "translate", "in": "query", "required": false, "schema": {"type": "string", "pattern": "^([A-Za-z]{2,3}(-[A-Za-z0-9]{2,8}){0,2})?$", "description": "Translate into this language. Best effort: YouTube often refuses.", "default": "", "title": "Translate"}, "description": "Translate into this language. Best effort: YouTube often refuses."}, {"name": "format", "in": "query", "required": false, "schema": {"enum": ["json", "text", "md", "srt", "vtt"], "type": "string", "description": "Shape of the answer: json (default), text, md, srt or vtt.", "default": "json", "title": "Format"}, "description": "Shape of the answer: json (default), text, md, srt or vtt."}, {"name": "timestamps", "in": "query", "required": false, "schema": {"type": "boolean", "description": "With format=text: start each paragraph with [m:ss].", "default": false, "title": "Timestamps"}, "description": "With format=text: start each paragraph with [m:ss]."}], "responses": {"200": {"description": "The transcript: JSON by default, or the body of `format`.", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/TranscriptOut"}}, "text/plain": {}, "text/markdown": {}, "application/x-subrip": {}, "text/vtt": {}}, "headers": {"X-Request-Id": {"description": "Identifier of this request. Quote it when you report a problem.", "schema": {"type": "string"}}, "X-Credits-Charged": {"description": "Credits this request cost: 0 or 1.", "schema": {"type": "integer"}}, "X-Credits-Remaining": {"description": "Credits the account has left.", "schema": {"type": "integer"}}, "X-RateLimit-Limit": {"description": "Requests per minute the account may send.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requests the account may still send right now.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Seconds from now until the limit is whole again.", "schema": {"type": "integer"}}, "RateLimit-Policy": {"description": "The limit as an IETF draft field: `\"default\";q=120;w=60`.", "schema": {"type": "string"}}, "RateLimit": {"description": "What is left of it, same draft: `\"default\";r=119;t=1`.", "schema": {"type": "string"}}}}, "401": {"description": "Missing or invalid API key", "headers": {"X-Request-Id": {"description": "Identifier of this request. Quote it when you report a problem.", "schema": {"type": "string"}}, "WWW-Authenticate": {"description": "Always `Bearer`: how to send the key.", "schema": {"type": "string"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorOut"}}}}, "402": {"description": "Out of credits", "headers": {"X-Request-Id": {"description": "Identifier of this request. Quote it when you report a problem.", "schema": {"type": "string"}}, "X-Credits-Charged": {"description": "Credits this request cost: 0 or 1.", "schema": {"type": "integer"}}, "X-Credits-Remaining": {"description": "Credits the account has left.", "schema": {"type": "integer"}}, "X-RateLimit-Limit": {"description": "Requests per minute the account may send.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requests the account may still send right now.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Seconds from now until the limit is whole again.", "schema": {"type": "integer"}}, "RateLimit-Policy": {"description": "The limit as an IETF draft field: `\"default\";q=120;w=60`.", "schema": {"type": "string"}}, "RateLimit": {"description": "What is left of it, same draft: `\"default\";r=119;t=1`.", "schema": {"type": "string"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorOut"}}}}, "404": {"description": "No such video, captions or language", "headers": {"X-Request-Id": {"description": "Identifier of this request. Quote it when you report a problem.", "schema": {"type": "string"}}, "X-Credits-Charged": {"description": "Credits this request cost: 0 or 1.", "schema": {"type": "integer"}}, "X-Credits-Remaining": {"description": "Credits the account has left.", "schema": {"type": "integer"}}, "X-RateLimit-Limit": {"description": "Requests per minute the account may send.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requests the account may still send right now.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Seconds from now until the limit is whole again.", "schema": {"type": "integer"}}, "RateLimit-Policy": {"description": "The limit as an IETF draft field: `\"default\";q=120;w=60`.", "schema": {"type": "string"}}, "RateLimit": {"description": "What is left of it, same draft: `\"default\";r=119;t=1`.", "schema": {"type": "string"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorOut"}}}}, "422": {"description": "Invalid parameter", "headers": {"X-Request-Id": {"description": "Identifier of this request. Quote it when you report a problem.", "schema": {"type": "string"}}, "X-Credits-Charged": {"description": "Credits this request cost: 0 or 1.", "schema": {"type": "integer"}}, "X-Credits-Remaining": {"description": "Credits the account has left.", "schema": {"type": "integer"}}, "X-RateLimit-Limit": {"description": "Requests per minute the account may send.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requests the account may still send right now.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Seconds from now until the limit is whole again.", "schema": {"type": "integer"}}, "RateLimit-Policy": {"description": "The limit as an IETF draft field: `\"default\";q=120;w=60`.", "schema": {"type": "string"}}, "RateLimit": {"description": "What is left of it, same draft: `\"default\";r=119;t=1`.", "schema": {"type": "string"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorOut"}}}}, "429": {"description": "Rate limit exceeded", "headers": {"X-Request-Id": {"description": "Identifier of this request. Quote it when you report a problem.", "schema": {"type": "string"}}, "X-Credits-Charged": {"description": "Credits this request cost: 0 or 1.", "schema": {"type": "integer"}}, "X-Credits-Remaining": {"description": "Credits the account has left.", "schema": {"type": "integer"}}, "X-RateLimit-Limit": {"description": "Requests per minute the account may send.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requests the account may still send right now.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Seconds from now until the limit is whole again.", "schema": {"type": "integer"}}, "RateLimit-Policy": {"description": "The limit as an IETF draft field: `\"default\";q=120;w=60`.", "schema": {"type": "string"}}, "RateLimit": {"description": "What is left of it, same draft: `\"default\";r=119;t=1`.", "schema": {"type": "string"}}, "Retry-After": {"description": "Seconds to wait before trying again.", "schema": {"type": "integer"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorOut"}}}}, "503": {"description": "YouTube is not answering, or the service is busy", "headers": {"X-Request-Id": {"description": "Identifier of this request. Quote it when you report a problem.", "schema": {"type": "string"}}, "X-Credits-Charged": {"description": "Credits this request cost: 0 or 1.", "schema": {"type": "integer"}}, "X-Credits-Remaining": {"description": "Credits the account has left.", "schema": {"type": "integer"}}, "X-RateLimit-Limit": {"description": "Requests per minute the account may send.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requests the account may still send right now.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Seconds from now until the limit is whole again.", "schema": {"type": "integer"}}, "RateLimit-Policy": {"description": "The limit as an IETF draft field: `\"default\";q=120;w=60`.", "schema": {"type": "string"}}, "RateLimit": {"description": "What is left of it, same draft: `\"default\";r=119;t=1`.", "schema": {"type": "string"}}, "Retry-After": {"description": "Seconds to wait before trying again.", "schema": {"type": "integer"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorOut"}}}}, "504": {"description": "The transcript took too long", "headers": {"X-Request-Id": {"description": "Identifier of this request. Quote it when you report a problem.", "schema": {"type": "string"}}, "X-Credits-Charged": {"description": "Credits this request cost: 0 or 1.", "schema": {"type": "integer"}}, "X-Credits-Remaining": {"description": "Credits the account has left.", "schema": {"type": "integer"}}, "X-RateLimit-Limit": {"description": "Requests per minute the account may send.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requests the account may still send right now.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Seconds from now until the limit is whole again.", "schema": {"type": "integer"}}, "RateLimit-Policy": {"description": "The limit as an IETF draft field: `\"default\";q=120;w=60`.", "schema": {"type": "string"}}, "RateLimit": {"description": "What is left of it, same draft: `\"default\";r=119;t=1`.", "schema": {"type": "string"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorOut"}}}}}}}, "/v1/languages": {"get": {"tags": ["Transcripts"], "summary": "List the caption languages of a video", "description": "Free. Use it to pick `lang` before asking for a transcript.", "operationId": "listLanguages", "security": [{"ApiKey": []}], "parameters": [{"name": "video", "in": "query", "required": true, "schema": {"type": "string", "maxLength": 2048, "description": "An 11-character video id or any YouTube URL.", "title": "Video"}, "description": "An 11-character video id or any YouTube URL."}], "responses": {"200": {"description": "Successful Response", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LanguagesOut"}}}, "headers": {"X-Request-Id": {"description": "Identifier of this request. Quote it when you report a problem.", "schema": {"type": "string"}}, "X-Credits-Charged": {"description": "Credits this request cost: 0 or 1.", "schema": {"type": "integer"}}, "X-Credits-Remaining": {"description": "Credits the account has left.", "schema": {"type": "integer"}}, "X-RateLimit-Limit": {"description": "Requests per minute the account may send.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requests the account may still send right now.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Seconds from now until the limit is whole again.", "schema": {"type": "integer"}}, "RateLimit-Policy": {"description": "The limit as an IETF draft field: `\"default\";q=120;w=60`.", "schema": {"type": "string"}}, "RateLimit": {"description": "What is left of it, same draft: `\"default\";r=119;t=1`.", "schema": {"type": "string"}}}}, "401": {"description": "Missing or invalid API key", "headers": {"X-Request-Id": {"description": "Identifier of this request. Quote it when you report a problem.", "schema": {"type": "string"}}, "WWW-Authenticate": {"description": "Always `Bearer`: how to send the key.", "schema": {"type": "string"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorOut"}}}}, "404": {"description": "No such video, captions or language", "headers": {"X-Request-Id": {"description": "Identifier of this request. Quote it when you report a problem.", "schema": {"type": "string"}}, "X-Credits-Charged": {"description": "Credits this request cost: 0 or 1.", "schema": {"type": "integer"}}, "X-Credits-Remaining": {"description": "Credits the account has left.", "schema": {"type": "integer"}}, "X-RateLimit-Limit": {"description": "Requests per minute the account may send.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requests the account may still send right now.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Seconds from now until the limit is whole again.", "schema": {"type": "integer"}}, "RateLimit-Policy": {"description": "The limit as an IETF draft field: `\"default\";q=120;w=60`.", "schema": {"type": "string"}}, "RateLimit": {"description": "What is left of it, same draft: `\"default\";r=119;t=1`.", "schema": {"type": "string"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorOut"}}}}, "422": {"description": "Invalid parameter", "headers": {"X-Request-Id": {"description": "Identifier of this request. Quote it when you report a problem.", "schema": {"type": "string"}}, "X-Credits-Charged": {"description": "Credits this request cost: 0 or 1.", "schema": {"type": "integer"}}, "X-Credits-Remaining": {"description": "Credits the account has left.", "schema": {"type": "integer"}}, "X-RateLimit-Limit": {"description": "Requests per minute the account may send.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requests the account may still send right now.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Seconds from now until the limit is whole again.", "schema": {"type": "integer"}}, "RateLimit-Policy": {"description": "The limit as an IETF draft field: `\"default\";q=120;w=60`.", "schema": {"type": "string"}}, "RateLimit": {"description": "What is left of it, same draft: `\"default\";r=119;t=1`.", "schema": {"type": "string"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorOut"}}}}, "429": {"description": "Rate limit exceeded", "headers": {"X-Request-Id": {"description": "Identifier of this request. Quote it when you report a problem.", "schema": {"type": "string"}}, "X-Credits-Charged": {"description": "Credits this request cost: 0 or 1.", "schema": {"type": "integer"}}, "X-Credits-Remaining": {"description": "Credits the account has left.", "schema": {"type": "integer"}}, "X-RateLimit-Limit": {"description": "Requests per minute the account may send.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requests the account may still send right now.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Seconds from now until the limit is whole again.", "schema": {"type": "integer"}}, "RateLimit-Policy": {"description": "The limit as an IETF draft field: `\"default\";q=120;w=60`.", "schema": {"type": "string"}}, "RateLimit": {"description": "What is left of it, same draft: `\"default\";r=119;t=1`.", "schema": {"type": "string"}}, "Retry-After": {"description": "Seconds to wait before trying again.", "schema": {"type": "integer"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorOut"}}}}, "503": {"description": "YouTube is not answering, or the service is busy", "headers": {"X-Request-Id": {"description": "Identifier of this request. Quote it when you report a problem.", "schema": {"type": "string"}}, "X-Credits-Charged": {"description": "Credits this request cost: 0 or 1.", "schema": {"type": "integer"}}, "X-Credits-Remaining": {"description": "Credits the account has left.", "schema": {"type": "integer"}}, "X-RateLimit-Limit": {"description": "Requests per minute the account may send.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requests the account may still send right now.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Seconds from now until the limit is whole again.", "schema": {"type": "integer"}}, "RateLimit-Policy": {"description": "The limit as an IETF draft field: `\"default\";q=120;w=60`.", "schema": {"type": "string"}}, "RateLimit": {"description": "What is left of it, same draft: `\"default\";r=119;t=1`.", "schema": {"type": "string"}}, "Retry-After": {"description": "Seconds to wait before trying again.", "schema": {"type": "integer"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorOut"}}}}, "504": {"description": "The transcript took too long", "headers": {"X-Request-Id": {"description": "Identifier of this request. Quote it when you report a problem.", "schema": {"type": "string"}}, "X-Credits-Charged": {"description": "Credits this request cost: 0 or 1.", "schema": {"type": "integer"}}, "X-Credits-Remaining": {"description": "Credits the account has left.", "schema": {"type": "integer"}}, "X-RateLimit-Limit": {"description": "Requests per minute the account may send.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requests the account may still send right now.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Seconds from now until the limit is whole again.", "schema": {"type": "integer"}}, "RateLimit-Policy": {"description": "The limit as an IETF draft field: `\"default\";q=120;w=60`.", "schema": {"type": "string"}}, "RateLimit": {"description": "What is left of it, same draft: `\"default\";r=119;t=1`.", "schema": {"type": "string"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorOut"}}}}}}}, "/v1/account": {"get": {"tags": ["Account"], "summary": "Credits and limits of the account behind the key", "description": "Free.", "operationId": "getAccount", "responses": {"200": {"description": "Successful Response", "headers": {"X-Request-Id": {"description": "Identifier of this request. Quote it when you report a problem.", "schema": {"type": "string"}}, "X-Credits-Charged": {"description": "Credits this request cost: 0 or 1.", "schema": {"type": "integer"}}, "X-Credits-Remaining": {"description": "Credits the account has left.", "schema": {"type": "integer"}}, "X-RateLimit-Limit": {"description": "Requests per minute the account may send.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requests the account may still send right now.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Seconds from now until the limit is whole again.", "schema": {"type": "integer"}}, "RateLimit-Policy": {"description": "The limit as an IETF draft field: `\"default\";q=120;w=60`.", "schema": {"type": "string"}}, "RateLimit": {"description": "What is left of it, same draft: `\"default\";r=119;t=1`.", "schema": {"type": "string"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AccountOut"}}}}, "401": {"description": "Missing or invalid API key", "headers": {"X-Request-Id": {"description": "Identifier of this request. Quote it when you report a problem.", "schema": {"type": "string"}}, "WWW-Authenticate": {"description": "Always `Bearer`: how to send the key.", "schema": {"type": "string"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorOut"}}}}, "429": {"description": "Rate limit exceeded", "headers": {"X-Request-Id": {"description": "Identifier of this request. Quote it when you report a problem.", "schema": {"type": "string"}}, "X-Credits-Charged": {"description": "Credits this request cost: 0 or 1.", "schema": {"type": "integer"}}, "X-Credits-Remaining": {"description": "Credits the account has left.", "schema": {"type": "integer"}}, "X-RateLimit-Limit": {"description": "Requests per minute the account may send.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requests the account may still send right now.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Seconds from now until the limit is whole again.", "schema": {"type": "integer"}}, "RateLimit-Policy": {"description": "The limit as an IETF draft field: `\"default\";q=120;w=60`.", "schema": {"type": "string"}}, "RateLimit": {"description": "What is left of it, same draft: `\"default\";r=119;t=1`.", "schema": {"type": "string"}}, "Retry-After": {"description": "Seconds to wait before trying again.", "schema": {"type": "integer"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorOut"}}}}, "503": {"description": "YouTube is not answering, or the service is busy", "headers": {"X-Request-Id": {"description": "Identifier of this request. Quote it when you report a problem.", "schema": {"type": "string"}}, "X-Credits-Charged": {"description": "Credits this request cost: 0 or 1.", "schema": {"type": "integer"}}, "X-Credits-Remaining": {"description": "Credits the account has left.", "schema": {"type": "integer"}}, "X-RateLimit-Limit": {"description": "Requests per minute the account may send.", "schema": {"type": "integer"}}, "X-RateLimit-Remaining": {"description": "Requests the account may still send right now.", "schema": {"type": "integer"}}, "X-RateLimit-Reset": {"description": "Seconds from now until the limit is whole again.", "schema": {"type": "integer"}}, "RateLimit-Policy": {"description": "The limit as an IETF draft field: `\"default\";q=120;w=60`.", "schema": {"type": "string"}}, "RateLimit": {"description": "What is left of it, same draft: `\"default\";r=119;t=1`.", "schema": {"type": "string"}}, "Retry-After": {"description": "Seconds to wait before trying again.", "schema": {"type": "integer"}}}, "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ErrorOut"}}}}}, "security": [{"ApiKey": []}]}}}, "components": {"schemas": {"AccountOut": {"properties": {"credits_remaining": {"type": "integer", "title": "Credits Remaining"}, "plan": {"type": "string", "title": "Plan"}, "rate_limit_per_minute": {"type": "integer", "title": "Rate Limit Per Minute"}}, "type": "object", "required": ["credits_remaining", "plan", "rate_limit_per_minute"], "title": "AccountOut"}, "ErrorBody": {"properties": {"code": {"type": "string", "enum": ["missing_api_key", "invalid_api_key", "insufficient_credits", "no_captions", "language_not_available", "video_unavailable", "age_restricted", "translation_not_available", "not_found", "method_not_allowed", "invalid_video", "invalid_parameter", "rate_limited", "internal_error", "source_unavailable", "busy", "timeout"], "title": "Code", "description": "Stable machine-readable code. Branch on this."}, "message": {"type": "string", "title": "Message"}, "status": {"type": "integer", "title": "Status"}, "retryable": {"type": "boolean", "title": "Retryable"}, "docs_url": {"type": "string", "title": "Docs Url"}, "request_id": {"type": "string", "title": "Request Id"}}, "additionalProperties": true, "type": "object", "required": ["code", "message", "status", "retryable", "docs_url", "request_id"], "title": "ErrorBody", "description": "What went wrong. Some codes add fields of their own: `retry_after` (seconds, on 429\nand 503), `param` (on 422), `available_languages` (with `language_not_available`),\n`credits_remaining` and `topup_url` (with `insufficient_credits`)."}, "ErrorOut": {"properties": {"error": {"$ref": "#/components/schemas/ErrorBody"}}, "type": "object", "required": ["error"], "title": "ErrorOut"}, "LanguageOut": {"properties": {"code": {"type": "string", "title": "Code"}, "name": {"type": "string", "title": "Name"}}, "type": "object", "required": ["code", "name"], "title": "LanguageOut"}, "LanguagesOut": {"properties": {"video_id": {"type": "string", "title": "Video Id"}, "title": {"type": "string", "title": "Title"}, "author": {"type": "string", "title": "Author"}, "author_url": {"type": "string", "title": "Author Url"}, "default_language": {"type": "string", "title": "Default Language"}, "languages": {"items": {"$ref": "#/components/schemas/TrackOut"}, "type": "array", "title": "Languages"}, "translation_languages": {"items": {"$ref": "#/components/schemas/LanguageOut"}, "type": "array", "title": "Translation Languages"}}, "type": "object", "required": ["video_id", "title", "author", "author_url", "default_language", "languages", "translation_languages"], "title": "LanguagesOut"}, "SegmentOut": {"properties": {"start": {"type": "number", "title": "Start", "description": "Seconds from the start of the video."}, "duration": {"type": "number", "title": "Duration"}, "text": {"type": "string", "title": "Text"}}, "type": "object", "required": ["start", "duration", "text"], "title": "SegmentOut"}, "TrackOut": {"properties": {"code": {"type": "string", "title": "Code"}, "name": {"type": "string", "title": "Name"}, "auto_generated": {"type": "boolean", "title": "Auto Generated"}, "translatable": {"type": "boolean", "title": "Translatable"}}, "type": "object", "required": ["code", "name", "auto_generated", "translatable"], "title": "TrackOut"}, "TranscriptOut": {"properties": {"video_id": {"type": "string", "title": "Video Id"}, "url": {"type": "string", "title": "Url"}, "title": {"type": "string", "title": "Title"}, "author": {"type": "string", "title": "Author"}, "author_url": {"type": "string", "title": "Author Url"}, "language": {"type": "string", "title": "Language", "description": "Language of the text: the translation target if any."}, "language_name": {"type": "string", "title": "Language Name"}, "source_language": {"type": "string", "title": "Source Language", "description": "Language of the caption track."}, "translated": {"type": "boolean", "title": "Translated"}, "auto_generated": {"type": "boolean", "title": "Auto Generated"}, "duration": {"type": "number", "title": "Duration", "description": "Seconds, the end of the last caption line."}, "segments": {"items": {"$ref": "#/components/schemas/SegmentOut"}, "type": "array", "title": "Segments"}}, "type": "object", "required": ["video_id", "url", "title", "author", "author_url", "language", "language_name", "source_language", "translated", "auto_generated", "duration", "segments"], "title": "TranscriptOut"}}, "securitySchemes": {"ApiKey": {"type": "http", "description": "Your API key: `Authorization: Bearer stx_...`", "scheme": "bearer"}}}}