<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: John John</title>
    <description>The latest articles on DEV Community by John John (@john_john_7298fe4366c6621).</description>
    <link>https://dev.to/john_john_7298fe4366c6621</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3816880%2F11c4937f-1da1-4117-91f4-5ff2bc8d716e.png</url>
      <title>DEV Community: John John</title>
      <link>https://dev.to/john_john_7298fe4366c6621</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/john_john_7298fe4366c6621"/>
    <language>en</language>
    <item>
      <title>Stop using Headless Browsers to fetch YouTube Transcripts 🚀</title>
      <dc:creator>John John</dc:creator>
      <pubDate>Tue, 10 Mar 2026 12:33:56 +0000</pubDate>
      <link>https://dev.to/john_john_7298fe4366c6621/stop-using-headless-browsers-to-fetch-youtube-transcripts-244m</link>
      <guid>https://dev.to/john_john_7298fe4366c6621/stop-using-headless-browsers-to-fetch-youtube-transcripts-244m</guid>
      <description>&lt;p&gt;Fetching YouTube transcripts in Node.js usually means one of two things: fighting with heavy headless browsers or dealing with flaky, outdated scrapers.&lt;/p&gt;

&lt;p&gt;I wanted something faster, type-safe, and proxy-ready. So I built YT Caption Kit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Problem&lt;/strong&gt;&lt;br&gt;
If you are building an AI summarizer, a search engine for videos, or a language learning app, you need captions. But:&lt;/p&gt;

&lt;p&gt;Puppeteer/Playwright are overkill and resource-heavy for just fetching text.&lt;/p&gt;

&lt;p&gt;Official YouTube APIs can be restrictive or require complex OAuth flows for simple data.&lt;/p&gt;

&lt;p&gt;Formatting (like  or &lt;b&gt; tags) is often lost in basic scrapers.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Solution: YT Caption Kit&lt;/strong&gt;&lt;br&gt;
yt-caption-kit is a lightweight, zero-browser dependency for Node.js and TypeScript that fetches transcripts directly from YouTube's internal endpoints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why you should use it:&lt;/strong&gt;&lt;br&gt;
🚀 No Headless Browser: Extremely fast and low memory footprint.&lt;/p&gt;

&lt;p&gt;🛡️ TypeScript First: Full autocomplete and built-in error classes (like AgeRestricted or IpBlocked).&lt;/p&gt;

&lt;p&gt;🌍 Smart Fallbacks: Automatically prefers manual transcripts but falls back to auto-generated ones.&lt;/p&gt;

&lt;p&gt;🎨 Format Ready: Export to JSON, SRT, WebVTT, or plain text out of the box.&lt;/p&gt;

&lt;p&gt;🔄 Proxy Support: Built-in support for generic HTTP/SOCKS and Webshare rotation to avoid rate limits.&lt;/p&gt;

&lt;p&gt;💻 CLI Included: Need a transcript fast? Just run npx yt-caption-kit .&lt;/p&gt;

&lt;p&gt;Quick Start&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Bash
npm &lt;span class="nb"&gt;install &lt;/span&gt;yt-caption-kit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using the API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;TypeScript&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;YtCaptionKit&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;yt-caption-kit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;YtCaptionKit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Fetch English or German transcripts with formatting preserved&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;transcript&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GJLlxj_dtq8&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;languages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;de&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;preserveFormatting&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transcript&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;snippets&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Using the CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Bash
&lt;span class="c"&gt;# Get subtitles in SRT format for your video editor&lt;/span&gt;
yt-caption-kit GJLlxj_dtq8 &lt;span class="nt"&gt;--format&lt;/span&gt; srt &lt;span class="nt"&gt;--translate&lt;/span&gt; es
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Handling the "YouTube Wall"&lt;br&gt;
We’ve all been there—your IP gets flagged. yt-caption-kit makes it easy to plug in proxies so your app stays up:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;TypeScript&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;YtCaptionKit&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;proxyConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WebshareProxyConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;proxyUsername&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;USER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;proxyPassword&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PASS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🌟 Support the project&lt;br&gt;
This project relies on undocumented endpoints, which means maintenance is key! If you find this useful for your next AI project or tool, please consider dropping a star on GitHub. It helps me know people are using it and keeps the updates coming!&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/Dhaxor/yt-caption-kit" rel="noopener noreferrer"&gt;https://github.com/Dhaxor/yt-caption-kit&lt;/a&gt;&lt;br&gt;
NPM: &lt;a href="https://www.npmjs.com/package/yt-caption-kit" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/yt-caption-kit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd love to hear what you're building with this! Drop a comment below if you have questions or feature requests.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
