{
 "title": "YouTube Transcript Scraper vs youtube-transcript-api: first-hand test evidence",
 "canonical_page": "https://apihq.dev/compare/youtube-transcript-scraper-vs-youtube-transcript-api",
 "test_date": "2026-07-17",
 "affiliation": "apihq operates the YouTube Transcript Scraper being compared. See the canonical page for methodology and limitations.",
 "sanitization": "Transcript text is omitted from both tools' results (caption text can be copyrighted). Rows keep outcome, language, track type, and segment counts, which is what the comparison's claims rest on.",
 "library_environment": {
  "package": "youtube-transcript-api",
  "version": "1.2.4",
  "python": "3.9.6",
  "os": "macOS",
  "network": "residential ISP connection (not a datacenter IP)",
  "call": "default YouTubeTranscriptApi().fetch(video_id), sequential, no proxy configuration"
 },
 "actor_run": {
  "actor": "apihq/youtube-transcript-scraper",
  "build": "0.1.7",
  "run_id": "QrP1vcLKLBJGGGpt2",
  "started_at": "2026-07-17T15:19:03.524Z",
  "finished_at": "2026-07-17T15:19:24.094Z",
  "status": "SUCCEEDED",
  "charged_event_counts": {
   "apify-actor-start": 1,
   "transcript": 8
  },
  "list_price_calculation": {
   "transcript_events": 8,
   "price_per_transcript_usd": 0.003,
   "start_events": 1,
   "start_fee_usd": 5e-05,
   "list_price_total_usd": 0.02405,
   "note": "Owner-account run: this is the list-price value of the emitted charge events, not an observed customer charge. A non-owner run is billed these events at the listed prices."
  }
 },
 "actor_input": {
  "videoIds": [
   "jNQXAC9IVRw",
   "dQw4w9WgXcQ",
   "kJQP7kiw5Fk",
   "9bZkp7q19f0",
   "fJ9rUzIMcZQ",
   "hTWKbfoikeg",
   "M7lc1UVf-VE",
   "LgbyEFILLJI",
   "jfKfPfyJRdk",
   "00000000000",
   "aaaaaaaaaaa"
  ]
 },
 "results": [
  {
   "video_id": "jNQXAC9IVRw",
   "label": "Me at the zoo (2005, first YouTube video)",
   "youtube_transcript_api": {
    "outcome": "transcript",
    "seconds": 2.64,
    "language": "en",
    "is_generated": false,
    "segments": 6
   },
   "youtube_transcript_scraper": {
    "success": true,
    "language": "en",
    "is_auto_generated": false,
    "segments": 6,
    "charge_event": "transcript",
    "list_price_usd": 0.003
   }
  },
  {
   "video_id": "dQw4w9WgXcQ",
   "label": "Rick Astley - Never Gonna Give You Up",
   "youtube_transcript_api": {
    "outcome": "transcript",
    "seconds": 4.96,
    "language": "en",
    "is_generated": false,
    "segments": 61
   },
   "youtube_transcript_scraper": {
    "success": true,
    "language": "en",
    "is_auto_generated": false,
    "segments": 61,
    "charge_event": "transcript",
    "list_price_usd": 0.003
   }
  },
  {
   "video_id": "kJQP7kiw5Fk",
   "label": "Luis Fonsi - Despacito",
   "youtube_transcript_api": {
    "outcome": "transcript",
    "seconds": 9.74,
    "language": "en",
    "is_generated": false,
    "segments": 79
   },
   "youtube_transcript_scraper": {
    "success": true,
    "language": "en",
    "is_auto_generated": false,
    "segments": 90,
    "charge_event": "transcript",
    "list_price_usd": 0.003
   }
  },
  {
   "video_id": "9bZkp7q19f0",
   "label": "PSY - Gangnam Style",
   "youtube_transcript_api": {
    "outcome": "exception",
    "seconds": 2.56,
    "exception": "NoTranscriptFound",
    "message": ""
   },
   "youtube_transcript_scraper": {
    "success": true,
    "language": "ko",
    "is_auto_generated": true,
    "segments": 67,
    "charge_event": "transcript",
    "list_price_usd": 0.003
   }
  },
  {
   "video_id": "fJ9rUzIMcZQ",
   "label": "Queen - Bohemian Rhapsody",
   "youtube_transcript_api": {
    "outcome": "transcript",
    "seconds": 2.59,
    "language": "en",
    "is_generated": false,
    "segments": 74
   },
   "youtube_transcript_scraper": {
    "success": true,
    "language": "en",
    "is_auto_generated": false,
    "segments": 74,
    "charge_event": "transcript",
    "list_price_usd": 0.003
   }
  },
  {
   "video_id": "hTWKbfoikeg",
   "label": "Nirvana - Smells Like Teen Spirit",
   "youtube_transcript_api": {
    "outcome": "transcript",
    "seconds": 2.61,
    "language": "en",
    "is_generated": false,
    "segments": 53
   },
   "youtube_transcript_scraper": {
    "success": true,
    "language": "en",
    "is_auto_generated": false,
    "segments": 53,
    "charge_event": "transcript",
    "list_price_usd": 0.003
   }
  },
  {
   "video_id": "M7lc1UVf-VE",
   "label": "YouTube Developers - Player API demo",
   "youtube_transcript_api": {
    "outcome": "transcript",
    "seconds": 3.17,
    "language": "en",
    "is_generated": false,
    "segments": 466
   },
   "youtube_transcript_scraper": {
    "success": true,
    "language": "en",
    "is_auto_generated": false,
    "segments": 466,
    "charge_event": "transcript",
    "list_price_usd": 0.003
   }
  },
  {
   "video_id": "LgbyEFILLJI",
   "label": "MrBeast Short",
   "youtube_transcript_api": {
    "outcome": "transcript",
    "seconds": 3.63,
    "language": "en",
    "is_generated": true,
    "segments": 28
   },
   "youtube_transcript_scraper": {
    "success": true,
    "language": "en",
    "is_auto_generated": true,
    "segments": 28,
    "charge_event": "transcript",
    "list_price_usd": 0.003
   }
  },
  {
   "video_id": "jfKfPfyJRdk",
   "label": "lofi girl - live radio stream",
   "youtube_transcript_api": {
    "outcome": "exception",
    "seconds": 1.0,
    "exception": "VideoUnplayable",
    "message": ""
   },
   "youtube_transcript_scraper": {
    "success": false,
    "code": "PLAYABILITY",
    "status_code": 403,
    "error": "Video jfKfPfyJRdk is not playable: This live stream recording is not available.",
    "charge_event": null,
    "list_price_usd": 0.0
   }
  },
  {
   "video_id": "00000000000",
   "label": "nonexistent video ID (valid format)",
   "youtube_transcript_api": {
    "outcome": "exception",
    "seconds": 0.38,
    "exception": "VideoUnavailable",
    "message": ""
   },
   "youtube_transcript_scraper": {
    "success": false,
    "code": "PLAYABILITY",
    "status_code": 403,
    "error": "Video 00000000000 is not playable: This video is unavailable",
    "charge_event": null,
    "list_price_usd": 0.0
   }
  },
  {
   "video_id": "aaaaaaaaaaa",
   "label": "nonexistent video ID (valid format)",
   "youtube_transcript_api": {
    "outcome": "exception",
    "seconds": 0.26,
    "exception": "VideoUnavailable",
    "message": ""
   },
   "youtube_transcript_scraper": {
    "success": false,
    "code": "PLAYABILITY",
    "status_code": 403,
    "error": "Video aaaaaaaaaaa is not playable: This video is unavailable",
    "charge_event": null,
    "list_price_usd": 0.0
   }
  }
 ],
 "library_test_script": "\"\"\"First-hand test: youtube-transcript-api 1.2.4 over a fixed sample.\n\nRun date recorded in output. Environment: macOS, residential ISP\nconnection (NOT a datacenter IP), Python 3.9.6.\n\"\"\"\nimport json\nimport time\n\nfrom youtube_transcript_api import YouTubeTranscriptApi\n\nSAMPLE = [\n    (\"jNQXAC9IVRw\", \"Me at the zoo (2005, first YouTube video)\"),\n    (\"dQw4w9WgXcQ\", \"Rick Astley - Never Gonna Give You Up\"),\n    (\"kJQP7kiw5Fk\", \"Luis Fonsi - Despacito (Spanish)\"),\n    (\"9bZkp7q19f0\", \"PSY - Gangnam Style (Korean)\"),\n    (\"fJ9rUzIMcZQ\", \"Queen - Bohemian Rhapsody\"),\n    (\"hTWKbfoikeg\", \"Nirvana - Smells Like Teen Spirit\"),\n    (\"M7lc1UVf-VE\", \"YouTube Developers - Player API demo\"),\n    (\"LgbyEFILLJI\", \"MrBeast Short ($1 vs $10,000 Cake)\"),\n    (\"jfKfPfyJRdk\", \"lofi girl - live radio stream\"),\n    (\"00000000000\", \"nonexistent video ID (valid format)\"),\n    (\"aaaaaaaaaaa\", \"nonexistent video ID (valid format)\"),\n]\n\napi = YouTubeTranscriptApi()\nresults = []\nfor vid, label in SAMPLE:\n    row = {\"video_id\": vid, \"label\": label}\n    t0 = time.time()\n    try:\n        fetched = api.fetch(vid)\n        row[\"outcome\"] = \"transcript\"\n        row[\"language\"] = fetched.language_code\n        row[\"is_generated\"] = fetched.is_generated\n        row[\"segments\"] = len(fetched.snippets)\n        try:\n            tlist = api.list(vid)\n            row[\"available_tracks\"] = [\n                {\"lang\": t.language_code, \"generated\": t.is_generated}\n                for t in tlist\n            ]\n        except Exception:\n            pass\n    except Exception as e:\n        row[\"outcome\"] = \"exception\"\n        row[\"exception\"] = type(e).__name__\n        row[\"message\"] = str(e).split(\"\\n\")[0][:200]\n    row[\"seconds\"] = round(time.time() - t0, 2)\n    results.append(row)\n    print(f\"{vid}  {row['outcome']:<10} {row.get('exception','')} {row['seconds']}s\")\n\nwith open(\"library_results.json\", \"w\") as f:\n    json.dump(results, f, indent=1)\nprint(\"\\nsaved library_results.json\")\n"
}