Resumen
Este flujo de n8n se ejecuta una vez al dia y recoge senal en bruto de los tres sitios donde la gente realmente habla de tu nicho: temas de discusion en Reddit, videos en tendencia de TikTok para un hashtag y resultados de busqueda de YouTube. Todo eso va a un nodo LLM que sintetiza una lista ordenada de ideas de contenido. La idea es dejar de mantener tres scrapers distintos. En vez de uno peleando con Reddit, otro con la API de la app de TikTok y un tercero lidiando con YouTube, haces tres llamadas POST a Scavio con una sola clave Bearer y un unico fondo de creditos. La busqueda en Reddit cuesta 1 credito. La consulta del hashtag de TikTok cuesta 1 credito, y la llamada de videos del hashtag otro 1 credito. La busqueda en YouTube cuesta 1 credito. Asi que una sola ejecucion diaria con las cuatro llamadas de datos cuesta unos 4 creditos. A la tarifa de pago por uso de Scavio de 0,005 $ por credito eso son unos 2 centavos al dia, y el plan Project de 30 $/mes te da 7.000 creditos, mucho mas de lo que consume un pipeline de contenido diario. El compromiso honesto: Scavio te da los nodos de datos, no el flujo completo. Sigues construyendo tu el disparador programado de n8n, conectas tu propia credencial de LLM (OpenAI, Anthropic o el que uses) y anades el paso de publicacion o notificacion al final. Scavio sustituye la capa de scraping; no sustituye a n8n. Si tu unico objetivo es la consistencia entre plataformas, la ventaja es que las tres fuentes devuelven JSON estructurado con la misma autenticacion, asi que tu nodo LLM ve un payload uniforme en lugar de tres salidas con formas distintas. Ahi es donde suele romperse el montaje original de r/n8nforbeginners: cada scraper devuelve una forma diferente, falla un dia distinto y necesita su propio proxy y manejo de CAPTCHA. Una clave, un formato de error, un solo lugar para depurar.
Desencadenador
Disparador programado diario a las 7:00 (nodo Cron de n8n), o un mensaje de Telegram para ejecutar bajo demanda
Programación
Diario a las 7:00 (recomendado), o cada hora durante una semana de lanzamiento
Pasos del flujo de trabajo
Disparar la ejecucion
Un nodo Schedule (Cron) de n8n se activa a diario a las 7:00. Cambialo por un nodo disparador de Telegram si prefieres ejecutarlo bajo demanda enviando un mensaje.
Extraer temas de Reddit
Envia tu consulta de nicho por POST a /api/v1/reddit/search (1 credito). Recibes titulos de publicaciones, puntuaciones y numero de comentarios: las discusiones reales de hoy.
Resolver el hashtag de TikTok
Envia el nombre del hashtag por POST a /api/v1/tiktok/hashtag (1 credito) para obtener su challenge_id. Es el paso uno de la busqueda en dos fases de TikTok; no puedes pedir videos por nombre directamente.
Obtener videos en tendencia de TikTok
Envia el hashtag por POST a /api/v1/tiktok/hashtag/videos (1 credito) para los clips en tendencia actuales y sus reproducciones bajo esa etiqueta.
Buscar en YouTube
Envia un POST a /api/v1/youtube/search con el campo "search" en el cuerpo (no "query"; 1 credito) para ver que posiciona y acumula visitas sobre tu tema en YouTube.
Sintetizar con un nodo LLM
Une los tres payloads y pasalos a un nodo LLM de n8n (credencial de OpenAI o Anthropic). Pidele que agrupe temas y devuelva una lista ordenada de ideas de contenido multiplataforma.
Entregar las ideas
Envia la lista ordenada a Slack, Notion, una hoja de Google o correo. Scavio no publica por ti, asi que este ultimo paso es tu propio nodo.
Implementacion en Python
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))
Implementacion en JavaScript
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));