Reddit User Karma & Post History Extractor avatar

Reddit User Karma & Post History Extractor

Pricing

from $0.49 / 1,000 results

Go to Apify Store
Reddit User Karma & Post History Extractor

Reddit User Karma & Post History Extractor

Look up Reddit accounts by username for archive-wide post/comment/total karma, archived post and comment counts, first/last activity dates, and their public post and comment history with 30+ filters. No API key, login or proxy setup required.

Pricing

from $0.49 / 1,000 results

Rating

0.0

(0)

Developer

Xyrelith Data

Xyrelith Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 hours ago

Last modified

Features

Limited permissions

Share

Give this actor a list of Reddit usernames and it returns each account's public profile summary — post karma, comment karma, total karma, archived post/comment counts, and first/last activity dates — together with their post and comment history, filtered by subreddit, keyword, score, date window, post type, flair and 20+ other criteria. No Reddit API key, login or proxy setup is required.

Data source

Reddit's anonymous .json endpoints now return HTTP 403, and the www HTML is JavaScript-challenged from datacenter IPs. The actor therefore reads the public Reddit archive through Arctic Shift (arctic-shift.photon-reddit.com), which mirrors Reddit posts, comments and account aggregates over a no-key HTTP API.

  • Primary: Arctic Shift /api/posts/search, /api/comments/search, /api/users/search, /api/posts/ids, /api/comments/ids.
  • Fallback: Reddit's public Atom feed (/user/<name>/.rss) and profile HTML where reachable. Feed IDs are enriched through the archive ID endpoints when available, which restores scores for recent items.
  • Reddit .json is never called.

Freshness and fallback limits

  • Arctic Shift archives an item shortly after it is posted. Its score and num_comments can read 0 or 1 until the archive re-crawls the item (~36 hours). The score_captured_at field on each post/comment shows when the archived score was captured.
  • Account karma and archived post/comment counts come from Arctic's /api/users/search aggregate. That aggregate is refreshed infrequently; each profile record carries post_stats_updated_at, comment_stats_updated_at and karma_updated_at so you can see how current the numbers are.
  • The Atom fallback returns at most the most recent ~100 items. The feed itself has no score or karma values; scores are restored only when the archive ID lookup succeeds. Reddit rate-limits or blocks the feed from some networks (429/503); the actor retries with backoff (honouring Retry-After/X-RateLimit-Reset) before giving up. It is best effort, not a full-history replacement.
  • Profile HTML is often a JavaScript challenge or WAF block. When it is reachable, it fills account creation date, avatar, bio and account flags; otherwise those fields are omitted.

What this actor does

  • Profile summary — archive-wide post/comment/total karma, archived post/comment counts, first/last post, comment and overall activity dates, plus account flags/avatar/bio when the profile page is reachable
  • Post and comment history — newest first, oldest first, or top-scored within the fetched window
  • Overview mode — posts and comments merged into one chronological feed
  • Date windows and filters — subreddit, keyword, score range, post type, flair, domain, awards, content length, comment counts, upvote ratio, and exclusion toggles for stickied/removed/crossposted/spoiler/locked/archived posts
  • Flexible username input — bare usernames, u/name, profile URLs, or comma-separated names
  • Pagination — walks the archive by creation-time cursor until the requested caps or source exhaustion
  • Legacy inputs — old saved tasks using username, section, sortBy, maxPost, includeComments, minPostScore, excludeNsfwPosts, maxPostAgeDays, subreddit or keywords keep working (mapped in code)
  • Empty fields are omitted from every record — no null, "", [] or {} values

Output: profile record

One record per username (dataType: "user_profile") when "Include profile info record" is on:

  • username, user_id, profile_url
  • post_karma, comment_karma, total_karma
  • archived_posts, archived_comments — archive-wide counts, not just the rows in this dataset
  • first_post_at, last_post_at, first_comment_at, last_comment_at, first_activity_at, last_activity_at (+ matching *_utc epochs)
  • post_stats_updated_at, comment_stats_updated_at, karma_updated_at
  • created_at / created_utc — account creation, when the profile page exposes it
  • is_gold (Reddit Premium), is_mod, is_employee, has_verified_email, verified, accept_followers, hide_from_robots — when exposed by the profile page
  • icon_img (avatar), snoovatar_img, snoovatar_size, user_subreddit (bio, banner, display name, subscribers, NSFW flag, type, URL)
  • crawled_at, source

Output: post record

One record per post (dataType: "post") returned by the posts or overview sections:

  • subreddit, subreddit_prefixed, subreddit_id, subreddit_subscribers, subreddit_type
  • post_id, post_name, title
  • author, author_meta — {username, id, flair, flair_background_color, flair_text_color, flair_css_class, flair_richtext, flair_template_id, flair_type, is_premium, is_blocked, has_patreon_flair}
  • content, content_html — self-post body
  • content_url, url, permalink, url_overridden_by_dest, domain
  • post_hint, is_self, post_type, media_type
  • score, ups, downs, upvote_ratio, num_comments, num_crossposts, num_duplicates
  • link_flair, link_flair_background_color, link_flair_text_color, link_flair_css_class, link_flair_template_id, link_flair_type, link_flair_richtext
  • thumbnail_url, thumbnail_width, thumbnail_height
  • created_utc, created_at, edited, edited_at
  • is_stickied, is_locked, is_archived, is_pinned, is_nsfw, is_spoiler, is_original_content, is_crosspost, crosspost_parent_id
  • is_crosspostable, is_meta, is_reddit_media_domain, is_robot_indexable, is_created_from_ads_ui
  • allow_live_comments, contest_mode, hide_score, content_categories, media_only, quarantine, suggested_sort, no_follow, send_replies
  • gilded, total_awards_received, awards — [{name, count, coin_price, icon_url}]
  • removed_by_category, distinguished, hidden
  • has_media, images, gallery_images, gallery_count
  • video_url, video_duration_seconds, video_width, video_height, video_has_audio, video_bitrate_kbps
  • poll_data — poll options, vote counts and end time
  • embed_provider, embed_type, embed_title, embed_author_name, embed_thumbnail_url, embed_html, embed_width, embed_height
  • search_term — the keyword filter that matched, when set
  • score_captured_at — when the archived score was captured
  • crawled_at, source — arctic_shift, arctic_ids, rss or username_only

Output: comment record

One record per comment (dataType: "comment") returned by the comments or overview sections:

  • post_id, post_url, post_title, post_author, link_id
  • comment_id, comment_name
  • author, author_meta
  • body, body_html
  • score, ups, downs, score_hidden, controversiality
  • subreddit, subreddit_prefixed, subreddit_id, subreddit_type
  • created_utc, created_at, edited, edited_at
  • depth, parent_id, parent_kind, is_op, comment_type
  • is_stickied, is_locked, distinguished, is_nsfw, collapsed, collapsed_reason, collapsed_reason_code, collapsed_because_crowd_control
  • can_gild, no_follow, send_replies, unrepliable_reason
  • gilded, total_awards_received, awards
  • removed_by_category, permalink
  • search_term — the keyword filter that matched, when set
  • score_captured_at
  • crawled_at, source

Input

FieldTypeDefaultDescription
usernamesarray–Usernames to scrape — bare (spez), u/-prefixed, profile URLs, or comma-separated names
includeProfileInfobooleantrueEmit the profile summary record
sectionsarray["posts"]overview (posts + comments), posts, comments
maxPostsinteger100Max matching posts per user (1–5,000)
maxCommentsinteger100Max matching comments per user (1–5,000)
sortselectnewestnewest, oldest, or top (score-ranked within the fetched items)
timeFilterselectallCreated within the past hour/day/week/month/year
includeNSFWbooleanfalseInclude 18+ posts and comments on 18+ posts
onlyWithFlairbooleanfalseKeep only posts that have a link flair
subredditsarray–Restrict to posts/comments made in these subreddits
keywordstring–Keep only posts/comments whose title, self-text or body contains this text
titleContainsstring–Keep only posts whose title contains this text
contentContainsstring–Keep only self posts whose body contains this text
flairContainsstring–Keep only posts whose link flair contains this text
authorFlairContainsstring–Keep only posts whose author flair contains this text
domainstring–Keep only posts whose link domain contains this text, e.g. youtube.com
distinguishedselect–Only moderator, admin, special, or none (regular) posts
postTypeselect–Only self, link, image, video, gallery or poll posts
minScore / maxScoreinteger–Keep only posts/comments with a score in this range
minPostComments / maxPostCommentsinteger–Keep only posts whose own comment count is in this range
minUpvoteRationumber–Keep only posts with an upvote ratio at or above this value (0–1)
minAwardsinteger–Keep only posts with at least this many total awards
minContentLength / maxContentLengthinteger–Keep only self posts whose body length (characters) is in this range
onlyOriginalContentbooleanfalseKeep only posts tagged as original content
excludeStickiedbooleanfalseDrop stickied/pinned posts
excludeRemovedbooleanfalseDrop removed/deleted posts
excludeCrosspostsbooleanfalseDrop crossposted posts
excludeSpoilersbooleanfalseDrop spoiler-tagged posts
excludeLockedbooleanfalseDrop posts with comments locked by a moderator
excludeArchivedbooleanfalseDrop archived posts
excludeDeletedAuthorbooleanfalseDrop posts whose author account was deleted
excludeKeywordsarray–Drop posts whose title/body/flair contains any of these terms
postedAfter / postedBeforedate–Keep only items created within this date range (UTC)

Example: profile summary and recent overview

{
"usernames": ["spez"],
"includeProfileInfo": true,
"sections": ["overview"],
"maxPosts": 50,
"maxComments": 50
}

Example: recent posts in selected subreddits

{
"usernames": ["u/example_user"],
"sections": ["posts"],
"sort": "newest",
"maxPosts": 200,
"subreddits": ["pics", "AskReddit"],
"keyword": "photo",
"excludeStickied": true
}

Example: high-scoring comments from the past year

{
"usernames": ["spez"],
"includeProfileInfo": false,
"sections": ["comments"],
"timeFilter": "year",
"maxComments": 500,
"minScore": 50
}

Use cases

  • User research — analyze an account's posting patterns, engagement and karma
  • Account vetting — check activity dates, karma and history before trusting a recommendation or partnership
  • Content discovery — pull a creator's or influencer's posts by subreddit, keyword or score
  • Moderation research — audit a user's post history across specific communities
  • Behavioral and social research — bulk-export public user history for academic or market research
  • Profile monitoring — track a user's public activity over time on a schedule

FAQ

Do I need a Reddit API key or account login? No — the actor reads the public Reddit archive and public profile surfaces without credentials.

Do I need to configure a proxy? No — there is no proxy setting to configure.

Why do some scores read 0 or 1? Arctic Shift archives an item at posting time and updates score/comment counts on a later crawl (~36 hours). Check score_captured_at; the item's score becomes accurate after that re-crawl.

Why are karma totals different from the live profile? Arctic's account aggregate is refreshed infrequently and may lag the live profile. karma_updated_at shows the aggregate date. The actor never invents a fresher number.

What happens when the archive is rate-limited? The actor retries with backoff (and a smaller page size) and, if the search still fails, falls back to the public Atom feed (most recent ~100 items; scores only where the archive ID lookup succeeds). The run status message says which source was used.

Does it include private activity like upvotes or saved posts? No — only public posts and comments are available. Voting history, saved items and hidden posts are private to the account owner.

What happens for suspended or nonexistent usernames? The run completes and reports that no records were found for that username.

Is history capped? The actor pages through the archive by creation-time cursor until maxPosts/maxComments or source exhaustion. Reddit's Atom fallback is capped at the most recent ~100 items by Reddit itself.

Can I filter to a date range? Yes — use postedAfter / postedBefore (UTC dates) or timeFilter. The window is passed to the archive, so pagination stops at the boundary.

Is this actor affiliated with Reddit? No — this is an independent, third-party actor reading public Reddit archive data. It is not built, endorsed or maintained by Reddit, Inc.