To get video transcripts in n8n, send the video link to Supadata’s transcript API with an HTTP Request node, then clean the reply in a Code node. It takes YouTube, TikTok, Instagram, X and Facebook links, and it’s free for 100 credits a month. Ask for a language, add a short wait loop for videos over 20 minutes, and have the Code node say why a transcript came back empty.
This post contains affiliate links. If you sign up through one, I earn a commission at no extra cost to you. I only point to tools I actually use.

The review videos I never turned into posts
I film product reviews for my YouTube channel. Before the transcripts showed up in a workflow on their own, the words stayed in the videos. I just didn’t do blog posts.
I found Supadata in Nate Herk’s free AI Automation Society community on Skool, and I haven’t used anything else since. Now it sits inside two of my workflows. One turns a YouTube review into a blog post draft. The other turns a TikTok I share from my phone into a blog idea. I’m still on the free plan, I get a lot out of it, and I’ll happily pay when I outgrow it.
What does Supadata do in an n8n workflow?
Supadata turns a video link into text. You send it the link, and it sends back the spoken words, either as one block of plain text or as timestamped chunks. If the video already has captions, it uses those. If it doesn’t, it can transcribe the audio with AI instead.
In n8n there’s no built-in node for transcripts, so the workflow calls Supadata’s API. Supadata also publishes its own community node, n8n-nodes-supadata, and its readme lists YouTube operations. My workflows use the plain HTTP Request node, which reaches every platform the API covers:
- YouTube
- TikTok
- X (Twitter)
- A public link to a video or audio file, up to 750 MB and 12 hours long
Who is this setup for?
This is for you if a workflow of yours needs the words from a video: turning reviews into posts, pulling quotes for social, writing show notes, or summarizing a creator’s video before you decide to watch it. It’s also for you if you already use n8n and want to add transcripts without learning a whole new tool.
Skip it if any of these sounds like you:
- You need one transcript, once. YouTube has a Show transcript button on videos with captions. Copy it and move on.
- You don’t use n8n or another automation tool. The point here is transcripts that arrive inside a workflow without you touching them.
What do you need to get video transcripts in n8n?
- n8n. Cloud or self-hosted. Mine runs on a Hostinger VPS I set up with the one-click template.
- A Supadata account and API key. The free plan gives you 100 credits a month at 1 request per second, no card needed. Paid plans start at $5 a month billed yearly for 300 credits, then $17 a month for 3,000.
- A video link in your workflow. From a form, a sheet, a webhook, an Airtable row, wherever your links already live.
Here’s what a transcript costs in credits, from Supadata’s pricing page:
| What you ask for | Mode setting | Credit cost |
|---|---|---|
| A video that already has captions | native or auto | 1 credit per transcript |
| A video with no captions, transcribed by AI | generate, or auto falling back | 2 credits per minute of video |
| Checking on a long video’s transcript job | (job lookup) | Free |
On the free plan, 100 credits covers 100 captioned videos, or about 50 minutes of AI transcription.
How does the Supadata request work in n8n?
It’s one GET request with your key in a header. The URL carries the video link and three settings: text=true for one block of plain text, mode=auto for captions first and AI as the backup, and lang=en so it doesn’t hand you a different language.
Before you open n8n, test your key in a terminal:
curl 'https://api.supadata.ai/v1/transcript?url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DYOUR_VIDEO_ID&text=true&mode=auto&lang=en' \
-H 'x-api-key: YOUR_SUPADATA_KEY'
Then set up the HTTP Request node in n8n:
- Method: GET
- Authentication: Generic Credential Type, then Header Auth. The header name is
x-api-keyand the value is your key. - Settings tab: set On Error to Continue, so a failed request still reaches your Code node with the reason attached.
- URL: switch the field to Expression, then paste this, with your video link field in place of
videoUrl:
https://api.supadata.ai/v1/transcript?url={{ encodeURIComponent($json.videoUrl) }}&text=true&mode=auto&lang=en
Supadata answers in one of four ways, and your workflow has to handle all of them:
| What came back | What it means | What to do |
|---|---|---|
content, lang, availableLangs | The transcript | Clean it and keep going |
jobId only | The video is over 20 minutes, so it’s transcribing in the background | Wait, then ask for the job’s result |
Status 206, transcript-unavailable | There’s nothing to transcribe | Flag it, or fall back to the caption |
Status 429, limit-exceeded | You’re out of credits for the month | Wait for the reset or upgrade |

How do you handle long videos?
Add a wait loop after the request. An IF node checks for a job ID with {{ !!$json.jobId }}. If there is one, a Wait node pauses 15 seconds and a second HTTP Request asks for the result at https://api.supadata.ai/v1/transcript/ plus the job ID. Another IF node sends it back around while the status is still queued or active. I cap mine at 16 checks, which is about 4 minutes. Checking a job doesn’t cost credits, and Supadata keeps the result for an hour.
How do you clean the transcript?
A Code node right after the request (or after the wait loop) turns the reply into one tidy field, and names the problem when there’s no transcript:
// Clean Transcript
// Code node, JavaScript, Mode: Run Once for Each Item
// Made with the Transcript Setup Builder on jen8n.com
const r = $json;
const ASKED_LANG = 'en'; // English
const MAX_CHECKS = 16;
const clean = (s) => String(s == null ? '' : s).replace(/\s+/g, ' ').trim();
// 1. Did Supadata send back an error?
// A 206 arrives as a normal item: { error: 'transcript-unavailable', message, details }.
// A 429 or other failure arrives as an error object, because On Error is set to Continue.
const err = r.error;
const errText = typeof err === 'string'
? [err, r.message, r.details].filter((v) => typeof v === 'string').join(' ')
: (err ? [err.message, err.description, err.error, err.details].filter((v) => typeof v === 'string').join(' ') : '');
const httpCode = (err && typeof err === 'object') ? String(err.httpCode || err.status || err.statusCode || '') : '';
let reason = '';
if (r.status === 'failed') {
reason = 'Job failed: Supadata gave up on this video.';
} else if (r.status === 'queued' || r.status === 'active') {
const jobId = $('Get Transcript').first().json.jobId || '';
reason = 'Still transcribing after ' + MAX_CHECKS + ' checks. Fetch job ' + jobId + ' again later, Supadata keeps the result for 1 hour.';
} else if (httpCode === '429' || /\b429\b|limit-exceeded/i.test(errText)) {
reason = 'Out of credits: Supadata said limit-exceeded (429).';
} else if (httpCode === '206' || /transcript-unavailable/i.test(errText)) {
reason = 'No transcript available for this video.';
} else if (err) {
reason = 'Supadata request failed: ' + (clean(errText) || 'no error message');
}
// 2. Turn the content into one clean string (works for text=true and for chunks)
const chunks = Array.isArray(r.content) ? r.content : null;
const transcript = clean(chunks ? chunks.map((c) => (c && c.text) || '').join(' ') : r.content);
if (!reason && (r.lang === 'none' || !transcript)) {
reason = 'No transcript available for this video.';
}
// 3. Did it come back in the language you asked for?
let warning = '';
if (!reason && ASKED_LANG && r.lang && r.lang !== ASKED_LANG) {
warning = 'Asked for ' + ASKED_LANG + ' but got ' + r.lang + '.';
}
const out = {
transcript: reason ? '' : transcript,
charCount: 0,
lang: r.lang || '',
error: reason,
warning: warning,
hasTranscript: !reason,
source: reason ? 'none' : 'supadata',
};
// 4. No transcript: keep going. hasTranscript is false and error says why,
// so put an IF on hasTranscript after this node.
out.charCount = out.transcript.length;
return { json: out };
The fixes Claude caught in my workflows
I build my workflows with Claude Code, and it caught three of these before I ever noticed them. Every one is baked into the Code node above and into the generator below.
- An Arabic transcript for an English review. My request didn’t ask for a language, and Supadata returns the first one available when you don’t. One product review came back in Arabic. Adding
lang=enfixed it. - Long videos marked as “no transcript.” My first version never checked back on a job ID, so a long video would have come out empty even with plenty of talking in it. The wait loop fixed that.
- Out of credits, reported as “no transcript.” In early October my workflow sent me two “No Transcript” emails. Claude traced both to a 429 from Supadata. I’d used all 100 free credits for the month, so now the Code node says out of credits instead.
Get the generator
My setup is built around my own workflows: English only, YouTube links in one, TikTok links in the other. Yours probably looks different. The generator asks about your setup instead: where your videos come from, which field holds the link, the language, whether to pay for AI on videos without captions, and what should happen when there’s no transcript.
Then it gives you the HTTP Request settings, the wait loop and the Code node for your answers, a prompt you can paste into Claude Code or any AI chat to build it for you, or both.
What it doesn’t do

It doesn’t always hear the talking. On one of my YouTube reviews, a fresh upload where I talk the whole time, Supadata’s AI came back with no speech. So my YouTube workflow has a field where I can paste a transcript by hand, and it skips Supadata when that field is filled.
It doesn’t give you a transcript for a video with no words. A TikTok with only text on screen or a trending sound comes back as unavailable. Your workflow has to decide what to do next, which is why the generator asks.
The AI path ignores your language setting. Supadata’s docs say lang is ignored when the mode is set to generate. Set mode=native if you need a specific language and never want to pay for AI.
It doesn’t stay free forever if you use it a lot. I run out of credits some months.
Frequently asked questions
Can n8n get YouTube transcripts?
Yes, through an API. n8n has no built-in transcript node, so you call a transcript service like Supadata with an HTTP Request node. You send the YouTube link and get the spoken words back as text.
Is Supadata free?
Supadata has a free plan with 100 credits a month and no card required. A captioned transcript costs 1 credit, and AI transcription costs 2 credits per minute of video. Paid plans start at $5 a month billed yearly for 300 credits.
Does Supadata work with TikTok and Instagram?
Yes. Supadata’s transcript endpoint takes YouTube, TikTok, Instagram, X and Facebook links, plus public links to video or audio files. I use it for YouTube and TikTok in my own workflows.
Why did my transcript come back in the wrong language?
Supadata returns the first available language when you don’t ask for one. Add lang=en, or your language’s two-letter code, to the request URL. On the AI transcription path the language setting is ignored.
What happens with videos longer than 20 minutes?
Supadata sends back a job ID instead of the transcript. Your workflow waits, then asks for the result with the job ID until the status says completed or failed. Checking a job costs no credits, and the result stays available for one hour.
Is there a Supadata node for n8n?
Yes. Supadata publishes a community node called n8n-nodes-supadata, and its readme lists YouTube operations. The plain HTTP Request node works on every platform the API covers, which is what I use.
Try it yourself
To get video transcripts in n8n, send the link to Supadata with an HTTP Request node and ask for your language. Wait on long videos, and let a Code node name the problem when a transcript comes back empty. Grab a free key, run the curl test, then let the generator write the rest for your setup.
A tool I built
Porch Pile
Track your whole Amazon Influencer operation, every product, video, and brand deal, so one glance tells you what to film next.
Start your pile →I run an affiliate program on the tools I build. Approved affiliates earn 20% on what their referrals pay, for up to a year. US only for now. See the program →
Related reading
- How I Turn a YouTube Video Into a Blog Post With n8n
- n8n TikTok Automation That Turns a Share Into a Blog Idea
- How I Turn a YouTube Video Into Shorts Without Editing
- n8n Error Workflow: How I Stop Finding Out Days Later
Subscribe if you haven’t yet, and go turn those old videos into something you can read.
