This workflow follows the Agent → Datatable 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 →
{
"name": "Daily Viral Content Radar Pro (AnyAPI)",
"nodes": [
{
"parameters": {
"formTitle": "Onboard Your Website",
"formDescription": "Enter your website and we will figure out your niche and steer the daily content radar toward it.",
"formFields": {
"values": [
{
"fieldLabel": "Website URL",
"placeholder": "https://yoursite.com",
"requiredField": true
}
]
},
"options": {}
},
"id": "48649ad9-d18f-4417-b9cf-89a69feb0907",
"name": "Onboard Your Website",
"type": "n8n-nodes-base.formTrigger",
"typeVersion": 2.6,
"position": [
224,
288
]
},
{
"parameters": {
"method": "POST",
"url": "https://api.getanyapi.com/v1/run/web.scrape",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={ \"url\": \"{{ $json['Website URL'] }}\" }",
"options": {}
},
"id": "1a458c5b-7247-41de-8383-99c3d281c647",
"name": "AnyAPI: Scrape Website",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
608,
288
],
"retryOnFail": true,
"maxTries": 3,
"waitBetweenTries": 5000
},
{
"parameters": {
"promptType": "define",
"text": "=Title: {{ $json.output.data.title }}\nDescription: {{ $json.output.data.description }}\n\nBody:\n{{ $json.output.data.markdown }}",
"hasOutputParser": true,
"options": {
"systemMessage": "You are a market-positioning analyst. Given the scraped text of a company's website, determine the single content niche this business should track for viral short-form content, plus defining keywords.\n\nRules:\n- niche is a short, search-friendly phrase of 2 to 4 words (e.g. 'ai automation', 'home fitness', 'personal finance'). Lowercase, no brand names, no punctuation.\n- keywords is up to 5 related search terms a creator in this niche would use. Lowercase, deduplicated, most relevant first, no brand names.\n- Base it only on the provided text. If thin, infer the most likely niche and keep keywords broad.\n- Return only the structured object."
}
},
"id": "cbec8ea2-4c96-4df7-ba3f-ad08833629c2",
"name": "Extract Niche",
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 3.1,
"position": [
1008,
288
]
},
{
"parameters": {
"model": "deepseek/deepseek-v4-pro",
"options": {}
},
"id": "e91ec53d-d096-4cb4-9530-dcb552725a49",
"name": "Niche Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"typeVersion": 1,
"position": [
944,
448
]
},
{
"parameters": {
"jsonSchemaExample": "{ \"niche\": \"ai automation\", \"keywords\": [\"n8n\", \"zapier\", \"workflow automation\", \"ai agents\", \"no-code\"] }"
},
"id": "50e8ba15-69c9-412a-a7f3-d3da60d6b69c",
"name": "Niche Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"typeVersion": 1.3,
"position": [
1168,
448
]
},
{
"parameters": {
"operation": "upsert",
"dataTableId": {
"__rl": true,
"mode": "id",
"value": "REPLACE_WITH_YOUR_DATA_TABLE_ID",
"cachedResultName": "niche_store"
},
"matchType": "allConditions",
"filters": {
"conditions": [
{
"keyName": "key",
"keyValue": "default"
}
]
},
"columns": {
"mappingMode": "defineBelow",
"matchingColumns": [
"key"
],
"value": {
"key": "default",
"niche": "={{ $json.output.niche }}",
"keywords": "={{ ($json.output.keywords || []).join(', ') }}"
},
"schema": [
{
"id": "key",
"displayName": "key",
"type": "string",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true
},
{
"id": "niche",
"displayName": "niche",
"type": "string",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": false
},
{
"id": "keywords",
"displayName": "keywords",
"type": "string",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": false
}
]
},
"options": {}
},
"id": "25b85c04-49b7-4cd9-803f-aff4c1a4ddaa",
"name": "Save Niche",
"type": "n8n-nodes-base.dataTable",
"typeVersion": 1.1,
"position": [
1440,
288
]
},
{
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 8
}
]
}
},
"id": "9e5b6f50-4fed-459a-b656-0fdb0310a7d9",
"name": "Every Morning 8AM",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
192,
864
]
},
{
"parameters": {
"operation": "get",
"dataTableId": {
"__rl": true,
"mode": "id",
"value": "REPLACE_WITH_YOUR_DATA_TABLE_ID",
"cachedResultName": "niche_store"
},
"matchType": "allConditions",
"filters": {
"conditions": [
{
"keyName": "key",
"keyValue": "default"
}
]
},
"returnAll": true
},
"id": "a8a8f018-3d10-4163-a6ed-689f928d3ec2",
"name": "Read Niche",
"type": "n8n-nodes-base.dataTable",
"typeVersion": 1.1,
"position": [
448,
864
]
},
{
"parameters": {
"jsCode": "const DEFAULT_NICHE = 'ai automation';\nconst rows = $input.all();\nconst row = rows.find(function (i) { return i.json && i.json.niche; });\nconst niche = (row && row.json && row.json.niche) || DEFAULT_NICHE;\nconst kwRaw = (row && row.json && row.json.keywords) || '';\nconst keywords = kwRaw ? String(kwRaw).split(',').map(function (s) { return s.trim(); }).filter(Boolean) : [];\nconst seen = new Set();\nconst terms = [];\nconst all = [niche].concat(keywords);\nfor (let i = 0; i < all.length; i++) { const t = all[i]; const k = String(t).toLowerCase(); if (t && !seen.has(k)) { seen.add(k); terms.push(t); } }\nconst capped = terms.slice(0, 6);\nconst orQuery = '(' + capped.join(' OR ') + ') lang:en';\nreturn [{ json: { niche: niche, keywords: keywords, terms: capped, orQuery: orQuery } }];"
},
"id": "3984cb67-c777-45af-a408-e3fb899ec9e1",
"name": "Resolve Niche",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
704,
864
]
},
{
"parameters": {
"method": "POST",
"url": "https://api.getanyapi.com/v1/run/tiktok.search_top",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={ \"query\": \"{{ $json.term }}\", \"publishTime\": \"this-week\", \"sortBy\": \"most-liked\" }",
"options": {}
},
"id": "73636f39-31be-4edf-aae7-352b20ef090f",
"name": "TikTok Top",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
1344,
720
],
"retryOnFail": true,
"maxTries": 3,
"waitBetweenTries": 5000,
"onError": "continueRegularOutput"
},
{
"parameters": {
"numberInputs": 4
},
"id": "d4be4c21-ccf1-4973-b262-08ab6fd0836d",
"name": "Combine Sources",
"type": "n8n-nodes-base.merge",
"typeVersion": 3.2,
"position": [
1712,
864
]
},
{
"parameters": {
"method": "POST",
"url": "https://api.getanyapi.com/v1/run/instagram.reels_search",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={ \"query\": \"{{ $json.term }}\", \"datePosted\": \"last-week\" }",
"options": {}
},
"id": "96eeb936-99bc-408a-a927-1038de51fd0c",
"name": "Instagram Reels",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
1344,
944
],
"retryOnFail": true,
"maxTries": 3,
"waitBetweenTries": 5000,
"onError": "continueRegularOutput"
},
{
"parameters": {
"method": "POST",
"url": "https://api.getanyapi.com/v1/run/youtube.search",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={ \"query\": \"{{ $json.term }}\", \"uploadDate\": \"this_week\", \"sortBy\": \"popular\" }",
"options": {}
},
"id": "10ec9057-c88a-4a3b-850a-ec6878ab01d0",
"name": "YouTube",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
1344,
832
],
"retryOnFail": true,
"maxTries": 3,
"waitBetweenTries": 5000,
"onError": "continueRegularOutput"
},
{
"parameters": {
"method": "POST",
"url": "https://api.getanyapi.com/v1/run/twitter.search",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={ \"query\": \"{{ $json.orQuery }} since:{{ $now.minus({ days: 7 }).toISODate() }}\", \"limit\": 15, \"queryType\": \"Top\" }",
"options": {}
},
"id": "3cb9792a-937e-467a-b441-c77c56ba4c38",
"name": "X Search",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.4,
"position": [
1344,
1056
],
"retryOnFail": true,
"maxTries": 3,
"waitBetweenTries": 5000,
"onError": "continueRegularOutput"
},
{
"parameters": {
"jsCode": "let tk = [], ig = [], yt = [], tw = [];\ntry { tk = $('TikTok Top').all(); } catch (e) {}\ntry { ig = $('Instagram Reels').all(); } catch (e) {}\ntry { yt = $('YouTube').all(); } catch (e) {}\ntry { tw = $('X Search').all(); } catch (e) {}\nconst rows = [];\nfor (let i = 0; i < tk.length; i++) { const o = (tk[i].json && tk[i].json.output) || {}; const arr = (o.data && o.data.items) || o.items || []; for (const v of arr) rows.push({ platform: 'TikTok', author: v.author || '', caption: v.caption || '', url: v.url || '', views: Number(v.views) || 0, likes: Number(v.likes) || 0 }); }\nfor (let i = 0; i < ig.length; i++) { const o = (ig[i].json && ig[i].json.output) || {}; const arr = (o.data && o.data.reels) || o.reels || []; for (const v of arr) rows.push({ platform: 'Instagram Reels', author: v.username || '', caption: v.caption || '', url: v.url || '', views: Number(v.views) || Number(v.plays) || 0, likes: Number(v.likes) || 0 }); }\nfor (let i = 0; i < yt.length; i++) { const o = (yt[i].json && yt[i].json.output) || {}; const arr = (o.data && o.data.videos) || o.videos || []; for (const v of arr) rows.push({ platform: 'YouTube', author: v.channel || '', caption: v.title || '', url: v.url || '', views: Number(v.views) || 0, likes: 0 }); }\nfor (let i = 0; i < tw.length; i++) { const o = (tw[i].json && tw[i].json.output) || {}; const arr = (o.data && o.data.items) || o.items || []; for (const v of arr) rows.push({ platform: 'X', author: (v.author && v.author.userName) || '', caption: v.text || '', url: v.url || v.twitterUrl || '', views: Number(v.viewCount) || 0, likes: Number(v.likeCount) || 0 }); }\nconst seen = new Set();\nconst deduped = [];\nfor (const r of rows) { const k = r.url || (r.platform + r.caption); if (k && !seen.has(k)) { seen.add(k); deduped.push(r); } }\nlet niche = 'your niche';\ntry { niche = $('Resolve Niche').first().json.niche || niche; } catch (e) {}\nconst stems = String(niche).toLowerCase().split(/\\s+/).filter(function (w) { return w.length >= 4; }).map(function (w) { return w.slice(0, 5); });\nfor (const r of deduped) { const hay = (String(r.caption) + ' ' + String(r.author)).toLowerCase(); let rel = 0; for (const s of stems) { if (s && hay.indexOf(s) !== -1) rel++; } r.rel = rel; }\ndeduped.sort(function (a, b) { if (b.rel !== a.rel) return b.rel - a.rel; return b.views - a.views; });\nconst top = deduped.slice(0, 30);\nconst lines = [];\nfor (let i = 0; i < top.length; i++) { const v = top[i]; lines.push((i + 1) + '. [' + v.platform + '] @' + v.author + ' - ' + (v.views || 0).toLocaleString() + ' views\\n ' + String(v.caption || '').slice(0, 160) + '\\n ' + v.url); }\nreturn [{ json: { niche: niche, generatedAt: $now.toISO(), count: top.length, videos: top, videosText: lines.join('\\n\\n') } }];"
},
"id": "9036e7c3-6462-49cb-a878-ac489c59a313",
"name": "Rank Top Viral",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1920,
864
]
},
{
"parameters": {
"promptType": "define",
"text": "=Niche: {{ $json.niche }}\n\nBelow are candidate videos from a keyword search for this niche. They are noisy: many only loosely matched and are NOT actually about the niche. Select only the genuinely on-niche ones, then analyze them.\n\n{{ $json.videosText }}",
"hasOutputParser": true,
"options": {
"systemMessage": "You are a short-form video strategist with a research tool, analyzing a niche for the user's business. You receive candidate videos that matched a keyword search for the niche, but the list is NOISY - many are off-topic viral content that only loosely matched.\n\nStep 1 (filter): discard every candidate that is not genuinely about the niche, EVEN IF it has millions of views.\n\nStep 2 (select): from the genuinely on-niche candidates, choose the best 5 to 8, ordered by a blend of topical relevance and view count. If fewer than 5 are truly on-niche, return only those - never pad with off-topic videos.\n\nStep 3 (transcribe): for your TOP 3 selected videos only, use the Deep Scrape tool to fetch the ACTUAL transcript before describing them. Call the tool ONE AT A TIME (wait for each result before the next call) with body = {\"url\": the video's url} and sku = the transcript SKU for that platform: TikTok -> tiktok.video_transcript, YouTube -> youtube.video_transcript, Instagram Reels -> instagram.reel_transcript, X -> twitter.tweet_transcript. Use at most 3 transcript calls total. If a call errors or returns empty, fall back to that video's caption.\n\nStep 4 (per selected video) write three fields:\n- whatItIs: ONE factual sentence on what the video actually shows or says, based on the TRANSCRIPT when you fetched one (otherwise the caption), so the reader understands the content without opening it.\n- whyViral: 1-2 sentences on the hook, format, emotion, or trend that made it spread.\n- steps: a concrete 3-step plan to replicate it for the user's own brand in this niche.\n\nStep 5 (landscape): also write a top-level summary - 2 to 3 sentences on what this batch reveals about the niche landscape RIGHT NOW and a concrete takeaway for a brand operating in it. Be specific, not generic.\n\nReturn only the structured object: a top-level summary string plus a videos array containing ONLY your selected videos."
}
},
"id": "fcf6bbd1-84bd-4637-9359-af5999eff57b",
"name": "Virality Analyst",
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 3.1,
"position": [
2304,
832
]
},
{
"parameters": {
"model": "deepseek/deepseek-v4-pro",
"options": {}
},
"id": "5a8d04e3-bce2-445d-b76a-b94922bcbafa",
"name": "Analyst Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"typeVersion": 1,
"position": [
2240,
1024
]
},
{
"parameters": {
"jsonSchemaExample": "{ \"summary\": \"Short-form web scraping content right now leans on 'X is dead' paradigm-shift hooks and fast tool-demo reels; for a scraping product the opening is contrarian technical takes plus 30-second walkthroughs.\", \"videos\": [ { \"platform\": \"TikTok\", \"author\": \"name\", \"url\": \"https://example.com\", \"whatItIs\": \"one factual sentence on what the video actually shows\", \"whyViral\": \"reason it spread\", \"steps\": [\"step 1\", \"step 2\", \"step 3\"] } ] }"
},
"id": "99329f9a-2108-45dc-971b-2ee137bef8f9",
"name": "Analyst Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"typeVersion": 1.3,
"position": [
2464,
1024
]
},
{
"parameters": {
"fieldToSplitOut": "output.videos",
"options": {}
},
"id": "48aedcc8-bf64-46b8-9330-470b5509e49a",
"name": "Split Out Videos",
"type": "n8n-nodes-base.splitOut",
"typeVersion": 1,
"position": [
2112,
1440
]
},
{
"parameters": {
"operation": "append",
"documentId": {
"__rl": true,
"value": "https://docs.google.com/spreadsheets/d/REPLACE_WITH_YOUR_SHEET_ID/edit",
"mode": "url"
},
"sheetName": {
"__rl": true,
"mode": "name",
"value": "Sheet1"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"Date": "={{ $now.toISODate() }}",
"Platform": "={{ $json.platform }}",
"Author": "={{ $json.author }}",
"URL": "={{ $json.url }}",
"WhyViral": "={{ $json.whyViral }}"
},
"schema": [
{
"id": "Date",
"displayName": "Date",
"type": "string",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true
},
{
"id": "Platform",
"displayName": "Platform",
"type": "string",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true
},
{
"id": "Author",
"displayName": "Author",
"type": "string",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true
},
{
"id": "URL",
"displayName": "URL",
"type": "string",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true
},
{
"id": "WhyViral",
"displayName": "WhyViral",
"type": "string",
"required": false,
"defaultMatch": false,
"display": true,
"canBeUsedToMatch": true
}
]
},
"options": {}
},
"id": "c74e343e-08cc-4cc2-a2a3-42e6a4e11c79",
"name": "Log Viral Finds",
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
2512,
1440
],
"onError": "continueRegularOutput"
},
{
"parameters": {
"jsCode": "const out = ($input.first().json.output) || {};\nconst v = out.videos || [];\nconst summary = out.summary || '';\nconst niche = $('Resolve Niche').first().json.niche;\nlet reach = {};\ntry { const cands = $('Rank Top Viral').first().json.videos || []; for (const c of cands) { if (c.url) reach[c.url] = c; } } catch (e) {}\nfunction fmt(n) { n = Number(n) || 0; if (n >= 1000000) return (n / 1000000).toFixed(1).replace(/\\.0$/, '') + 'M'; if (n >= 1000) return (n / 1000).toFixed(1).replace(/\\.0$/, '') + 'K'; return String(n); }\nlet md = '# Daily viral ' + niche + ' brief\\n\\n';\nif (summary) md += summary + '\\n\\n';\nlet total = 0; for (const x of v) { const r = reach[x.url]; if (r) total += Number(r.views) || 0; }\nmd += '**' + v.length + ' on-niche videos this week - ' + fmt(total) + ' combined views**\\n\\n';\nconst topLines = [];\nfor (let i = 0; i < v.length; i++) { const x = v[i]; const author = String(x.author || '').replace(/^@+/, ''); const r = reach[x.url] || {}; const reachStr = (r.views != null) ? (fmt(r.views) + ' views' + (r.likes ? ' - ' + fmt(r.likes) + ' likes' : '')) : ''; md += '## ' + (i + 1) + '. [' + (x.platform || '') + '] @' + author + (reachStr ? ' - ' + reachStr : '') + '\\n'; if (x.whatItIs) md += '*What it is:* ' + x.whatItIs + '\\n\\n'; md += '*Why it worked:* ' + (x.whyViral || '') + '\\n\\nReplicate:\\n'; const st = x.steps || []; for (let j = 0; j < st.length; j++) { md += '- ' + st[j] + '\\n'; } md += '\\n' + (x.url || '') + '\\n\\n'; if (i < 3) topLines.push((i + 1) + '. [' + (x.platform || '') + '] @' + author + ' - ' + (x.whatItIs || x.whyViral || '') + '\\n ' + (x.url || '')); }\nif (v.length === 0) { md += '_No genuinely on-niche viral videos surfaced today._\\n'; }\nreturn [{ json: { emailBody: md, niche: niche, topText: topLines.join('\\n\\n') || 'No on-niche videos today.' } }];"
},
"id": "100c5848-ea98-41a1-ac04-d70234512156",
"name": "Build Digest",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
240,
1440
]
},
{
"parameters": {
"sendTo": "you@example.com",
"subject": "=Daily viral {{ $json.niche }} brief - {{ $now.toFormat('LLL d') }}",
"message": "={{ $json.html }}",
"options": {}
},
"id": "37af8884-9944-4d58-aa25-705bc084e2e0",
"name": "Email the Brief",
"type": "n8n-nodes-base.gmail",
"typeVersion": 2.2,
"position": [
1504,
1440
]
},
{
"parameters": {
"promptType": "define",
"text": "=Niche: {{ $('Resolve Niche').item.json.niche }}\n\nWrite a short-form video script for the single best idea below (these are the on-niche winners selected for the user):\n\n{{ $('Build Digest').item.json.topText }}",
"options": {
"systemMessage": "You are a viral short-form scriptwriter. Pick the single highest-potential idea and write a ready-to-shoot 30 to 45 second script in Markdown: a 1-line HOOK, 3 to 5 BEATS as bullets with on-screen text and voiceover, and a CTA. Punchy, concrete, no fluff."
}
},
"id": "c8260212-a7ba-4b32-8c79-1ce24a1a86a6",
"name": "Write Script",
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 3.1,
"position": [
624,
1440
]
},
{
"parameters": {
"model": "deepseek/deepseek-v4-pro",
"options": {}
},
"id": "be9a20ab-41e1-4931-8391-814e3c39e378",
"name": "Script Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"typeVersion": 1,
"position": [
624,
1632
]
},
{
"parameters": {
"content": "## Setup - run once\nDrop in your website. We read back your niche plus the keywords your audience actually searches, and save them to steer every morning's run.",
"height": 460,
"width": 1700,
"color": 4
},
"id": "87434d1e-70a0-4c72-bc4e-95363c28399e",
"name": "Band Onboarding",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
80,
80
]
},
{
"parameters": {
"content": "## 1. Your niche\nReads the niche from onboarding (safe default if empty) and expands it into the exact search terms a creator in your space would actually use.",
"height": 600,
"width": 820,
"color": 7
},
"id": "d6e1402b-6831-4d07-924c-367d993710d5",
"name": "Band D1",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
80,
592
]
},
{
"parameters": {
"content": "## 5. Your morning brief\nOne 8am email: the landscape read, each video's reach plus why it worked plus a 3-step replicate plan, and a ready-to-shoot script.",
"height": 560,
"width": 1820,
"color": 2
},
"id": "fea18e3a-4503-4c4d-8b1d-e6ed2bed1c10",
"name": "Band D2",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
80,
1232
]
},
{
"parameters": {
"toolDescription": "Fetch the ACTUAL spoken transcript of a selected video (preferred), or extra detail about a creator or topic, before you analyze it. For a transcript, set sku to the platform's transcript SKU and body to the video's url. Use it on your top few selected videos so your analysis reflects what is really said, not just the caption.",
"method": "POST",
"url": "=https://api.getanyapi.com/v1/run/{{ $fromAI('sku', 'AnyAPI SKU to run. For a video transcript use the platform transcript SKU: tiktok.video_transcript, youtube.video_transcript, instagram.reel_transcript, or twitter.tweet_transcript. Other detail SKUs: tiktok.profile_videos, youtube.video, instagram.profile, web.scrape.', 'string') }}",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ $fromAI('body', 'JSON body for the chosen SKU. For any transcript SKU pass the video URL exactly as given: {\"url\":\"https://www.tiktok.com/@user/video/123\"}. Other examples: {\"username\":\"someuser\"}, {\"url\":\"https://...\"}.', 'json') }}",
"options": {},
"optimizeResponse": true
},
"id": "81f71622-956f-4cd1-b452-7756667b82fb",
"name": "Deep Scrape",
"type": "n8n-nodes-base.httpRequestTool",
"typeVersion": 4.4,
"position": [
2688,
1024
],
"retryOnFail": true,
"maxTries": 3,
"waitBetweenTries": 5000
},
{
"parameters": {
"fieldToSplitOut": "terms",
"options": {
"destinationFieldName": "term"
}
},
"id": "9b9f04ff-3efd-44a8-9146-b928795d6e02",
"name": "Split Terms",
"type": "n8n-nodes-base.splitOut",
"typeVersion": 1,
"position": [
1008,
864
]
},
{
"parameters": {
"jsCode": "const brief = ($('Build Digest').first().json.emailBody) || '';\nconst niche = ($('Build Digest').first().json.niche) || 'your niche';\nconst script = ($input.first().json.output) || '';\nlet md = brief + '\\n\\n---\\n\\n# Script for the top idea\\n\\n' + script;\nmd = md.replace(/\\s*[\u2014\u2013]\\s*/g, ' - ');\nfunction esc(s) { return String(s).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>'); }\nfunction inline(s) {\n s = esc(s);\n s = s.replace(/\\[([^\\]]+)\\]\\((https?:[^)\\s]+)\\)/g, '<a href=\"$2\">$1</a>');\n s = s.replace(/(^|[^\"=>])((https?:\\/\\/)[^\\s<]+)/g, '$1<a href=\"$2\">$2</a>');\n s = s.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n s = s.replace(/\\*([^*]+)\\*/g, '<em>$1</em>');\n return s;\n}\nconst lines = md.split('\\n');\nlet html = '';\nlet inList = false;\nfunction closeList() { if (inList) { html += '</ul>'; inList = false; } }\nfor (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n if (line === '') { closeList(); continue; }\n if (line === '---') { closeList(); html += '<hr>'; continue; }\n if (line.indexOf('## ') === 0) { closeList(); html += '<h2>' + inline(line.slice(3)) + '</h2>'; continue; }\n if (line.indexOf('# ') === 0) { closeList(); html += '<h1>' + inline(line.slice(2)) + '</h1>'; continue; }\n if (line.indexOf('- ') === 0) { if (!inList) { html += '<ul>'; inList = true; } html += '<li>' + inline(line.slice(2)) + '</li>'; continue; }\n closeList();\n html += '<p>' + inline(line) + '</p>';\n}\ncloseList();\nconst wrapped = '<div style=\"font-family:-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;font-size:15px;line-height:1.55;color:#1a1a1a;max-width:640px\">' + html + '</div>';\nreturn [{ json: { html: wrapped, niche: niche } }];"
},
"id": "35c8c8bf-24ab-4792-bc7e-4cd59bb09732",
"name": "Render HTML",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1088,
1440
]
},
{
"parameters": {
"content": "## 2. Find what's hot\nPulls this week's top TikToks, Reels, YouTube and X for every term - one AnyAPI key, 1,200+ sites behind it, swap in any other.",
"height": 600,
"width": 640,
"color": 5
},
"id": "7765f9d4-8bd5-4eda-8875-625a07319424",
"name": "Band Find",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
928,
592
]
},
{
"parameters": {
"content": "## 3. Cut the noise\nPools every result, drops the off-topic viral junk that only shared a keyword, and keeps the genuinely on-niche videos ranked by reach.",
"height": 600,
"width": 480,
"color": 3
},
"id": "f1c003d7-b5e5-49a4-bf6b-ca02947ab008",
"name": "Band Cut",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
1584,
592
]
},
{
"parameters": {
"content": "## 4. Read why it won\nAI pulls the actual transcript of the top videos and explains WHY each blew up - the exact hook, format, and angle - then how to copy it.",
"height": 600,
"width": 960,
"color": 6
},
"id": "42300dbf-3cd7-4b93-ba76-d268d707231a",
"name": "Band Analyze",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
2080,
592
]
},
{
"parameters": {
"content": "## 6. Archive to Sheets\nEvery selected winner is logged to a Google Sheet - date, platform, author, link, why it worked - so your swipe file builds itself.",
"height": 560,
"width": 1120
},
"id": "7baafab0-187b-4a12-be10-8754fadd17cd",
"name": "Band Archive",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
1920,
1232
]
}
],
"connections": {
"Onboard Your Website": {
"main": [
[
{
"node": "AnyAPI: Scrape Website",
"type": "main",
"index": 0
}
]
]
},
"AnyAPI: Scrape Website": {
"main": [
[
{
"node": "Extract Niche",
"type": "main",
"index": 0
}
]
]
},
"Extract Niche": {
"main": [
[
{
"node": "Save Niche",
"type": "main",
"index": 0
}
]
]
},
"Niche Model": {
"ai_languageModel": [
[
{
"node": "Extract Niche",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Niche Parser": {
"ai_outputParser": [
[
{
"node": "Extract Niche",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Every Morning 8AM": {
"main": [
[
{
"node": "Read Niche",
"type": "main",
"index": 0
}
]
]
},
"Read Niche": {
"main": [
[
{
"node": "Resolve Niche",
"type": "main",
"index": 0
}
]
]
},
"Resolve Niche": {
"main": [
[
{
"node": "X Search",
"type": "main",
"index": 0
},
{
"node": "Split Terms",
"type": "main",
"index": 0
}
]
]
},
"Combine Sources": {
"main": [
[
{
"node": "Rank Top Viral",
"type": "main",
"index": 0
}
]
]
},
"Rank Top Viral": {
"main": [
[
{
"node": "Virality Analyst",
"type": "main",
"index": 0
}
]
]
},
"Virality Analyst": {
"main": [
[
{
"node": "Split Out Videos",
"type": "main",
"index": 0
},
{
"node": "Build Digest",
"type": "main",
"index": 0
}
]
]
},
"Analyst Model": {
"ai_languageModel": [
[
{
"node": "Virality Analyst",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Analyst Parser": {
"ai_outputParser": [
[
{
"node": "Virality Analyst",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Split Out Videos": {
"main": [
[
{
"node": "Log Viral Finds",
"type": "main",
"index": 0
}
]
]
},
"Script Model": {
"ai_languageModel": [
[
{
"node": "Write Script",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Build Digest": {
"main": [
[
{
"node": "Write Script",
"type": "main",
"index": 0
}
]
]
},
"Split Terms": {
"main": [
[
{
"node": "TikTok Top",
"type": "main",
"index": 0
},
{
"node": "YouTube",
"type": "main",
"index": 0
},
{
"node": "Instagram Reels",
"type": "main",
"index": 0
}
]
]
},
"Write Script": {
"main": [
[
{
"node": "Render HTML",
"type": "main",
"index": 0
}
]
]
},
"Render HTML": {
"main": [
[
{
"node": "Email the Brief",
"type": "main",
"index": 0
}
]
]
},
"TikTok Top": {
"main": [
[
{
"node": "Combine Sources",
"type": "main",
"index": 0
}
]
]
},
"YouTube": {
"main": [
[
{
"node": "Combine Sources",
"type": "main",
"index": 2
}
]
]
},
"Instagram Reels": {
"main": [
[
{
"node": "Combine Sources",
"type": "main",
"index": 1
}
]
]
},
"X Search": {
"main": [
[
{
"node": "Combine Sources",
"type": "main",
"index": 3
}
]
]
},
"Deep Scrape": {
"ai_tool": [
[
{
"node": "Virality Analyst",
"type": "ai_tool",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
},
"meta": {
"templateCredsSetupCompleted": true
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Daily Viral Content Radar Pro (AnyAPI). Uses formTrigger, httpRequest, agent, lmChatOpenRouter. Event-driven trigger; 34 nodes.
Source: https://github.com/getanyapi-com/n8n-nodes-anyapi/blob/22b1330461b52b134b9fe2fad3500d6f3511b456/templates/daily-viral-content-radar-pro.json — 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.
The AI-Powered Shopify SEO Content Automation is an enterprise-grade workflow that transforms product content creation for e-commerce stores. This sophisticated multi-agent system integrates GPT-4o, C
Who is this for? Agencies, consultants, and service providers who conduct discovery calls and need to quickly turn conversations into professional proposals.
🧠 Automate end-to-end SEO blog creation and WordPress publishing using a GPT-5 multi-agent workflow with real-time research, metadata generation, and optional featured images.
This is an automated blog post generation system that: Researches topics using AI agents and web search tools Writes complete blog posts with proper SEO structure Generates custom images for each post
YouTube Strategist. Uses formTrigger, splitOut, splitInBatches, agent. Event-driven trigger; 50 nodes.