This workflow corresponds to n8n.io template #4825 — we link there as the canonical source.
This workflow follows the Agent → Form Trigger 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 →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "42653f91-fb17-48b0-b999-9faa8b6b310e",
"name": "YouTube Keyword Form",
"type": "n8n-nodes-base.formTrigger",
"position": [
-2688,
96
],
"parameters": {
"options": {},
"formTitle": "Youtube Keywords",
"formFields": {
"values": [
{
"fieldLabel": "Search As You Want To See"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "9593bac8-e21c-4918-ab6f-1918bf170c6c",
"name": "Start YouTube Video Scraper",
"type": "n8n-nodes-base.httpRequest",
"position": [
-2480,
96
],
"parameters": {
"url": "https://api.brightdata.com/datasets/v3/trigger",
"method": "POST",
"options": {},
"jsonBody": "={\n \"input\": [\n {\n \"keyword\": \"{{ $json['Search As You Want To See'] }}\",\n \"num_of_posts\": \"{{ $json['numOfPosts'] || 2 }}\"\n \n }\n ],\n \"custom_output_fields\": [\n \"url\",\n \"title\",\n \"youtuber\",\n \"youtuber_md5\",\n \"video_url\",\n \"video_length\",\n \"likes\",\n \"views\",\n \"date_posted\",\n \"description\",\n \"num_comments\",\n \"subscribers\",\n \"music\",\n \"video_id\",\n \"channel_url\",\n \"preview_image\",\n \"discovery_input\",\n \"shortcode\",\n \"verified\",\n \"handle_name\",\n \"is_sponsored\",\n \"related_videos\",\n \"quality_label\",\n \"post_type\",\n \"youtuber_id\",\n \"transcript\",\n \"formatted_transcript\",\n \"hashtags\",\n \"tags\",\n \"next_recommended_videos\",\n \"recommended_videos\",\n \"transcript_language\",\n \"chapters\",\n \"timestamp\"\n \n ]\n}",
"sendBody": true,
"sendQuery": true,
"sendHeaders": true,
"specifyBody": "json",
"queryParameters": {
"parameters": [
{
"name": "dataset_id",
"value": "gd_lk56epmy2i5g7lzu0k"
},
{
"name": "include_errors",
"value": "true"
},
{
"name": "type",
"value": "discover_new"
},
{
"name": "discover_by",
"value": "keyword"
},
{
"name": "limit_per_input",
"value": "2"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "api_key"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "08aed791-d2a6-476a-b79e-89494a340646",
"name": "Check Scraping Progress",
"type": "n8n-nodes-base.httpRequest",
"position": [
-2240,
96
],
"parameters": {
"url": "=https://api.brightdata.com/datasets/v3/progress/{{ $json.snapshot_id }}",
"options": {},
"sendQuery": true,
"sendHeaders": true,
"queryParameters": {
"parameters": [
{
"name": "format",
"value": "json"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "your_api_key"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "2f360fbe-0a54-4509-93d8-efc167b49657",
"name": "Wait for Scraper (1 min)",
"type": "n8n-nodes-base.wait",
"position": [
-2000,
96
],
"parameters": {
"unit": "minutes",
"amount": 1
},
"typeVersion": 1.1
},
{
"id": "e40b616e-a877-4f8b-babb-c789277b4e41",
"name": "Check: Is Scraping Complete?",
"type": "n8n-nodes-base.if",
"position": [
-1712,
96
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "b9213a26-9b0d-4742-8b38-5b839da95875",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.status }}",
"rightValue": "ready"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "81a0c9e1-a80a-4335-9375-b263b2aec7ca",
"name": "Fetch Scraped Video Data",
"type": "n8n-nodes-base.httpRequest",
"position": [
-1472,
80
],
"parameters": {
"url": "=https://api.brightdata.com/datasets/v3/snapshot/{{ $json.snapshot_id }}",
"options": {},
"sendQuery": true,
"sendHeaders": true,
"queryParameters": {
"parameters": [
{
"name": "format",
"value": "json"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_TOKEN_HERE"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "611bc529-916c-4406-bc9e-add702cb5e90",
"name": "Process Videos in Batches",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-1216,
80
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "bcf171b3-343a-4278-8d55-78e01fe83f63",
"name": "Extract Video Metadata",
"type": "n8n-nodes-base.set",
"position": [
-912,
96
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "06c81576-bf82-4b6c-b90a-44ab60986d3c",
"name": "title",
"type": "string",
"value": "={{$json[\"title\"]}}"
},
{
"id": "6b99265a-6650-4383-8f27-e016aed4b90a",
"name": "channel",
"type": "string",
"value": "={{$json[\"youtuber\"]}}"
},
{
"id": "5585e63b-5008-4940-a2e4-09c18ba939bb",
"name": "description\t",
"type": "string",
"value": "={{$json[\"description\"]}}"
},
{
"id": "adf98e09-1b6c-4c19-b75f-5f8390edeec1",
"name": "url",
"type": "string",
"value": "={{ $json.url }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "0d46c22c-a622-424d-9b18-e4aae9118ae6",
"name": "Generate Blog with Claude AI",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-656,
96
],
"parameters": {
"text": "=Objective:\nWrite an engaging, clear, and informative blog post based on the provided title and description.\n\nInput Data:\n\nTitle: {{ $json.title }}\n\nDescription:{{ $json['description\t'] }}\n\nOutput Requirements:\n\nTitle: Use the provided title exactly as it is.\n\nContent Structure:\n\nIntroduction:\n\nStart with a warm, friendly opening.\n\nClearly introduce the topic.\n\nBriefly explain what the reader will learn or gain from the post.\n\nSubheadings:\n\nDivide the main content using relevant and clear subheadings.\n\nUnder each subheading, provide detailed, easy-to-read paragraphs.\n\nUse real examples or relatable insights where appropriate.\n\nContent Style & Tone:\n\nUse a friendly, conversational tone \u2014 like explaining to a curious friend.\n\nAvoid unnecessary jargon.\n\nIf complex terms are needed, explain them in simple language.\n\nKeep paragraphs short (2\u20134 sentences) for easy readability.\n\nConclusion:\n\nSummarize key points.\n\nOptionally, add a call-to-action or final thought to leave the reader with something valuable.\n\nLength Requirement:\n\nMinimum 600 words.\n\nStyle Guidelines:\n\nDo not use emojis.\n\nEnsure the content is professional yet approachable.\n\nSuitable for publication on a high-quality blog or content platform.",
"options": {},
"promptType": "define"
},
"typeVersion": 2
},
{
"id": "934e4458-4924-4e95-b5ed-3b7b85ec20ae",
"name": "Claude Sonnet 4 Model",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"position": [
-656,
448
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "claude-sonnet-4-20250514",
"cachedResultName": "Claude 4 Sonnet"
},
"options": {}
},
"credentials": {
"anthropicApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "21986def-15af-4870-a76c-984210436097",
"name": "Extract Title & Content",
"type": "n8n-nodes-base.code",
"position": [
-256,
96
],
"parameters": {
"jsCode": "// This code is for n8n's \"Code\" node to extract and clean title and content from AI Agent output\nconst items = $input.all();\nconst results = [];\n\nfor (const item of items) {\n if (item.json && item.json.output) {\n const output = item.json.output;\n\n // Split into lines and remove empty ones\n const lines = output.split('\\n').filter(line => line.trim() !== \"\");\n\n // Extract and clean title\n let title = lines.length > 0 ? lines[0].trim() : \"\";\n\n // Remove markdown characters like #, *, _, etc. from title\n title = title.replace(/^#+\\s*/, \"\"); // Remove leading # and spaces\n title = title.replace(/^\\*+\\s*/, \"\"); // Remove leading * and spaces\n title = title.replace(/^\\*+(.*?)\\*+$/, \"$1\"); // Remove surrounding ** or * from both ends\n title = title.replace(/^_+(.*?)_+$/, \"$1\"); // Remove surrounding __ or _ from both ends\n\n // Extract content\n const content = lines.slice(1).join('\\n').trim();\n\n results.push({\n json: {\n title: title,\n content: content\n }\n });\n } else {\n results.push(item);\n }\n}\n\nreturn results;\n"
},
"typeVersion": 2
},
{
"id": "079640c3-56a3-49cd-be92-d08948c78f12",
"name": "Publish to Blogger",
"type": "n8n-nodes-base.httpRequest",
"position": [
16,
96
],
"parameters": {
"url": "https://www.googleapis.com/blogger/v3/blogs/1328013863418152026/posts/",
"method": "POST",
"options": {},
"sendBody": true,
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "title",
"value": "={{ $json.title }}"
},
{
"name": "content",
"value": "={{ $json.content }}"
}
]
},
"genericAuthType": "oAuth2Api"
},
"credentials": {
"oAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "c020aa83-8eb9-4560-96cf-a6907b7c5a96",
"name": "Save to Tracking Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
256,
96
],
"parameters": {
"columns": {
"value": {
"YouTube Title": "={{ $json.title }}",
"Bloger_LiveLink": "={{ $json.url }}"
},
"schema": [
{
"id": "YouTube Title",
"type": "string",
"display": true,
"required": false,
"displayName": "YouTube Title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Bloger_LiveLink",
"type": "string",
"display": true,
"required": false,
"displayName": "Bloger_LiveLink",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 956277970,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1om6vKHTQ3-2fVENjg26DnTPneHq1FkSFWAdZW8xHqmI/edit#gid=956277970",
"cachedResultName": "Sheet2"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1om6vKHTQ3-2fVENjg26DnTPneHq1FkSFWAdZW8xHqmI",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1om6vKHTQ3-2fVENjg26DnTPneHq1FkSFWAdZW8xHqmI/edit?usp=drivesdk",
"cachedResultName": "YouTube Finder"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.6
},
{
"id": "74377661-121e-46c4-8811-aa767d7b11f9",
"name": "Wait Before Next Batch (1 min)",
"type": "n8n-nodes-base.wait",
"position": [
480,
96
],
"parameters": {
"unit": "minutes",
"amount": 1
},
"typeVersion": 1.1
},
{
"id": "ab51ff30-82ee-4ee4-9e5c-b39aefc2f734",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-3264,
-272
],
"parameters": {
"width": 528,
"height": 928,
"content": "# YouTube to Blog Automation\n\nTransform YouTube videos into engaging blog posts automatically. This workflow scrapes YouTube videos based on keywords, uses Claude AI to write professional blog content, and publishes directly to Blogger.\n\n## How it works\n\nThe workflow starts when you submit a keyword through the form. It sends a request to Bright Data to scrape YouTube videos matching that keyword. The system waits for the scraping to complete, checking every minute until the data is ready.\n\nOnce the videos are fetched, the workflow processes them in batches. For each video, it extracts the title, description, and channel information. Claude AI then generates a 600+ word blog post based on this data, using a conversational and engaging tone.\n\nThe AI-generated content is cleaned to remove markdown formatting and extract a proper title. Finally, the blog post is published to your Blogger account, and the video title along with the live blog URL is saved to Google Sheets for tracking. The workflow pauses for 1 minute between batches to avoid rate limits.\n\n## Setup steps\n\n1. **Get API credentials**: Sign up for Bright Data (YouTube scraper) and obtain your API key. Also set up OAuth for Blogger API access.\n\n2. **Configure Bright Data**: Update the \"Start YouTube Video Scraper\" node with your Bright Data dataset ID and API key. Set the number of videos to scrape per keyword.\n\n3. **Connect Blogger account**: In the \"Publish to Blogger\" node, add your Blogger OAuth credentials and replace the blog ID with your own blog ID.\n\n4. **Set up tracking sheet**: Create a Google Sheet with columns \"YouTube Title\" and \"Bloger_LiveLink\". Update the sheet ID in the \"Save to Tracking Sheet\" node.\n\n5. **Test the workflow**: Submit a test keyword, monitor the execution, and verify the blog post appears on Blogger before using in production."
},
"typeVersion": 1
},
{
"id": "f279ef50-8ab4-4161-9ecb-7a83f7adc912",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2688,
-32
],
"parameters": {
"color": 7,
"width": 304,
"height": 176,
"content": "## Form Input & Scraping\nUser submits a keyword which triggers Bright Data to scrape YouTube videos matching the search term\n"
},
"typeVersion": 1
},
{
"id": "383de876-2303-455b-9c60-287b0cd4b439",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2240,
-32
],
"parameters": {
"color": 7,
"width": 624,
"height": 176,
"content": "## Scraping Status Verification\nPolls Bright Data every minute to check if scraping is complete, looping until data is ready for processing\n"
},
"typeVersion": 1
},
{
"id": "527bc2f3-0d9d-417d-970a-c832af262aa6",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1472,
-32
],
"parameters": {
"color": 7,
"width": 352,
"content": "## Video Data Retrieval\nFetches the final scraped YouTube video data and splits it into batches for sequential AI processing\n"
},
"typeVersion": 1
},
{
"id": "eca19f5d-04fd-4f52-86c7-91051280cc00",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-912,
-32
],
"parameters": {
"color": 7,
"width": 752,
"height": 176,
"content": "## AI Content Generation\nExtracts video title and description, sends to Claude AI for professional blog generation (600+ words), then cleans the output to separate title from content\n"
},
"typeVersion": 1
},
{
"id": "fa43985e-5553-4e7f-b473-34cfe0f17083",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
16,
-32
],
"parameters": {
"color": 7,
"width": 560,
"height": 176,
"content": "## Blog Publishing & Logging\nPublishes the AI-generated blog to Blogger, saves video title and live URL to Google Sheets, then waits 1 minute before processing the next video batch\n"
},
"typeVersion": 1
}
],
"connections": {
"Publish to Blogger": {
"main": [
[
{
"node": "Save to Tracking Sheet",
"type": "main",
"index": 0
}
]
]
},
"YouTube Keyword Form": {
"main": [
[
{
"node": "Start YouTube Video Scraper",
"type": "main",
"index": 0
}
]
]
},
"Claude Sonnet 4 Model": {
"ai_languageModel": [
[
{
"node": "Generate Blog with Claude AI",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Extract Video Metadata": {
"main": [
[
{
"node": "Generate Blog with Claude AI",
"type": "main",
"index": 0
}
]
]
},
"Save to Tracking Sheet": {
"main": [
[
{
"node": "Wait Before Next Batch (1 min)",
"type": "main",
"index": 0
}
]
]
},
"Check Scraping Progress": {
"main": [
[
{
"node": "Wait for Scraper (1 min)",
"type": "main",
"index": 0
}
]
]
},
"Extract Title & Content": {
"main": [
[
{
"node": "Publish to Blogger",
"type": "main",
"index": 0
}
]
]
},
"Fetch Scraped Video Data": {
"main": [
[
{
"node": "Process Videos in Batches",
"type": "main",
"index": 0
}
]
]
},
"Wait for Scraper (1 min)": {
"main": [
[
{
"node": "Check: Is Scraping Complete?",
"type": "main",
"index": 0
}
]
]
},
"Process Videos in Batches": {
"main": [
[],
[
{
"node": "Extract Video Metadata",
"type": "main",
"index": 0
}
]
]
},
"Start YouTube Video Scraper": {
"main": [
[
{
"node": "Check Scraping Progress",
"type": "main",
"index": 0
}
]
]
},
"Check: Is Scraping Complete?": {
"main": [
[
{
"node": "Fetch Scraped Video Data",
"type": "main",
"index": 0
}
],
[
{
"node": "Check Scraping Progress",
"type": "main",
"index": 0
}
]
]
},
"Generate Blog with Claude AI": {
"main": [
[
{
"node": "Extract Title & Content",
"type": "main",
"index": 0
}
]
]
},
"Wait Before Next Batch (1 min)": {
"main": [
[
{
"node": "Process Videos in Batches",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
anthropicApigoogleSheetsOAuth2ApioAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Automatically scrape YouTube videos by keyword, generate SEO blog posts with Claude AI, and publish to Blogger with tracking.
Source: https://n8n.io/workflows/4825/ — 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.
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.
Content creators, marketers, and social media managers who want to turn high-performing YouTube videos into viral X (Twitter) threads using keywords (without manual research). Perfect for anyone looki
This template requires a self-hosted n8n instance to run.
A complete n8n automation that discovers TikTok influencers using Bright Data, evaluates their fit using Claude AI, and sends personalized outreach emails. Designed for marketing teams and brands that
Content creators, marketers, and video editors who want to automatically extract highlight clips from YouTube videos using natural language descriptions—no manual timestamp hunting required.