The short answer: the most direct setup for YouTube transcripts in n8n is one HTTP Request node calling the YouTube Transcript Scraper actor through Apify's run-sync-get-dataset-items endpoint: video IDs in, transcript JSON out, in the same workflow step. No YouTube Data API key, no scraping nodes to babysit. Because every video comes back as its own row with a success field, a single IF node splits transcripts from captionless videos, and a bad ID becomes a row on the false branch instead of a failed execution. You need an Apify account (the free tier works) and its API token.
What you'll build
Four nodes, no code:
- Trigger: whatever starts your workflow (a schedule, a webhook, a new row in a sheet).
- HTTP Request: runs the transcript actor and returns one item per video.
- IF: routes on
success. Transcripts go one way, failures the other. - Your destination: Google Sheets, Notion, a vector store, another webhook.
Step 1: the HTTP Request node
Add an HTTP Request node and configure it like this:
- Method:
POST - URL:
https://api.apify.com/v2/acts/apihq~youtube-transcript-scraper/run-sync-get-dataset-items- Authentication: send your Apify token either as a header (
Authorization: Bearer YOUR_APIFY_TOKEN) or as a?token=query parameter. The header keeps the token out of execution logs, so prefer it. - Body (JSON):
{
"videoIds": ["jNQXAC9IVRw", "dQw4w9WgXcQ", "00000000000"],
"language": "en",
"metadata": true
}run-sync-get-dataset-items is an official Apify API endpoint that starts the actor, waits for it to finish, and responds with the dataset items directly, which is exactly what n8n wants: each video becomes one item flowing out of the node.
One caveat: the sync endpoint has a hard wait limit of about five minutes. Batches of up to 50 IDs normally finish well inside it (each video has its own 30-second deadline), but if you push big batches on slow days, switch the node to the async pattern (call /runs, then fetch the dataset) or use the Apify community node below, which handles the waiting for you.
Step 2: branch on success with an IF node
Every item the node emits carries a success field: success: true rows carry the transcript; success: false rows carry a machine-readable code instead. Add an IF node:
- Condition: Boolean →
{{ $json.success }}istrue - True branch: your destination. The transcript is in
{{ $json.transcript }}as time-coded segments, plus title and channel in{{ $json.metadata }}. - False branch: log or ignore. The row carries
{{ $json.code }}(NO_CAPTIONSfor videos without captions,PLAYABILITYfor private/deleted ones), so you can even branch further. These rows were not billed.
This is the part most n8n YouTube tutorials skip: on real video lists, some videos have no fetchable captions. With this contract that's not an error state to catch. It's a row on the false branch, and it costs $0.0000.
Alternative: the Apify community node
If you prefer a dedicated node over raw HTTP, install Apify's community node (search for Apifyin n8n's nodes panel, or install @apify/n8n-nodes-apify on self-hosted). Use its Run Actor and get dataset items operation, point it at apihq/youtube-transcript-scraper, and paste the same JSON input. It waits for the run and emits dataset items exactly like the HTTP approach, plus it stores your token as a proper n8n credential.
Whole channels: chain two actors
To transcribe a channel instead of a hand-picked list, put a second HTTP Request node in front, calling apihq~youtube-channel-scraper the same way with { "channelUrl": "@mkbhd", "maxResults": 100 }. It emits one row per video ($0.50 per 1,000); collect the video_id values with an Item Lists / Aggregate node into batches of up to 50, and feed them to the transcript node. Two nodes take you from channel to transcripts, still with no code.
What it costs
| Step | Price |
|---|---|
| Listing 100 channel videos | $0.05 |
| 90 delivered transcripts (say 10 videos had no captions) | $0.27 |
| The 10 captionless videos | $0.00 |
| A transcribed 100-video channel | $0.32 |
Billing happens on your existing Apify account; n8n never sees a card. To cap a run's spend, set a limit in Apify's Run Limits panel.
When n8n is the wrong tool
If you're processing thousands of videos on a schedule, a ten-line Python script against the same actor (see our Python guide) will be easier to monitor than a giant n8n execution list. n8n shines when transcripts are one step in a broader automation, like a content pipeline, a Slack digest, or a research sheet, not as a bulk ETL engine.