Reddit Scraper avatar

Reddit Scraper

Pricing

from $1.05 / 1,000 scraped entries

Go to Apify Store
Reddit Scraper

Reddit Scraper

Scrape public Reddit posts, comments, subreddits, and user profiles from search queries, Reddit URLs, subreddit feeds, or usernames. Export structured rows with IDs, URLs, authors, timestamps, scores, comment counts, media links, and matched inputs.

Pricing

from $1.05 / 1,000 scraped entries

Rating

0.0

(0)

Developer

Maxime Dupré

Maxime Dupré

Maintained by Community

Actor stats

0

Bookmarked

27

Total users

5

Monthly active users

9 hours ago

Last modified

Share

🔎 Reddit scraper for posts, comments, subreddits, and users

Reddit Scraper collects public data from Reddit search, Reddit URLs, subreddits, and user profiles. It is for marketers, researchers, analysts, and developers who want Reddit data in a clean table. You get posts, comments, community details, user profile facts, scores, comment counts, dates, Reddit links, and media links. You can download the dataset, read it through the Apify API, or send it into your own workflow. You do not need a Reddit account or API key.

📦 Reddit data you can export

Each row has a rowType, so you can filter the dataset by Reddit object type.

Row typeWhat you get
postTitle, text, author, subreddit, score, upvote ratio, comment count, flair, NSFW, spoiler, locked, and pinned flags, Reddit link, and media or shared links
commentComment text, author, subreddit, score, nesting depth, parent post and parent comment IDs, parent post title, and Reddit link
communitySubreddit name, title, description, creation date, NSFW flag, and Reddit link
userUsername, display name, profile description, post karma, comment karma, verified flag, account creation date, and Reddit link

Every row has matchedInput, which shows the search query, URL, subreddit, or username that found it. The url field always holds the Reddit page link. When a post shares an outside link, such as a news article or an image, that link is in media. Some fields are null when Reddit does not show that fact.

The Actor also saves RUN-SUMMARY.json in the key-value store. It has total rows, rows by type, rows by input and subreddit, duplicate counts, skip reasons, and the top engagement rows.

🚀 How to run the Reddit scraper

  1. Open the Input tab.
  2. Fill at least one section:
    • Search queries, such as openai or chatgpt
    • Reddit URLs, such as a post, comment, subreddit, user, popular, or search URL
    • Subreddits, such as r/artificial or OpenAI
    • Users, such as u/spez
  3. Pick which row types you want with Search result type and User activity.
  4. Set Post row limit, Comment row limit, and Comments per expanded post to control run size.
  5. Start the run, then open the dataset or RUN-SUMMARY.json.

The form starts with small row limits, so your first run stays short and cheap.

⚙️ Input

Input fields

FieldTypeWhat it does
searchQueriesarray of stringsReddit search phrases. Each phrase is a separate search.
searchCommunityNamestringSearch only inside one subreddit, such as r/artificial. Leave empty to search all of Reddit.
searchResultTypestringpostsAndComments (default), posts, or comments. Chooses which row types each search returns.
sortstringPost search sort: relevance, hot, top, new (default), or comments.
commentSortstringComment search sort: relevance, top, or new (default).
timestringSearch time window: all (default), hour, day, week, month, or year.
dateFromstringKeep search rows created on or after this date (YYYY-MM-DD).
dateTostringKeep search rows created on or before this date (YYYY-MM-DD).
maxDaysOldintegerKeep search rows from the last number of days. Default 30. It is used only when both date fields are empty. 0 turns it off.
includeNSFWbooleanKeep search rows that Reddit marks as NSFW. Default false.
strictSearchbooleanKeep only search rows whose text contains every word of the search phrase. Default false.
collectCommentsUnderSearchPostsbooleanAlso save comments under the posts that a search finds. Default false.
startUrlsarray of objectsReddit URLs to scrape, each as { "url": "..." }. The URL decides what you get: a post with its comments, a subreddit, a user, the popular feed, or a search page.
subredditNamesarray of stringsSubreddit names or r/name handles. Each one returns a community row and feed posts.
subredditSortstringSubreddit feed: hot (default), new, top, or rising.
subredditTimestringTime window for the top feed: all (default), hour, day, week, month, or year.
collectCommentsUnderSubredditPostsbooleanAlso save comments under subreddit feed posts. Default true.
userNamesarray of stringsReddit usernames or u/name handles. Each one returns a user row and public activity.
userActivitystringpostsAndComments (default), posts, or comments. Chooses which user activity rows to save.
postRowLimitintegerMost post rows to save for each search query, subreddit, user, or listing URL. Empty or 0 saves all available posts. The form prefills 10.
commentRowLimitintegerMost comment rows to save for each search query, user, post URL, comment URL, or search URL. Empty or 0 saves all available comments. The form prefills 10.
commentsPerExpandedPostintegerMost comments to save under each post when comment collection is on. Default 150. 0 saves all of them. The form prefills 5.

The search filters (dateFrom, dateTo, maxDaysOld, includeNSFW, and strictSearch) apply to search rows only.

Input example

{
"searchQueries": [
"openai",
"chatgpt",
"openai api"
],
"searchCommunityName": "r/artificial",
"searchResultType": "postsAndComments",
"sort": "new",
"commentSort": "new",
"time": "all",
"maxDaysOld": 30,
"includeNSFW": false,
"strictSearch": false,
"collectCommentsUnderSearchPosts": false,
"startUrls": [
{
"url": "https://www.reddit.com/r/artificial/"
},
{
"url": "https://www.reddit.com/r/OpenAI/search/?q=gpt-5&restrict_sr=1"
}
],
"subredditNames": [
"r/artificial",
"OpenAI"
],
"subredditSort": "hot",
"subredditTime": "all",
"collectCommentsUnderSubredditPosts": true,
"userNames": [
"u/spez"
],
"userActivity": "postsAndComments",
"postRowLimit": 10,
"commentRowLimit": 10,
"commentsPerExpandedPost": 5
}

🧾 Output

Output fields

Post rows

FieldTypeWhat it does
rowTypestringAlways post.
redditIdstringReddit post ID.
urlstringReddit page link for the post. It never holds the outside link that the post shares.
matchedInputstringThe search query, URL, subreddit, or username that found the post.
createdAtstring or nullPost date in ISO 8601 format.
authorNamestring or nullAuthor username.
subredditNamestring or nullSubreddit name without r/.
titlestring or nullPost title.
textstring or nullPost text, when the post has text.
scoreinteger or nullReddit score.
upvoteRationumber or nullUpvote ratio, when Reddit shows it.
commentCountinteger or nullComment count that Reddit shows.
flairTextstring or nullPost flair.
isNsfwboolean or nullWhether Reddit marks the post as NSFW.
isSpoilerboolean or nullWhether the post is a spoiler.
isLockedboolean or nullWhether the post is locked.
isPinnedboolean or nullWhether the post is pinned in its subreddit or profile.
mediaarrayImages, galleries, videos, thumbnails, and the outside link that the post shares.
media.typestringimage, video, gallery, thumbnail, or link.
media.urlstringLink to the image, video, or gallery item, or the outside link.
media.widthinteger or nullMedia width, when Reddit shows it.
media.heightinteger or nullMedia height, when Reddit shows it.
media.thumbnailUrlstring or nullThumbnail link, when Reddit shows it.

Example post row

{
"rowType": "post",
"redditId": "1xjiczy",
"url": "https://www.reddit.com/r/artificial/comments/1xjiczy/tech_stocks_set_to_wipe_out_more_than_1_trillion/",
"matchedInput": "https://www.reddit.com/r/artificial/",
"createdAt": "2026-10-30T15:25:41.031Z",
"authorName": "return2ozma",
"subredditName": "artificial",
"title": "Tech stocks set to wipe out more than $1 trillion as concerns deepen about the AI boom",
"text": null,
"score": 245,
"upvoteRatio": 0.9487179487179487,
"commentCount": 44,
"flairText": "News",
"isNsfw": false,
"isSpoiler": false,
"isLocked": false,
"isPinned": false,
"media": [
{
"type": "link",
"url": "https://www.nbcnews.com/business/markets/tech-stocks-nasdaq-ai-boom-fears-deepen-rcna606512",
"width": null,
"height": null,
"thumbnailUrl": "https://external-preview.redd.it/YHsujDfmZu1wNca6BlLWzj0HsHt32IQZ8arFpMo4mxo.jpeg?width=140&height=73&auto=webp&s=6cc8e707776cff73c0d02eb35586015b386704e9"
}
]
}

Comment rows

FieldTypeWhat it does
rowTypestringAlways comment.
redditIdstringReddit comment ID.
urlstringReddit page link for the comment.
matchedInputstringThe search query, URL, subreddit, or username that found the comment.
createdAtstring or nullComment date in ISO 8601 format.
authorNamestring or nullAuthor username.
subredditNamestring or nullSubreddit name without r/.
commentTextstring or nullComment text.
scoreinteger or nullReddit score.
parentPostIdstring or nullID of the post the comment belongs to.
parentCommentIdstring or nullID of the comment it replies to. null for top-level comments.
parentPostTitlestring or nullTitle of the parent post, when known.
depthinteger or nullReply depth. 0 is a top-level comment.
isSubmitterboolean or nullWhether the comment author also wrote the post.
isNsfwboolean or nullWhether Reddit marks the comment as NSFW.
isLockedboolean or nullWhether the comment thread is locked.

Example comment row

{
"rowType": "comment",
"redditId": "19rx6pu13dkjo",
"url": "https://www.reddit.com/r/artificial/comments/1xjqc40/comment/19rx6pu13dkjo/",
"matchedInput": "https://www.reddit.com/r/artificial/",
"createdAt": "2026-10-31T08:34:04.790Z",
"authorName": "Many_Consideration86",
"subredditName": "artificial",
"score": 1,
"isNsfw": null,
"isLocked": false,
"commentText": "Not with a large enough astronomical constant.",
"parentPostId": "1xjqc40",
"parentCommentId": "19rx2lordgzeq",
"parentPostTitle": "AI cracks a 27-year-old pillar of computer science, OpenAI and Anthropic claim",
"depth": 1,
"isSubmitter": false
}

Community rows

FieldTypeWhat it does
rowTypestringAlways community.
redditIdstringReddit subreddit ID.
urlstringReddit page link for the subreddit.
matchedInputstringThe subreddit or URL that found the community.
createdAtstring or nullSubreddit creation date in ISO 8601 format.
communityNamestring or nullSubreddit name without r/.
communityTitlestring or nullSubreddit title.
communityDescriptionstring or nullSubreddit description.
isNsfwboolean or nullWhether Reddit marks the subreddit as NSFW.

Example community row

{
"rowType": "community",
"redditId": "artificial",
"url": "https://www.reddit.com/r/artificial/",
"matchedInput": "https://www.reddit.com/r/artificial/",
"createdAt": "2008-03-13T20:50:49.418Z",
"communityName": "artificial",
"communityTitle": "Artificial Intelligence (AI)",
"communityDescription": "Reddit’s home for Artificial Intelligence (AI)",
"isNsfw": false
}

User rows

FieldTypeWhat it does
rowTypestringAlways user.
redditIdstringReddit user ID.
urlstringReddit page link for the user profile.
matchedInputstringThe username or URL that found the profile.
createdAtstring or nullAccount creation date in ISO 8601 format.
usernamestring or nullReddit username.
displayNamestring or nullDisplay name on the profile.
profileDescriptionstring or nullProfile description.
postKarmainteger or nullPost karma.
commentKarmainteger or nullComment karma.
isVerifiedboolean or nullWhether Reddit marks the user as verified.
isNsfwboolean or nullWhether Reddit marks the profile as NSFW.

Example user row

{
"rowType": "user",
"redditId": "spez",
"url": "https://www.reddit.com/user/spez/",
"matchedInput": "u/spez",
"createdAt": "2005-06-06T00:00:00.000Z",
"username": "spez",
"displayName": "spez",
"profileDescription": "Reddit CEO",
"postKarma": 184758,
"commentKarma": 756619,
"isVerified": true,
"isNsfw": false
}

💳 Pricing

You pay one event for each post, comment, community, or user profile row saved to the dataset. The price is $0.0013 per row on the free plan, which is $1.30 per 1,000 rows. Paid plans pay less per row: $0.00125 on Bronze, $0.00115 on Silver, and $0.00105 on Gold and higher.

Skipped inputs, pages that are not found, duplicate rows, and failed comment loads are not saved as rows, so they are not charged. They show in the logs and in RUN-SUMMARY.json. If you set a maximum cost for the run, the Actor stops when it reaches that limit.

🔌 Integrations

  • Start runs from your app with the Apify API, or from Python or JavaScript with the Apify client.
  • Schedule repeat runs to watch search terms, subreddits, or users.
  • Export datasets as JSON, CSV, Excel, XML, RSS, or HTML.
  • Send finished runs to webhooks, Make, Zapier, Google Sheets, or other tools.

❓ FAQ

Why does a post's url point to Reddit and not to the shared article?

The url field is always the Reddit page link for the row. When a post shares an outside link, such as a news article or an image, you find it in media with the type link, image, video, or gallery.

Can I use this Reddit scraper from Python?

Yes. Use the Apify Python client or the Apify API to start a run with your input. Then read the dataset items as JSON or CSV.

Do I need a Reddit API key or a Reddit account?

No. The Actor reads public Reddit data. It does not ask for Reddit cookies, login details, OAuth, or a Reddit API key.

How is this different from the Reddit API limits?

The Reddit API needs app approval and has its own rate limits and rules. With this Actor, you do not manage Reddit credentials or rate limits. You set row limits and pay per saved row.

Is this Reddit scraper free?

No. Each saved row is a paid event. Apify gives free plan users monthly credit, which you can use for small runs.

Can I scrape Reddit images?

The Actor returns image, gallery, video, and thumbnail links in the media field. It does not download or store the media files.

Can I scrape comments under posts?

Yes. Turn on collectCommentsUnderSearchPosts for search posts or collectCommentsUnderSubredditPosts for subreddit posts. A post URL in startUrls also returns its comments. Use commentsPerExpandedPost to cap comments under each post.

Can I search inside one subreddit?

Yes. Put the subreddit in searchCommunityName, or add a subreddit search URL, such as https://www.reddit.com/r/OpenAI/search/?q=gpt-5, to startUrls.

Are duplicate rows saved twice?

No. When two inputs find the same post, comment, community, or user, the Actor saves it once and counts the duplicate in RUN-SUMMARY.json.

Are skipped or failed items saved as rows?

No. The dataset holds only scraped rows. Skips, duplicates, and pages that are not found go to the logs and RUN-SUMMARY.json.

📝 Changelog

v1.0 (31-10-2026)

  • Fixed url on post rows. It now always holds the Reddit page link for the post. Before, a post that shared an outside link, such as an article or an image, put that outside link in url. You now find the shared link in media.
  • Renamed matchedInputs to matchedInput. It is now one text value, not a list. It shows the search query, URL, subreddit, or username that found the row. Update any code that reads matchedInputs.
  • Removed redditFullname from all rows. There is no replacement field. redditId still holds the short Reddit ID.
  • Removed memberCount and onlineCount from community rows. There is no replacement.
  • Removed subredditName from community rows. Use communityName, which holds the same subreddit name.
  • Added isPinned to post rows. It shows if a post is pinned in its subreddit or profile.
  • postRowLimit and commentRowLimit now save all rows when you leave them empty or set them to 0. Before, empty meant 150 rows and 0 saved no rows. Set a number to keep a limit.
  • commentsPerExpandedPost set to 0 now saves all comments under each post. Before, 0 saved no comments. To skip comments, turn off comment collection in that section instead.
  • Reliability improvements.

v0.1

  • Added search query, URL, subreddit, and user targets with post, comment, community, and user/profile rows.

v0.0

  • Initial release.

🆘 Support

For issues, questions, or feature requests, file a ticket and I'll fix or implement it in less than 24h 🫡

Made with ❤️ by Maxime Dupré