This workflow corresponds to n8n.io template #17301 — we link there as the canonical source.
This workflow follows the Gmail → HTTP Request recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "yt17live",
"name": "Turn any YouTube video into notes and takeaways with AI",
"tags": [],
"nodes": [
{
"id": "overview",
"name": "Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1120,
0
],
"parameters": {
"width": 812,
"height": 828,
"content": "## YouTube to notes: drop in a link, get the notes\n\nSkip the video. Put a YouTube link in the config node, run it, and get a clean set of notes, a TL;DR, key takeaways and action items emailed to you, so you get the value without watching 40 minutes.\n\n### How it works\nThe config node holds the YouTube URL (and optionally what you care about). The transcript is fetched through a transcript API (this works where a plain request is blocked, because YouTube serves an empty transcript to servers). An AI Agent turns the transcript into a title, a two to three sentence TL;DR, key takeaways, structured notes and action items, and emails them to you.\n\n### Setup\n- Paste the YouTube URL, your transcript API key (Supadata has a free tier) and your delivery email into the config node.\n- Add an Anthropic credential on the chat model node and pick a model.\n- Add Gmail on the send node, then click Test workflow to run it.\n\n### Why an API and not a plain fetch\nYouTube returns an empty transcript to non-browser requests, and the free transcript sites are bot-protected. A transcript API maintains the proxy and token handling, so this stays reliable. It also does something ChatGPT cannot: fetch the transcript for you.\n\n### Customization\nSwap the Manual Trigger for a Schedule or a webhook to run it automatically, save notes to Notion or Google Docs, or feed a list of links for a batch.\n\nBuilt by **nocode.expert** \u2014 done-for-you automation and AI workflows. https://nocode.expert"
},
"typeVersion": 1
},
{
"id": "section-input",
"name": "Section: Input",
"type": "n8n-nodes-base.stickyNote",
"position": [
-256,
160
],
"parameters": {
"color": 7,
"width": 780,
"height": 624,
"content": "## 1. URL in config\nPut the YouTube URL in the config node and run. The transcript is fetched via a transcript API (Supadata) - reliable where a plain fetch is blocked."
},
"typeVersion": 1
},
{
"id": "section-summarize",
"name": "Section: Summarize",
"type": "n8n-nodes-base.stickyNote",
"position": [
560,
160
],
"parameters": {
"color": 7,
"width": 912,
"height": 624,
"content": "## 2. Summarize with an AI Agent\nThe Agent turns the transcript into a TL;DR, key takeaways, structured notes and action items. Add your Anthropic credential on the chat model node."
},
"typeVersion": 1
},
{
"id": "section-deliver",
"name": "Section: Deliver",
"type": "n8n-nodes-base.stickyNote",
"position": [
1616,
160
],
"parameters": {
"color": 7,
"width": 616,
"height": 624,
"content": "## 3. Email the notes\nThe notes are emailed to you. Add Notion or Google Docs to keep a library, or a Schedule trigger to automate."
},
"typeVersion": 1
},
{
"id": "when-clicking-test-workflow",
"name": "When clicking Test workflow",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-176,
560
],
"parameters": {},
"typeVersion": 1
},
{
"id": "set-config-video-url-key-email",
"name": "Set config: video URL, key & email",
"type": "n8n-nodes-base.set",
"position": [
128,
560
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "a1",
"name": "youtubeUrl",
"type": "string",
"value": "https://www.youtube.com/watch?v=R9c_JQrEtu8"
},
{
"id": "a2",
"name": "focus",
"type": "string",
"value": ""
},
{
"id": "a3",
"name": "supadataApiKey",
"type": "string",
"value": ""
},
{
"id": "a4",
"name": "email",
"type": "string",
"value": "you@example.com"
},
{
"id": "a5",
"name": "maxChars",
"type": "string",
"value": "45000"
},
{
"id": "ak",
"name": "anthropicKey",
"type": "string",
"value": ""
},
{
"id": "am",
"name": "model",
"type": "string",
"value": "claude-haiku-4-5"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "fetch-transcript-supadata",
"name": "Fetch transcript (Supadata)",
"type": "n8n-nodes-base.httpRequest",
"position": [
624,
560
],
"parameters": {
"url": "=https://api.supadata.ai/v1/youtube/transcript?text=true&url={{ encodeURIComponent($('Set config: video URL, key & email').first().json.youtubeUrl) }}",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "x-api-key",
"value": "={{ $('Set config: video URL, key & email').first().json.supadataApiKey }}"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "build-notes-prompt",
"name": "Build notes prompt",
"type": "n8n-nodes-base.code",
"position": [
816,
560
],
"parameters": {
"jsCode": "const cfg = $('Set config: video URL, key & email').first().json;\nconst focus = cfg.focus || '';\nlet transcript = $json.content;\nif (Array.isArray(transcript)) transcript = transcript.map((s) => s.text).join(' ');\ntranscript = String(transcript || '').slice(0, Number(cfg.maxChars) || 45000);\nconst schema = { type: 'object', additionalProperties: false, required: ['title','tldr','key_takeaways','notes','action_items'], properties: {\n title: { type: 'string' }, tldr: { type: 'string' },\n key_takeaways: { type: 'array', items: { type: 'string' } },\n notes: { type: 'string' }, action_items: { type: 'array', items: { type: 'string' } } } };\nconst system = 'You are an expert note-taker. Turn this YouTube transcript into notes a busy person can act on WITHOUT watching the video. Be faithful to the transcript; do not invent facts not present.';\nconst user = 'Return: title (best guess of the video topic), tldr (2-3 sentences), key_takeaways (5-8 crisp bullets), notes (well-structured markdown with subheadings), action_items (concrete things to do, or empty).'\n + (focus ? ' The reader especially cares about: ' + focus + '. Weight the notes toward that.' : '')\n + '\\n\\n=== TRANSCRIPT ===\\n' + transcript;\nreturn [{ json: { body: {\n model: cfg.model || 'claude-haiku-4-5', max_tokens: 2000, system,\n messages: [{ role: 'user', content: user }],\n output_config: { format: { type: 'json_schema', schema } },\n} } }];"
},
"typeVersion": 2
},
{
"id": "format-the-notes",
"name": "Format the notes",
"type": "n8n-nodes-base.code",
"position": [
1696,
560
],
"parameters": {
"jsCode": "const cfg = $('Set config: video URL, key & email').first().json;\nconst blocks = $json.content || [];\nlet out = {};\ntry { out = JSON.parse((blocks.find((b) => b.type === 'text') || {}).text || '{}'); } catch (e) {}\nconst esc = (s) => String(s || '').replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\nconst md = (s) => esc(s)\n .replace(/^### (.*)$/gm, '<h4>$1</h4>').replace(/^## (.*)$/gm, '<h3>$1</h3>').replace(/^# (.*)$/gm, '<h3>$1</h3>')\n .replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>')\n .replace(/^\\s*[-*] (.*)$/gm, '<li>$1</li>').replace(/(<li>[\\s\\S]*?<\\/li>)/g, '<ul>$1</ul>')\n .replace(/\\n{2,}/g, '<br><br>').replace(/\\n/g, '<br>');\nconst list = (a) => Array.isArray(a) && a.length ? '<ul>' + a.map((x) => '<li>' + esc(x) + '</li>').join('') + '</ul>' : '';\nconst html =\n '<div style=\"font-family:system-ui,Arial;max-width:760px;margin:0 auto;text-align:left\">' +\n '<h2>' + esc(out.title) + '</h2>' +\n (out.tldr ? '<p style=\"font-size:15px;color:#333\"><strong>TL;DR:</strong> ' + esc(out.tldr) + '</p>' : '') +\n (out.key_takeaways && out.key_takeaways.length ? '<h3>Key takeaways</h3>' + list(out.key_takeaways) : '') +\n (out.notes ? '<h3>Notes</h3><div>' + md(out.notes) + '</div>' : '') +\n (out.action_items && out.action_items.length ? '<h3>Action items</h3>' + list(out.action_items) : '') +\n '<p style=\"color:#999;font-size:12px;margin-top:20px\">Generated from the video transcript via nocode.expert.</p></div>';\nreturn [{ json: { title: out.title || 'Video notes', html, deliverTo: cfg.email } }];"
},
"typeVersion": 2
},
{
"id": "email-the-notes",
"name": "Email the notes",
"type": "n8n-nodes-base.gmail",
"position": [
1904,
560
],
"parameters": {
"sendTo": "={{ $('Format the notes').first().json.deliverTo }}",
"message": "={{ $('Format the notes').first().json.html }}",
"options": {},
"subject": "=Notes: {{ $('Format the notes').first().json.title }}"
},
"typeVersion": 2.1
},
{
"id": "summarize-http-anthropic",
"name": "Summarize with Claude",
"type": "n8n-nodes-base.httpRequest",
"position": [
1136,
560
],
"parameters": {
"url": "https://api.anthropic.com/v1/messages",
"method": "POST",
"options": {},
"jsonBody": "={{ JSON.stringify($json.body) }}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "x-api-key",
"value": "={{ $('Set config: video URL, key & email').first().json.anthropicKey }}"
},
{
"name": "anthropic-version",
"value": "2023-06-01"
},
{
"name": "content-type",
"value": "application/json"
}
]
}
},
"typeVersion": 4.2
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"executionOrder": "v1"
},
"versionId": "1c0227dd-04b6-4442-8c41-7a5f4f356821",
"nodeGroups": [],
"connections": {
"Format the notes": {
"main": [
[
{
"node": "Email the notes",
"type": "main",
"index": 0
}
]
]
},
"Build notes prompt": {
"main": [
[
{
"node": "Summarize with Claude",
"type": "main",
"index": 0
}
]
]
},
"Summarize with Claude": {
"main": [
[
{
"node": "Format the notes",
"type": "main",
"index": 0
}
]
]
},
"Fetch transcript (Supadata)": {
"main": [
[
{
"node": "Build notes prompt",
"type": "main",
"index": 0
}
]
]
},
"When clicking Test workflow": {
"main": [
[
{
"node": "Set config: video URL, key & email",
"type": "main",
"index": 0
}
]
]
},
"Set config: video URL, key & email": {
"main": [
[
{
"node": "Fetch transcript (Supadata)",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow takes a YouTube URL, fetches the video transcript via Supadata, summarizes it into a TL;DR, takeaways, notes, and action items using Anthropic Claude, and emails the formatted results to you via Gmail. Runs manually when you click Test workflow. Reads the YouTube…
Source: https://n8n.io/workflows/17301/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Gmail Workflow. Uses gmail, googleCalendar, executeWorkflowTrigger, whatsApp. Event-driven trigger; 61 nodes.
This workflow ingests proof-of-delivery and completion documents from Gmail or a webhook, extracts key fields with an OpenRouter vision model, reconciles them against Google Sheets dispatch data, arch
Splitout Code. Uses manualTrigger, httpRequest, stickyNote, splitOut. Event-driven trigger; 46 nodes.
Automate CSV imports into HubSpot without the mess. Powered by n8n. Supercharged by Pollup AI.
Echo Brand Voice Analysis (Processor) - TASK-074 Dec 10 Fix. Uses formTrigger, httpRequest, executeWorkflowTrigger, moveBinaryData. Event-driven trigger; 40 nodes.