{
  "openapi": "3.0.1",
  "info": {
    "title": "YouTube Transcript Scraper: Channel, Playlist & Keyword Search",
    "description": "YouTube transcript scraper: search a channel's transcripts, get timestamped quotes with links. Watch channels for new uploads with Slack alerts. RAG chunks, SRT, VTT. Videos, Shorts, playlists. From $1 per 1,000 transcript hours (a video under an hour counts once); failed videos free. No login.",
    "version": "1.1",
    "x-build-id": "2NgXQYTcXfWzTPpju"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/fulox~youtube-transcript-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-fulox-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/fulox~youtube-transcript-scraper/runs": {
      "post": {
        "operationId": "runs-sync-fulox-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/fulox~youtube-transcript-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-fulox-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": "Videos, channels or playlists",
            "maxItems": 500,
            "type": "array",
            "description": "Paste YouTube links, one per line: videos (watch?v=, youtu.be/, /shorts/, /live/, /embed/ or a bare 11-character ID), channels (https://www.youtube.com/@mkbhd, /channel/UC..., /c/name, /user/name or just @mkbhd) and playlists (a link with list=PL...). A channel or playlist is expanded into its newest videos (see 'Videos per channel or playlist'). Invalid entries and duplicates are reported in a free row. Leave empty when you use searchQueries. Up to 500 entries and 5,000 videos per run (300 on the Apify free plan).",
            "items": {
              "type": "string"
            }
          },
          "searchQueries": {
            "title": "YouTube searches (optional)",
            "type": "array",
            "description": "Text to search on YouTube, one per line, as in the YouTube search box (videos only, in YouTube's relevance order). Each query is expanded into its first results, up to 'Videos per channel or playlist' per query (about 600 at most). Listing is free; only delivered transcripts are charged. Up to 20 queries of 200 characters. In watch mode each query remembers what it delivered.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "searchTerms": {
            "title": "Search the transcripts for (optional)",
            "type": "array",
            "description": "Words or phrases to find in every transcript, ignoring case. Each hit becomes a quote with the second it was said, a clickable link that opens the video at that moment, and the chapter. A phrase may span two caption lines. Free: matches never change the price. Up to 50 terms of 100 characters.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "matchRows": {
            "title": "One row per keyword match",
            "type": "boolean",
            "description": "Besides the video row, add a free row of type match for every keyword hit (term, second, link that opens the video there, quote, chapter). Up to 50 per video. Matches never change the price.",
            "default": false
          },
          "languages": {
            "title": "Caption languages, in order of preference",
            "type": "array",
            "description": "Language codes such as en, de, es, pt-BR. The first language the video has wins; 'en' also matches en-US and en-GB. Up to 10.",
            "default": [
              "en"
            ],
            "items": {
              "type": "string"
            }
          },
          "preferAutoGenerated": {
            "title": "Prefer auto-generated captions",
            "type": "boolean",
            "description": "By default, captions written by a person beat auto-generated ones in the same language. Turn on to read the auto-generated track first.",
            "default": false
          },
          "fallbackToAnyLanguage": {
            "title": "Use another language when yours is missing",
            "type": "boolean",
            "description": "On: a video without your languages gives its best available track and the row says requestedLanguageFound: false. Off: such a video is a free language_not_found row listing the languages it has.",
            "default": true
          },
          "formats": {
            "title": "Output formats",
            "type": "array",
            "description": "text: clean transcript in paragraphs. segments: timed lines (start, dur, text). srt, vtt: subtitle files as strings. markdown: one document with front matter, chapter headings and timestamp links. chunks: RAG chunks with a stable id, start and end, token estimate, chapter and deep link. Leave empty for metadata, chapters, quality and matches only (same price).",
            "items": {
              "type": "string",
              "enum": [
                "text",
                "segments",
                "srt",
                "vtt",
                "markdown",
                "chunks"
              ],
              "enumTitles": [
                "Text (clean paragraphs)",
                "Segments (timed lines)",
                "SRT",
                "VTT",
                "Markdown (front matter, chapters, links)",
                "RAG chunks"
              ]
            },
            "default": [
              "text",
              "segments"
            ]
          },
          "chunkTokens": {
            "title": "Chunk size (tokens)",
            "minimum": 100,
            "maximum": 2000,
            "type": "integer",
            "description": "Target size of each chunk when 'chunks' is selected, 100 to 2000. Chunks end at a sentence end or a pause of 2 seconds or more and never split a caption line. Tokens are estimated as characters divided by 4.",
            "default": 400
          },
          "channelContent": {
            "title": "What to take from a channel",
            "type": "array",
            "description": "Which uploads of a channel to list: videos (long-form), shorts, live (past live streams).",
            "items": {
              "type": "string",
              "enum": [
                "videos",
                "shorts",
                "live"
              ],
              "enumTitles": [
                "Videos",
                "Shorts",
                "Live streams"
              ]
            },
            "default": [
              "videos"
            ]
          },
          "maxVideosPerSource": {
            "title": "Videos per channel or playlist",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Newest first. Applies to each playlist and to each selected channel tab. The run as a whole is capped at 5,000 videos (300 on the Apify free plan). Listing is free.",
            "default": 100
          },
          "publishedAfter": {
            "title": "Only videos published after (channels and playlists)",
            "type": "string",
            "description": "A date (2026-09-01) or an age (7 days, 24 hours, 3 weeks, 2 months). Uses the listing's relative date ('3 days ago'), so a video is kept when the date is unclear. Does not apply to videos you paste directly."
          },
          "includeDescription": {
            "title": "Add the video description",
            "type": "boolean",
            "description": "Adds the description (up to 5,000 characters) to each row. Chapters are read from the description either way.",
            "default": false
          },
          "listOnly": {
            "title": "List only (free preview)",
            "type": "boolean",
            "description": "One free row per video with its length, caption languages and the results it would cost (estimatedResults), without downloading any transcript. Never charged. Checks at most 200 videos per run. Watch mode is ignored.",
            "default": false
          },
          "watch": {
            "title": "Watch mode: only new uploads",
            "type": "boolean",
            "description": "Remembers which videos of each channel or playlist were delivered. Schedule the Actor and every run delivers only new uploads, plus a free digest row. Videos you paste directly are always processed.",
            "default": false
          },
          "watchlistName": {
            "title": "Watchlist name",
            "type": "string",
            "description": "Separate memory per name, so two schedules do not share what they have seen. Letters, digits, - and _, up to 40 characters.",
            "default": "default"
          },
          "slackWebhookUrl": {
            "title": "Slack webhook URL (optional)",
            "type": "string",
            "description": "A hooks.slack.com incoming-webhook URL. A digest is posted when at least one transcript was delivered. Stored as a secret, never logged."
          },
          "webhookUrl": {
            "title": "Webhook URL (optional)",
            "type": "string",
            "description": "An https URL that receives the digest as JSON when at least one transcript was delivered. Stored as a secret, never logged."
          },
          "resetState": {
            "title": "Forget what was delivered before",
            "type": "boolean",
            "description": "In watch mode, forget the remembered videos of the sources in this run, so everything is delivered (and charged) again.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}