Workflow

Reddit Content Signal Workflow

Daily monitoring of Reddit for content opportunities matching your keywords. Surfaces high-engagement discussions as content briefs.

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

1

Load keyword configuration

Read target keywords and minimum engagement thresholds from configuration.

2

Search Reddit for each keyword

Call Scavio with platform reddit for each keyword to get recent discussions.

3

Score and filter posts

Score posts by upvotes, comment count, and recency. Filter out low-signal results.

4

Extract content angles

Parse post titles and snippets to identify the specific question or pain point being discussed.

5

Deduplicate and rank

Remove duplicate topics across keywords and rank by combined engagement signal.

6

Output content opportunities

Save ranked opportunities as content briefs with source links and engagement data.

Python Implementation

Python
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

JavaScript
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

Reddit

Community, posts & threaded comments from any subreddit

Frequently Asked Questions

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.

This workflow uses a cron schedule (daily at 7 am utc). Runs daily at 7 AM UTC.

This workflow uses the following Scavio platforms: reddit. Each platform is called via the same unified API endpoint.

Yes. Scavio's free tier includes 250 credits per month with no credit card required. That is enough to test and validate this workflow before scaling it.

Reddit Content Signal Workflow

Daily monitoring of Reddit for content opportunities matching your keywords. Surfaces high-engagement discussions as content briefs.