Overview
This workflow monitors Reddit daily for discussions matching your target keywords. It scores posts by engagement, identifies recurring questions and pain points, and surfaces the highest-signal discussions as content creation opportunities. The output feeds into content calendars with data-driven topic prioritization.
Trigger
Cron schedule (daily at 7 AM UTC)
Schedule
Runs daily at 7 AM UTC
Workflow Steps
Load keyword configuration
Read target keywords and minimum engagement thresholds from configuration.
Search Reddit for each keyword
Call Scavio with platform reddit for each keyword to get recent discussions.
Score and filter posts
Score posts by upvotes, comment count, and recency. Filter out low-signal results.
Extract content angles
Parse post titles and snippets to identify the specific question or pain point being discussed.
Deduplicate and rank
Remove duplicate topics across keywords and rank by combined engagement signal.
Output content opportunities
Save ranked opportunities as content briefs with source links and engagement data.
Python Implementation
import requests
import json
from pathlib import Path
from datetime import datetime
API_KEY = "your_scavio_api_key"
KEYWORDS = ["search api", "web scraping alternative", "SERP data", "google results api"]
MIN_SCORE = 5
MIN_COMMENTS = 3
def search_reddit(keyword: str) -> list[dict]:
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "reddit", "query": keyword},
timeout=15,
)
res.raise_for_status()
return res.json().get("organic", [])
def score_post(post: dict) -> float:
score = post.get("score", 0)
comments = post.get("comments", 0)
return score + (comments * 2) # Weight comments higher
def run():
all_opportunities = []
seen_titles = set()
for keyword in KEYWORDS:
posts = search_reddit(keyword)
for post in posts:
title = post.get("title", "")
if title in seen_titles:
continue
post_score = post.get("score", 0)
post_comments = post.get("comments", 0)
if post_score >= MIN_SCORE and post_comments >= MIN_COMMENTS:
seen_titles.add(title)
all_opportunities.append({
"keyword": keyword,
"title": title,
"subreddit": post.get("subreddit", ""),
"score": post_score,
"comments": post_comments,
"signal_score": score_post(post),
"link": post.get("link", ""),
"content_angle": post.get("snippet", "")[:200],
})
# Rank by signal score
all_opportunities.sort(key=lambda x: x["signal_score"], reverse=True)
top_opportunities = all_opportunities[:15]
date = datetime.utcnow().strftime("%Y-%m-%d")
report = {
"date": date,
"keywords_searched": len(KEYWORDS),
"total_posts_found": len(all_opportunities),
"top_opportunities": top_opportunities,
}
Path(f"reddit_signals_{date}.json").write_text(json.dumps(report, indent=2))
print(f"Found {len(all_opportunities)} content opportunities, top {len(top_opportunities)} saved")
for opp in top_opportunities[:5]:
print(f" [{opp['subreddit']}] {opp['title'][:60]} (signal: {opp['signal_score']:.0f})")
if __name__ == "__main__":
run()JavaScript Implementation
const API_KEY = "your_scavio_api_key";
const KEYWORDS = ["search api", "web scraping alternative", "SERP data", "google results api"];
const MIN_SCORE = 5;
const MIN_COMMENTS = 3;
async function searchReddit(keyword) {
const res = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": API_KEY, "content-type": "application/json" },
body: JSON.stringify({ platform: "reddit", query: keyword }),
});
if (!res.ok) throw new Error(`scavio ${res.status}`);
return (await res.json()).organic ?? [];
}
function scorePost(post) {
return (post.score ?? 0) + (post.comments ?? 0) * 2;
}
async function run() {
const fs = await import("fs/promises");
const allOpportunities = [];
const seenTitles = new Set();
for (const keyword of KEYWORDS) {
const posts = await searchReddit(keyword);
for (const post of posts) {
const title = post.title ?? "";
if (seenTitles.has(title)) continue;
const postScore = post.score ?? 0;
const postComments = post.comments ?? 0;
if (postScore >= MIN_SCORE && postComments >= MIN_COMMENTS) {
seenTitles.add(title);
allOpportunities.push({
keyword,
title,
subreddit: post.subreddit ?? "",
score: postScore,
comments: postComments,
signalScore: scorePost(post),
link: post.link ?? "",
contentAngle: (post.snippet ?? "").slice(0, 200),
});
}
}
}
allOpportunities.sort((a, b) => b.signalScore - a.signalScore);
const topOpportunities = allOpportunities.slice(0, 15);
const date = new Date().toISOString().slice(0, 10);
const report = { date, keywordsSearched: KEYWORDS.length, totalPostsFound: allOpportunities.length, topOpportunities };
await fs.writeFile(`reddit_signals_${date}.json`, JSON.stringify(report, null, 2));
console.log(`Found ${allOpportunities.length} opportunities, top ${topOpportunities.length} saved`);
for (const opp of topOpportunities.slice(0, 5)) {
console.log(` [${opp.subreddit}] ${opp.title.slice(0, 60)} (signal: ${opp.signalScore})`);
}
}
run();Platforms Used
Community, posts & threaded comments from any subreddit