{
  "data": {
    "id": "CnvdnJtMgXENfddpn",
    "actId": "faVsWy9VTSNVIhWpR",
    "userId": "Sx9bmYi5TKmC279aT",
    "startedAt": "2026-10-19T13:22:33.694Z",
    "finishedAt": "2026-10-19T13:22:35.809Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "WEB"
    },
    "stats": {
      "durationMillis": 2015,
      "runTimeSecs": 2.015,
      "computeUnits": 0.002238888888888889,
      "imageSizeBytes": 558281728
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"Scrape Youtube Transcription\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"videoUrl\": {\n      \"title\": \"URL of the Youtube video\",\n      \"type\": \"string\",\n      \"description\": \"The Video URL from YouTube.\",\n      \"editor\": \"textfield\",\n      \"prefill\": \"https://www.youtube.com/watch?v=IELMSD2kdmk\"\n    },\n    \"targetLanguage\": {\n      \"title\": \"Target Language\",\n      \"type\": \"string\",\n      \"description\": \"ISO 639-1 language code for the transcript\",\n      \"editor\": \"select\",\n      \"enum\": [\n        \"en\",\n        \"pt\",\n        \"es\",\n        \"fr\",\n        \"de\",\n        \"it\",\n        \"ja\",\n        \"ko\",\n        \"zh\",\n        \"ru\",\n        \"ar\",\n        \"hi\",\n        \"nl\",\n        \"pl\",\n        \"tr\",\n        \"vi\",\n        \"id\",\n        \"th\",\n        \"sv\",\n        \"da\",\n        \"no\",\n        \"fi\",\n        \"cs\",\n        \"hu\",\n        \"ro\",\n        \"uk\",\n        \"el\",\n        \"he\",\n        \"fa\",\n        \"bn\",\n        \"ta\",\n        \"te\",\n        \"mr\",\n        \"ur\",\n        \"gu\",\n        \"kn\",\n        \"ml\",\n        \"pa\",\n        \"sr\",\n        \"hr\",\n        \"bg\",\n        \"sk\",\n        \"lt\",\n        \"lv\",\n        \"et\",\n        \"sl\",\n        \"ca\",\n        \"af\",\n        \"sq\",\n        \"am\",\n        \"hy\",\n        \"az\",\n        \"eu\",\n        \"be\",\n        \"bs\",\n        \"my\",\n        \"ceb\",\n        \"zh-Hans\",\n        \"zh-Hant\",\n        \"co\",\n        \"eo\",\n        \"fil\",\n        \"fy\",\n        \"gl\",\n        \"ka\",\n        \"ht\",\n        \"ha\",\n        \"haw\",\n        \"hmn\",\n        \"is\",\n        \"ig\",\n        \"ga\",\n        \"jv\",\n        \"kk\",\n        \"km\",\n        \"rw\",\n        \"ku\",\n        \"ky\",\n        \"lo\",\n        \"la\",\n        \"lb\",\n        \"mk\",\n        \"mg\",\n        \"ms\",\n        \"mt\",\n        \"mi\",\n        \"mn\",\n        \"ne\",\n        \"ny\",\n        \"or\",\n        \"ps\",\n        \"sm\",\n        \"gd\",\n        \"sn\",\n        \"sd\",\n        \"si\",\n        \"so\",\n        \"st\",\n        \"su\",\n        \"sw\",\n        \"tg\",\n        \"tt\",\n        \"tk\",\n        \"ug\",\n        \"uz\",\n        \"cy\",\n        \"xh\",\n        \"yi\",\n        \"yo\",\n        \"zu\"\n      ],\n      \"enumTitles\": [\n        \"English (en)\",\n        \"Português (pt)\",\n        \"Español (es)\",\n        \"Français (fr)\",\n        \"Deutsch (de)\",\n        \"Italiano (it)\",\n        \"日本語 (ja)\",\n        \"한국어 (ko)\",\n        \"中文 (zh)\",\n        \"Русский (ru)\",\n        \"العربية (ar)\",\n        \"हिन्दी (hi)\",\n        \"Nederlands (nl)\",\n        \"Polski (pl)\",\n        \"Türkçe (tr)\",\n        \"Tiếng Việt (vi)\",\n        \"Bahasa Indonesia (id)\",\n        \"ไทย (th)\",\n        \"Svenska (sv)\",\n        \"Dansk (da)\",\n        \"Norsk (no)\",\n        \"Suomi (fi)\",\n        \"Čeština (cs)\",\n        \"Magyar (hu)\",\n        \"Română (ro)\",\n        \"Українська (uk)\",\n        \"Ελληνικά (el)\",\n        \"עברית (he)\",\n        \"فارسی (fa)\",\n        \"বাংলা (bn)\",\n        \"தமிழ் (ta)\",\n        \"తెలుగు (te)\",\n        \"मराठी (mr)\",\n        \"اردو (ur)\",\n        \"ગુજરાતી (gu)\",\n        \"ಕನ್ನಡ (kn)\",\n        \"മലയാളം (ml)\",\n        \"ਪੰਜਾਬੀ (pa)\",\n        \"Српски (sr)\",\n        \"Hrvatski (hr)\",\n        \"Български (bg)\",\n        \"Slovenčina (sk)\",\n        \"Lietuvių (lt)\",\n        \"Latviešu (lv)\",\n        \"Eesti (et)\",\n        \"Slovenščina (sl)\",\n        \"Català (ca)\",\n        \"Afrikaans (af)\",\n        \"Shqip (sq)\",\n        \"አማርኛ (am)\",\n        \"Հայերեն (hy)\",\n        \"Azərbaycan (az)\",\n        \"Euskara (eu)\",\n        \"Беларуская (be)\",\n        \"Bosanski (bs)\",\n        \"မြန်မာ (my)\",\n        \"Cebuano (ceb)\",\n        \"简体中文 (zh-Hans)\",\n        \"繁體中文 (zh-Hant)\",\n        \"Corsu (co)\",\n        \"Esperanto (eo)\",\n        \"Filipino (fil)\",\n        \"Frysk (fy)\",\n        \"Galego (gl)\",\n        \"ქართული (ka)\",\n        \"Kreyòl Ayisyen (ht)\",\n        \"Hausa (ha)\",\n        \"ʻŌlelo Hawaiʻi (haw)\",\n        \"Hmong (hmn)\",\n        \"Íslenska (is)\",\n        \"Igbo (ig)\",\n        \"Gaeilge (ga)\",\n        \"Basa Jawa (jv)\",\n        \"Қазақ (kk)\",\n        \"ខ្មែរ (km)\",\n        \"Kinyarwanda (rw)\",\n        \"Kurdî (ku)\",\n        \"Кыргызча (ky)\",\n        \"ລາວ (lo)\",\n        \"Latina (la)\",\n        \"Lëtzebuergesch (lb)\",\n        \"Македонски (mk)\",\n        \"Malagasy (mg)\",\n        \"Bahasa Melayu (ms)\",\n        \"Malti (mt)\",\n        \"Te Reo Māori (mi)\",\n        \"Монгол (mn)\",\n        \"नेपाली (ne)\",\n        \"Chichewa (ny)\",\n        \"ଓଡ଼ିଆ (or)\",\n        \"پښتو (ps)\",\n        \"Gagana Samoa (sm)\",\n        \"Gàidhlig (gd)\",\n        \"Shona (sn)\",\n        \"سنڌي (sd)\",\n        \"සිංහල (si)\",\n        \"Soomaali (so)\",\n        \"Sesotho (st)\",\n        \"Basa Sunda (su)\",\n        \"Kiswahili (sw)\",\n        \"Тоҷикӣ (tg)\",\n        \"Татар (tt)\",\n        \"Türkmen (tk)\",\n        \"ئۇيغۇر (ug)\",\n        \"Oʻzbek (uz)\",\n        \"Cymraeg (cy)\",\n        \"isiXhosa (xh)\",\n        \"ייִדיש (yi)\",\n        \"Yorùbá (yo)\",\n        \"isiZulu (zu)\"\n      ],\n      \"prefill\": \"en\",\n      \"default\": \"en\"\n    }\n  },\n  \"required\": [\n    \"videoUrl\",\n    \"targetLanguage\"\n  ]\n}",
    "readme": "# YouTube Transcript Scraper\n\nExtract clean, timestamped transcripts from any public YouTube video as structured JSON — built for **AI agents, RAG pipelines, and LLM workflows**, and just as useful for SEO, content repurposing, and research.\n\n---\n\n## Overview\n\n**YouTube Transcript Scraper** pulls the full transcript of a YouTube video, segmented by timestamp, and returns it as clean, structured JSON — no HTML scraping, no manual copy-pasting, no fighting YouTube's UI.\n\nIt's built for two audiences:\n\n- **Developers and AI builders** feeding video content into a RAG pipeline, a chatbot's knowledge base, an LLM fine-tuning set, or an autonomous agent that needs to \"watch\" a video without watching it.\n- **Content teams and researchers** repurposing video into blog posts, generating subtitles, or pulling searchable text out of hours of video for SEO and content audits.\n\nWorks with any **public YouTube video that has captions enabled** (auto-generated or manually uploaded), in the language you request.\n\n---\n\n## Why use this Actor\n\n- **Clean, structured JSON** — every transcript segment comes with a start time, duration, and text, ready to parse programmatically. No regex-scraping raw captions.\n- **Built for AI agents and RAG** — the output shape is designed to be dropped straight into a vector store, a LangChain/LlamaIndex loader, or an LLM prompt.\n- **Timestamp-accurate** — every line keeps its original start/duration, so you can cite, seek, or resegment by any chunk size you need.\n- **Language selectable** — request the transcript in a specific language (see `targetLanguage` below) instead of whatever YouTube defaults to.\n- **Fast** — a full transcript typically returns in seconds.\n- **No browser or API keys needed on your side** — just a video URL.\n\n---\n\n## Use cases\n\n- **RAG and AI agent pipelines**: index video transcripts as a knowledge source, or let an agent call this Actor as a tool to answer \"what does this video say about X?\"\n- **Content repurposing**: turn a video into a blog post, newsletter, or social clips script.\n- **SEO**: publish transcripts alongside video embeds to make video content indexable and searchable by Google.\n- **Research and analysis**: pull text from interviews, lectures, or talks for qualitative analysis at scale.\n- **Accessibility and localization**: generate a base for subtitles/captions in a target language.\n\n---\n\n## Input parameters\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `videoUrl` | String | Yes | Full URL of the YouTube video to transcribe. Example: `https://www.youtube.com/watch?v=VIDEO_ID`. |\n| `targetLanguage` | String (ISO 639-1) | Yes | Language code for the returned transcript (e.g. `en`, `es`, `pt`, `fr`, `de`, `ja`...). Defaults to `en`. |\n\n### Example input\n\n```json\n{\n  \"videoUrl\": \"https://www.youtube.com/watch?v=VIDEO_ID\",\n  \"targetLanguage\": \"en\"\n}\n```\n\n---\n\n## Output\n\nEach run pushes **one dataset item**: an object containing the ordered list of transcript segments for the requested video. Every segment has:\n\n| Field | Type | Description |\n|---|---|---|\n| `start` | String | Segment start time, in seconds. |\n| `dur` | String | Segment duration, in seconds. |\n| `text` | String | The spoken text for that segment. |\n\n### Example output\n\n```json\n{\n  \"data\": [\n    { \"start\": \"0.280\", \"dur\": \"4.440\", \"text\": \"I'm Dr Orion terban and this is psyx\" },\n    { \"start\": \"2.960\", \"dur\": \"4.680\", \"text\": \"Better Living Through psychology and the\" },\n    { \"start\": \"4.720\", \"dur\": \"5.879\", \"text\": \"topic of today's short talk is make her\" }\n  ]\n}\n```\n\nHere's a real sample pulled straight from a live run, shown as a table for a quick visual check of the output shape:\n\n| start | dur | text |\n|---|---|---|\n| 0.280 | 4.440 | I'm Dr Orion terban and this is psyx |\n| 2.960 | 4.680 | Better Living Through psychology and the |\n| 4.720 | 5.879 | topic of today's short talk is make her |\n| 7.640 | 6.320 | work for it so you've probably heard the |\n| 10.599 | 5.600 | fact that women disproportionately end |\n| 13.960 | 4.640 | relationships like they break up and |\n\nResults are available from the **Output**/**Storage** tab as JSON, CSV, Excel, or a rendered table — or via the Apify API/SDK, same as any Actor dataset.\n\n---\n\n## Integrating programmatically (API, SDKs, AI agents)\n\nThis Actor is a regular Apify Actor, so it's callable from any language via the [Apify API](https://docs.apify.com/api/v2), the official SDKs, or as a **tool for AI agents** through the [Apify MCP Server](https://mcp.apify.com) — no custom scraping code required on your end.\n\n**JavaScript (`apify-client`)**\n\n```javascript\nimport { ApifyClient } from 'apify-client';\n\nconst client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });\n\nconst run = await client.actor('pintostudio/youtube-transcript-scraper').call({\n  videoUrl: 'https://www.youtube.com/watch?v=VIDEO_ID',\n  targetLanguage: 'en',\n});\n\nconst { items } = await client.dataset(run.defaultDatasetId).listItems();\nconsole.log(items[0].data); // [{ start, dur, text }, ...]\n```\n\n**Python (`apify-client`)**\n\n```python\nfrom apify_client import ApifyClient\n\nclient = ApifyClient(\"<YOUR_API_TOKEN>\")\n\nrun = client.actor(\"pintostudio/youtube-transcript-scraper\").call(run_input={\n    \"videoUrl\": \"https://www.youtube.com/watch?v=VIDEO_ID\",\n    \"targetLanguage\": \"en\",\n})\n\nfor item in client.dataset(run[\"defaultDatasetId\"]).iterate_items():\n    print(item[\"data\"])\n```\n\n**For AI agents**: this Actor can be exposed as a callable tool through Apify's MCP Server, so an agent (Claude, GPT, or any MCP-compatible assistant) can fetch a transcript on demand as part of answering a question or building a RAG index — without you writing a scraper.\n\n---\n\n## How to use\n\n1. **Set the input** — provide `videoUrl` (required) and `targetLanguage` (defaults to `en`), either in the Apify Console or via an API call.\n2. **Run the Actor** — start it from the Console, schedule it, or trigger it via the API/SDK.\n3. **Read the output** — pull the transcript from the dataset in JSON, CSV, table view, or programmatically via the API.\n\n---\n\n## SEO benefits\n\nPublishing transcripts alongside your video content helps you:\n\n- **Boost keyword density** naturally, using the exact language spoken in the video.\n- **Make video content crawlable** — search engines can't \"watch\" a video, but they can index a transcript.\n- **Improve accessibility** — provide a text alternative for viewers who prefer reading or need it for accessibility reasons.\n\n---\n\n## Limitations\n\n- Works only with **public YouTube videos** that have captions/transcripts enabled (auto-generated or manual).\n- **Private, restricted, or caption-less videos** are not supported.\n- Processes **one video per run** — for a playlist or channel, run it once per video URL (e.g. in a loop or a batch of Actor calls).\n\n---\n\n## Pricing\n\nThis Actor is billed via the Apify platform's usage-based pricing. See the pricing panel at the top of this page for current rates.\n\n---\n\n## FAQ\n\n**Does this work for all YouTube videos?**\nNo — only public videos that have captions/transcripts enabled.\n\n**Can I scrape private videos?**\nNo, private or restricted videos aren't supported due to YouTube's own restrictions.\n\n**Can I get the transcript in a language other than the video's original audio?**\nIf YouTube provides (or auto-translates) captions in that language, yes — set `targetLanguage` to the ISO 639-1 code you want.\n\n**Is this compatible with playlists or full channels?**\nNot directly in one run — this Actor processes a single video URL at a time. Loop over video URLs (e.g. from a playlist scraper) to cover a whole playlist or channel.\n\n**Can I use this with LangChain, an AI agent, or a RAG pipeline?**\nYes — the output is plain structured JSON with timestamped segments, and the Actor is callable via the Apify API/SDKs or as an agent tool through Apify's MCP Server.\n\n## Related Actor\n\nNeed macro/economic context to pair with your video insights? Check out [Economic Calendar Data (Investing.com)](https://apify.com/pintostudio/economic-calendar-data-investing-com) — structured economic calendar events (actual, forecast, previous values, importance ratings) across 45+ countries, built for the same algo-trading and AI-agent use cases. From the same developer, [Pinto Studio](https://apify.com/pintostudio).\n\n---\n\nStart using **YouTube Transcript Scraper** today to turn any video into searchable, structured, agent-ready text. 🚀",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "youtube-transcript-scraper",
      "title": "Youtube Transcript Scraper",
      "description": "Extract YouTube video transcripts with timestamps as clean, structured JSON. Built for AI agents, RAG pipelines and LLM workflows, as well as SEO and content repurposing.",
      "version": "1.0",
      "meta": {
        "templateId": "js-start"
      },
      "input": {
        "title": "Scrape Youtube Transcription",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "videoUrl": {
            "title": "URL of the Youtube video",
            "type": "string",
            "description": "The Video URL from YouTube.",
            "editor": "textfield",
            "prefill": "https://www.youtube.com/watch?v=IELMSD2kdmk"
          },
          "targetLanguage": {
            "title": "Target Language",
            "type": "string",
            "description": "ISO 639-1 language code for the transcript",
            "editor": "select",
            "enum": [
              "en",
              "pt",
              "es",
              "fr",
              "de",
              "it",
              "ja",
              "ko",
              "zh",
              "ru",
              "ar",
              "hi",
              "nl",
              "pl",
              "tr",
              "vi",
              "id",
              "th",
              "sv",
              "da",
              "no",
              "fi",
              "cs",
              "hu",
              "ro",
              "uk",
              "el",
              "he",
              "fa",
              "bn",
              "ta",
              "te",
              "mr",
              "ur",
              "gu",
              "kn",
              "ml",
              "pa",
              "sr",
              "hr",
              "bg",
              "sk",
              "lt",
              "lv",
              "et",
              "sl",
              "ca",
              "af",
              "sq",
              "am",
              "hy",
              "az",
              "eu",
              "be",
              "bs",
              "my",
              "ceb",
              "zh-Hans",
              "zh-Hant",
              "co",
              "eo",
              "fil",
              "fy",
              "gl",
              "ka",
              "ht",
              "ha",
              "haw",
              "hmn",
              "is",
              "ig",
              "ga",
              "jv",
              "kk",
              "km",
              "rw",
              "ku",
              "ky",
              "lo",
              "la",
              "lb",
              "mk",
              "mg",
              "ms",
              "mt",
              "mi",
              "mn",
              "ne",
              "ny",
              "or",
              "ps",
              "sm",
              "gd",
              "sn",
              "sd",
              "si",
              "so",
              "st",
              "su",
              "sw",
              "tg",
              "tt",
              "tk",
              "ug",
              "uz",
              "cy",
              "xh",
              "yi",
              "yo",
              "zu"
            ],
            "enumTitles": [
              "English (en)",
              "Português (pt)",
              "Español (es)",
              "Français (fr)",
              "Deutsch (de)",
              "Italiano (it)",
              "日本語 (ja)",
              "한국어 (ko)",
              "中文 (zh)",
              "Русский (ru)",
              "العربية (ar)",
              "हिन्दी (hi)",
              "Nederlands (nl)",
              "Polski (pl)",
              "Türkçe (tr)",
              "Tiếng Việt (vi)",
              "Bahasa Indonesia (id)",
              "ไทย (th)",
              "Svenska (sv)",
              "Dansk (da)",
              "Norsk (no)",
              "Suomi (fi)",
              "Čeština (cs)",
              "Magyar (hu)",
              "Română (ro)",
              "Українська (uk)",
              "Ελληνικά (el)",
              "עברית (he)",
              "فارسی (fa)",
              "বাংলা (bn)",
              "தமிழ் (ta)",
              "తెలుగు (te)",
              "मराठी (mr)",
              "اردو (ur)",
              "ગુજરાતી (gu)",
              "ಕನ್ನಡ (kn)",
              "മലയാളം (ml)",
              "ਪੰਜਾਬੀ (pa)",
              "Српски (sr)",
              "Hrvatski (hr)",
              "Български (bg)",
              "Slovenčina (sk)",
              "Lietuvių (lt)",
              "Latviešu (lv)",
              "Eesti (et)",
              "Slovenščina (sl)",
              "Català (ca)",
              "Afrikaans (af)",
              "Shqip (sq)",
              "አማርኛ (am)",
              "Հայերեն (hy)",
              "Azərbaycan (az)",
              "Euskara (eu)",
              "Беларуская (be)",
              "Bosanski (bs)",
              "မြန်မာ (my)",
              "Cebuano (ceb)",
              "简体中文 (zh-Hans)",
              "繁體中文 (zh-Hant)",
              "Corsu (co)",
              "Esperanto (eo)",
              "Filipino (fil)",
              "Frysk (fy)",
              "Galego (gl)",
              "ქართული (ka)",
              "Kreyòl Ayisyen (ht)",
              "Hausa (ha)",
              "ʻŌlelo Hawaiʻi (haw)",
              "Hmong (hmn)",
              "Íslenska (is)",
              "Igbo (ig)",
              "Gaeilge (ga)",
              "Basa Jawa (jv)",
              "Қазақ (kk)",
              "ខ្មែរ (km)",
              "Kinyarwanda (rw)",
              "Kurdî (ku)",
              "Кыргызча (ky)",
              "ລາວ (lo)",
              "Latina (la)",
              "Lëtzebuergesch (lb)",
              "Македонски (mk)",
              "Malagasy (mg)",
              "Bahasa Melayu (ms)",
              "Malti (mt)",
              "Te Reo Māori (mi)",
              "Монгол (mn)",
              "नेपाली (ne)",
              "Chichewa (ny)",
              "ଓଡ଼ିଆ (or)",
              "پښتو (ps)",
              "Gagana Samoa (sm)",
              "Gàidhlig (gd)",
              "Shona (sn)",
              "سنڌي (sd)",
              "සිංහල (si)",
              "Soomaali (so)",
              "Sesotho (st)",
              "Basa Sunda (su)",
              "Kiswahili (sw)",
              "Тоҷикӣ (tg)",
              "Татар (tt)",
              "Türkmen (tk)",
              "ئۇيغۇر (ug)",
              "Oʻzbek (uz)",
              "Cymraeg (cy)",
              "isiXhosa (xh)",
              "ייִדיש (yi)",
              "Yorùbá (yo)",
              "isiZulu (zu)"
            ],
            "prefill": "en",
            "default": "en"
          }
        },
        "required": [
          "videoUrl",
          "targetLanguage"
        ]
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "YouTube transcript output",
        "properties": {
          "transcript": {
            "type": "string",
            "title": "Transcript",
            "description": "The full ordered transcript (start time, duration, and text for each caption segment) for the requested video. Produced by every normal (non-Standby) run.",
            "template": "{{links.apiDefaultDatasetUrl}}/items?view=overview"
          },
          "output": {
            "type": "string",
            "title": "Output record",
            "description": "The same transcript result (or error payload, if the run failed), also stored as a key-value store record for convenience.",
            "template": "{{links.apiDefaultKeyValueStoreUrl}}/records/output"
          }
        }
      },
      "dockerfile": "./Dockerfile",
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "fields": {
            "type": "object",
            "properties": {
              "data": {
                "type": "array",
                "title": "Transcript segments",
                "description": "Ordered list of caption segments for the requested video, each with a start time, duration, and the spoken text.",
                "items": {
                  "type": "object",
                  "properties": {
                    "start": {
                      "type": "string",
                      "title": "Start time (seconds)"
                    },
                    "dur": {
                      "type": "string",
                      "title": "Duration (seconds)"
                    },
                    "text": {
                      "type": "string",
                      "title": "Caption text"
                    }
                  }
                }
              }
            },
            "required": [
              "data"
            ]
          },
          "views": {
            "overview": {
              "title": "Transcript",
              "description": "One row per run: the full ordered transcript for the requested video.",
              "transformation": {
                "fields": [
                  "data"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "data": {
                    "label": "Transcript segments",
                    "format": "array"
                  }
                }
              }
            }
          }
        },
        "keyValueStore": {
          "actorKeyValueStoreSchemaVersion": 1,
          "title": "YouTube Transcript Scraper key-value store",
          "collections": {
            "inputParameters": {
              "title": "Input",
              "description": "The input parameters (video URL, target language) this run was started with.",
              "key": "INPUT",
              "contentTypes": [
                "application/json"
              ]
            },
            "output": {
              "title": "Output",
              "description": "The transcript result for this run (or an error payload if the run failed), the same object that was also pushed to the dataset.",
              "key": "output",
              "contentTypes": [
                "application/json"
              ],
              "jsonSchema": {
                "$schema": "http://json-schema.org/draft-07/schema#",
                "type": "object",
                "properties": {
                  "data": {
                    "type": [
                      "array",
                      "null"
                    ],
                    "description": "Ordered transcript segments, or null if the run failed.",
                    "items": {
                      "type": "object",
                      "properties": {
                        "start": {
                          "type": "string",
                          "description": "Start time of the segment, in seconds."
                        },
                        "dur": {
                          "type": "string",
                          "description": "Duration of the segment, in seconds."
                        },
                        "text": {
                          "type": "string",
                          "description": "Caption text for the segment."
                        }
                      }
                    }
                  },
                  "error": {
                    "type": "object",
                    "description": "Present only when the run failed.",
                    "properties": {
                      "success": {
                        "type": "boolean"
                      },
                      "message": {
                        "type": "string"
                      },
                      "data": {
                        "type": "null"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      "usesStandbyMode": true,
      "webServerSchema": {
        "openapi": "3.0.3",
        "info": {
          "title": "YouTube Transcript Scraper API",
          "description": "On-demand HTTP API exposed by this Actor's web server when it is run in Standby mode. It lets you fetch a YouTube video's transcript synchronously, using the same input fields as the Actor's input schema, without starting a new dataset run. A normal (non-Standby) run of this Actor is unaffected and keeps writing to the dataset as before.",
          "version": "1.0"
        },
        "servers": [
          {
            "url": "https://pintostudio--youtube-transcript-scraper.apify.actor",
            "description": "Actor Standby URL (the platform rewrites this to the actual Standby URL at runtime)."
          }
        ],
        "paths": {
          "/": {
            "get": {
              "summary": "Health / readiness check",
              "description": "Used by the Apify platform's Standby readiness probe. Always returns 200 once the server has started.",
              "operationId": "healthCheck",
              "responses": {
                "200": {
                  "description": "The Actor's web server is ready.",
                  "content": {
                    "application/json": {
                      "schema": {
                        "type": "object",
                        "properties": {
                          "status": {
                            "type": "string",
                            "example": "ok"
                          },
                          "actor": {
                            "type": "string",
                            "example": "youtube-transcript-scraper"
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "/transcript": {
            "get": {
              "summary": "Get a YouTube video transcript",
              "description": "Fetches the transcript for a YouTube video synchronously and returns it as JSON. Accepts the same input fields as the Actor's input schema. Does not write to a dataset or key-value store; use a normal Actor run for that.",
              "operationId": "getTranscript",
              "parameters": [
                {
                  "name": "videoUrl",
                  "in": "query",
                  "required": true,
                  "schema": {
                    "type": "string"
                  },
                  "description": "The URL (or 11-character video ID) of the YouTube video, e.g. 'https://www.youtube.com/watch?v=IELMSD2kdmk'."
                },
                {
                  "name": "targetLanguage",
                  "in": "query",
                  "required": false,
                  "schema": {
                    "type": "string",
                    "default": "en"
                  },
                  "description": "ISO 639-1 language code for the transcript. Defaults to 'en'."
                }
              ],
              "responses": {
                "200": {
                  "description": "The video's transcript.",
                  "content": {
                    "application/json": {
                      "schema": {
                        "type": "object",
                        "properties": {
                          "data": {
                            "type": "array",
                            "items": {
                              "$ref": "#/components/schemas/TranscriptSegment"
                            }
                          }
                        }
                      }
                    }
                  }
                },
                "400": {
                  "description": "Invalid input, or no transcript could be retrieved.",
                  "content": {
                    "application/json": {
                      "schema": {
                        "$ref": "#/components/schemas/ErrorResponse"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "components": {
          "schemas": {
            "TranscriptSegment": {
              "type": "object",
              "description": "Same shape as one entry in the Actor's dataset output's 'data' array.",
              "properties": {
                "start": {
                  "type": "string",
                  "description": "Start time of the segment, in seconds."
                },
                "dur": {
                  "type": "string",
                  "description": "Duration of the segment, in seconds."
                },
                "text": {
                  "type": "string",
                  "description": "Caption text for the segment."
                }
              }
            },
            "ErrorResponse": {
              "type": "object",
              "properties": {
                "error": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "webServerMcpPath": "/mcp",
      "readme": "# YouTube Transcript Scraper\n\nExtract clean, timestamped transcripts from any public YouTube video as structured JSON — built for **AI agents, RAG pipelines, and LLM workflows**, and just as useful for SEO, content repurposing, and research.\n\n---\n\n## Overview\n\n**YouTube Transcript Scraper** pulls the full transcript of a YouTube video, segmented by timestamp, and returns it as clean, structured JSON — no HTML scraping, no manual copy-pasting, no fighting YouTube's UI.\n\nIt's built for two audiences:\n\n- **Developers and AI builders** feeding video content into a RAG pipeline, a chatbot's knowledge base, an LLM fine-tuning set, or an autonomous agent that needs to \"watch\" a video without watching it.\n- **Content teams and researchers** repurposing video into blog posts, generating subtitles, or pulling searchable text out of hours of video for SEO and content audits.\n\nWorks with any **public YouTube video that has captions enabled** (auto-generated or manually uploaded), in the language you request.\n\n---\n\n## Why use this Actor\n\n- **Clean, structured JSON** — every transcript segment comes with a start time, duration, and text, ready to parse programmatically. No regex-scraping raw captions.\n- **Built for AI agents and RAG** — the output shape is designed to be dropped straight into a vector store, a LangChain/LlamaIndex loader, or an LLM prompt.\n- **Timestamp-accurate** — every line keeps its original start/duration, so you can cite, seek, or resegment by any chunk size you need.\n- **Language selectable** — request the transcript in a specific language (see `targetLanguage` below) instead of whatever YouTube defaults to.\n- **Fast** — a full transcript typically returns in seconds.\n- **No browser or API keys needed on your side** — just a video URL.\n\n---\n\n## Use cases\n\n- **RAG and AI agent pipelines**: index video transcripts as a knowledge source, or let an agent call this Actor as a tool to answer \"what does this video say about X?\"\n- **Content repurposing**: turn a video into a blog post, newsletter, or social clips script.\n- **SEO**: publish transcripts alongside video embeds to make video content indexable and searchable by Google.\n- **Research and analysis**: pull text from interviews, lectures, or talks for qualitative analysis at scale.\n- **Accessibility and localization**: generate a base for subtitles/captions in a target language.\n\n---\n\n## Input parameters\n\n| Parameter | Type | Required | Description |\n|---|---|---|---|\n| `videoUrl` | String | Yes | Full URL of the YouTube video to transcribe. Example: `https://www.youtube.com/watch?v=VIDEO_ID`. |\n| `targetLanguage` | String (ISO 639-1) | Yes | Language code for the returned transcript (e.g. `en`, `es`, `pt`, `fr`, `de`, `ja`...). Defaults to `en`. |\n\n### Example input\n\n```json\n{\n  \"videoUrl\": \"https://www.youtube.com/watch?v=VIDEO_ID\",\n  \"targetLanguage\": \"en\"\n}\n```\n\n---\n\n## Output\n\nEach run pushes **one dataset item**: an object containing the ordered list of transcript segments for the requested video. Every segment has:\n\n| Field | Type | Description |\n|---|---|---|\n| `start` | String | Segment start time, in seconds. |\n| `dur` | String | Segment duration, in seconds. |\n| `text` | String | The spoken text for that segment. |\n\n### Example output\n\n```json\n{\n  \"data\": [\n    { \"start\": \"0.280\", \"dur\": \"4.440\", \"text\": \"I'm Dr Orion terban and this is psyx\" },\n    { \"start\": \"2.960\", \"dur\": \"4.680\", \"text\": \"Better Living Through psychology and the\" },\n    { \"start\": \"4.720\", \"dur\": \"5.879\", \"text\": \"topic of today's short talk is make her\" }\n  ]\n}\n```\n\nHere's a real sample pulled straight from a live run, shown as a table for a quick visual check of the output shape:\n\n| start | dur | text |\n|---|---|---|\n| 0.280 | 4.440 | I'm Dr Orion terban and this is psyx |\n| 2.960 | 4.680 | Better Living Through psychology and the |\n| 4.720 | 5.879 | topic of today's short talk is make her |\n| 7.640 | 6.320 | work for it so you've probably heard the |\n| 10.599 | 5.600 | fact that women disproportionately end |\n| 13.960 | 4.640 | relationships like they break up and |\n\nResults are available from the **Output**/**Storage** tab as JSON, CSV, Excel, or a rendered table — or via the Apify API/SDK, same as any Actor dataset.\n\n---\n\n## Integrating programmatically (API, SDKs, AI agents)\n\nThis Actor is a regular Apify Actor, so it's callable from any language via the [Apify API](https://docs.apify.com/api/v2), the official SDKs, or as a **tool for AI agents** through the [Apify MCP Server](https://mcp.apify.com) — no custom scraping code required on your end.\n\n**JavaScript (`apify-client`)**\n\n```javascript\nimport { ApifyClient } from 'apify-client';\n\nconst client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });\n\nconst run = await client.actor('pintostudio/youtube-transcript-scraper').call({\n  videoUrl: 'https://www.youtube.com/watch?v=VIDEO_ID',\n  targetLanguage: 'en',\n});\n\nconst { items } = await client.dataset(run.defaultDatasetId).listItems();\nconsole.log(items[0].data); // [{ start, dur, text }, ...]\n```\n\n**Python (`apify-client`)**\n\n```python\nfrom apify_client import ApifyClient\n\nclient = ApifyClient(\"<YOUR_API_TOKEN>\")\n\nrun = client.actor(\"pintostudio/youtube-transcript-scraper\").call(run_input={\n    \"videoUrl\": \"https://www.youtube.com/watch?v=VIDEO_ID\",\n    \"targetLanguage\": \"en\",\n})\n\nfor item in client.dataset(run[\"defaultDatasetId\"]).iterate_items():\n    print(item[\"data\"])\n```\n\n**For AI agents**: this Actor can be exposed as a callable tool through Apify's MCP Server, so an agent (Claude, GPT, or any MCP-compatible assistant) can fetch a transcript on demand as part of answering a question or building a RAG index — without you writing a scraper.\n\n---\n\n## How to use\n\n1. **Set the input** — provide `videoUrl` (required) and `targetLanguage` (defaults to `en`), either in the Apify Console or via an API call.\n2. **Run the Actor** — start it from the Console, schedule it, or trigger it via the API/SDK.\n3. **Read the output** — pull the transcript from the dataset in JSON, CSV, table view, or programmatically via the API.\n\n---\n\n## SEO benefits\n\nPublishing transcripts alongside your video content helps you:\n\n- **Boost keyword density** naturally, using the exact language spoken in the video.\n- **Make video content crawlable** — search engines can't \"watch\" a video, but they can index a transcript.\n- **Improve accessibility** — provide a text alternative for viewers who prefer reading or need it for accessibility reasons.\n\n---\n\n## Limitations\n\n- Works only with **public YouTube videos** that have captions/transcripts enabled (auto-generated or manual).\n- **Private, restricted, or caption-less videos** are not supported.\n- Processes **one video per run** — for a playlist or channel, run it once per video URL (e.g. in a loop or a batch of Actor calls).\n\n---\n\n## Pricing\n\nThis Actor is billed via the Apify platform's usage-based pricing. See the pricing panel at the top of this page for current rates.\n\n---\n\n## FAQ\n\n**Does this work for all YouTube videos?**\nNo — only public videos that have captions/transcripts enabled.\n\n**Can I scrape private videos?**\nNo, private or restricted videos aren't supported due to YouTube's own restrictions.\n\n**Can I get the transcript in a language other than the video's original audio?**\nIf YouTube provides (or auto-translates) captions in that language, yes — set `targetLanguage` to the ISO 639-1 code you want.\n\n**Is this compatible with playlists or full channels?**\nNot directly in one run — this Actor processes a single video URL at a time. Loop over video URLs (e.g. from a playlist scraper) to cover a whole playlist or channel.\n\n**Can I use this with LangChain, an AI agent, or a RAG pipeline?**\nYes — the output is plain structured JSON with timestamped segments, and the Actor is callable via the Apify API/SDKs or as an agent tool through Apify's MCP Server.\n\n## Related Actor\n\nNeed macro/economic context to pair with your video insights? Check out [Economic Calendar Data (Investing.com)](https://apify.com/pintostudio/economic-calendar-data-investing-com) — structured economic calendar events (actual, forecast, previous values, importance ratings) across 45+ countries, built for the same algo-trading and AI-agent use cases. From the same developer, [Pinto Studio](https://apify.com/pintostudio).\n\n---\n\nStart using **YouTube Transcript Scraper** today to turn any video into searchable, structured, agent-ready text. 🚀"
    },
    "buildNumber": "1.0.63",
    "imageDigest": "36478426012775f3b716d6da64befb5bad8810c12f4460a4fb456a6ca7afb4a3",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.0"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.002238888888888889
    }
  }
}