Blog/Social data
11 min read

Reddit User Information Extraction: Profile, Posts and Comments by API

One Reddit account, three endpoints: a profile with karma split two ways, a complete post history in one call, and comments that carry their thread.

Reddit User Information Extraction: Profile, Posts and Comments by API

Copy this line to your agent to pull a Reddit user's posts and comments.

set up https://monid.ai/SKILL.md and use tikhub /api/v1/reddit/app/fetch_user_comments with a username

On 2026-09-15 we pointed three endpoints at one public Reddit account. The first returned a profile row with karma split two ways, and the split said more about the account than the total would have. The second returned every post the account had ever made, twenty-three of them, in one call with no next page. The third returned twenty-five comments, each one carrying the title of the thread it was written in. This guide runs through Monid, the OpenRouter for agent tools.

What can you extract about a Reddit user?

Three things, from three different calls: who the account is, what it has posted, and what it has said in other people's threads. The last one is usually the most informative and the least often pulled.

The profile

apify/trudax/reddit-scraper-lite started from a user page returned this as the first item:

{
  "dataType": "user",
  "username": "spez",
  "description": "Reddit CEO",
  "postKarma": 184487,
  "commentKarma": 756493,
  "verified": true,
  "isMod": true,
  "acceptFollowers": true,
  "over18": false,
  "createdAt": "2005-06-06T04:00:00.000Z",
  "scrapedAt": "2026-09-15T21:13:17.399Z"
}

Account age, two karma figures, verification, moderator status and whether the account accepts followers. Fourteen fields, and the row is labelled dataType: "user" because the nine rows after it are posts. It is a thinner record than a platform with a public follower graph returns, and the comparison with what an Instagram profile API should return shows where the gaps are.

The posts

The same call returned nine post rows: title, upVotes, numberOfComments, createdAt, description and a URL. The top one: "Modernizing Reddit's infrastructure with you", 339 upvotes, 451 comments, posted 2026-08-05. Nine rows because we asked for ten items and one slot went to the profile.

tikhub/api/v1/reddit/app/fetch_user_posts for the same username returned twenty-three ProfilePost nodes with hasNextPage: false. That is the complete post history, and each node carries twenty-five or more state flags: isStickied, isArchived, isLocked, isNsfw, distinguishedAs, editedAt, and so on.

The comments

tikhub/api/v1/reddit/app/fetch_user_comments returned twenty-five comment nodes with hasNextPage: true and a cursor. Each node:

{
  "id": "t1_p1wosm9",
  "createdAt": "2026-08-05T18:31:50Z",
  "content": { "preview": "That was the thinking. Otherwise it would be easier to just replicate the UI.", "html": null },
  "score": 12,
  "authorInfo": { "displayName": "spez" },
  "postInfo": { "id": "t3_1vgbkge", "title": "Modernizing Reddit's infrastructure with you" }
}

postInfo is the field that makes a comment history readable. Without it you have a list of sentences; with it you have a list of conversations the account chose to join.

📖 See also Two Reddit Scrapers, One Query, Four Posts in Common

Why is karma two numbers and not one?

Because Reddit tracks them separately, and the ratio between them is the fastest read on what kind of account you are looking at.

The measurement

Post karma 184,487. Comment karma 756,493. Comment karma exceeds post karma by a factor of about four.

What that says

This account participates by replying, not by publishing. Twenty-three posts in twenty years and a comment feed that paginates. The comment-to-post karma ratio is a behavioural signature, and it separates three kinds of account that a single karma total would lump together:

Publishers. High post karma, low comment karma. They start threads and leave. Brand accounts and content marketers often look like this.

Participants. High comment karma, low post karma. They join other people's threads. Domain experts, moderators and long-tenured members look like this.

Farmers. High both, short account age. Volume across both axes in a short time is the pattern reputation-farming produces, and createdAt is the field that exposes it.

Why the total misleads

A total of roughly 941,000 karma says "very active". The split says "very active in comments, specifically". For anyone reading Reddit as a source of expert opinion, the second is the account you want and the first is noise. Store both figures and the account age, and compute the ratio, because the ratio is the profile. The same argument for keeping the components rather than the sum runs through the salary data guide, where base and total compensation tell different stories about the same job.

The row that hides

The profile came back as one row in an array of ten, marked only by dataType. A pipeline that iterates the array as posts will try to read upVotes off the profile row, find postKarma instead, and either crash or silently coerce. Filter on dataType === "user" first, always, and treat the rest as posts.

How do you pull a user's profile, posts and comments?

Three steps, one per kind of record, and the order matters for cost.

For agents

Grab an API key at app.monid.ai, then paste this to your agent and hand it the key:

set up https://monid.ai/SKILL.md

It learns the whole discover, inspect, run workflow itself. More in the agent quickstart.

For humans

npm install -g @monid-ai/cli
monid keys add -k <your-api-key> -l main

Step 1. Pull the complete post history

What it does. Returns every post the account has made, with state flags.

The endpoints. tikhub/api/v1/reddit/app/fetch_user_posts, billed per call, requires username.

The call.

monid run -p tikhub -e /api/v1/reddit/app/fetch_user_posts --query '{"username": "spez"}'

What comes back. postFeed.elements.edges, twenty-three on our run, with pageInfo.hasNextPage telling you whether that is everything. It was.

What it costs. A fraction of a cent per call, flat, whether the account has three posts or three hundred. Current figures at monid.ai/tools.

Step 2. Page through the comments

What it does. Returns comments newest first, each tagged with its thread.

The endpoints. tikhub/api/v1/reddit/app/fetch_user_comments, per call, requires username, takes a cursor.

The call.

monid run -p tikhub -e /api/v1/reddit/app/fetch_user_comments --query '{"username": "spez"}'

Pass pageInfo.endCursor back to get the next twenty-five. Stop when hasNextPage is false.

What comes back. Comment nodes with content.preview, score, commentStats and postInfo.

What it costs. Per call, per page. A prolific commenter is many pages; budget on comment count divided by twenty-five.

Step 3. Add the profile row when you need karma and age

What it does. Returns the account-level record alongside a page of posts.

The endpoints. apify/trudax/reddit-scraper-lite, per result plus a flat fee, takes startUrls pointing at the user page.

The call.

monid run -p apify -e /trudax/reddit-scraper-lite -w \
  -i '{"startUrls":[{"url":"https://www.reddit.com/user/spez/"}],"maxItems":10,"maxComments":0,"includeMediaLinks":true,"skipCommunity":true}'

What comes back. One dataType: "user" row and up to maxItems - 1 post rows. Set maxItems small: you are here for the profile row, and the posts you already have from Step 1.

What it costs. Per result plus the flat fee, so the flat fee dominates a ten-item pull. Run it once per account, not once per page.

Give this to your agent

$Set up https://monid.ai/SKILL.md, and then use Monid to for this Reddit username, pull the profile, the complete post list and the last hundred comments, then tell me the comment-to-post karma ratio, the account age, and the five subreddits they comment in most.

📖 See also Is There an Alternative to Apify for Scraping Reddit?

Which route gives you the complete history?

The per-call route for posts, the cursor for comments, and the per-result route only for the profile row. The three routes have different notions of "done".

What each one returned

PostsCommentsProfile
tikhub/fetch_user_posts23, hasNextPage: falsenono
tikhub/fetch_user_commentsno25 per page, cursorno
apify/reddit-scraper-lite (user page)9, capped by maxItemsoptional, maxCommentsyes, one row

Complete means different things

The tikhub posts call said hasNextPage: false, which is the endpoint telling you it has nothing more. Twenty-three posts is the account's entire public posting history. That is a census.

The apify call returned nine posts because we asked for ten items and one was the profile. Raise maxItems and you get more; the count is your parameter, not the account's history. That is a page.

The comments call returned twenty-five with a cursor. Complete is however many pages you are willing to walk, and on a heavy commenter that is many.

The rule this produces

Use the endpoint whose completeness flag is a field, not a parameter. hasNextPage is the endpoint's own statement about what remains. maxItems is yours. When the endpoint tells you it is done, believe it; when you told it when to stop, do not call the result a history. The same distinction between a ranked page and a census is measured on the search side in the Reddit scraper comparison.

One field that was empty

The apify post rows carried no body text, only title and description. For the full body of a specific post you go back to the post URL with maxComments set, which is a different call. Know that before you build a text pipeline on the user-page route.

Which endpoint should I use for which job?

EndpointWhat it doesInputOutputBest forBilling
tikhub/api/v1/reddit/app/fetch_user_postsComplete post historyusernameProfilePost nodes with state flags, hasNextPageThe post censusPer call
tikhub/api/v1/reddit/app/fetch_user_commentsComment history, pagedusername, cursorComment nodes with postInfoWhat the account says elsewherePer call per page
apify/trudax/reddit-scraper-liteProfile row plus a page of postsstartUrls user pagedataType: user row plus postsKarma, age, mod statusPer result plus flat fee
apify/crawlerbros/reddit-comment-scraperFull threads under a postPost URLComment treeReading one conversation in depthPer result plus flat fee
tikhub/api/v1/reddit/app/fetch_dynamic_searchFind accounts by keywordquery, search_type: userUser resultsWhen you have a topic and not a namePer call

Every row was verified with monid inspect on 2026-09-15. The table gives billing shape rather than figures, because shape drives design and current numbers live on monid.ai/tools.

The billing shapes decide the order. Per call means the two tikhub routes cost the same whether an account has posted three times or three hundred, so run them first and widely. Per result plus a flat fee means the apify route is priced for one deliberate pull per account, not for paging.

When is user extraction the wrong thing to do?

Four cases, and the first is the one that matters most.

The account is a private individual, not a public one. We ran this on a company CEO whose account is public, widely covered and whose posts are official communications. Running the same three calls on an ordinary user builds a dossier on a person who did not choose to be studied. Reddit's data is public in the technical sense; assembling one person's full history across years is a different act from reading a thread, and in many jurisdictions it is a regulated one. Do it for moderation, research with ethics approval, or accounts that are public figures. Do not do it to find out who someone is.

You need deleted or removed content. A deleted comment leaves a gap in the sequence and does not appear, and the flags on a post node tell you it is archived or locked, not what was removed. No route here recovers content the account or a moderator took down.

You need private or suspended accounts. A suspended account returns nothing useful and a private profile exposes only what Reddit shows logged-out visitors. There is no configuration that changes this.

You want the official route. Reddit's Data API exists behind an approval process and licensing since late 2025, and for a product built on user data it is the defensible path. The routes here read public pages and are for research, moderation and bursty analysis, as laid out in the Reddit API guide.

And the disclosure: this is Monid's blog and we resell all three endpoints. The most important paragraph in this article is the one about who not to run this on, which is a recommendation to make fewer calls.

Conclusion

Reddit user information extraction is three calls, not one: a profile with two karma figures, a post history that one route returns complete in a single call, and a comment feed that carries the title of every thread the account joined. The comment feed is the one that tells you what the account actually thinks, and it is the one most pipelines skip because it pages.

What matters more than which endpoint is which fields you keep. Comment karma against post karma is a behavioural signature that a single total hides; hasNextPage is the endpoint's own statement of completeness where maxItems is only yours; and postInfo on each comment turns a list of sentences into a list of conversations. And the profile row arrives disguised as a post, so filter on dataType before anything else.

Free next step: run monid inspect -p tikhub -e /api/v1/reddit/app/fetch_user_comments to read the node shape, then pull one public account you already know and check whether the comment-to-post karma ratio matches your impression of them. Start at monid.ai.

FAQ

Can I extract information from a private or suspended Reddit account?

No. These routes read what Reddit shows to a logged-out visitor, and a suspended account shows nothing while a private profile shows only the shell. The acceptFollowers, verified and isMod flags on a public profile are as far as account-level visibility goes. Any tool claiming to read further is describing account-based access with the risks that carries, and that is not what this article covers.

Do deleted comments show up in the comment history?

No, and their absence is not marked. A deleted comment simply does not appear in the feed, so a comment count you compute will be lower than the account's lifetime total and the gap is invisible. Post nodes carry isArchived and isLocked flags, which describe a live post's state, not removal. If a complete record matters, collect on a schedule and diff, which is the only way to see something disappear.

How much does a full history cost to pull?

The post history is one per-call charge, complete, because the endpoint returns it with hasNextPage: false on accounts of ordinary size. The comment history is one per-call charge per page of twenty-five, so a heavy commenter with thousands of comments is many pages and the budget is comment count divided by twenty-five. The profile row costs one per-result pull with a flat fee, run once. Current figures are on monid.ai/tools, and the cheapest mistake to avoid is paging the profile route instead of the comment route.

Is it ethical to extract a Reddit user's information?

It depends entirely on who and why, and the technical availability of the data does not settle it. Reading a public figure's official account, moderating a community you run, or conducting research under an ethics process are established uses. Assembling a private individual's full history to identify or profile them is not, regardless of the data being technically public, and in several jurisdictions it engages data protection law. Decide the purpose before the first call, write it down, and if the honest answer is "to find out who this person is", do not run it.

Last updated September 2026.

reddit user information extractionreddit user apireddit profile scraperreddit comments apisocial data