Reddit Scraper: Posts, Comments & Subreddits (No login) avatar

Reddit Scraper: Posts, Comments & Subreddits (No login)

Pricing

from $1.25 / 1,000 reddit posts

Go to Apify Store
Reddit Scraper: Posts, Comments & Subreddits (No login)

Reddit Scraper: Posts, Comments & Subreddits (No login)

Scrape Reddit posts and comments from subreddits, search, post URLs and user profiles. No login, no API key. Real score and comment count, clean text, parent IDs for comment threads. Free not-found and error rows.

Pricing

from $1.25 / 1,000 reddit posts

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

2 days ago

Last modified

Share

Scrape public Reddit posts and comments from subreddits, Reddit search, post URLs and user profiles. You get one row per post or comment with its real score, comment count, clean text, author, links and thread IDs. No login and no Reddit API key.

The smallest run reads the 10 newest posts of one subreddit (for example apify) in a few seconds and costs about $0.035.

Reddit Scraper: choose subreddits, search queries, post URLs or users, get posts and comment threads with score and comment count, export to JSON or CSV

Table of contents

What it does

The Actor reads public pages of Reddit and saves posts and comments to a Dataset. Choose one mode:

  • subreddit — posts from one or more subreddits (new, hot, top or rising);
  • search — posts that match keywords, across all public subreddits;
  • post — single posts by URL or ID, usually with their comments;
  • user — posts submitted by a user.

In every mode you can also add comments for each post (maxCommentsPerPost). Each comment keeps parentId and depth, so you can rebuild the reply tree.

Targets that do not exist, are empty or cannot be read get a free status row. You always see what happened to each subreddit, query, post or user.

Good fit

  • Watch what people say about a brand, product or topic in a subreddit or in search.
  • Collect posts and comment threads for market research or a text dataset (AI, RAG, sentiment).
  • Export the posts of known users or a list of posts to a spreadsheet.

Not a fit / limits

  • Only public content. No login, no private, banned or quarantined subreddits, no private messages.
  • In user mode only the user's posts are collected, not their comments.
  • Reddit itself shows at most about 1,000 posts per listing or search, so one target returns up to about 970–995 posts.
  • This is not the official Reddit API. Reddit can change its pages; the Actor reports missing text or score in the run summary when that happens.

Quick start

  1. Open the Input tab.
  2. Keep Mode = Posts from subreddits and type a subreddit in Subreddits, for example apify.
  3. Keep Max posts per target = 10 and Max comments per post = 0 (the prefill).
  4. Click Start.
  5. Open the Output tab and check title, score and numComments of the first rows.

Expected result: 10 newest posts of r/apify, one row each, in about 5 seconds.

Use cases

Buyer jobInput pathOutput entityKey fieldsNext step
Brand or topic monitoringmode: search, searchQueries, sort: newposttitle, text, subreddit, score, createdAtschedule the run, export CSV
Community researchmode: subreddit, subreddits, sort: top, timeFilter: monthpost + commentscore, numComments, text, parentIdspreadsheet or BI tool
Discussion analysismode: post, postUrls, maxCommentsPerPostpost + commenttext, depth, parentId, scoresentiment or AI pipeline
Author researchmode: user, usernamespostsubreddit, title, score, createdAtspreadsheet

Input

Input fields

FieldPlain nameTypeRequiredDefault / prefillAllowed valuesEffect
modeModestringyessubredditsubreddit, search, post, userWhat to read; only the list for this mode is used
subredditsSubredditsstring[]for subredditprefill ["apify"]up to 50; apify, r/apify or a subreddit URLSubreddits to read
searchQueriesSearch queriesstring[]for search—up to 50 keywords or phrasesSearches across all public subreddits
postUrlsPost URLsstring[]for post—up to 50 post URLs or IDs (1x64f49, t3_1x64f49, redd.it/1x64f49)One post row per URL, plus comments
usernamesUsernamesstring[]for user—up to 50; spez, u/spez or a profile URLPosts submitted by each user
maxPostsMax posts per targetintegerno101–1000Posts for each subreddit, query or user (not used in post mode)
maxCommentsPerPostMax comments per postintegerno00–5000 = posts only; otherwise comments with replies for each post
sortPost sortstringnonewnew, hot, top, rising, relevance, commentsOrder of posts
timeFilterTime rangestringnoallhour, day, week, month, year, allTime range for top sort and for search
commentSortComment sortstringnotoptop, new, best, controversial, oldOrder of comments
proxyProxyobjectnoApify Proxy, RESIDENTIAL, USproxy editorReddit blocks datacenter IPs; keep the default

The same post given twice (for example as an ID and as a URL) is saved once. Share links (reddit.com/r/.../s/...) are not supported: open them in a browser and copy the full post URL.

Interacting settings

WhenSettingEffective behavior
mode: subredditsortnew, hot, top, rising; another value falls back to the nearest one (shown in the run summary)
mode: searchsortrelevance, new, top, comments
mode: usersortnew, hot, top
sort: top or mode: searchtimeFilterLimits posts to the chosen time range; other sorts ignore it
mode: postmaxCommentsPerPostSet it above 0 to get comments; maxPosts is ignored
commentSort: newmaxCommentsPerPostReddit may end a "new" comment list early; the run adds a warning. Use top for long threads

Input examples

Newest posts of a subreddit (prefill)

{
"mode": "subreddit",
"subreddits": ["apify"],
"maxPosts": 10,
"maxCommentsPerPost": 0
}

Expected output: 10 post rows with title, text, score, numComments, upvoteRatio, postType. Cost on the free plan: $0.035.

Search with top posts of the month

{
"mode": "search",
"searchQueries": ["web scraping"],
"sort": "top",
"timeFilter": "month",
"maxPosts": 15
}

Expected output: 15 post rows from different subreddits with subreddit, title, text and score.

One post with its comments

{
"mode": "post",
"postUrls": ["https://www.reddit.com/r/AskReddit/comments/1x3uinu/what_previously_glorified_careers_are_struggling_now/"],
"maxCommentsPerPost": 100,
"commentSort": "top"
}

Expected output: 1 post row and up to 100 comment rows with parentId, depth, score and text.

Output

Each row has type: post, comment or status. The Output tab has four views: All rows, Post columns, Comment columns and Status columns.

Output fields

FieldMeaningTypeCan be empty?
typepost, comment or statusstringno
idReddit ID: t3_... for posts, t1_... for commentsstringno (status rows: absent)
postIdt3_ ID of the post (for a comment: its post)stringno (status rows: absent)
parentIdComments: t3_ post ID for a top-level comment, t1_ comment ID for a replystringnull on posts
depthComments: 0 = top level, 1 = reply, …integernull on posts
subredditSubreddit name without r/stringrarely null
titlePost title (on comments: title of their post)stringrarely null
textPost body or comment text, plain text, HTML entities decodedstringnull for link, image and video posts without a body
authorUsernamestringnull for deleted or removed authors
authorIdt2_ ID of the post author (posts only)stringnull on comments
scoreUpvotes minus downvotes, as Reddit shows itintegernull when Reddit hides it or the comment is deleted
upvoteRatioShare of upvotes, 0–1 (posts)numbernull in search and post modes
numCommentsNumber of comments on the postintegernull on comments
urlLink to the post or comment on reddit.comstringnull for some deleted comments
linkUrlLink, image, video or gallery URL of the poststringnull for text posts
postTypetext, link, image, video, gallery, …stringnull in search and post modes
createdAtCreation time, ISO 8601 UTCstringrarely null
statusStatus rows: not_found, no_results or errorstringstatus rows only
messageStatus rows: what happened, in plain wordsstringstatus rows only
errorCodeStatus rows: INVALID_INPUT, SOURCE_BLOCKED, …stringnull for not_found and no_results
modeMode of the runstringno
inputYour subreddit, query, post URL or username as givenstringno
sourceAlways Redditstringno
fetchedAtTime the row was read, ISO 8601 UTCstringno

null means Reddit did not show the value. It is never replaced with 0: a deleted comment has score: null, not 0.

Output entities and surfaces

SituationWhereResult shapeWhat to do
Normal post or commentDatasettype: post / type: commentExport or filter by type
Subreddit or post does not existDatasetfree status: not_found rowCheck the spelling
Empty listing or search; user with no posts or no such userDatasetfree status: no_results rowTry another sort or timeFilter; check the username
Invalid input or source failureDatasetfree status: error row with errorCodeRead message; fix input or retry later
Whole runKey-value store RUN_SUMMARYstatus, reason, counts, targets, warningsCheck which targets returned data

RUN_SUMMARY.status is complete when all targets were read and partial when the run stopped early: your charge limit was reached (CHARGE_LIMIT, run still SUCCEEDED), the run timeout was near, or Reddit failed after some rows were saved. Saved rows stay in the Dataset in every case.

Output example

Post from the prefill run (trimmed text):

{
"type": "post",
"id": "t3_1x64f49",
"postId": "t3_1x64f49",
"parentId": null,
"depth": null,
"subreddit": "apify",
"title": "Weekly: job board",
"text": "Are you expanding your team or looking to hire a freelancer for a project? ...",
"author": "<username>",
"score": 1,
"upvoteRatio": 1,
"numComments": 0,
"url": "https://www.reddit.com/r/apify/comments/1x64f49/weekly_job_board/",
"linkUrl": null,
"postType": "text",
"createdAt": "2026-10-14T22:00:47.863Z",
"mode": "subreddit",
"input": "apify",
"source": "Reddit",
"fetchedAt": "2026-10-15T04:02:10.190Z"
}

Comment row (post mode):

{
"type": "comment",
"id": "t1_pfecihy",
"postId": "t3_1x3uinu",
"parentId": "t3_1x3uinu",
"depth": 0,
"subreddit": "AskReddit",
"title": "What previously glorified careers are struggling now?",
"text": "Graphic design has taken it on the chin",
"author": "<username>",
"score": 23359,
"createdAt": "2026-10-12T06:35:32.317Z",
"source": "Reddit"
}

Status row:

{
"type": "status",
"status": "not_found",
"input": "zzzzzz9",
"mode": "post",
"message": "Post zzzzzz9 was not found: it may be deleted, removed, private or the ID is wrong.",
"errorCode": null,
"source": "Reddit"
}

Moving from another Reddit scraper

Field names differ from some other Reddit Actors, so this is not a drop-in replacement. Common mapping: body → text, username → author, communityName → subreddit, upVotes → score, dataType → type, scrapedAt → fetchedAt. There is no html field: text is already plain text.

Pricing and limits

Pricing unit

You pay per event (pay-per-event). Apify platform usage (compute and proxy) is included in these prices.

EventFreeBronzeSilverGold and higher
Run start (apify-actor-start)$0.02$0.02$0.02$0.02
Post row (post)$0.0015$0.0014$0.0013$0.00125
Comment row (comment)$0.0008$0.00075$0.0007$0.00065
  • status rows (not_found, no_results, error) are free.
  • A run that finds nothing pays only the run start, $0.02.
  • The start event is charged once per run up to 1 GB of memory. The Actor picks 256–1024 MB itself; if you set 2048 MB, the start is charged twice.
  • Set Maximum cost per run in run options to cap spending. When the cap is reached, the run stops, keeps the saved rows and ends as SUCCEEDED with partial in RUN_SUMMARY.

Cost examples (Free plan prices)

ScenarioInput scopeRowsChargeMeasured time
Prefill1 subreddit, 10 posts10 posts$0.035~4 s
Search3 queries × 10 posts30 posts$0.065~20 s
Community research200 posts + comments200 posts + 1,297 comments$1.36~85 s
Nothing found6 searches with no matches0 (status rows)$0.02~5 s

Limits

  • Up to 50 subreddits, queries, posts or users per run; up to 1,000 posts per target and 500 comments per post.
  • Reddit shows at most about 1,000 posts per listing or search (970–995 in our tests); the run summary warns when it lists fewer than maxPosts.
  • Large searches can take several minutes. The default run timeout is 1 hour; the Actor stops 20 seconds before the timeout and keeps all saved rows.

API, export and integrations

  • Export: download the Dataset as JSON, CSV, Excel, XML or HTML from the Output tab, or export one view (Post columns, Comment columns, Status columns).
  • API: start the Actor with the Apify API or the Apify JavaScript/Python client and read Dataset items; check RUN_SUMMARY in the default Key-value store.
  • Scheduling: create a Task with your input and a schedule in Apify Console, for example a daily search with sort: new.
  • Webhooks / no-code: use Apify integrations (Make, Zapier, n8n, webhooks) to send new rows to another tool.

Use with AI agents (MCP)

  • MCP server with only this Actor: https://mcp.apify.com?tools=cliqtomedia/reddit-scraper
  • Smallest useful input: {"mode": "subreddit", "subreddits": ["apify"], "maxPosts": 10, "maxCommentsPerPost": 0}
  • Key output fields: type (post, comment or status), title, text, score, numComments, url.
  • The prefill run takes about 4 seconds and costs $0.035 on the Free plan. Keep maxPosts small (10–50) for answers in under a minute; search is slower than subreddit mode.

Troubleshooting

A subreddit returns a not_found row

Symptom: no posts, one status: not_found row. Likely reason: the subreddit does not exist, is banned or private, or the name has a typo. Action: open https://www.reddit.com/r/<name>/ in a browser and check the name.

A user returns a no_results row

Reddit shows the same empty page for an account without posts, a suspended account and a name that does not exist. So in user mode all three give status: no_results, not not_found. Action: open https://www.reddit.com/user/<name>/submitted/ in a browser and check the name.

Fewer posts than maxPosts

Symptom: for example 11 posts when you asked for 30. Likely reason: Reddit shows only these posts for the chosen sort and timeFilter (for example top of a quiet week). RUN_SUMMARY.warnings says so. Action: choose a longer timeFilter or sort: new.

Fewer comments than maxCommentsPerPost

Likely reason: the post has fewer comments, or commentSort: new was used — Reddit ends that list early. RUN_SUMMARY.counts.commentsCutShort shows it. Action: use commentSort: top.

error row with SOURCE_BLOCKED

Likely reason: Reddit refused every proxy session for this target, or the content needs a login. Action: keep the default residential proxy and retry later. Content behind a login is not collected.

Search results change between runs

Reddit's relevance order can change from page to page and from run to run. Use sort: new or sort: top when you need stable results.

FAQ

Do I need a Reddit account or API key?

No. The Actor reads public pages without login, cookies or an API key.

Reddit does not show them on search results and single post pages. They are filled in subreddit and user modes.

Do I pay for empty results?

You pay the run start ($0.02). Rows for missing, empty or invalid targets are free.

Is the data fresh?

Yes. Each row is read at run time; fetchedAt shows when. Scores and comment counts change on Reddit after that.

How does it read Reddit, and is it allowed?

The Actor reads only pages that anyone can open without an account. It uses a browser-like HTTP client and Apify residential proxies. It does not log in, does not use your cookies and does not solve CAPTCHAs or browser challenges; if Reddit asks for a login or shows a challenge, that target gets an error row.

Reddit's User Agreement does not allow scraping without Reddit's written consent. Check whether your use is permitted. You are responsible for how you use the data, including personal data rules such as GDPR.

Support

For bugs, questions or feature requests, open an issue on the Issues tab of this Actor. Include the run ID, the mode and the error text. Do not post tokens, cookies or private data.