Reddit Search Scraper avatar

Reddit Search Scraper

Pricing

from $1.00 / 1,000 results

Go to Apify Store
Reddit Search Scraper

Reddit Search Scraper

Search Reddit posts globally or within a subreddit. Sort by relevance/hot/new/top/comments.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Farhan Febrian Nauval

Farhan Febrian Nauval

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

19 days ago

Last modified

Categories

Share

Search Reddit posts by keyword — across all of Reddit or restricted to one subreddit — and stream a clean JSON record per post into your Apify dataset.

Why use this actor

  • Global or subreddit-scoped — search the entire Reddit corpus, or narrow to a single community like r/python for higher signal.
  • Multiple sort modes — relevance, hot, new, top, and most-commented, paired with a time window (hour / day / week / month / year / all).
  • Bulk queries — pass any number of keywords in one run; results from every query land in the same dataset, joinable back to your input via _input.
  • No account / no login required — the public path works out of the box. An optional client ID slot is available for users who want higher rate limits on heavy jobs.
  • Automatic retries and fallbacks — transient failures retry with exponential backoff, and the actor transparently switches data paths if one is rate-limited.
  • Stable JSON output — every row carries _input, _source, and _scrapedAt envelope fields so it slots straight into pipelines, spreadsheets, and databases.

How it works

  1. You supply one or more search terms (and optionally a subreddit to restrict to, a sort mode, and a time window).
  2. The actor runs each query against Reddit's search and pages through results up to your maxPosts limit per query.
  3. Each post is normalized into a flat JSON record and streamed into the run's dataset, ready to download as JSON, CSV, or Excel.

You do not need to manage scrapers, browsers, or rotating IPs — all handled internally.

Input

{
"queries": ["python", "machine learning"],
"subreddit": "python",
"sort": "new",
"timeFilter": "all",
"maxPosts": 25,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["DATACENTER"]
}
}
FieldTypeDescription
queriesarrayOne or more search terms. Each query runs independently. Required.
subredditstringOptional subreddit name (without r/) to restrict the search to. Leave blank for a global search.
sortstringrelevance (default), hot, new, top, or comments.
timeFilterstringhour, day, week, month, year, or all. Only meaningful for top / comments sort.
maxPostsintegerMax posts returned per query. Default 25. Use 0 for unlimited (Reddit caps pagination at ~1,000 per query).
redditClientIdstringOptional Reddit client ID for higher rate limits. Leave blank for the public path.
proxyConfigurationobjectApify Proxy settings. Datacenter works for most jobs.

Output

Sample command:

python test_local.py python --max 3 --sort new

Three real rows from that run (each Reddit post object has ~100 fields; the most useful ones are shown — full record is what your dataset will contain):

{
"_input": "python",
"_subreddit": null,
"_source": "S3-fallback",
"_scrapedAt": "2026-05-18T11:09:23.157233+00:00",
"id": "1tgj61p",
"name": "t3_1tgj61p",
"subreddit": "esp32",
"subreddit_name_prefixed": "r/esp32",
"subreddit_subscribers": 186169,
"subreddit_type": "public",
"title": "Introduction Course for Esp32s3 with Esp_IDF",
"selftext": "There are not many guides and tutorials for ESP-IDF, most courses are covered using MicroPython or Arduino IDE and Others are Paid ones, so I built this small showcase and tutorial to be a quick start for ESP-IDF...",
"author": "Algstud",
"author_fullname": "t2_y5vowmd5s",
"score": 1,
"ups": 1,
"downs": 0,
"upvote_ratio": 1.0,
"num_comments": 0,
"num_crossposts": 0,
"created_utc": 1779102116.0,
"domain": "github.com",
"url": "https://github.com/Bayt-al-Hikmah/Esp32S3",
"permalink": "/r/esp32/comments/1tgj61p/introduction_course_for_esp32s3_with_esp_idf/",
"link_flair_text": "I made a thing!",
"is_self": false,
"is_video": false,
"over_18": false,
"spoiler": false,
"locked": false,
"archived": false,
"stickied": false,
"thumbnail": "https://external-preview.redd.it/ytq2ya-Oo2hIRZTRqTrPcF-JSlsz3ewW0GmhJWL1PV4.png?width=140&height=70&auto=webp&s=6dbdbfb056a9edf231166b1f2e84fb410c55be53"
}
{
"_input": "python",
"_subreddit": null,
"_source": "S3-fallback",
"_scrapedAt": "2026-05-18T11:09:23.158235+00:00",
"id": "1tgj5uf",
"name": "t3_1tgj5uf",
"subreddit": "mcp",
"subreddit_name_prefixed": "r/mcp",
"subreddit_subscribers": 108813,
"title": "Memcord v3.4.1",
"selftext": "Privacy-first, self-hosted MCP server (python based) helps you organize chat history, summarize messages, search across past chats with AI...",
"author": "Longjumping_Tie_7758",
"score": 1,
"ups": 1,
"upvote_ratio": 1.0,
"num_comments": 0,
"created_utc": 1779102101.0,
"domain": "self.mcp",
"url": "https://old.reddit.com/r/mcp/comments/1tgj5uf/memcord_v341/",
"permalink": "/r/mcp/comments/1tgj5uf/memcord_v341/",
"link_flair_text": "resource",
"is_self": true,
"is_video": false,
"over_18": false
}
{
"_input": "python",
"_subreddit": null,
"_source": "S3-fallback",
"_scrapedAt": "2026-05-18T11:09:23.158235+00:00",
"id": "1tgj4v7",
"name": "t3_1tgj4v7",
"subreddit": "grafana",
"subreddit_name_prefixed": "r/grafana",
"subreddit_subscribers": 24820,
"title": "built a grafana dashboard that tracks zestimate drift across my rental portfolio and it caught a $40k valuation drop i would have missed",
"selftext": "i own 6 rental units and i wanted a way to passively monitor what's happening with property values without manually checking zillow every week...",
"author": "straightedge23",
"score": 1,
"ups": 1,
"upvote_ratio": 1.0,
"num_comments": 0,
"created_utc": 1779102034.0,
"domain": "self.grafana",
"url": "https://old.reddit.com/r/grafana/comments/1tgj4v7/built_a_grafana_dashboard_that_tracks_zestimate/",
"permalink": "/r/grafana/comments/1tgj4v7/built_a_grafana_dashboard_that_tracks_zestimate/",
"link_flair_text": ":Confused: Miscellaneous",
"is_self": true,
"over_18": false
}
FieldTypeDescription
_inputstringThe query you supplied, exactly as written. Use this to join results back to your input list.
_subredditstring | nullThe subreddit restriction you applied, or null for a global search.
_sourcestringInternal tag for the data path used. S1-primary is the fastest path; S2-fallback and S3-fallback indicate a fallback was used (still complete data).
_scrapedAtstringISO-8601 UTC timestamp when the record was scraped.
idstringReddit post ID (the short form, e.g. 1tgj61p).
namestringReddit "fullname" — t3_ prefix + id. Use this when cross-referencing with the comments endpoint.
subredditstringSubreddit the post is in (without r/).
subreddit_name_prefixedstringDisplay form with the r/ prefix.
subreddit_subscribersintegerSubscriber count of the host subreddit at scrape time.
subreddit_typestringpublic, restricted, private, etc.
titlestringPost title.
selftextstringSelf-post body in Markdown. Empty for link posts.
authorstringUsername of the poster. [deleted] if the author removed their account.
author_fullnamestringReddit fullname of the author (t2_...).
scoreintegerPost score (upvotes minus downvotes after fuzzing).
upsintegerFuzzed upvote count.
downsintegerFuzzed downvote count (Reddit returns 0 in the public API).
upvote_rationumberRatio of upvotes to total votes (0.0–1.0).
num_commentsintegerNumber of comments on the post.
num_crosspostsintegerNumber of times the post has been crossposted.
created_utcnumberPost creation time as a UNIX timestamp.
domainstringOutbound domain for link posts; self.<subreddit> for self-posts.
urlstringOutbound URL for link posts, or the Reddit comments URL for self-posts.
permalinkstringRelative path on reddit.com to the post's comments page.
link_flair_textstring | nullFlair text on the post, if any.
is_selfbooleantrue for text/self posts.
is_videobooleantrue for video posts.
over_18booleanNSFW marker.
spoilerbooleanSpoiler marker.
lockedbooleantrue if comments are locked.
archivedbooleantrue if the post is past the archive cutoff.
stickiedbooleantrue if the post is pinned at the top of its subreddit.
thumbnailstringThumbnail URL, or self / default / nsfw placeholders.

Each post also carries Reddit's full set of supplementary fields (media previews, awards, mod flags, gildings, etc.) — these stream through unchanged into your dataset.

Error envelope

Queries that fail (rate-limit, network error, all fallback paths exhausted) emit a structured error instead of crashing the run:

{
"_input": "python",
"_error": "fetch_failed",
"_errorDetail": "all strategies failed",
"_source": "S3-fallback",
"_scrapedAt": "2026-05-18T11:09:23.157233+00:00"
}

Filter on _error to triage failed rows.

Pricing

This actor is billed per result: $3.50 per 1,000 posts. Each post in the dataset = 1 result. Errors are not billed.

Other Sosmed Actors

PlatformActorBest for
RedditReddit Subreddit Posts ScraperStream the live feed of any subreddit (hot / new / top / rising).
RedditReddit Post Detail ScraperPull a post + its full comment tree.
RedditReddit User Profile ScraperKarma, trophies, submitted/comments history for any user.
YouTubeYouTube Search ScraperSearch YouTube videos by keyword.
BlueskyBluesky Search ScraperKeyword search across the atproto network.
X / TwitterX Search ScraperSearch tweets by keyword, hashtag, or user filter.
MastodonMastodon Account ScraperProfile + post counts for any Mastodon handle.

Browse the full catalog at apify.com/xtracto.

Notes

  • NSFW filtering — NSFW posts come through with over_18: true. Filter them out in your post-processing if you don't want them.
  • Subreddit scope — leave subreddit blank for a global search across all of Reddit, or set it to a community name like python to restrict results to that subreddit only.
  • Sort + time window — the timeFilter field only changes results when sort is top or comments. For new, hot, and relevance it is ignored.
  • Pagination cap — Reddit limits search pagination to roughly the first 1,000 results per query. To get more breadth, split into narrower queries (e.g. by adding date ranges or topic qualifiers).
  • Optional client ID — provide your own Reddit client ID via redditClientId for higher per-IP rate limits on very large jobs. Leave it blank for normal use; the public path is the default and works without any setup.
  • Reproducibilityrelevance sort can shift opaquely between runs as Reddit re-ranks results. For stable comparisons across runs, prefer new or top.