Use it for brand and PR monitoring, market and product research, finding the questions people ask for SEO and content, social listening, idea validation, or Reddit datasets for AI and analytics. It runs in your Apify account, and you do not need a Reddit login, API key, OAuth app or cookies.
What it collects
- Posts: ID, URL, title, body as plain text and HTML, and publish time and date.
- Comments: ID, URL, text, publish time and date, reply status and attached image URLs.
- Parent posts: every comment carries its post’s ID, title, URL, score, comment count and date.
- Subreddits and authors: the community’s name and URL, and the author’s name and profile URL, on every result at no extra charge.
- Engagement: the score on every result, plus upvotes and comment count for posts.
- Attribution: the result’s rank in Reddit’s results and the keyword that first found it.
How it works
Reddit Scraper runs Reddit’s keyword search for you, with no headless browser, no login and no API credentials on your end. Choose posts or comments and give it one or more keywords: it walks the result pages of each keyword, removes results that appear more than once, and stops at your maxItemsPerQuery and maxItems limits or your pay-per-event budget.
Post search finds threads across all of Reddit, sorted by relevance, newest, top or most comments, and optionally limited to the past day, week, month or year; it goes up to about 250 results per keyword and sort order. Comment search finds individual comments that mention your keywords, sorted by relevance, newest or top, and each one comes with its parent post’s title, URL, score and comment count.
Use cases
- Brand and PR teams — monitor what Reddit says about a brand, product or competitor, in posts and in comments.
- Market and product researchers — collect user opinions, complaints and feature requests around a topic.
- SEO and content marketers — find the questions people actually ask, and the threads that get discussed.
- Trend and social listening analysts — track how a topic is discussed over the past day, week, month or year.
- AI and data teams — build datasets of Reddit posts and comments for analysis, classification or LLM pipelines.
- Founders — validate an idea by reading how people describe the problem in their own words.
Input
Set these in the Actor’s input form on Apify, or send them as JSON through the API.
-
searchType— What to search:posts(“Posts”), the default, orcomments(“Comments”). One run searches one type, so run the Actor twice for both. Comment results include the title, URL, score and comment count of the post they belong to. -
keywords— Required: at least one, one per line. Each keyword runs a separate Reddit search, and results are deduplicated across keywords, so a post or comment is never charged twice. Reddit has no hashtags: use plain keywords. A run handles up to 1,000 keywords, and a keyword longer than 200 characters is skipped with a warning. -
sort— Result order:relevance(“Relevance”), the default;new(“Newest”);top(“Top (most upvoted)”); orcomments(“Most comments”), for post search only. Comment search falls back torelevance, with a warning in the log. -
timeframe— Only include posts from this period:all(“All time”), the default;day(“Past 24 hours”);week(“Past week”);month(“Past month”); oryear(“Past year”). Post search only; comment search ignores it. -
maxItemsPerQuery— Maximum results per keyword. Empty means 100, the pre-filled value;0removes the per-keyword limit, up to 5,000. Reddit’s post search ends at about 250 results per keyword and sort order. -
maxItems— Overall cap across all keywords combined.0or empty means unlimited, though each keyword is still capped bymaxItemsPerQuery. The form pre-fills 1,000. -
customMapFunction— Optional(object) => objectJavaScript function applied to every item, to reshape or enrich it. It must not be used for filtering. Leave it empty to store items unchanged.
Custom map function
Use customMapFunction to reshape or enrich items on the fly. The input form pre-fills a function that returns each item unchanged, a starting point to edit:
(object) => { return {...object} } The README sets one rule:
- No filtering. The function takes an item and returns an item.
The input form adds that the function must not be used for filtering, and that accounts using it for filtering may be banned.
Input tips
Take a quick sample
Run a single keyword with maxItems set to 10: a cheap, fast check that the Actor and your keyword return what you expect.
Find the most discussed posts of the past month
Sort post search by most comments and limit it to the past month:
{
"searchType": "posts",
"keywords": [
"claude code"
],
"sort": "comments",
"timeframe": "month",
"maxItemsPerQuery": 100
} Monitor fresh mentions
Use sort: new, add timeframe: day or week for post search, and schedule the run. Each run then picks up what was posted since the last one.
Find brand mentions in comments
Search comments to find every place a brand or product is mentioned in passing, inside threads that are about something else. This input collects the newest comments that mention three apps, with cross-keyword dedup applied automatically:
{
"searchType": "comments",
"keywords": [
"notion",
"obsidian",
"logseq"
],
"sort": "new",
"maxItemsPerQuery": 100,
"maxItems": 300
} Go as deep as Reddit allows on one keyword
Post search stops at about 250 results per keyword and sort order, and some of those repeat. To go beyond that, run the keyword again with other sort values or timeframe windows, or add more specific related keywords. This input collects the top posts of all time:
{
"keywords": [
"home espresso"
],
"sort": "top",
"timeframe": "all",
"maxItemsPerQuery": 0,
"maxItems": 0
} Output
Each run writes its results to an Apify dataset. Each item is one unique Reddit post or comment, and its type field says which: post or comment. A keyword with no matches adds no items; it isn’t stored as a placeholder row. In Apify Console, the dataset’s Overview shows the type, URL, title, text, subreddit, author, score and date.
These are the main fields of an item.
-
typeidfullnameurl—postorcomment, Reddit’s short ID, the same ID with its type prefix (t3_for posts,t1_for comments) and the permalink. -
titletexttextHtml— A post’s title, and the post body or comment as plain text and HTML. A title-only post has an emptytextand notextHtml. -
createTimecreateDate— The publish time as a Unix timestamp in seconds, and the same moment as aYYYY-MM-DDdate in UTC. -
subredditauthorMeta— The subreddit’s name and URL, and the author’s name and profile URL. Author details are left out for deleted accounts. -
statistics—scoreon every result; posts also haveupvotesandcommentCount. -
postisReplyparentCommentId— Comments only: the parent post’s ID, title, URL, score, comment count, flags and date, and whether the comment answers another comment, whose short ID is then inparentCommentId. -
images— Comments only: attached image URLs, usually an empty list. They are signed links that expire. -
searchPositionsearchKeywordinputKeyword— The result’s 0-based rank in Reddit’s results for its keyword, counted across pages, and the keyword that first found it.
{
"type": "post",
"id": "abc1234",
"fullname": "t3_abc1234",
"url": "https://www.reddit.com/r/ExampleCommunity/comments/abc1234/example_post/",
"title": "Which home espresso setup would you recommend?",
"text": "Looking for a first machine and grinder. Any tips?",
"createTime": 1791288000,
"createDate": "2026-10-06",
"subreddit": {
"name": "ExampleCommunity",
"url": "https://www.reddit.com/r/ExampleCommunity/"
},
"authorMeta": {
"name": "example_user",
"url": "https://www.reddit.com/user/example_user/"
},
"statistics": {
"score": 128,
"upvotes": 128,
"commentCount": 46
},
"searchPosition": 0,
"searchKeyword": "home espresso",
"inputKeyword": "home espresso"
} {
"type": "comment",
"id": "def5678",
"fullname": "t1_def5678",
"url": "https://www.reddit.com/r/ExampleCommunity/comments/abc1234/example_post/def5678/",
"text": "A good grinder matters more than the machine.",
"textHtml": "<p>A good grinder matters more than the machine.</p>",
"createTime": 1791291600,
"createDate": "2026-10-06",
"isReply": false,
"images": [],
"authorMeta": {
"name": "example_commenter",
"url": "https://www.reddit.com/user/example_commenter/"
},
"statistics": {
"score": 42
},
"post": {
"id": "abc1234",
"title": "Which home espresso setup would you recommend?",
"url": "https://www.reddit.com/r/ExampleCommunity/comments/abc1234/example_post/",
"score": 128,
"commentCount": 46,
"createDate": "2026-10-06"
},
"subreddit": {
"name": "ExampleCommunity",
"url": "https://www.reddit.com/r/ExampleCommunity/"
},
"searchPosition": 0,
"searchKeyword": "home espresso",
"inputKeyword": "home espresso"
} Field reference
Every documented key of a dataset item, with its JSON type. A dot marks a key inside an object.
| Field | Type | Meaning |
|---|---|---|
type | string | post or comment. |
id | string | Reddit’s short ID for the post or comment. |
fullname | string | The same ID with Reddit’s type prefix: t3_ for posts, t1_ for comments. |
url | string | The post or comment permalink. |
title | string | Posts only: the post title. |
text | string | The post body or comment as plain text. Empty on a title-only post. |
textHtml | string | The same as HTML, left out on a title-only post. Images embedded in a post body appear only here. |
createTime | number | The publish time as a Unix timestamp in seconds. |
createDate | string | The same moment as a YYYY-MM-DD date, in UTC. |
subreddit.name subreddit.url | string | The subreddit’s name and URL. |
subreddit.icon | string | The subreddit’s icon URL, left out when there is none. |
authorMeta.name authorMeta.url | string | The author’s username and profile URL. Author details are left out for deleted accounts. |
authorMeta.avatar | string | The author’s avatar URL, left out when there is none. |
statistics.score | number | The score, on every result. |
statistics.upvotes statistics.commentCount | number | Posts only: upvotes and comment count. |
post | object | Comments only: the parent post’s short id, title, url, score, commentCount, flags and createDate. |
isReply | boolean | Comments only: true when the comment answers another comment. |
parentCommentId | string | Comments only: the short ID of the comment it answers. Top-level comments have none. |
images | array | Comments only: attached image URLs, usually an empty list. They are signed links that expire, so download promptly if you need them. |
searchPosition | number | The result’s 0-based rank in Reddit’s results for its keyword, counted across pages. |
searchKeyword inputKeyword | string | The keyword that found the result. A result is stored once, under whichever keyword found it first. |
isVideo isNsfw isSpoiler | boolean | In the README’s post sample, as false; the README does not describe them. Check a run of your own before relying on them. |
authorMeta.id subreddit.id | string | In the README’s samples, as t2_ and t5_ IDs; the README does not describe them. Check a run of your own before relying on them. |
authorMeta.isNsfw subreddit.isNsfw subreddit.isQuarantined | boolean | In the README’s comment sample, as false; the README does not describe them. Check a run of your own before relying on them. |
How to run it
- Open the Actor on Apify, listed as “Reddit Scraper”, and sign in. You need an Apify account.
- Fill in the Input tab, then click Start.
- When the run finishes, open the Output tab and click Export to download the dataset as JSON, CSV or another format.
Or send the same input to the Apify API. This call runs the Actor and returns its dataset items. Replace $APIFY_TOKEN with the API token from your Apify Console.
curl -X POST \
"https://api.apify.com/v2/actors/batscrape~reddit-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"searchType":"posts","keywords":["home espresso"],"maxItems":10}' The call waits up to 300 seconds. For a longer run, start it asynchronously and read the dataset when it finishes. Read the Apify API reference.
New to Apify? See how BatScrape Actors run on Apify. To run it on a schedule, or send results on when a run finishes, see schedules and webhooks.
Pricing
Pay per event. A run is charged when it starts, then one result event for every unique post or comment delivered to your dataset, with no separate per-keyword or per-page fee. A result found by more than one keyword is stored and charged once, a keyword with no matches adds no result charges, and there is no free allowance. Every result is checked against the run’s charge budget before it’s stored, so a run stops cleanly instead of overspending. See current rates on Apify .
Limitations
- Post search ends at about 250 results per keyword and sort order, Reddit’s own limit, and some of those repeat. For more, combine sort orders and time filters or add more specific keywords.
- Comment search has no stated depth: it continues until Reddit has no more comments, a limit is reached, or the last pages add few new comments. The time filter and the “most comments” sort apply to post search only.
- It does not fetch a post’s full comment thread: comment search returns the individual comments that match your keyword. Upvote ratio, awards, flair, thumbnails and subreddit subscriber counts are not available from Reddit search.
- It returns metadata and links only, and downloads no images or videos. Posts carry no media fields, and comment image URLs are signed links that expire.
- Search operators such as
subreddit:orauthor:have not been tested with the Actor, so their behaviour is not guaranteed. - A run handles up to 1,000 keywords; the rest are skipped with a warning. A keyword stops early when its last pages keep adding few new results.
- On the Apify free plan, a run is limited to one request: the first page of results for the first keyword. A paid plan removes that limit.
FAQ
Answers from the Actor’s README on Apify.
Do I need a Reddit account, login or API key?
No. Searches run through a backend service, and no login, cookies, API key or OAuth app are required on your end. You need an Apify account to run the Actor.
How many results do I get per keyword?
Up to maxItemsPerQuery results (100 when left empty, up to 5,000 when set to 0), within maxItems and the run’s maximum charge. Post search ends at about 250 posts per keyword and sort order, Reddit’s own limit, and some of those repeat. Comment search continues until Reddit has no more comments, a limit is reached, or the last pages add few new comments.
Can I filter comments by time, or sort them by most comments?
No. The time filter and the “most comments” sort apply to post search only. For comment search the time filter is ignored and “most comments” falls back to relevance, with a warning in the log. Use sort: new to get the newest comments first.
Can I use hashtags or search operators such as `subreddit:`?
Reddit has no hashtags, so search with plain keywords. Search operators such as subreddit: or author: have not been tested with this Actor, so their behaviour can’t be promised. To focus on one community, use subreddit.name in the output.
What’s included at no extra charge?
Subreddit, author and score come with every result, plus upvotes and comment count for posts and the parent post’s title, URL, score and comment count for comments. Duplicates are removed for free, and a keyword with no matches adds no result charges. There is no free allowance: every delivered result is charged.
Does it download images or videos?
No. It returns metadata and links only. Comments may include image URLs in images, signed links that expire; posts carry no media fields, and images embedded in a post body appear only inside textHtml.
Why did a run return few or no results?
Check these first:
- Your plan: on the Apify free plan a run is limited to the first page of results for the first keyword. The log says so when the limit applies.
- The log: every keyword ends with a line that says which limit stopped it.
-
maxItemsPerQuery: left empty, a keyword stops at 100 results. Raise it, or set it to0for no per-keyword limit. -
maxItems: the whole run stops once it’s reached, even if a keyword has not reached its own limit. - The charge budget: a run that can’t afford another result stops cleanly rather than erroring.
-
timeframe: a short window on a rare keyword can leave few matches. - Dedup: a keyword whose results an earlier keyword in the run already collected adds nothing new.
How do I keep the cost of a run down?
Three settings help:
- Set
maxItemsto a hard cap that matches your budget, and keepmaxItemsPerQuerylow when you only need the top results of each keyword. - Batch related keywords into one run: cross-keyword dedup means overlaps are never charged twice.
- On scheduled post searches, use
sort: newwith a shorttimeframe, so each run collects recent posts instead of ones you already have.
Related reading
- What to check before budgeting an Actor run — Understand the questions behind a scraping budget: the Actor’s current pricing, your input limits, sample output, and the effect of retries or incomplete runs.
- Planning predictable output for our Apify Actors — How we’re approaching output schemas for BatScrape: explicit fields, example records, and clear change notes before consumers build on a dataset.
- Planning a scraper around the data you need — A practical starting checklist for a scraping task: define the records, inspect a sample, identify useful fields, and make the output easy to validate.
- How to use BatScrape Actors on Apify — Run an Actor in Apify Console or through the API, export its dataset, schedule runs and pass results to automation tools.
Other BatScrape Actors
- TikTok Shop Scraper — Scrape US TikTok Shop products by keyword or store, and full product pages and buyer reviews from product URLs. Export prices, discounts, ratings, units sold, SKU stock and shipping.
- Threads Scraper — Search Threads by keyword or collect a public account’s latest posts. Export text, authors, engagement, topics, mentions, links and media URLs without a Threads login.
- Realtor.com Scraper — Scrape Realtor.com for-sale, rental and sold listings by city, ZIP code or URL. Export price, beds, baths, photos, sale and tax history, schools and agents.
- TikTok Scraper — Search TikTok by keyword and export unique videos with creator profiles, engagement stats, music, hashtags and media URLs. Sort by relevance or likes, filter by date and region.
- Douyin Scraper — Search Douyin (抖音), also known as TikTok China, by keyword. Export unique posts with creator profiles, engagement stats, music and media URLs.
- FollowScores Scraper — Extract live football fixtures, results and team profiles for 11 European competitions and 214 teams.
Every published Actor is on the scrapers hub.