RedditapisRedditapis
Users

Get a Reddit User's Recent Comments History

Fetch a Reddit user's recent comments by username, sorted by new, top, or controversial. Includes comment body, upvotes, subreddit, and cursor pagination.

GET/api/reddit/user/:name/comments$0.0015 / call

A user's recent comments.

Path Parameters

ParameterTypeRequiredDescription
namestringYesReddit username

Query Parameters

ParameterTypeRequiredDescription
sortstringNonew (default) | top | controversial
limitnumberNoNumber of comments to return, 1-100 (default 25)
afterstringNoPagination cursor. Pass back the after value from the previous response exactly as issued; it is opaque and carries your paging depth. See Pagination depth.

Paging past Reddit's cap

Reddit closes a single listing near 1000 items and then stops issuing a cursor, so listing_status: truncated is Reddit's limit rather than the end of the data. Every distinct combination of parameters you send is a separate listing with its own budget, so widen across listings rather than paging deeper into one.

What you can vary here:

  • sort takes new, top, hot, controversial, each with its own cursor.

How far these actually widen has not been measured on this endpoint. On /api/reddit/posts two sorts ranged from 0 to 99 shared items out of 100 depending on how busy the subreddit was, so read a page of each before assuming a second sort doubles your coverage.

Example

curl -H "Authorization: Bearer $TOKEN" \
  "https://api.redditapis.com/api/reddit/user/spez/comments?sort=top"
const response = await fetch(
  "https://api.redditapis.com/api/reddit/user/spez/comments?sort=top",
  { headers: { Authorization: "Bearer TOKEN" } }
);
import requests

response = requests.get(
    "https://api.redditapis.com/api/reddit/user/spez/comments",
    params={"sort": "top"},
    headers={"Authorization": "Bearer TOKEN"},
)

Response Shape

{
  "comments": [
    {
      "id": "ocfdez3",
      "author": "spez",
      "body": "...",
      "subreddit": "redditstock",
      "upvotes": 77,
      "permalink": "/r/redditstock/comments/abc123/title/ocfdez3/",
      "url": "https://reddit.com/r/...",
      "post_id": "abc123",
      "parent_id": "t1_ocfa1b2",
      "is_submitter": false,
      "link_title": "...",
      "link_url": "...",
      "created": "2026-04-09T12:00:00.000Z"
    }
  ],
  "after": "t1_xyz"
}

upvotes is the comment's net vote count. permalink is the comment's own path on reddit.com, the same field a post row carries, and url is that path as a full URL. post_id, link_title, and link_url refer to the parent post the comment is on (not the comment itself). post_id is the bare id (no prefix), for joining against GET /post/:id or GET /post/:id/comments. parent_id is what the comment replies to, as Reddit names it (t3_ plus the post id for a top-level comment, t1_ plus a comment id for a reply), and is_submitter is true when the commenter wrote the post.

When after comes back empty

An empty cursor means there is no next page to ask for. It does not always mean you have every comment: Reddit often stops serving a busy listing long before it runs out. Paging r/all on 2026-08-14 stopped after 400 posts covering about a minute of a feed that plainly holds more.

The response tells you which happened. When after is null it also carries listing_status, which reads complete, truncated or unknown. Only complete means you have everything; treat the other two as a partial answer and widen your search rather than stopping. The full field list and what to do about each answer is in Pagination depth.

Independent third-party API for developers and researchers. Not affiliated with, endorsed by, or sponsored by Reddit, Inc.

On this page