Overview
This n8n workflow runs once a day and gathers raw signal from three places people actually talk about your niche: Reddit discussion topics, TikTok trending videos for a hashtag, and YouTube search results. It sends all of that to an LLM node that synthesizes a ranked list of content ideas. The point is to stop running three separate scrapers. Instead of one scraper fighting Reddit, another fighting TikTok's app API, and a third dealing with YouTube, you make three POST calls to Scavio with a single Bearer key and one credit pool. Reddit search is 1 credit. TikTok hashtag lookup is 1 credit, and the hashtag videos call is another 1 credit. YouTube search is 1 credit. So a single daily run across the four data calls costs roughly 4 credits. At Scavio's pay-as-you-go rate of $0.005 per credit that's about 2 cents a day, and the Project plan at $30/month gives you 7,000 credits, far more than a daily content pipeline burns. The honest tradeoff: Scavio gives you the data nodes, not the whole workflow. You still build the n8n schedule trigger, wire your own LLM credential (OpenAI, Anthropic, or whatever you run), and add the posting or notification step at the end. Scavio replaces the scraping layer; it doesn't replace n8n. If your only goal is consistency across platforms, the win here is that all three sources return structured JSON with the same auth, so your LLM node sees a uniform payload instead of three differently-shaped scraper outputs. That's where the original r/n8nforbeginners build usually breaks: each scraper returns a different shape, breaks on a different day, and needs its own proxy and CAPTCHA handling. One key, one error format, one place to debug.
Trigger
Daily schedule trigger at 7 AM (n8n Cron node), or a Telegram message to run on demand
Schedule
Daily at 7 AM (recommended), or hourly during a launch week
Workflow Steps
Trigger the run
An n8n Schedule (Cron) node fires daily at 7 AM. Swap in a Telegram trigger node if you'd rather run it on demand by sending a message.
Pull Reddit topics
POST your niche query to /api/v1/reddit/search (1 credit). You get back post titles, scores, and comment counts, the discussions people are actually having today.
Resolve the TikTok hashtag
POST the hashtag name to /api/v1/tiktok/hashtag (1 credit) to get its challenge_id. This is step one of TikTok's two-step lookup; you can't fetch videos by name directly.
Fetch trending TikTok videos
POST the hashtag to /api/v1/tiktok/hashtag/videos (1 credit) for the current trending clips and play counts under that tag.
Search YouTube
POST to /api/v1/youtube/search with the wire body field "search" (not "query"; 1 credit) to see what's ranking and getting views for your topic on YouTube.
Synthesize with an LLM node
Merge the three payloads and pass them to an n8n LLM node (OpenAI or Anthropic credential). Prompt it to cluster themes and return a ranked list of cross-platform content ideas.
Deliver the ideas
Send the ranked list to Slack, Notion, a Google Sheet, or email. Scavio doesn't post for you, so this last step is your own node.
Python Implementation
import requests
API_KEY = "your_scavio_api_key"
BASE = "https://api.scavio.dev/api/v1"
HEADERS = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
# Pick the topics and hashtag you want fresh ideas around.
SUBREDDIT_QUERY = "ai agents"
HASHTAG = "aiagents"
YOUTUBE_QUERY = "ai agents tutorial"
def reddit_topics(query, count=15):
res = requests.post(f"{BASE}/reddit/search",
headers=HEADERS, json={"query": query, "count": count}, timeout=30)
res.raise_for_status()
posts = res.json().get("data", {}).get("posts", [])
return [{"title": p.get("title"), "score": p.get("score"),
"comments": p.get("num_comments"), "url": p.get("url")} for p in posts]
def tiktok_trending(hashtag, count=15):
# Step 1: resolve the hashtag name to a challenge_id.
meta = requests.post(f"{BASE}/tiktok/hashtag",
headers=HEADERS, json={"hashtag": hashtag}, timeout=30)
meta.raise_for_status()
challenge = meta.json().get("data", {})
# Step 2: pull the trending videos for that hashtag.
vids = requests.post(f"{BASE}/tiktok/hashtag/videos",
headers=HEADERS, json={"hashtag": hashtag, "count": count}, timeout=30)
vids.raise_for_status()
videos = vids.json().get("data", {}).get("videos", [])
return {"challenge_id": challenge.get("challenge_id"),
"videos": [{"desc": v.get("desc"), "plays": v.get("play_count")}
for v in videos]}
def youtube_results(query, count=15):
# Wire body uses "search", not "query".
res = requests.post(f"{BASE}/youtube/search",
headers=HEADERS, json={"search": query, "count": count}, timeout=30)
res.raise_for_status()
items = res.json().get("data", {}).get("videos", [])
return [{"title": v.get("title"), "channel": v.get("channel"),
"views": v.get("view_count")} for v in items]
def collect():
return {
"reddit": reddit_topics(SUBREDDIT_QUERY),
"tiktok": tiktok_trending(HASHTAG),
"youtube": youtube_results(YOUTUBE_QUERY),
}
if __name__ == "__main__":
payload = collect()
# Hand `payload` to your LLM node (n8n OpenAI/Anthropic node) for idea synthesis.
print(json.dumps(payload, indent=2))
JavaScript Implementation
const API_KEY = "your_scavio_api_key";
const BASE = "https://api.scavio.dev/api/v1";
const HEADERS = {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
};
const SUBREDDIT_QUERY = "ai agents";
const HASHTAG = "aiagents";
const YOUTUBE_QUERY = "ai agents tutorial";
async function post(path, body) {
const res = await fetch(`${BASE}${path}`, {
method: "POST",
headers: HEADERS,
body: JSON.stringify(body),
});
if (!res.ok) throw new Error(`scavio ${path} ${res.status}`);
return res.json();
}
async function redditTopics(query, count = 15) {
const json = await post("/reddit/search", { query, count });
const posts = json.data?.posts ?? [];
return posts.map((p) => ({
title: p.title,
score: p.score,
comments: p.num_comments,
url: p.url,
}));
}
async function tiktokTrending(hashtag, count = 15) {
// Step 1: resolve hashtag name to a challenge_id.
const meta = await post("/tiktok/hashtag", { hashtag });
const challenge = meta.data ?? {};
// Step 2: pull trending videos for that hashtag.
const vids = await post("/tiktok/hashtag/videos", { hashtag, count });
const videos = vids.data?.videos ?? [];
return {
challenge_id: challenge.challenge_id,
videos: videos.map((v) => ({ desc: v.desc, plays: v.play_count })),
};
}
async function youtubeResults(query, count = 15) {
// Wire body uses "search", not "query".
const json = await post("/youtube/search", { search: query, count });
const items = json.data?.videos ?? [];
return items.map((v) => ({
title: v.title,
channel: v.channel,
views: v.view_count,
}));
}
async function collect() {
const [reddit, tiktok, youtube] = await Promise.all([
redditTopics(SUBREDDIT_QUERY),
tiktokTrending(HASHTAG),
youtubeResults(YOUTUBE_QUERY),
]);
return { reddit, tiktok, youtube };
}
collect()
// Hand `payload` to your LLM node (n8n OpenAI/Anthropic node) for synthesis.
.then((payload) => console.log(JSON.stringify(payload, null, 2)))
.catch((err) => console.error(err));