{
  "openapi": "3.0.1",
  "info": {
    "title": "YouTube Transcript Scraper Pro (Captions + AI Fallback)",
    "description": "Extract YouTube transcripts at scale without burning through your budget. It starts with free captions whenever they're available, then switches to AI only for videos that don't have them. You stay in control of costs, and the output — JSON, SRT, VTT, plain text, or LLM-ready format",
    "version": "2.8",
    "x-build-id": "puCMzuW4Er17E4Ycb"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/codepoetry~youtube-transcript-ai-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-codepoetry-youtube-transcript-ai-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/codepoetry~youtube-transcript-ai-scraper/runs": {
      "post": {
        "operationId": "runs-sync-codepoetry-youtube-transcript-ai-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/codepoetry~youtube-transcript-ai-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-codepoetry-youtube-transcript-ai-scraper",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "required": [
          "startUrls"
        ],
        "properties": {
          "startUrls": {
            "title": "YouTube URLs",
            "type": "array",
            "description": "Paste one or more YouTube URLs — single videos, playlists, or channels. Supports watch URLs, short youtu.be links, and channel URLs.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "maxResults": {
            "title": "Max videos per playlist/channel",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum number of videos to fetch from a playlist or channel. Single video URLs ignore this. Channels return newest videos first. One run transcribes at most 500 videos in total; every video past that is returned as a RUN_VIDEO_LIMIT_REACHED item, never charged, so you can run it again.",
            "default": 10
          },
          "languages": {
            "title": "Caption languages",
            "type": "array",
            "description": "Languages to try, in order of preference. The first match on each video is used. A base code finds a regional track, so \"en\" matches a video whose only English captions are \"en-US\", and \"zh\" matches \"zh-TW\" — you rarely need to be more specific than the language itself. The list is suggestions, not a limit: any code YouTube publishes captions under is accepted, and one that no video carries simply reports LANGUAGE_NOT_FOUND for that video while the rest of the run continues. Note: setting Caption source to Manual Only means auto-generated captions are ignored even if they exist in your requested language.",
            "items": {
              "type": "string",
              "enumSuggestedValues": [
                "af",
                "ak",
                "sq",
                "am",
                "ar",
                "hy",
                "as",
                "ay",
                "az",
                "bn",
                "eu",
                "be",
                "bho",
                "bs",
                "bg",
                "my",
                "ca",
                "ceb",
                "zh",
                "zh-CN",
                "zh-HK",
                "zh-SG",
                "zh-TW",
                "zh-Hans",
                "zh-Hant",
                "co",
                "hr",
                "cs",
                "da",
                "dv",
                "nl",
                "en",
                "en-US",
                "eo",
                "et",
                "ee",
                "fil",
                "fi",
                "fr",
                "gl",
                "lg",
                "ka",
                "de",
                "el",
                "gn",
                "gu",
                "ht",
                "ha",
                "haw",
                "he",
                "hi",
                "hmn",
                "hu",
                "is",
                "ig",
                "id",
                "ga",
                "it",
                "ja",
                "jv",
                "kn",
                "kk",
                "km",
                "rw",
                "ko",
                "kri",
                "ku",
                "ky",
                "lo",
                "la",
                "lv",
                "ln",
                "lt",
                "lb",
                "mk",
                "mg",
                "ms",
                "ml",
                "mt",
                "mi",
                "mr",
                "mn",
                "ne",
                "nso",
                "no",
                "ny",
                "or",
                "om",
                "ps",
                "fa",
                "pl",
                "pt",
                "pa",
                "qu",
                "ro",
                "ru",
                "sm",
                "sa",
                "gd",
                "sr",
                "sn",
                "sd",
                "si",
                "sk",
                "sl",
                "so",
                "st",
                "es",
                "su",
                "sw",
                "sv",
                "tg",
                "ta",
                "tt",
                "te",
                "th",
                "ti",
                "ts",
                "tr",
                "tk",
                "uk",
                "ur",
                "ug",
                "uz",
                "vi",
                "cy",
                "fy",
                "xh",
                "yi",
                "yo",
                "zu",
                "iw",
                "de-DE",
                "es-419",
                "es-ES",
                "pt-BR",
                "pt-PT",
                "fa-IR",
                "en-GB",
                "fr-CA"
              ],
              "enumTitles": [
                "af — Afrikaans",
                "ak — Akan",
                "sq — Albanian",
                "am — Amharic",
                "ar — Arabic",
                "hy — Armenian",
                "as — Assamese",
                "ay — Aymara",
                "az — Azerbaijani",
                "bn — Bangla",
                "eu — Basque",
                "be — Belarusian",
                "bho — Bhojpuri",
                "bs — Bosnian",
                "bg — Bulgarian",
                "my — Burmese",
                "ca — Catalan",
                "ceb — Cebuano",
                "zh — Chinese",
                "zh-CN — Chinese (China)",
                "zh-HK — Chinese (Hong Kong)",
                "zh-SG — Chinese (Singapore)",
                "zh-TW — Chinese (Taiwan)",
                "zh-Hans — Chinese (Simplified)",
                "zh-Hant — Chinese (Traditional)",
                "co — Corsican",
                "hr — Croatian",
                "cs — Czech",
                "da — Danish",
                "dv — Divehi",
                "nl — Dutch",
                "en — English",
                "en-US — English (United States)",
                "eo — Esperanto",
                "et — Estonian",
                "ee — Ewe",
                "fil — Filipino",
                "fi — Finnish",
                "fr — French",
                "gl — Galician",
                "lg — Ganda",
                "ka — Georgian",
                "de — German",
                "el — Greek",
                "gn — Guarani",
                "gu — Gujarati",
                "ht — Haitian Creole",
                "ha — Hausa",
                "haw — Hawaiian",
                "he — Hebrew",
                "hi — Hindi",
                "hmn — Hmong",
                "hu — Hungarian",
                "is — Icelandic",
                "ig — Igbo",
                "id — Indonesian",
                "ga — Irish",
                "it — Italian",
                "ja — Japanese",
                "jv — Javanese",
                "kn — Kannada",
                "kk — Kazakh",
                "km — Khmer",
                "rw — Kinyarwanda",
                "ko — Korean",
                "kri — Krio",
                "ku — Kurdish",
                "ky — Kyrgyz",
                "lo — Lao",
                "la — Latin",
                "lv — Latvian",
                "ln — Lingala",
                "lt — Lithuanian",
                "lb — Luxembourgish",
                "mk — Macedonian",
                "mg — Malagasy",
                "ms — Malay",
                "ml — Malayalam",
                "mt — Maltese",
                "mi — Māori",
                "mr — Marathi",
                "mn — Mongolian",
                "ne — Nepali",
                "nso — Northern Sotho",
                "no — Norwegian",
                "ny — Nyanja",
                "or — Odia",
                "om — Oromo",
                "ps — Pashto",
                "fa — Persian",
                "pl — Polish",
                "pt — Portuguese",
                "pa — Punjabi",
                "qu — Quechua",
                "ro — Romanian",
                "ru — Russian",
                "sm — Samoan",
                "sa — Sanskrit",
                "gd — Scottish Gaelic",
                "sr — Serbian",
                "sn — Shona",
                "sd — Sindhi",
                "si — Sinhala",
                "sk — Slovak",
                "sl — Slovenian",
                "so — Somali",
                "st — Southern Sotho",
                "es — Spanish",
                "su — Sundanese",
                "sw — Swahili",
                "sv — Swedish",
                "tg — Tajik",
                "ta — Tamil",
                "tt — Tatar",
                "te — Telugu",
                "th — Thai",
                "ti — Tigrinya",
                "ts — Tsonga",
                "tr — Turkish",
                "tk — Turkmen",
                "uk — Ukrainian",
                "ur — Urdu",
                "ug — Uyghur",
                "uz — Uzbek",
                "vi — Vietnamese",
                "cy — Welsh",
                "fy — Western Frisian",
                "xh — Xhosa",
                "yi — Yiddish",
                "yo — Yoruba",
                "zu — Zulu",
                "iw — Hebrew (YouTube's track code)",
                "de-DE — German (Germany)",
                "es-419 — Spanish (Latin America)",
                "es-ES — Spanish (Spain)",
                "pt-BR — Portuguese (Brazil)",
                "pt-PT — Portuguese (Portugal)",
                "fa-IR — Persian (Iran)",
                "en-GB — English (UK)",
                "fr-CA — French (Canada)"
              ]
            },
            "default": [
              "en"
            ]
          },
          "subType": {
            "title": "Caption source",
            "enum": [
              "manual",
              "auto",
              "both"
            ],
            "type": "string",
            "description": "Manual = human-written captions only. Auto = YouTube's machine-generated captions only. Both = tries manual first, falls back to auto. Most videos only have auto-generated captions.",
            "default": "both"
          },
          "outputFormats": {
            "title": "Output formats",
            "type": "array",
            "description": "Plain Text is the simplest — one block of words. JSON adds timestamps. LLM-Ready strips [Music] and filler tokens for AI pipelines. SRT and VTT are subtitle formats for video editors.",
            "items": {
              "type": "string",
              "enum": [
                "json",
                "text",
                "llm",
                "srt",
                "vtt"
              ],
              "enumTitles": [
                "JSON (timestamped segments)",
                "Plain Text",
                "LLM-Ready (filler stripped)",
                "SRT (subtitle file)",
                "VTT (WebVTT)"
              ]
            },
            "default": [
              "json",
              "text",
              "llm"
            ]
          },
          "wordLevel": {
            "title": "Word-level timestamps",
            "type": "boolean",
            "description": "Add per-word start and end times inside each JSON segment.",
            "default": false
          },
          "enableAiFallback": {
            "title": "Enable AI transcription",
            "type": "boolean",
            "description": "Off by default. Turn on to transcribe the audio of videos that have no native YouTube captions in any language. A video with captions only in other languages is not transcribed: it is returned as LANGUAGE_NOT_FOUND with its available_languages. Per-minute AI charges apply.",
            "default": false
          },
          "forceTranscriptionLanguage": {
            "title": "AI transcription language",
            "enum": [
              "",
              "af",
              "am",
              "ar",
              "as",
              "az",
              "ba",
              "be",
              "bg",
              "bn",
              "bo",
              "br",
              "bs",
              "ca",
              "cs",
              "cy",
              "da",
              "de",
              "el",
              "en",
              "es",
              "et",
              "eu",
              "fa",
              "fi",
              "fo",
              "fr",
              "gl",
              "gu",
              "ha",
              "haw",
              "he",
              "hi",
              "hr",
              "ht",
              "hu",
              "hy",
              "id",
              "is",
              "it",
              "ja",
              "jw",
              "ka",
              "kk",
              "km",
              "kn",
              "ko",
              "la",
              "lb",
              "ln",
              "lo",
              "lt",
              "lv",
              "mg",
              "mi",
              "mk",
              "ml",
              "mn",
              "mr",
              "ms",
              "mt",
              "my",
              "ne",
              "nl",
              "nn",
              "no",
              "oc",
              "pa",
              "pl",
              "ps",
              "pt",
              "ro",
              "ru",
              "sa",
              "sd",
              "si",
              "sk",
              "sl",
              "sn",
              "so",
              "sq",
              "sr",
              "su",
              "sv",
              "sw",
              "ta",
              "te",
              "tg",
              "th",
              "tl",
              "tr",
              "tt",
              "uk",
              "ur",
              "uz",
              "vi",
              "yi",
              "yo",
              "yue",
              "zh"
            ],
            "type": "string",
            "description": "The language AI transcription writes in, instead of the one it detects in the audio. Set it when you know every caption-free video in the run is in this language — the transcript is returned in it with language_was_forced true, and a video in another language comes back as a poor transcript rather than a correct one. Leave empty to detect the language per video."
          },
          "maxAiMinutes": {
            "title": "Max AI minutes per run",
            "minimum": 0,
            "maximum": 600,
            "type": "integer",
            "description": "Hard cap on total AI transcription minutes for this run, up to 600. When reached, remaining caption-free videos return an AI_MINUTES_LIMIT_REACHED item and the run continues. Set to 0 for the maximum (600). A single video longer than 120 minutes is skipped regardless.",
            "default": 30
          },
          "skipAiFallbackIfLongerThan": {
            "title": "Skip AI for long videos (minutes)",
            "minimum": 0,
            "type": "integer",
            "description": "Skip AI transcription for any video longer than this many minutes. Useful when a channel mixes short clips with long recordings. Set to 0 to disable.",
            "default": 0
          },
          "useAnyAvailableCaptionLanguage": {
            "title": "Use captions in any available language",
            "type": "boolean",
            "description": "When a video has no captions in your requested languages but does have a caption track in its original spoken language, deliver that existing track (charged as a normal transcript) instead of running paid AI transcription. The returned `language` will differ from your requested language and `is_language_fallback` is set to true. Off by default.",
            "default": false
          },
          "machineTranslateCaptions": {
            "title": "Machine-translate captions into your language",
            "type": "boolean",
            "description": "When your requested language exists only as a YouTube auto-translation (YouTube blocks automated downloads of those), download the video's original captions and machine-translate them, keeping timestamps. Charged as a normal transcript; items carry `is_machine_translated: true` and `translated_from`. Turn off to get LANGUAGE_NOT_FOUND (or the language fallback / AI) instead.",
            "default": true
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}