Add .rss to any Reddit URL and you get a free feed with no login, which is the right answer for light, low-volume monitoring of one subreddit or search. It is the wrong answer once you need scores, comment counts, full text, pagination, or many queries, because the RSS feed is thin and Reddit guards its data behind a $30B market cap and an aggressive robots.txt. This is the question two subreddits asked this week, r/learnpython and r/scrapingtheweb, and the honest answer has three tiers, not one. Here's each, with code and the exact tradeoff.
Prerequisites
- Python 3.9+ or Node 18+
- For the API tier: a Scavio key (50 free credits at scavio.dev)
- Understanding that scraping Reddit HTML directly violates robots.txt and gets you blocked
Walkthrough
Step 1: 1. Free tier: the .rss trick
Append .rss to a subreddit, user, or search URL. You get an XML feed of recent items with title, author, link, and timestamp, no auth. It works well for 'tell me when r/X has a new post.' What you don't get: score, comment count, full selftext, or pagination beyond the recent window. Reddit also rate-limits anonymous feed pulls, so a tight polling loop gets throttled.
import feedparser
feed = feedparser.parse('https://www.reddit.com/r/aiagents/new/.rss')
for e in feed.entries[:5]:
print(e.title, '-', e.author, '-', e.published)Step 2: 2. Where RSS breaks
RSS gives you headlines, not data. If you're scoring posts for buying intent, deduping across subreddits, reading comment threads, or running 50 keyword searches, the feed doesn't carry the fields and the anonymous rate limit bites. The official Reddit API solves the fields but adds OAuth, per-minute rate limits, and the maintenance of a token-refresh flow that breaks quietly.
# RSS entry has no .score, no .num_comments, no .selftext
# print(e.score) -> AttributeErrorStep 3: 3. API tier: structured search without the OAuth dance
A structured Reddit API returns posts with the fields RSS drops and handles pagination for you. Scavio's /api/v1/reddit/search takes a Bearer key and returns data.posts plus totalResults and nextCursor. Verified live on 2026-06-26: a search returned 7 posts in data.posts with title, author, subreddit, url, timestamp, and position, billed at 2 credits. No OAuth, no token refresh, no HTML parsing.
import os, requests
KEY = os.environ['SCAVIO_API_KEY']
r = requests.post(
'https://api.scavio.dev/api/v1/reddit/search',
headers={'Authorization': f'Bearer {KEY}'},
json={'query': 'best web search api for agents'},
).json()
posts = r['data']['posts']
print(r['data']['totalResults'], 'posts;', r['credits_used'], 'credits')
for p in posts[:5]:
print(p['subreddit'], '-', p['title'])Step 4: 4. Paginate and pull full threads
Pass data.nextCursor back to walk results. To read a thread's comments, use /api/v1/reddit/post with the post URL or id. This is the tier that powers brand-monitoring and lead-gen pipelines, where you need the full thread and a stable schema, not a headline feed.
# next page
r2 = requests.post(
'https://api.scavio.dev/api/v1/reddit/search',
headers={'Authorization': f'Bearer {KEY}'},
json={'query': 'best web search api for agents', 'cursor': r['data']['nextCursor']},
).json()Python Example
import os, requests
KEY = os.environ['SCAVIO_API_KEY']
def reddit_search(query):
r = requests.post(
'https://api.scavio.dev/api/v1/reddit/search',
headers={'Authorization': f'Bearer {KEY}'},
json={'query': query},
).json()
return r['data']['posts']
for p in reddit_search('best web search api for agents')[:5]:
print(p['subreddit'], '-', p['title'])JavaScript Example
const KEY = process.env.SCAVIO_API_KEY;
async function redditSearch(query) {
const r = await fetch('https://api.scavio.dev/api/v1/reddit/search', {
method: 'POST',
headers: { Authorization: `Bearer ${KEY}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ query }),
}).then((x) => x.json());
return r.data.posts;
}
for (const p of (await redditSearch('best web search api for agents')).slice(0, 5)) {
console.log(p.subreddit, '-', p.title);
}Expected Output
RSS returns an XML feed with title/author/link/published and nothing else. The Scavio call returns data.posts (7 in our run) with title, author, subreddit, url, timestamp, and position, plus data.totalResults and data.nextCursor for pagination, and credits_used: 2. Decision rule: RSS for 'notify me on new posts'; structured API the moment you need scores, full text, dedup, or volume.