Skip to content
Social media Apify Actor

Reddit Scraper for keyword search.

Reddit Scraper is a BatScrape Actor on Apify that searches Reddit posts or comments by keyword across all subreddits. It returns one JSON record per unique post or comment, with its text, subreddit, author and score; posts add upvotes and comment counts, and comments carry their parent post.

Runs in your Apify account. Export JSON or CSV.

  • Posts
  • Comments
  • Subreddits & authors
  • Scores
Reddit in action Illustrative demo
01 / INPUT

Set the input

Choose a keyword to search on Reddit.

Search keywords Required
home espresso Keyword
Search for Posts
Result limit 10
Output format Structured JSON

Example configuration · Run your own search on Apify.

02 / RESULT

Preview a record

Each result includes its subreddit, author and score.

Made-up values · Actual field names · No live request.

03 / EXPORT

Export JSON

Use the structured dataset in your research or automation.

dataset-item.json JSON
{
  "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"
}
Download sample JSON

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, or comments (“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)”); or comments (“Most comments”), for post search only. Comment search falls back to relevance, 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”); or year (“Past year”). Post search only; comment search ignores it.
  • maxItemsPerQuery — Maximum results per keyword. Empty means 100, the pre-filled value; 0 removes 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. 0 or empty means unlimited, though each keyword is still capped by maxItemsPerQuery. The form pre-fills 1,000.
  • customMapFunction — Optional (object) => object JavaScript 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.

  • type id fullname url — post or comment, Reddit’s short ID, the same ID with its type prefix (t3_ for posts, t1_ for comments) and the permalink.
  • title text textHtml — A post’s title, and the post body or comment as plain text and HTML. A title-only post has an empty text and no textHtml.
  • createTime createDate — The publish time as a Unix timestamp in seconds, and the same moment as a YYYY-MM-DD date in UTC.
  • subreddit authorMeta — The subreddit’s name and URL, and the author’s name and profile URL. Author details are left out for deleted accounts.
  • statistics — score on every result; posts also have upvotes and commentCount.
  • post isReply parentCommentId — 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 in parentCommentId.
  • images — Comments only: attached image URLs, usually an empty list. They are signed links that expire.
  • searchPosition searchKeyword inputKeyword — 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"
}
Illustrative record: real field names, made-up values, trimmed.
{
  "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"
}
Illustrative comment result, from `searchType: comments`: it carries its parent post in `post`. Made-up values, trimmed.

Field reference

Every documented key of a dataset item, with its JSON type. A dot marks a key inside an object.

FieldTypeMeaning
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

  1. Open the Actor on Apify, listed as “Reddit Scraper”, and sign in. You need an Apify account.
  2. Fill in the Input tab, then click Start.
  3. 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: or author: 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 to 0 for 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 maxItems to a hard cap that matches your budget, and keep maxItemsPerQuery low 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: new with a short timeframe, so each run collects recent posts instead of ones you already have.

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.

YOUR NEXT DATASET STARTS HERE

Scrape at scale. Build with better data.

Discover our scraping actors on Apify. Configure your source and connect the results to your workflow.

  • Run actors on Apify
  • Export JSON or CSV
FROM SOURCE TO DATASET
Apify 02 / Run

03 / Use your data

JSON Apps & APIs
CSV Sheets & analysis
Ready for your workflow

Your source. Your Apify account. Your data.

Purpose-built actors. One place to start. Explore the scraper collection