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.002 / 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",
      "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.

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