Reddit Scraper - Posts, Comments & Subreddits avatar

Reddit Scraper - Posts, Comments & Subreddits

Pricing

from $5.00 / 1,000 post scrapeds

Go to Apify Store
Reddit Scraper - Posts, Comments & Subreddits

Reddit Scraper - Posts, Comments & Subreddits

Extract Reddit posts, comments, subreddit data, and user profiles.

Pricing

from $5.00 / 1,000 post scrapeds

Rating

5.0

(4)

Developer

viralanalyzer

viralanalyzer

Maintained by Community

Actor stats

0

Bookmarked

29

Total users

2

Monthly active users

11 days ago

Last modified

Share

Reddit Scraper

🔗 View on Apify Store | 🇺🇸 English | 🇧🇷 Português

Scrape Reddit posts, real comment trees, engagement metrics and sentiment from any subreddit or global search query, straight from Reddit's public RSS feed + public .json comments endpoint. Get titles, permalinks, authors, creation dates, and — optionally — full comment threads. No API key, no login, no credentials needed.

Data source: this actor reads Reddit's public RSS/Atom feed (https://www.reddit.com/r/{subreddit}/{sort}/.rss) for posts, and — when includeComments is on — enriches up to maxPostsWithComments posts with real comment trees via Reddit's public .json endpoint (/comments/{post_id}.json?limit=&depth=&sort=top). No authentication required.

⚠️ Comment trees are unavailable right now (measured 2026-09-09)

Reddit's public .json comments endpoint returns HTTP 403 on every route we have — datacenter and residential alike (9 of 9 attempts blocked in one run, while the RSS feed that carries the posts went through in the very same run). includeComments now defaults to off: leaving it on costs you ~19s of run time for a fetch that cannot succeed today. Posts are still delivered, and comments_tree stays [] — nothing is ever fabricated. We will flip the default back when the endpoint is reachable.

Limitations: the RSS feed alone does not expose engagement metrics or comment threads, so without includeComments the following fields stay null / empty and are never fabricated:

  • score, upvote_ratio, num_comments → null
  • selftext (post body) → null (the feed only provides the title and a boilerplate link block)
  • comments_tree → [] When comment fetching is enabled, score, num_comments, selftext, upvote_ratio and is_video are enriched with the real values from the post listing, and comments_tree carries the real thread (up to commentsLimit top-level comments × commentsDepth recursion). If a comment fetch fails or is blocked, the post is still returned with comments_tree: [] — nothing is invented.

✨ Features

  • 🔍 Subreddit scraping — hot, new, top, rising, controversial posts
  • 🌐 Global / in-subreddit search — search across Reddit via the public search RSS feed
  • 💬 Real comment trees via public .json endpoint — recursive reply threads (no API key) with author, body, score, created_utc, depth, permalink, replies[]
  • 📊 Real engagement enrichment — when comments are fetched, score, num_comments, selftext, upvote_ratio, is_video are filled from the post listing (never fabricated)
  • 💬 Sentiment analysis — PT-BR + EN support (positivo/neutro/negativo) on the post title
  • 🧹 content_clean — HTML-stripped text ready for ML/AI training
  • ⚡ Lightweight — pure HTTP + RSS/Atom parse, no browser required
  • 🔑 Zero credentials — public RSS feed, no API key or login
  • 🔁 Resilient — retry-on-429 with backoff + request spacing between subreddits
  • 🌐 Apify Proxy — built-in proxy support for reliability

📥 Input

FieldTypeDefaultDescription
subredditsstring[]["brasil"]List of subreddits to scrape
searchQuerystring""Global search query (overrides subreddits)
sortenum"hot"Sort: hot, new, top, rising, controversial
timeenum"week"Time filter: hour, day, week, month, year, all
maxPostsinteger10Maximum posts to collect
maxPostsWithCommentsinteger3How many collected posts get a real comment-tree fetch (0 = none; FREE tier capped at 1)
includeCommentsbooleantrueFetch real comment trees via Reddit's public .json endpoint (no API key)
commentsDepthinteger3Max depth for comment tree recursion (clamped to 10)
commentsLimitinteger10Max top-level comments per post (Reddit clamps to 100)

Example Input

{
"subreddits": ["brasil", "technology"],
"sort": "hot",
"time": "week",
"maxPosts": 5,
"maxPostsWithComments": 3,
"includeComments": true,
"commentsDepth": 2,
"commentsLimit": 5
}

📤 Output

Each post produces one object:

FieldTypeDescription
post_idstring|nullReddit post ID (base36, from the Atom <id>)
subredditstring|nullSubreddit name
titlestringPost title
selftextstring|nullPost body — null via RSS; enriched with the real body when comments are fetched
authorstringAuthor username, [deleted] when the feed carries none
scorenumber|nullNet upvotes — null via RSS; enriched with the real value when comments are fetched
upvote_rationumber|nullUpvote ratio — null via RSS; enriched with the real value when comments are fetched
num_commentsnumber|nullComment count — null via RSS; enriched with the real value when comments are fetched
urlstring|nullPost URL (permalink)
permalinkstring|nullReddit permalink (relative path)
created_utcinteger|nullUnix timestamp (from RSS date)
createdISOstring|nullCreation date in ISO 8601 (from RSS date)
flairstring|nullPost flair text (best effort)
is_videoboolean|nullnull via RSS; real boolean on the posts enriched by the .json fetch
content_cleanstringML-ready text from the title (no HTML)
sentimentstringTitle sentiment (PT-BR + EN heuristic)
comments_treearrayReal comment thread. Filled only on the posts that receive a .json fetch — the first maxPostsWithComments of the run (FREE tier: 1). [] on every other post, and [] when the fetch is blocked

Comment Tree Structure

Each node maps 1:1 from Reddit's public .json comments listing (top-level = depth 1):

{
"id": "m6p2abc",
"author": "user123",
"body": "Great post!",
"score": 42,
"created_utc": 1707753600,
"depth": 1,
"permalink": "/r/AskReddit/comments/abc123/comment/m6p2abc/",
"replies": [
{
"id": "m6p3def",
"author": "user456",
"body": "Agreed!",
"score": 15,
"created_utc": 1707754200,
"depth": 2,
"permalink": "/r/AskReddit/comments/abc123/comment/m6p3def/",
"replies": []
}
]
}

📋 Use Cases

  • AI/ML Training Data — Clean text with content_clean field, ready for NLP
  • Market Research — Monitor discussions about brands, products, or industries
  • Sentiment Analysis — Track community sentiment over time
  • Competitor Intelligence — Monitor what people say about competitors
  • Content Ideas — Find popular topics and discussions in your niche
  • Academic Research — Collect structured data from Reddit communities
  • Community Monitoring — Track subreddit health and engagement

✅ Capabilities & Limits

Stated up front, so you do not pay a run to find out.

Built here: maxPostsWithComments is a global budget shared across all subreddits, consumed first-come-first-served by the first one in the list. With 5 subreddits at maxPostsWithComments: 3, only the first subreddit's top 3 posts carry real score, num_comments, upvote_ratio, selftext, is_video and comments_tree; posts from the rest are still pushed and still charged, with comments_tree: [] and those fields null.

Input / featureSupportedNotes
subreddits✅List of subreddits to scrape (e.g. ['brasil', 'technology', 'worldnews'])
searchQuery✅Search term across all Reddit (alternative to subreddit). Leave empty to use subreddits list.
sort✅How to sort posts
time✅Time range for 'top' sort
Result volume (maxPosts)⚠️Maximum number of posts to extract per subreddit
Result volume (maxPostsWithComments)⚠️How many of the collected posts receive a real comment-tree fetch via Reddit's public .json endpoint. Global budget for the whole run, default 3, max 10, FREE tier 1. Each enriched post costs one extra HTTP request (up to 3 attempts with backoff on 429/403), so it adds runtime — but no extra PPE event
includeComments✅Fetch real comment trees (via Reddit's public .json endpoint, no API key) for up to maxPostsWithComments posts
commentsDepth✅Max depth of nested comment replies to fetch (recursive; clamped to 10)
commentsLimit✅Max top-level comments per post (Reddit clamps the .json endpoint to 100)
Proxy⚠️Proxy settings for Reddit's IP blocks. Leave it empty and the Actor starts on the Apify datacenter proxy and only switches to RESIDENTIAL US after a request has already been blocked — retry-only, so a clean run never spends residential traffic. If no proxy is available at all, requests go out direct

❓ FAQ

Q: Do I need a Reddit API key? A: No! This actor reads Reddit's public RSS feed — no API key, no login, no credentials.

Q: Why are score, num_comments and the comment tree empty? A: When includeComments is false, the actor uses only Reddit's public RSS feed, which does not include engagement metrics or comment threads — those fields return null / [] rather than being fabricated. Enable includeComments (and set maxPostsWithComments > 0) to enrich posts with real scores, comment counts, post bodies and full comment trees via the public .json endpoint.

Q: Does includeComments do anything? A: Yes! Since v1.7 it fetches real comment trees via Reddit's public .json endpoint (no API key). The number of posts enriched is capped by maxPostsWithComments (FREE tier: 1 post) and the tree size by commentsLimit / commentsDepth.

Q: What proxy should I use? A: The default Apify (datacenter) proxy works for the RSS feed. Residential US is available as a fallback if you hit rate limits.

Q: Can I search across all of Reddit? A: Yes! Use the searchQuery field to search globally (or within a subreddit) via the public search RSS feed.

Q: Does it support Portuguese content? A: Yes! Sentiment analysis supports both PT-BR and English keywords, and the parser handles UTF-8 titles correctly.

💰 Pricing

Pay Per Event + platform usage (you pay compute, traffic and Apify proxy):

EventCost
post-scraped$0.005 per post ($5.00 / 1,000)

There is no per-comment event. Comments are included in the post row when includeComments is on. Diagnostic rows are not charged.

📝 Changelog

v1.7 (Current)

  • 💬 Real comment trees — when includeComments is on, up to maxPostsWithComments posts get their thread fetched from Reddit's public .json endpoint (/comments/{id}.json?limit=&depth=&sort=top, no API key). Recursive comments_tree with author, body, score, created_utc, depth, permalink, replies[].
  • 📊 Real engagement enrichment — score, num_comments, selftext, upvote_ratio, is_video are now filled with real values from the post listing when comments are fetched (still null via RSS-only).
  • 🛡️ Cost control — new maxPostsWithComments input (default 3, max 10; FREE tier capped at 1) + commentsLimit/commentsDepth bounds; failed/blocked comment fetches never fabricate data (comments_tree stays []).
  • ➕ Added maxPostsWithComments to the input schema.

v1.6

  • 🔁 Switched data source to Reddit's public RSS/Atom feed — the legacy .json API now returns HTTP 403; the public RSS feed still works with no credentials.
  • 🔑 No API key, no session cookies required.
  • 🔁 Retry-on-429 with increasing backoff + request spacing between subreddits.
  • ➕ Added createdISO (ISO 8601 date) and sentiment output fields.
  • ⚠️ score, upvote_ratio, num_comments, selftext are now null and comments_tree is empty (not available via RSS — never fabricated).

v1.5

  • ✅ Improved reliability and proxy handling
  • ✅ Enhanced sentiment analysis (PT-BR + EN)
  • ✅ Better comment tree extraction

v1.0

  • Initial release

Reddit Scraper

🇺🇸 English | 🇧🇷 Português

Raspe posts, árvores de comentários reais, métricas de engajamento e sentimento de qualquer subreddit ou busca global no Reddit, direto do feed RSS público + endpoint público .json de comentários do Reddit. Obtenha títulos, permalinks, autores, datas de criação e — opcionalmente — threads completas de comentários. Sem API key, sem login, sem credenciais.

Fonte de dados: este actor lê o feed RSS/Atom público do Reddit (https://www.reddit.com/r/{subreddit}/{sort}/.rss) para os posts e — quando includeComments está ativo — enriquece até maxPostsWithComments posts com árvores de comentários reais via endpoint público .json do Reddit (/comments/{post_id}.json?limit=&depth=&sort=top). Sem autenticação.

Limitações: o feed RSS sozinho não expõe métricas de engajamento nem árvore de comentários; sem includeComments, os campos abaixo ficam null / vazios e nunca são inventados:

  • score, upvote_ratio, num_comments → null
  • selftext (corpo do post) → null (o feed só traz o título e um bloco de links padrão)
  • comments_tree → [] Com o fetch de comentários ativo, score, num_comments, selftext, upvote_ratio e is_video são enriquecidos com os valores reais do post listing, e comments_tree traz a árvore real (até commentsLimit comentários de nível superior × commentsDepth de recursão). Se o fetch falhar ou for bloqueado, o post ainda é retornado com comments_tree: [] — nada é inventado.

✨ Funcionalidades

  • 🔍 Raspagem de subreddits — posts hot, new, top, rising, controversial
  • 🌐 Busca global / no subreddit — pesquise no Reddit via feed RSS de busca público
  • 💬 Árvores de comentários reais via endpoint público .json — threads recursivas de respostas (sem API key) com author, body, score, created_utc, depth, permalink, replies[]
  • 📊 Enriquecimento real de engajamento — ao buscar comentários, score, num_comments, selftext, upvote_ratio, is_video são preenchidos com valores reais do post listing (nunca inventados)
  • 💬 Análise de sentimento — suporte PT-BR + EN (positivo/neutro/negativo) no título
  • 🧹 content_clean — texto limpo pronto para ML/IA
  • ⚡ Leve — HTTP puro + parse RSS/Atom, sem navegador
  • 🔑 Zero credenciais — feed RSS público, sem API key ou login
  • 🔁 Resiliente — retry-on-429 com backoff + espaçamento entre subreddits
  • 🌐 Apify Proxy — suporte a proxy integrado para confiabilidade

📥 Entrada

CampoTipoPadrãoDescrição
subredditsstring[]["brasil"]Lista de subreddits para raspar
searchQuerystring""Busca global (substitui subreddits)
sortenum"hot"Ordenação: hot, new, top, rising, controversial
timeenum"week"Filtro de tempo: hour, day, week, month, year, all
maxPostsinteger10Máximo de posts a coletar
maxPostsWithCommentsinteger3Quantos posts coletados recebem fetch de árvore de comentários (0 = nenhum; FREE tier limitado a 1)
includeCommentsbooleantrueBuscar árvores de comentários reais via endpoint público .json do Reddit (sem API key)
commentsDepthinteger3Profundidade máxima dos comentários (recursiva; limitada a 10)
commentsLimitinteger10Máx comentários de nível superior por post (Reddit limita a 100)

Exemplo de Entrada

{
"subreddits": ["brasil", "technology"],
"sort": "hot",
"time": "week",
"maxPosts": 5,
"maxPostsWithComments": 3,
"includeComments": true,
"commentsDepth": 2,
"commentsLimit": 5
}

📤 Saída

Cada post produz um objeto:

CampoTipoDescrição
post_idstring|nullID do post (base36, do <id> do Atom)
subredditstring|nullNome do subreddit
titlestringTítulo do post
selftextstring|nullCorpo do post — null via RSS; enriquecido com o corpo real quando comentários são buscados
authorstringNome do autor, [deleted] quando o feed não traz
scorenumber|nullVotos líquidos — null via RSS; enriquecido com o valor real quando comentários são buscados
upvote_rationumber|nullProporção de upvotes — null via RSS; enriquecida com o valor real quando comentários são buscados
num_commentsnumber|nullTotal de comentários — null via RSS; enriquecido com o valor real quando comentários são buscados
urlstring|nullURL do post (permalink)
permalinkstring|nullPermalink do Reddit (caminho relativo)
created_utcinteger|nullTimestamp Unix (da data do RSS)
createdISOstring|nullData de criação em ISO 8601 (da data do RSS)
flairstring|nullFlair do post (best effort)
is_videoboolean|nullnull via RSS; booleano real nos posts enriquecidos pelo fetch .json
content_cleanstringTexto limpo do título para ML
sentimentstringSentimento do título (heurística PT-BR + EN)
comments_treearrayÁrvore real de comentários. Preenchida só nos posts que recebem o fetch .json — os primeiros maxPostsWithComments da execução (FREE tier: 1). [] nos demais posts e [] quando o fetch é bloqueado

📋 Casos de Uso

  • Dados para IA/ML — Texto limpo com content_clean, pronto para NLP
  • Pesquisa de mercado — Monitore discussões sobre marcas e produtos
  • Análise de sentimento — Acompanhe o sentimento da comunidade ao longo do tempo
  • Inteligência competitiva — Monitore o que falam sobre concorrentes
  • Ideias de conteúdo — Encontre tópicos populares no seu nicho
  • Pesquisa acadêmica — Colete dados estruturados de comunidades do Reddit
  • Monitoramento de comunidade — Acompanhe engajamento de subreddits

❓ Perguntas Frequentes

P: Preciso de API key do Reddit? R: Não! Este actor lê o feed RSS público do Reddit — sem API key, sem login, sem credenciais.

P: Por que score, num_comments e a árvore de comentários vêm vazios? R: Quando includeComments é false, o actor usa apenas o feed RSS público do Reddit, que não inclui métricas de engajamento nem comentários — esses campos retornam null / [] em vez de serem inventados. Ative includeComments (e maxPostsWithComments > 0) para enriquecer posts com scores reais, contagem de comentários, corpo do post e árvores completas via endpoint público .json.

P: O includeComments faz algo? R: Sim! Desde a v1.7 ele busca árvores de comentários reais via endpoint público .json do Reddit (sem API key). O número de posts enriquecidos é limitado por maxPostsWithComments (FREE tier: 1 post) e o tamanho da árvore por commentsLimit / commentsDepth.

P: Qual proxy devo usar? R: O proxy padrão da Apify (datacenter) funciona para o feed RSS. Residential US fica como fallback se houver rate limit.

P: Posso buscar em todo o Reddit? R: Sim! Use o campo searchQuery para busca global (ou dentro de um subreddit) via feed RSS de busca público.

P: Suporta conteúdo em português? R: Sim! A análise de sentimento suporta palavras-chave PT-BR e inglês, e o parser lida corretamente com títulos UTF-8.

💰 Preços

Este actor usa precificação Pay Per Event (PPE):

MétricaCusto
post-scraped$0.005 por post ($5,00 / 1.000)

Não há evento por comentário. Usage (CU/proxy) é do cliente.

🔗 Actors Relacionados