<?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: pantdeepakk5</title>
    <description>The latest articles on DEV Community by pantdeepakk5 (@deepakpant).</description>
    <link>https://dev.to/deepakpant</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F635755%2Fef257088-922c-4a2c-a236-c12f0fb0e096.png</url>
      <title>DEV Community: pantdeepakk5</title>
      <link>https://dev.to/deepakpant</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/deepakpant"/>
    <language>en</language>
    <item>
      <title>How to get YouTube transcripts in n8n (and use them in an AI Agent)</title>
      <dc:creator>pantdeepakk5</dc:creator>
      <pubDate>Mon, 28 Sep 2026 14:22:29 +0000</pubDate>
      <link>https://dev.to/deepakpant/how-to-get-youtube-transcripts-in-n8n-and-use-them-in-an-ai-agent-3lbp</link>
      <guid>https://dev.to/deepakpant/how-to-get-youtube-transcripts-in-n8n-and-use-them-in-an-ai-agent-3lbp</guid>
      <description>&lt;p&gt;If you want an n8n workflow to read what's actually said in a YouTube video (not just the title and description), you need a transcript. Here are two ways to get one: a built-in HTTP Request node hitting a REST API, or a community node that also plugs straight into an AI Agent as a tool.&lt;/p&gt;

&lt;p&gt;Both need a free API key from &lt;a href="https://getyoutubetranscript.com" rel="noopener noreferrer"&gt;GetYouTubeTranscript&lt;/a&gt; (100 credits, no card required). No Google API key or YouTube Data API quota involved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach 1: HTTP Request node
&lt;/h2&gt;

&lt;p&gt;If you don't want to install anything, n8n's built-in HTTP Request node can call the API directly, since it's a plain REST endpoint.&lt;/p&gt;

&lt;p&gt;Get a key from the &lt;a href="https://getyoutubetranscript.com/dashboard" rel="noopener noreferrer"&gt;dashboard&lt;/a&gt;, then set it as an environment variable available to your n8n instance (don't hardcode it into the workflow JSON):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GETYOUTUBETRANSCRIPT_API_KEY=sk_live_...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configure the HTTP Request node like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET https://getyoutubetranscript.com/api/v1/transcript?v={{ $json.videoId }}
Authorization: Bearer {{ $env.GETYOUTUBETRANSCRIPT_API_KEY }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feed a video ID into the node's input and it returns the transcript, title, author, and thumbnail as JSON at &lt;code&gt;$json.data.transcript&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;There's a ready-to-import workflow for this on the &lt;a href="https://getyoutubetranscript.com/blog/n8n-youtube-transcript-workflow" rel="noopener noreferrer"&gt;GetYouTubeTranscript n8n guide&lt;/a&gt; if you'd rather not wire the node up by hand.&lt;/p&gt;

&lt;h3&gt;
  
  
  Processing more than a handful of videos
&lt;/h3&gt;

&lt;p&gt;Feeding a list of video IDs straight into the HTTP Request node fires them all as fast as n8n can, which is fine for 5 videos and risky for 500 against a 60 req/min free-tier limit. Two built-in ways to pace it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;HTTP Request node → Add Option → Batching.&lt;/strong&gt; Set &lt;em&gt;Items per Batch&lt;/em&gt; and &lt;em&gt;Batch Interval (ms)&lt;/em&gt;. A batch size of 5 with a 5,000ms interval keeps you comfortably under a 60 req/min budget.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Split In Batches + Wait node.&lt;/strong&gt; Strictly sequential, no parallel burst at all. Safer if you're close to the limit or a downstream API (an LLM summarizer, say) has its own throughput ceiling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also enable &lt;strong&gt;Continue On Fail&lt;/strong&gt; on the HTTP Request node when processing a batch, since some videos will fail (private, no captions, a transient 429). Branch on the response with an IF node downstream instead of letting one bad video ID kill the whole run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach 2: the community node
&lt;/h2&gt;

&lt;p&gt;For a friendlier node UI (dropdowns instead of hand-built URLs) and AI Agent tool support, install &lt;a href="https://github.com/tubeagentkit/n8n-nodes-getyoutubetranscript" rel="noopener noreferrer"&gt;&lt;code&gt;n8n-nodes-getyoutubetranscript&lt;/code&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Settings → Community Nodes&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Install a community node&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Enter &lt;code&gt;n8n-nodes-getyoutubetranscript&lt;/code&gt; and confirm&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;(Self-hosted only — community nodes aren't available on n8n Cloud. If you're on self-hosted via npm, &lt;code&gt;npm install n8n-nodes-getyoutubetranscript&lt;/code&gt; and restart the instance instead.)&lt;/p&gt;

&lt;p&gt;The node adds one credential type (a single API key field, tested against the free &lt;code&gt;/resolve&lt;/code&gt; endpoint on save, so testing it never spends a credit) and eight operations:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Operation&lt;/th&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Get Transcript&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /transcript&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1 credit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search YouTube&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /search&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1 credit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resolve Channel&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /resolve&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Get Channel Latest Videos&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /channel/latest&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search Channel Videos&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /channel/search&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1 credit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List Channel Videos&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /channel/videos&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1 credit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List Playlist Videos&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /playlist&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1 credit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Get Credits&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /credits&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Failed and rate-limited requests are never charged.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using it as an AI Agent tool
&lt;/h3&gt;

&lt;p&gt;Because it's a proper n8n node (not just an HTTP call), you can attach it directly to an AI Agent node as a tool. The agent decides when to call it, fills in the video URL itself, and reasons over whatever comes back:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmmcc9h903pbhfd80sali.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmmcc9h903pbhfd80sali.gif" alt="AI Agent calling the GetYouTubeTranscript tool" width="720" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's useful for anything conversational: "summarize this video," "what does this channel's latest upload say about X," without you having to pre-wire which operation runs when.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example workflow
&lt;/h3&gt;

&lt;p&gt;The repo ships a ready-to-import workflow, &lt;a href="https://github.com/tubeagentkit/n8n-nodes-getyoutubetranscript/blob/main/examples/workflows/summarize-youtube-video-with-ai.json" rel="noopener noreferrer"&gt;&lt;code&gt;summarize-youtube-video-with-ai.json&lt;/code&gt;&lt;/a&gt;: a Manual Trigger sets the video URL, the GetYouTubeTranscript node fetches the transcript, an HTTP Request node sends it to OpenAI's Chat Completions API to summarize, and a Set node formats the output. Import it via n8n's &lt;strong&gt;Import from File&lt;/strong&gt;, then attach your GetYouTubeTranscript and OpenAI credentials.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which one to use
&lt;/h2&gt;

&lt;p&gt;HTTP Request node if you're on n8n Cloud (community nodes aren't supported there) or just need a quick one-off pull. The community node if you're self-hosted and want the dropdown UI, the extra operations (search, channels, playlists), or AI Agent tool support without hand-rolling the HTTP calls yourself.&lt;/p&gt;

&lt;p&gt;Full API reference, error codes, and rate limits: &lt;a href="https://getyoutubetranscript.com/docs" rel="noopener noreferrer"&gt;getyoutubetranscript.com/docs&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;Disclosure: I build GetYouTubeTranscript.&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>automation</category>
      <category>ai</category>
      <category>youtube</category>
    </item>
    <item>
      <title>Get YouTube Transcripts Programmatically: A Free, Step-by-Step Developer Guide</title>
      <dc:creator>pantdeepakk5</dc:creator>
      <pubDate>Sun, 13 Sep 2026 08:30:26 +0000</pubDate>
      <link>https://dev.to/deepakpant/get-youtube-transcripts-programmatically-a-free-step-by-step-developer-guide-557b</link>
      <guid>https://dev.to/deepakpant/get-youtube-transcripts-programmatically-a-free-step-by-step-developer-guide-557b</guid>
      <description>&lt;p&gt;There's no official YouTube transcript API. If you've ever needed a video's spoken text - for a RAG pipeline, a content research tool, an AI agent, or just to skim a 40-minute talk in 30 seconds - you've probably hit that wall.&lt;/p&gt;

&lt;p&gt;Here's the free, step-by-step way to do it, with real requests you can run right now.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Get a free API key (no card required)
&lt;/h2&gt;

&lt;p&gt;Sign up at &lt;a href="https://www.getyoutubetranscript.com" rel="noopener noreferrer"&gt;getyoutubetranscript.com&lt;/a&gt; (Google sign-in) and grab a key from your dashboard, or provision one straight from a script/agent with no browser at all:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Step 1: request a one-time code&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://www.getyoutubetranscript.com/api/v1/signup &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"email": "you@example.com"}'&lt;/span&gt;

&lt;span class="c"&gt;# Step 2: verify it, get your key back&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://www.getyoutubetranscript.com/api/v1/signup/verify &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"email": "you@example.com", "otp": "123456"}'&lt;/span&gt;
&lt;span class="c"&gt;# =&amp;gt; { "success": true, "api_key": "sk_live_..." }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Either way you land with &lt;strong&gt;100 free credits&lt;/strong&gt;, 1 credit = 1 request, no expiry countdown, no card on file.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Fetch a transcript
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://www.getyoutubetranscript.com/api/v1/transcript?v=dQw4w9WgXcQ"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer sk_live_xxxxxxxxxxxx"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"video_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dQw4w9WgXcQ"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"language_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"author_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"transcript"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"We're no strangers to love..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"word_count"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1842&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;v&lt;/code&gt; takes a raw video ID or a full URL - whichever's easier to pass around. Same call in Node:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&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="s1"&gt;https://www.getyoutubetranscript.com/api/v1/transcript?v=dQw4w9WgXcQ&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;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &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;YT_API_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&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;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;}&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&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;data&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://www.getyoutubetranscript.com/api/v1/transcript&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;v&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dQw4w9WgXcQ&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;API_KEY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;transcript&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Search YouTube itself
&lt;/h2&gt;

&lt;p&gt;Same key, a different endpoint - useful when you don't have a video ID yet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://www.getyoutubetranscript.com/api/v1/search?q=rust+async&amp;amp;type=video&amp;amp;limit=10"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer sk_live_xxxxxxxxxxxx"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns &lt;code&gt;video_results&lt;/code&gt; (title, link, videoId, channel, views, published_date, description) or, with &lt;code&gt;type=channel&lt;/code&gt;, matching channels instead. Pass the response's &lt;code&gt;continuation_token&lt;/code&gt; back as &lt;code&gt;page_token&lt;/code&gt; to page through more results.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Pull a whole channel
&lt;/h2&gt;

&lt;p&gt;Two ways depending on whether a human or a script is driving:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No code, no signup&lt;/strong&gt;: &lt;a href="https://www.getyoutubetranscript.com/youtube-channel-transcripts" rel="noopener noreferrer"&gt;/youtube-channel-transcripts&lt;/a&gt; - paste a channel URL/@handle, pick up to 10 videos, download every transcript as one &lt;code&gt;.txt&lt;/code&gt;. Free, capped at 10 per batch since it's proxying real scraping cost with no account behind it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scripted / more than 10&lt;/strong&gt;: the same metered API, uncapped.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List a channel's uploaded videos, paginated&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://www.getyoutubetranscript.com/api/v1/channel/videos?channel=@channelname"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer sk_live_xxxxxxxxxxxx"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"videos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"abc123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"length"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10:37"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"published_time"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3 days ago"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"has_more"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"continuation_token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"opaque-token-pass-this-back-for-the-next-page"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Loop &lt;code&gt;video_id&lt;/code&gt;s through &lt;code&gt;/api/v1/transcript&lt;/code&gt; and you've got a full-channel export. There's also &lt;code&gt;/api/v1/channel/search&lt;/code&gt; (search &lt;em&gt;inside&lt;/em&gt; one channel) and a free &lt;code&gt;/api/v1/channel/latest&lt;/code&gt; for the home-tab upload shelf.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Whole playlists
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;/api/v1/playlist?list=&amp;lt;playlist_id&amp;gt;&lt;/code&gt; works the same way - paginated, same &lt;code&gt;continuation_token&lt;/code&gt; convention, one call per page.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Bonus: skip the code entirely, give it to an AI agent
&lt;/h2&gt;

&lt;p&gt;All of the above is also exposed as an &lt;strong&gt;MCP server&lt;/strong&gt; (&lt;code&gt;https://www.getyoutubetranscript.com/api/mcp&lt;/code&gt;), so Claude, Cursor, or any MCP-compatible client can call these tools directly instead of you writing the fetch calls. It supports both a plain API key and full OAuth 2.1 (dynamic client registration), so a client can connect without you ever pasting a secret into it. Example prompt once connected: &lt;em&gt;"search this channel's videos for anything about pricing and summarize what they said."&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Rate limits &amp;amp; what's next
&lt;/h2&gt;

&lt;p&gt;Free tier: 60 requests/min, 100 credits total. Once you outgrow that, it's &lt;strong&gt;$5/month for 1,000 credits&lt;/strong&gt; (or $4.50/mo billed annually), 200-300 req/min depending on plan - no feature gating, the full API is available from the free tier on.&lt;/p&gt;

&lt;p&gt;Docs: &lt;a href="https://www.getyoutubetranscript.com/docs" rel="noopener noreferrer"&gt;getyoutubetranscript.com/docs&lt;/a&gt;&lt;br&gt;
MCP + skill repos: &lt;a href="https://github.com/tubeagentkit" rel="noopener noreferrer"&gt;github.com/tubeagentkit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you build something with this, I'd genuinely like to see it - drop a comment.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>api</category>
      <category>youtube</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
