{
  "openapi": "3.0.1",
  "info": {
    "title": "YouTube Transcript Scraper: Subtitles, Channels & Whisper",
    "description": "Get YouTube transcripts and subtitles from videos, Shorts, channels, playlists and keyword searches: text, timestamped segments, SRT and VTT, plus views, tags and chapters. No captions? Whisper transcribes the audio. Pick languages and a date window. Failed videos are free.",
    "version": "0.2",
    "x-build-id": "YXsg1XlKtoHCK79ag"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/humble-echidna~youtube-transcripts/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-humble-echidna-youtube-transcripts",
        "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/humble-echidna~youtube-transcripts/runs": {
      "post": {
        "operationId": "runs-sync-humble-echidna-youtube-transcripts",
        "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/humble-echidna~youtube-transcripts/run-sync": {
      "post": {
        "operationId": "run-sync-humble-echidna-youtube-transcripts",
        "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": [
          "urls"
        ],
        "properties": {
          "urls": {
            "title": "YouTube links",
            "type": "array",
            "description": "Videos, channels, playlists or search result pages, one per line. Videos: watch, youtu.be, Shorts, live or embed links, or a bare 11-character id (jNQXAC9IVRw). Channels: https://www.youtube.com/@handle (its Videos tab), a /videos, /shorts or /streams tab, or /channel/UC... links. Playlists: https://www.youtube.com/playlist?list=... Searches: https://www.youtube.com/results?search_query=... Leave empty if you only use Search keywords.",
            "default": [
              "https://www.youtube.com/watch?v=jNQXAC9IVRw"
            ],
            "items": {
              "type": "string"
            }
          },
          "searchQueries": {
            "title": "Search keywords",
            "type": "array",
            "description": "Search YouTube for these keywords, one search per line (e.g. 'sourdough starter'), and get the transcripts of the top results in YouTube's own order, up to 'Max videos per channel, playlist or search' each. Optional; works alongside YouTube links.",
            "items": {
              "type": "string"
            }
          },
          "maxVideosPerSource": {
            "title": "Max videos per channel, playlist or search",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "How many videos to read from each channel, playlist or search, e.g. 10. From 1 to 5000; default 10. Channels give their newest first, searches YouTube's top results. Single video links aren't affected.",
            "default": 10
          },
          "language": {
            "title": "Transcript language(s)",
            "type": "string",
            "description": "The caption language you want, as a code such as en, es, de, pt-BR or ja; or several in order of preference, separated by commas (es, en: Spanish, else English). Leave empty (the default) for the video's own language. The uploader's subtitles are used first, then YouTube's automatic captions of the spoken language. When a video has none of these languages, you get its own language instead, marked with languageFallback: true (never a machine translation)."
          },
          "publishedAfter": {
            "title": "Published on or after",
            "type": "string",
            "description": "Only videos from channels, playlists and searches published on or after this day: a date (YYYY-MM-DD) or a span back from today such as '30 days' or '2 weeks'. Videos outside the window are skipped before they're read and never charged. Video links you paste are always read. Leave empty for no start."
          },
          "publishedBefore": {
            "title": "Published on or before",
            "type": "string",
            "description": "Only videos from channels, playlists and searches published on or before this day: a date (YYYY-MM-DD) or a span back from today such as '1 year'. Leave empty for no end."
          },
          "whisperFallback": {
            "title": "Transcribe videos without captions (Whisper)",
            "type": "boolean",
            "description": "When a video has no captions at all, download its audio and transcribe it with the Whisper speech model, charged per audio minute on top of the transcript (see Pricing). On by default. Turn it off to skip those videos instead (they're listed in the log and cost nothing).",
            "default": true
          },
          "whisperModel": {
            "title": "Whisper model",
            "enum": [
              "base",
              "small"
            ],
            "type": "string",
            "description": "The speech model for videos without captions: `base` (default) suits clear speech in English and other major languages; `small` makes fewer mistakes on accents, background noise and non-English speech and is priced higher per minute.",
            "default": "base"
          },
          "maxWhisperMinutesPerVideo": {
            "title": "Max Whisper minutes per video",
            "minimum": 1,
            "maximum": 300,
            "type": "integer",
            "description": "Transcribe at most this many minutes of each video without captions, e.g. 60 (the default). From 1 to 300. A longer video gets its first part, and the item's notes say so. Videos with captions are never cut.",
            "default": 60
          },
          "includeText": {
            "title": "Plain text",
            "type": "boolean",
            "description": "Add the whole transcript as one text (`text`), with a new paragraph after each pause of 2 seconds or more. On by default.",
            "default": true
          },
          "includeSegments": {
            "title": "Timestamped segments",
            "type": "boolean",
            "description": "Add the transcript as timed segments (`segments`: start and end in seconds, and the text). On by default.",
            "default": true
          },
          "includeSrt": {
            "title": "SRT subtitles",
            "type": "boolean",
            "description": "Add the transcript as an SRT subtitle file (`srt`), ready to save as a .srt file. Off by default.",
            "default": false
          },
          "includeVtt": {
            "title": "WebVTT captions",
            "type": "boolean",
            "description": "Add the transcript as WebVTT captions (`vtt`), ready to save as a .vtt file. Off by default.",
            "default": false
          },
          "includeMetadata": {
            "title": "Video details",
            "type": "boolean",
            "description": "Add the video's details: channel, upload date, duration, views, likes, comment count, tags, categories, description, thumbnail and chapters. On by default, at no extra cost. Turn off for smaller items.",
            "default": true
          },
          "maxResults": {
            "title": "Max results per run",
            "minimum": 1,
            "type": "integer",
            "description": "Stop after this many transcripts in total, e.g. 20. Minimum 1; leave empty (the default) for no limit. The run also stops cleanly at the maximum cost per run you set in the run options, whichever comes first. Videos without a transcript don't count."
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Which IP addresses YouTube sees. The default, Apify's residential proxy, is what this actor is tested with: YouTube answered datacenter addresses with a bot check on every try (2026-10-14). Its traffic is included in the price. A bot check or rate limit is retried twice from a new address.",
            "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
                  },
                  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}