{
  "openapi": "3.0.1",
  "info": {
    "title": "YouTube Transcript Scraper - Subtitles & Timestamps",
    "description": "Get YouTube transcripts with timestamps from any video, playlist, channel or search. Auto-generated (ASR) and human captions, any language, optional machine translation, plus SRT/VTT and full video metadata. No API key, no login.",
    "version": "0.1",
    "x-build-id": "33UwOF4ZjgExAMlt9"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapersdelight~youtube-transcript-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapersdelight-youtube-transcript-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/scrapersdelight~youtube-transcript-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapersdelight-youtube-transcript-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/scrapersdelight~youtube-transcript-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapersdelight-youtube-transcript-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",
        "properties": {
          "videoUrls": {
            "title": "Video URLs or IDs",
            "type": "array",
            "description": "YouTube videos to transcribe. Accepts watch URLs, youtu.be short links, /shorts/, /embed/, /live/ and bare 11-character video IDs. Mix any of them freely.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "playlistUrls": {
            "title": "Playlist URLs",
            "type": "array",
            "description": "Transcribe every video in these playlists. Accepts a playlist URL (https://www.youtube.com/playlist?list=…), a watch URL that carries a `list=` parameter, or a bare playlist ID. Capped per playlist by 'Max videos per source'.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "channelUrls": {
            "title": "Channel URLs or handles",
            "type": "array",
            "description": "Transcribe the newest videos from these channels. Accepts @handles, /channel/UC… URLs, /c/ and /user/ vanity URLs, or a bare UC… channel ID. Capped per channel by 'Max videos per source'.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "searchQueries": {
            "title": "YouTube search queries",
            "type": "array",
            "description": "Search YouTube and transcribe the top video results for each query. Capped per query by 'Max videos per source'.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "languages": {
            "title": "Preferred transcript languages",
            "type": "array",
            "description": "Ordered preference list of language codes, e.g. ['en', 'es', 'pt-BR']. The first one the video actually publishes wins; 'en' also matches 'en-US' and 'en-GB'. Use ['any'] to always take the video's own default track.",
            "default": [
              "en"
            ],
            "items": {
              "type": "string"
            }
          },
          "fallbackToAnyLanguage": {
            "title": "Fall back to any available language",
            "type": "boolean",
            "description": "If the video has captions but not in your preferred languages, return the best track it does have instead of an empty row. On by default — a Spanish video coming back blank because you asked for English is the most common complaint about transcript scrapers.",
            "default": true
          },
          "preferAutoGenerated": {
            "title": "Prefer auto-generated captions",
            "type": "boolean",
            "description": "By default human-written captions win over YouTube's automatic speech recognition for the same language, because they are punctuated and accurate. Switch this on to prefer the ASR track instead (it is usually more complete on long videos).",
            "default": false
          },
          "translateTo": {
            "title": "Translate transcript to",
            "type": "string",
            "description": "Optional. A language code (e.g. `es`, `fr`, `de`, `ja`) to have YouTube machine-translate the transcript before it is returned. Leave empty to get the original language. The available targets for each video are listed in the row's `translationLanguages` field.",
            "default": ""
          },
          "includeSegments": {
            "title": "Include timestamped segments",
            "type": "boolean",
            "description": "Include the `segments` array — every caption cue with its start, duration and end in seconds. Turn off for a much smaller row when you only want the plain text.",
            "default": true
          },
          "includeSrt": {
            "title": "Include SRT subtitles",
            "type": "boolean",
            "description": "Add an `srt` field containing the transcript rendered as a ready-to-use .srt subtitle file.",
            "default": false
          },
          "includeVtt": {
            "title": "Include WebVTT subtitles",
            "type": "boolean",
            "description": "Add a `vtt` field containing the transcript rendered as a ready-to-use WebVTT file.",
            "default": false
          },
          "includeVideoMetadata": {
            "title": "Include publish date, category and likes",
            "type": "boolean",
            "description": "Fetch the video's publish date, upload date, YouTube category and like count. These live in a different response than the captions, so this adds one small request per video. Title, channel, duration, views, description, keywords and thumbnail come free either way.",
            "default": true
          },
          "skipVideosWithoutTranscript": {
            "title": "Skip videos with no transcript",
            "type": "boolean",
            "description": "Leave off (the default) to get a row for every video, with `transcriptStatus` and `transcriptError` explaining any that came back empty — you are never charged for a row you did not ask to skip, but you do see which videos failed and why. Switch on to deliver only videos that actually produced a transcript.",
            "default": false
          },
          "maxVideosPerSource": {
            "title": "Max videos per playlist / channel / search",
            "minimum": 0,
            "type": "integer",
            "description": "How many videos to take from each playlist, channel or search query. Bounded by default so a channel with 5,000 uploads does not run away. 0 = no per-source limit.",
            "default": 50
          },
          "maxItems": {
            "title": "Max videos per run",
            "minimum": 0,
            "type": "integer",
            "description": "Hard stop on the total number of videos transcribed in this run, across every source. 0 = no limit.",
            "default": 200
          },
          "requestConcurrency": {
            "title": "Request concurrency",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many videos to fetch in parallel. YouTube throttles hard above ~10; the default of 5 is measured as the fast, reliable setting.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Defaults to Apify Proxy with the RESIDENTIAL group, and you should leave it there. Measured 2026-09-02: through Apify's DATACENTER pool YouTube answers every request with 'Sign in to confirm you're not a bot' and zero caption tracks; through RESIDENTIAL it returns full transcripts. Datacenter proxies do not work for this endpoint. You can supply your own residential proxy instead.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}