One HTTP Request node gets you a YouTube transcript in n8n — no OAuth, no code, and it works on any public video, not just ones you own. This page has a ready-made workflow JSON you can import directly, plus a second node showing how to ask a question about the video instead of pulling the full transcript.
n8n ships a built-in YouTube node, but it's a wrapper around the YouTube Data API v3 — channel, playlist, and video metadata operations, authenticated via OAuth as a specific YouTube account. Caption/transcript downloads through that API are scoped to videos you own or manage; there's no supported way to pull the transcript of an arbitrary third-party video through it. Community nodes exist that scrape YouTube's page directly instead of using the API, but by their own maintainers' admission that approach only keeps working as long as YouTube's page structure doesn't change, and some have gone unmaintained. The workaround the n8n community actually uses is the one on this page: a plain HTTP Request node calling a hosted transcript API.
In a browser: framefetch.net/signup — instant key, 100 free calls/month, no card. Or by API:
curl -X POST https://framefetch.net/v1/keys -H "Content-Type: application/json" \
-d '{ "email": "you@example.com" }'
# -> { "key": "ff_xxx_yyy" } (includes a small free credit)In n8n's canvas, add an HTTP Request node and set it up like this:
| Field | Value |
|---|---|
| Method | POST |
| URL | https://framefetch.net/v1/extract |
| Send Headers | on — Authorization: Bearer ff_xxx_yyy |
| Send Body | on — JSON, "Using JSON" mode |
| JSON body | { "url": "<video URL>", "fields": ["transcript"] } |
Run the node once and open its output pane — transcript.text is the transcript, ready to feed into a Set node, an AI node, a Slack message, or anywhere else in your workflow.
This is a complete, importable n8n workflow: a Manual Trigger feeding two HTTP Request nodes — one pulling the full transcript, one asking a direct question about the same video and getting a grounded answer back instead. In n8n, use Import from File/URL (or paste this JSON directly onto the canvas) to load it, then replace YOUR_FRAMEFETCH_API_KEY with your real key and the example YouTube URL with your own.
{
"name": "FrameFetch - YouTube Transcript + Ask",
"nodes": [
{
"parameters": {},
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [260, 320],
"id": "b2f1a001-0000-4a11-8b11-000000000001",
"name": "When clicking 'Test workflow'"
},
{
"parameters": {
"method": "POST",
"url": "https://framefetch.net/v1/extract",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{ "name": "Authorization", "value": "Bearer YOUR_FRAMEFETCH_API_KEY" },
{ "name": "Content-Type", "value": "application/json" }
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"url\": \"https://www.youtube.com/watch?v=jNQXAC9IVRw\",\n \"fields\": [\"metadata\", \"transcript\"]\n}"
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [520, 200],
"id": "b2f1a001-0000-4a11-8b11-000000000002",
"name": "FrameFetch - Get Transcript"
},
{
"parameters": {
"method": "POST",
"url": "https://framefetch.net/v1/extract",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{ "name": "Authorization", "value": "Bearer YOUR_FRAMEFETCH_API_KEY" },
{ "name": "Content-Type", "value": "application/json" }
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={\n \"url\": \"https://www.youtube.com/watch?v=jNQXAC9IVRw\",\n \"ask\": \"What animal does the narrator point out?\"\n}"
},
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [520, 440],
"id": "b2f1a001-0000-4a11-8b11-000000000003",
"name": "FrameFetch - Ask a Question"
}
],
"connections": {
"When clicking 'Test workflow'": {
"main": [
[
{ "node": "FrameFetch - Get Transcript", "type": "main", "index": 0 },
{ "node": "FrameFetch - Ask a Question", "type": "main", "index": 0 }
]
]
}
},
"pinData": {},
"meta": {
"instanceId": "framefetch-n8n-youtube-transcript-guide"
}
}Both HTTP Request nodes use n8n's current node type (n8n-nodes-base.httpRequest, typeVersion 4.2) and the standard "Using JSON" body mode (specifyBody: "json") — the same shape n8n itself writes when you fill in the HTTP Request node's UI and export the workflow. The API key is a plain header value here for copy-paste simplicity; swap it for an n8n credential if you'd rather not paste a live key into the canvas.
The second node in the workflow above sends "ask" instead of requesting the full transcript field. FrameFetch reads the transcript server-side and returns a short, direct answer with timestamped quotes — useful when a downstream Slack message, spreadsheet row, or condition node needs one fact, not a multi-thousand-token transcript dump. See the question-answering API page for the full response shape and pricing.
Swap the url field for a TikTok, Instagram, or Reddit link and both nodes work unchanged — transcript, translation, and ask all work on those platforms too. Pinterest only returns metadata, insights, and frames from FrameFetch — it has no transcript, so the transcript node has nothing to return there. ask still works on Pinterest, though: with no transcript to read, it falls back to answering from sampled frames instead of declining (see the Pinterest video API page) — visual-only answers, no quotes, confidence capped below "high". A dedicated n8n community node, n8n-nodes-framefetch, has been built but is not yet published to npm — until it is, the HTTP Request node above is the fully-supported way to reach FrameFetch from n8n. If your agent talks MCP directly instead of n8n's HTTP node, see the MCP setup guide.
No. n8n ships a native YouTube node, but it wraps the YouTube Data API v3, which only exposes caption downloads for videos you own (via OAuth) — not arbitrary third-party videos. That's why the common pattern for transcribing someone else's YouTube (or TikTok, Instagram, Reddit) video in n8n is an HTTP Request node calling a transcript API, as shown on this page.
A community node, n8n-nodes-framefetch, has been built but is not yet published to npm as of this writing. Until it lands, the HTTP Request node shown on this page is the standard, fully-supported way to call any REST API from n8n, including FrameFetch.
Yes — swap the url field for a TikTok, Instagram, or Reddit video URL and the same two nodes work unchanged; transcript, translation, and ask all work on those four platforms. Pinterest has no transcript, so the transcript node has nothing to return there — but ask still works on Pinterest, falling back to answering from sampled frames instead of declining; expect visual-only answers with no quotes and confidence capped below "high".
Transcript is $0.0015 per audio-minute with a $0.002 minimum per call; ask is a flat $0.0075 per call. The free tier includes 100 calls a month. See the full rate card at framefetch.net/pricing.