RedditapisRedditapis
Users

Get a Reddit User's Upvoted Posts and Comments

Fetch the posts and comments a Reddit account has upvoted. Private data, requires that account's own session cookies from POST /api/reddit/login.

GET/api/reddit/user/:name/upvoted$0.002 / call

The posts and comments a Reddit account has upvoted. This is private data, Reddit only serves it to the account that owns it, so the request must carry that account's own session cookies (from POST /api/reddit/login) and :name must match the logged-in account. Querying it as any other account, or with no cookies, returns 403.

When to use this

Reach for this when you need to see what an account has upvoted, for research on your own account's activity, or a tool that lets a user review their own vote history. It cannot be used to see another Redditor's upvotes: Reddit never exposes that to anyone, including this API.

Mixed listing: posts AND comments

A Redditor can upvote either a post or a comment, so the response is one ordered items array (the exact order Reddit itself returns, which the after cursor tracks) with each item tagged kind: "post" or kind: "comment". A post item has the same shape as /api/reddit/posts; a comment item has the same shape as /api/reddit/user/:name/comments.

Path Parameters

ParameterTypeRequiredDescription
namestringYesReddit username (no u/ prefix). Must match the account the cookies belong to.

Query Parameters

ParameterTypeRequiredDescription
reddit_sessionstringYesSession cookie from /api/reddit/login
loidstringYesLong-lived account identifier cookie
csrf_tokenstringNoAnti-CSRF cookie, not required for a read, harmless if included
sortstringNonew (default) | top | hot | controversial
tstringNoTimeframe for sort=top/controversial: hour | day | week | month | year | all
limitnumberNoNumber of items 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.

The cookie fields above may be sent as x-reddit-session, x-reddit-loid and x-reddit-csrf-token headers instead of query parameters. Same request, same response; the difference is that a query string is written into every access, proxy and browser-history log along the path, and a Reddit session cookie is a credential that grants full control of the account.

The query form is unchanged and keeps working, so nothing you have built needs to move. If you send both, the headers win, so a stale query parameter you forgot to delete cannot quietly serve you. You can also add x-reddit-proxy to egress from your own IP. See Authenticated reads.

curl "https://api.redditapis.com/api/reddit/user/spez/upvoted?limit=25" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "x-reddit-session: YOUR_REDDIT_SESSION" \
  -H "x-reddit-loid: YOUR_LOID"

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.
  • t takes day, week, month, year, all. We forward it on every sort.

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/upvoted?reddit_session=eyJhbGc...&loid=000000..."
const params = new URLSearchParams({ reddit_session: "eyJhbGc...", loid: "000000..." });
const response = await fetch(
  `https://api.redditapis.com/api/reddit/user/spez/upvoted?${params}`,
  { headers: { Authorization: "Bearer TOKEN" } }
);
const data = await response.json();
import requests

response = requests.get(
    "https://api.redditapis.com/api/reddit/user/spez/upvoted",
    params={"reddit_session": "eyJhbGc...", "loid": "000000..."},
    headers={"Authorization": "Bearer TOKEN"},
)

Response Shape

{
  "items": [
    {
      "kind": "post",
      "id": "1tkez6e",
      "name": "t3_1tkez6e",
      "title": "...",
      "author": "spez",
      "permalink": "/r/announcements/comments/1tkez6e/...",
      "url": "https://reddit.com/r/announcements/comments/1tkez6e/...",
      "upvotes": 4210,
      "comments": 1200,
      "created": "2026-05-22T10:29:25.000Z"
    },
    {
      "kind": "comment",
      "id": "n1abc2d",
      "author": "spez",
      "body": "...",
      "subreddit": "announcements",
      "upvotes": 88,
      "permalink": "/r/announcements/comments/xyz/_/n1abc2d/",
      "url": "https://reddit.com/r/announcements/comments/xyz/_/n1abc2d/",
      "post_id": "xyz",
      "link_title": "...",
      "link_url": "https://reddit.com/r/announcements/comments/xyz/",
      "created": "2026-05-22T09:10:02.000Z"
    }
  ],
  "after": "t1_n1abc2d"
}

Response Fields

FieldTypeNotes
items[].kindstring"post" or "comment", tells you which shape the rest of the item follows
items[] (post)objectSame fields as /api/reddit/posts
items[] (comment)objectSame fields as /api/reddit/user/:name/comments
afterstring | nullCursor for the next page, or null when there is no next page to request. An empty cursor does not always mean you have every item, so read listing_status (below) to find out which. See Pagination depth.

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 item: 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.

Errors

StatusMeaning
400Missing reddit_session/loid, an invalid sort/t/limit, or an invalid username shape
401Missing Bearer token, or the Reddit session cookies are stale (re-run /api/reddit/login)
403name does not match the account the cookies belong to, the account is suspended, or the listing is otherwise not visible to it
404The user does not exist
502Could not complete the upstream request (retried and exhausted)

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

On this page