Resumen
Contenido teams spend horas researching que to escribir about. Este flujo de trabajo ejecuta cada manana, searches your nicho topics on Google via Scavio, identifies trending angles by analizando titulo patrones y recency, y produces un structured contenido brief con suggested headlines, key points to cover, y fuente URLs. It feeds directamente en your editorial calendar so writers tienen briefs listo cuando they iniciar their dia. Researching 10 topics diario costs about $0.05 in credits.
Desencadenador
Cron 8 AM UTC diario
Programación
Diario 8 AM
Pasos del flujo de trabajo
Cargar Topic Seeds
Leer el lista of nicho topics y seed palabras clave de your editorial configuracion file.
Search Trending Contenido
For cada topic, call Scavio search on Google y recopilar el top 10 resultados con titles y fragmentos.
Analizar Title Patterns
Extraer comun patrones de top-ranking titles: listicles, how-tos, comparisons, y trending angles.
Generar Contenido Briefs
For cada topic, produce un brief con un suggested headline, 5 key points, y 3 fuente URLs.
Exportar to Editorial Calendar
Escribir el briefs to un JSON file o push to your project management herramienta via webhook.
Implementacion en Python
import requests, os, json, re
from pathlib import Path
from datetime import date
from collections import Counter
API_KEY = os.environ["SCAVIO_API_KEY"]
SH = {"x-api-key": API_KEY, "Content-Type": "application/json"}
TOPICS_FILE = Path("content_topics.json")
BRIEFS_DIR = Path("content_briefs")
BRIEFS_DIR.mkdir(exist_ok=True)
PATTERNS = {
"listicle": r"\d+\s+(best|top|ways|tips|tools|reasons)",
"how_to": r"how to|step.by.step|guide|tutorial",
"comparison": r"vs\.?|versus|compared|comparison|alternative",
"news": r"2026|new|announce|launch|update",
}
def search_topic(topic: str) -> list:
resp = requests.post(
"https://api.scavio.dev/api/v1/search",
headers=SH,
json={"query": topic, "platform": "google"},
timeout=15,
)
resp.raise_for_status()
return resp.json().get("organic", [])[:10]
def detect_patterns(results: list) -> list:
detected = []
titles = " ".join(r.get("title", "") for r in results).lower()
for name, pattern in PATTERNS.items():
if re.search(pattern, titles, re.IGNORECASE):
detected.append(name)
return detected
def generate_brief(topic: str, results: list) -> dict:
patterns = detect_patterns(results)
key_points = []
seen = set()
for r in results:
snippet = r.get("snippet", "")
words = snippet.split()[:15]
point = " ".join(words)
if point and point not in seen:
key_points.append(point)
seen.add(point)
if len(key_points) >= 5:
break
sources = [{"title": r.get("title", ""), "url": r.get("url", "")} for r in results[:3]]
return {
"topic": topic,
"suggested_angle": patterns[0] if patterns else "informational",
"key_points": key_points,
"sources": sources,
"patterns_detected": patterns,
}
def run():
topics = json.loads(TOPICS_FILE.read_text())
briefs = []
for topic in topics:
results = search_topic(topic)
brief = generate_brief(topic, results)
briefs.append(brief)
out = BRIEFS_DIR / f"briefs_{date.today()}.json"
out.write_text(json.dumps(briefs, indent=2))
print(f"Generated {len(briefs)} content briefs for {date.today()}")
for b in briefs:
print(f" {b['topic']}: angle={b['suggested_angle']}, {len(b['key_points'])} points")
run()Implementacion en JavaScript
const SH = {'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json'};
const fs = await import('fs');
const BRIEFS_DIR = 'content_briefs';
try { fs.mkdirSync(BRIEFS_DIR); } catch {}
const topics = JSON.parse(fs.readFileSync('content_topics.json', 'utf8'));
const PATTERNS = {listicle:/\d+\s+(best|top|ways|tips|tools|reasons)/i, howTo:/how to|step.by.step|guide|tutorial/i, comparison:/vs\.?|versus|compared|comparison|alternative/i, news:/2026|new|announce|launch|update/i};
async function searchTopic(topic) {
const r = await fetch('https://api.scavio.dev/api/v1/search', {method:'POST', headers:SH, body:JSON.stringify({query:topic, platform:'google'})});
return ((await r.json()).organic || []).slice(0,10);
}
function detectPatterns(results) {
const titles = results.map(r=>r.title||'').join(' ');
return Object.entries(PATTERNS).filter(([k,p])=>p.test(titles)).map(([k])=>k);
}
function generateBrief(topic, results) {
const patterns = detectPatterns(results);
const keyPoints = [];
const seen = new Set();
for (const r of results) {
const point = (r.snippet||'').split(' ').slice(0,15).join(' ');
if (point && !seen.has(point)) { keyPoints.push(point); seen.add(point); }
if (keyPoints.length >= 5) break;
}
return {topic, suggestedAngle:patterns[0]||'informational', keyPoints, sources:results.slice(0,3).map(r=>({title:r.title||'', url:r.url||''})), patternsDetected:patterns};
}
const briefs = [];
for (const topic of topics) {
const results = await searchTopic(topic);
briefs.push(generateBrief(topic, results));
}
const today = new Date().toISOString().split('T')[0];
fs.writeFileSync(BRIEFS_DIR+'/briefs_'+today+'.json', JSON.stringify(briefs, null, 2));
console.log('Generated '+briefs.length+' content briefs');
briefs.forEach(b => console.log(' '+b.topic+': angle='+b.suggestedAngle+', '+b.keyPoints.length+' points'));Plataformas utilizadas
Búsqueda web con grafo de conocimiento, PAA y resúmenes de IA