Reddit APIReddit Vote APITutorialUpvote APIPRAW Alternative

Reddit Vote API: Upvote and Downvote a Post Programmatically (2026)

How to call POST /api/reddit/vote in 2026: auth via login, thing_id format (t3_ for posts, t1_ for comments), direction up/down/none, error handling, and how the no-OAuth REST path differs from PRAW.

RedditAPI·
Editorial-surreal silhouette reaching upward through layered organic ribbons toward a node of light, glassmorphism title panel

The Reddit Vote API exposes a single REST endpoint, POST /api/reddit/vote, that casts an upvote, downvote, or vote removal on any Reddit post or comment on behalf of an authenticated Reddit account. No OAuth app registration is required when using the managed proxy path at redditapis.com.

Not affiliated with Reddit Inc. redditapis.com is an independent third-party REST proxy for Reddit's API.


What you'll build:

  • A working POST /api/reddit/vote call from curl and Python
  • Auth via POST /api/reddit/login (the mandatory precondition)
  • Error handling for 401, 403, and 404 responses
  • Time to first vote: approximately 3 minutes from account creation

Cost: $0.005/vote + $0.012/login. Free credit: $0.50 at signup. No card required.


The Reddit Vote API in 30 Seconds

Two paths exist for casting votes on Reddit programmatically in 2026. The first is Reddit's official OAuth endpoint. The second is a managed REST proxy that handles Reddit session auth internally, requiring no developer app registration or scope review.

If you already have Reddit OAuth working - a registered developer app, an approved vote scope, and a refresh token - skip to Reddit's official /api/vote endpoint - the request shape is similar. No need to read further.

If you don't - or if OAuth app review has stalled, your scope request was rejected, or you want pay-per-call pricing without a $12,000/year contract - redditapis.com handles the Reddit session auth internally. You pass one bearer token from your redditapis.com account, call POST /api/reddit/login to get session cookies, then call POST /api/reddit/vote. No developer app registration. No OAuth scope review. No monthly cap.

Here is the minimal shape of that vote call:

# Minimal POST /api/reddit/vote - placeholders shown
curl -X POST https://api.redditapis.com/api/reddit/vote \
  -H "Authorization: Bearer YOUR_REDDITAPI_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "thing_id": "t3_abc123",
    "direction": "up",
    "reddit_session": "YOUR_REDDIT_SESSION_COOKIE",
    "loid": "YOUR_LOID_COOKIE",
    "csrf_token": "YOUR_CSRF_TOKEN"
  }'

The session cookies (reddit_session, loid, csrf_token) come from a prior call to POST /api/reddit/login. Step 1 in this tutorial covers that auth flow end to end.

Use cases at a glance:

  • Content creator self-upvote: vote on your own post immediately after publishing to seed early signal
  • Comment-moderation tooling: upvote high-quality replies in a community you moderate
  • Sentiment-action loops: vote on comments based on keyword or sentiment detection from a monitoring script
  • Engagement automation: integrate votes into a broader content-workflow pipeline alongside comments and DMs

Why Developers Need Programmatic Reddit Voting in 2026

The question comes up constantly in r/redditdev. Developers building content pipelines, brand-monitoring tools, community-management dashboards, and engagement automation all eventually want to close the loop - not just read Reddit data, but act on it from the same script.

The use cases cluster around a few patterns: a content creator who wants to upvote their own post the moment it goes live, a developer building a moderation tool that promotes high-signal replies, or a marketer running a sentiment loop that votes on comments matching certain criteria. In every case, the ask is identical: give me a clean REST endpoint that casts a vote on behalf of my account, with predictable auth and predictable pricing.

Common developer workflows that need the vote endpoint:

  • Publish a post, immediately upvote it from the same account to seed early signal
  • Moderation assist: automatically upvote replies that pass a quality filter
  • Sentiment loop: detect positive mentions via search, vote on them to surface them further
  • Content workflow pipeline: vote + comment + DM as a coordinated single-account sequence
r/redditdev·u/billybob19eight6

New to the reddit api

00
Open on Reddit

That thread captures the entry point accurately: developers arrive knowing they want votes, comments, and DMs from the same API, but do not know where to start. This post is the walkthrough they were looking for in 2026.

The pattern of exposing upvote, downvote, and community endpoints as first-class API primitives shows up beyond the Reddit ecosystem too. When developers build Reddit-inspired social platforms or prototype API products, voting is typically among the first three layers shipped:

Fathiu

Fathiu

@abolorreeeee

Three more repositories layers done on my reddit inspired api in Go: -votes (upvote and downvote) - communities - followers. Github: https://t.co/xGj6KOxAzy Votes use a composite primary key: - PRIMARY KEY (user_id, post_id) - SQLite enforces one vote per user per post at the… Show more

Embedded post media
Embedded post media
Embedded post media
Embedded post media

Reddit's algorithm treats early votes as a ranking signal. The first votes a post receives in the minutes after publishing carry disproportionate weight in determining whether the post reaches the top of the subreddit feed. A programmatic vote call from your own account - cast immediately after you publish - is a legitimate automation of what you would do manually if you were watching the post.


Why Reddit Write APIs Got Harder (2026)

As of March 31, 2026, Reddit introduced the "App" label for accounts using allowed automation - the first formal policy distinction between approved programmatic Reddit access and unwanted spam bots. Reddit's announcement on r/redditdev confirmed: accounts that use automation in allowed ways will be known as "apps" and carry a visible label. This is a recognition that programmatic Reddit use is legitimate, provided it proxies real user intent. See the Reddit Developer Platform docs for the official API reference.

r/redditdev·u/boat-botany

Keeping Reddit Human: A New App Label for Automated Accounts

00
Open on Reddit

The 2026 context matters because it changed the realistic access path for write-scope API use. Reddit's June 2023 API pricing announcement moved the platform from a largely-free developer tier to a commercial model. Since then, official developer app onboarding for write scopes has been inconsistently available. What developers report about the write-scope review process as of 2026:

  • Multi-week wait times for app approval in some cases
  • Unclear rejection criteria with no appeal path documented
  • Approval processes that stall without explanation or status update
  • $12,000/year minimum for the Standard (commercial) tier once approved, per Reddit's Data API terms

The practical consequence: for most developers who need write-scope API access in 2026 and want to ship in days rather than weeks, the OAuth app review path is not reliable. A managed REST proxy that handles Reddit session auth internally - like redditapis.com - is the alternative that gets you from account creation to working vote call in under 3 minutes.

The March 2026 App label announcement also signals what Reddit considers acceptable: one account, one developer, proxying that account's own actions. This tutorial is written entirely within that frame. Every code example operates from a single Reddit account owned by the developer running the script.


thing_id Format: t3_ for Posts, t1_ for Comments

Every POST /api/reddit/vote call requires a thing_id parameter. Reddit uses "fullnames" to identify content: a type prefix combined with the base-36 ID of the resource. Posts use the t3_ prefix and comments use t1_. Passing the wrong prefix or a bare ID returns a 400 or 404 error.

thing_id format visual: t3_ post vs t1_ comment side-by-side

The two fullname types relevant to voting:

  • t3_ - a link post (what most people call a "post" or "submission"). Example: t3_abc123
  • t1_ - a comment. Example: t1_xyz789

Getting the prefix wrong - or passing the bare numeric ID without the prefix - is the most common cause of 400 and 404 errors on the vote endpoint. The endpoint does not accept bare IDs.

Where to get a thing_id for a post you just created:

If your script submits a post and then wants to immediately vote on it, call GET /api/reddit/post/:id with the post's short ID. The response includes the fullname in the name field, which is the t3_ prefixed string you pass to the vote endpoint.

import os
import requests

API_KEY = os.environ["REDDITAPI_KEY"]
BASE = "https://api.redditapis.com"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}

def get_post_thing_id(post_short_id: str) -> str:
    """Get the t3_ fullname for a post by its short ID."""
    r = requests.get(
        f"{BASE}/api/reddit/post/{post_short_id}",
        headers=HEADERS,
    )
    r.raise_for_status()
    data = r.json()
    # The 'name' field contains the t3_ fullname
    return data["data"]["name"]  # e.g. "t3_abc123"

# Example: post just created with ID "1s3f3ag"
thing_id = get_post_thing_id("1s3f3ag")
print(thing_id)  # t3_1s3f3ag

For a comment's thing_id, use the name field from the comment's JSON response. Comments always return t1_ prefixed fullnames.

Full parameter reference: docs.redditapis.com/docs/write/vote


Step 1: Authenticate via POST /api/reddit/login

Before you can cast a vote, you need session cookies. Reddit's write endpoints require three auth tokens that prove your script is acting on behalf of a real, logged-in Reddit account. POST /api/reddit/login returns all three.

Auth flow diagram: login call returns cookies, cookies feed vote call

The four auth concepts:

Auth token table: bearer token, reddit_session, loid, csrf_token - what each is, how you get it, what it's used for

The four credentials in the flow:

  • Bearer token - your redditapis.com API key, generated at /signup. Goes in the Authorization: Bearer header on every call to api.redditapis.com.
  • reddit_session - Reddit session cookie returned by POST /api/reddit/login. Identifies the Reddit account to vote as.
  • loid - Long-lived account identifier cookie returned by POST /api/reddit/login. Required for all Reddit write operations.
  • csrf_token - Anti-CSRF protection token returned by POST /api/reddit/login. Required for vote calls; NOT required for comment calls.

Body format note: The POST /api/reddit/login body is Content-Type: application/json. Pass username and password as flat, top-level JSON fields. This is a common mistake for developers used to Reddit's native /api/login endpoint, which is form-encoded. The redditapis.com login endpoint is JSON only.

import os
import requests

API_KEY = os.environ["REDDITAPI_KEY"]
BASE = "https://api.redditapis.com"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}

def get_reddit_session(username: str, password: str) -> dict:
    """
    Authenticate a Reddit account via POST /api/reddit/login.
    Body is JSON (NOT form-encoded). Returns session cookies.
    Cost: $0.012 per call.
    """
    r = requests.post(
        f"{BASE}/api/reddit/login",
        # JSON body - flat top-level fields, not form-encoded
        json={
            "username": username,
            "password": password,
            # Optional: "totp_secret": "YOUR_2FA_SECRET" for 2FA accounts
            # Optional: "proxy": "http://user:pass@host:port" for developers routing requests through a corporate proxy
        },
        headers=HEADERS,
    )
    r.raise_for_status()
    data = r.json()
    # Login response is nested: reddit_session, loid, csrf_token live under data["cookies"]
    cookies = data["cookies"]
    return {
        "reddit_session": cookies["reddit_session"],
        "loid": cookies["loid"],
        "csrf_token": cookies["csrf_token"],
    }

session = get_reddit_session(
    username=os.environ["REDDIT_USERNAME"],
    password=os.environ["REDDIT_PASSWORD"],
)
print("Authenticated. Session cookies retrieved.")

Credential security model: When you call POST /api/reddit/login, your Reddit username and password travel to redditapis.com's servers over HTTPS. redditapis.com authenticates to Reddit on your behalf and returns the resulting session cookies. The session cookies - not your password - are what you store and pass to subsequent write calls. Your password is not stored or logged by redditapis.com; only the session cookies are returned. Full details at docs.redditapis.com/docs/auth/login.

Account prerequisites: The Reddit account you authenticate with must meet a few conditions for vote calls to apply cleanly:

  • The account must be active (not suspended or shadowbanned)
  • For 2FA accounts, pass totp_secret in the login body
  • Reddit applies platform-level quality signals to all write operations. Behavior consistent with normal human account usage reduces friction. This is Reddit-side behavior, not an API error.

Start building with RedditAPI

Reads $0.002, votes $0.005, writes $0.012, DMs $0.025. $0.50 free credits.

Step 2: Call POST /api/reddit/vote

With session cookies from POST /api/reddit/login in hand, the vote call is straightforward. The body is JSON with five required fields: thing_id, direction, reddit_session, loid, and csrf_token. All five must be present or the endpoint returns a 400 error.

Body format note: POST /api/reddit/vote body is Content-Type: application/json. Pass thing_id, direction, reddit_session, loid, and csrf_token as flat, top-level JSON fields. Not query parameters. Not form-encoded. Flat JSON.

# Requires imports + API_KEY/BASE/HEADERS from Step 1 above.
def cast_vote(thing_id: str, direction: str, session: dict) -> dict:
    """
    Cast a vote via POST /api/reddit/vote.
    
    thing_id: "t3_" prefix for posts, "t1_" for comments
    direction: "up", "down", or "none" (to remove a vote)
    session: dict with reddit_session, loid, csrf_token from get_reddit_session()
    
    Body is JSON (NOT form-encoded, NOT query params).
    Cost: $0.005 per call.
    """
    r = requests.post(
        f"{BASE}/api/reddit/vote",
        # JSON body - flat top-level fields
        json={
            "thing_id": thing_id,
            "direction": direction,
            "reddit_session": session["reddit_session"],
            "loid": session["loid"],
            "csrf_token": session["csrf_token"],
        },
        headers=HEADERS,
    )
    r.raise_for_status()
    return r.json()

# Upvote a post
result = cast_vote(
    thing_id="t3_abc123",
    direction="up",
    session=session,
)
print("Vote cast:", result)

Complete two-step pipeline (login + vote):

import os
import requests

API_KEY = os.environ["REDDITAPI_KEY"]
BASE = "https://api.redditapis.com"
HEADERS = {"Authorization": f"Bearer {API_KEY}"}

# Step 1: authenticate (cost: $0.012)
login_resp = requests.post(
    f"{BASE}/api/reddit/login",
    json={
        "username": os.environ["REDDIT_USERNAME"],
        "password": os.environ["REDDIT_PASSWORD"],
    },
    headers=HEADERS,
)
login_resp.raise_for_status()
# Login response is nested: cookies live under ["cookies"]
cookies = login_resp.json()["cookies"]

# Step 2: vote (cost: $0.005)
vote_resp = requests.post(
    f"{BASE}/api/reddit/vote",
    json={
        "thing_id": "t3_abc123",    # replace with your post's fullname
        "direction": "up",           # "up", "down", or "none"
        "reddit_session": cookies["reddit_session"],
        "loid": cookies["loid"],
        "csrf_token": cookies["csrf_token"],
    },
    headers=HEADERS,
)
vote_resp.raise_for_status()
print("Vote result:", vote_resp.json())

Total cost for one vote: $0.017 (pricing) ($0.012 login + $0.005 vote). When you cache the session cookies and reuse them across many vote calls, the login cost amortizes - 100 votes from one login session costs $0.012 + (100 x $0.005) = $0.512.

Your first ~97 vote calls are covered by the $0.50 credit at /signup, once the $0.012 login is accounted for. No credit card required.


Common 401, 403, and 404 Errors on POST /api/reddit/vote (and How to Fix Them)

Most errors on POST /api/reddit/vote fall into three status-code buckets: 401 for expired session cookies, 403 for a bad or missing csrf_token or subreddit membership gate, and 404 for a malformed thing_id. Identify the code and apply the fix below.

r/redditdev·u/Leprekus

POST API /api/vote returns 404

00
Open on Reddit

The 404 thread above is one of the most-searched discussions on vote API errors - the cause is almost always a malformed thing_id. The python+reddit tag on Stack Overflow covers the same error patterns going back several API versions. Here is the complete error table:

Error code Cause Fix
401 Unauthorized Session cookies expired or reddit_session is invalid Re-call POST /api/reddit/login to get a fresh session. Treat cookies as valid for 24 hours max; pre-emptively re-login before long-running batches.
403 Forbidden Wrong or missing csrf_token; OR the target subreddit restricts voting to members only; OR the Reddit account has not met karma or age thresholds for that community Verify csrf_token from the login response is passed correctly. For subreddit-restricted voting: your script's account must be a member before voting. For karma restrictions: the account needs established history in that subreddit.
404 Not Found Invalid thing_id prefix (passed bare ID or wrong type prefix); OR the post or comment was deleted between your fetch and your vote call Confirm thing_id is t3_ for posts and t1_ for comments - never a bare ID. Validate the target still exists via GET /api/reddit/post/:id before voting.

Error decision flow: 401 re-login path, 403 csrf/membership fix, 404 thing_id validation path

Additional patterns to know:

  • A 200 response does not always mean the vote applied at Reddit's layer. Reddit's anti-spam systems may silently discard a vote without returning an error. Monitor your account's actual vote state via GET /api/reddit/post/:id if you need confirmation.
  • If your script generates a high volume of sequential votes in a short window, some votes may be silently dropped. Match human posting rhythm: space out calls to align with how a person would vote manually.

Try it: your first vote calls are on us - $0.50 in free credit at /signup, no card required.


The Direction Parameter: up, down, and the "none" Trick

The direction field controls which way the vote is cast. It accepts three string values, "up", "down", and "none", as well as integer aliases that match Reddit's native API format. Passing "none" removes an existing vote rather than toggling the same direction again.

Direction parameter visual: up (orange arrow), down (blue arrow), none (gray X)

Direction values, meanings, and aliases:

Direction alias table: up/1/upvote, down/-1/downvote, none/0/clear/unvote with what each does

The three accepted string values and their integer aliases:

  • "up" (alias: 1, "upvote") - casts an upvote on the target post or comment
  • "down" (alias: -1, "downvote") - casts a downvote on the target post or comment
  • "none" (alias: 0, "clear", "unvote") - removes any existing vote, returning the post or comment to the unvoted state

Idempotency behavior:

  • Calling POST /api/reddit/vote with direction=up on something you already upvoted is a no-op - the vote state does not change, and you are not charged extra.
  • Calling with direction=down on something you previously voted up is a single-call direction switch - no intermediate unvote is needed.
  • To remove a vote explicitly, pass direction=none. Do not try to remove a vote by re-calling the same direction.
# Upvote
cast_vote(thing_id="t3_abc123", direction="up", session=session)

# Downvote (can call directly even if previously upvoted - single-call switch)
cast_vote(thing_id="t3_abc123", direction="down", session=session)

# Remove the vote explicitly
cast_vote(thing_id="t3_abc123", direction="none", session=session)

# Integer aliases also work
cast_vote(thing_id="t3_abc123", direction="1", session=session)   # upvote
cast_vote(thing_id="t3_abc123", direction="-1", session=session)  # downvote
cast_vote(thing_id="t3_abc123", direction="0", session=session)   # remove

Full parameter reference: docs.redditapis.com/docs/write/vote


How to Vote on Reddit Without OAuth: redditapis.com vs the Official Path

The central question for developers in 2026: do you need Reddit OAuth to cast votes programmatically? No, if you use a managed REST proxy. The redditapis.com vote endpoint handles Reddit session auth internally, so you never register a developer app or wait for scope approval. The comparison below covers the four realistic options as of mid-2026.

Comparison: Official OAuth vs PRAW vs Apify vs redditapis.com across setup, time, cost, OAuth requirement

The comparison above covers the four realistic options (verified 2026-05-27):

Official Reddit OAuth requires a registered developer application, an approved vote scope from Reddit's review queue (2-4 weeks minimum, inconsistent approval rates as documented by r/redditdev), and an OAuth 2.0 refresh token implementation in your code. Once approved, costs start at $12,000/year for the Standard tier, per Reddit's Data API terms. Write scopes (including vote) require the paid tier.

PRAW (the Python Reddit API Wrapper, documented at praw.readthedocs.io and maintained at github.com/praw-dev/praw) wraps Reddit's OAuth layer. Every PRAW limitation is an OAuth limitation: same app review requirement, same scope approval wait, same $12,000/year minimum for commercial use, same 10,000-call monthly cap on the free tier. PRAW is the right choice for hobby projects and academic research where commercial use is not a factor. It is installable via pip and listed at pypi.org/project/praw.

Apify Reddit Voting V2 is a no-code actor on Apify's platform for Reddit vote automation. It removes the OAuth requirement but adds a different abstraction layer. Apify Reddit Voting V2 pricing and availability checked 2026-05-27; verify current details at apify.com before purchase.

redditapis.com exposes POST /api/reddit/vote directly via a managed REST proxy. One bearer token from your account header is the only credential you manage. No developer app registration. No scope approval. No OAuth implementation. Setup takes under 3 minutes from /signup to first vote call. Cost is $0.005 per vote with a $0.50 free credit. Rate-limiting and session management are handled server-side.

The "without OAuth" keyword is the central differentiator. redditapis.com handles Reddit session authentication internally - you pass your Reddit credentials to POST /api/reddit/login, receive session cookies, and those cookies authenticate the vote. The OAuth layer is never exposed to your application.

For a deeper comparison including read endpoints, dataset access, and DM support: /reddit-api-alternatives.

For a hands-on walkthrough covering the Python upvoter automation flow end to end, the tutorial below covers account setup, the auth flow, and the vote call pattern used in this guide:


What Happens After a Vote: Idempotency and Vote State

Vote calls are not like comment calls. Comments create new resources - each call produces a new comment, so accidental duplicate calls create duplicate comments. Votes modify a single state that exists on the post or comment object. Understanding vote state prevents common bugs.

The three states:

# State 1: No vote (starting state)
# direction=none is a no-op if no vote exists

# State 2: Upvoted
cast_vote("t3_abc123", "up", session)    # sets vote to UP

# Re-calling with same direction is a no-op (idempotent)
cast_vote("t3_abc123", "up", session)    # no change, no double-charge

# State 3: Switching direction (single-call, no intermediate step needed)
cast_vote("t3_abc123", "down", session)  # changes vote from UP to DOWN directly

# Removing the vote
cast_vote("t3_abc123", "none", session)  # back to no-vote state

Common bug: Developers sometimes pass direction=none thinking it retries a failed vote. It does not - it removes any existing vote. If a vote call returned 200 but you are not sure the vote applied (Reddit anti-spam may silently discard), check the post's vote state via GET /api/reddit/post/:id before deciding whether to retry.

# Requires imports + API_KEY/BASE/HEADERS from Step 1 above.
def get_post_vote_state(post_short_id: str) -> dict:
    """
    Read current vote state before voting, when defensive logic is needed.
    Returns post data including score and vote direction.
    Cost: $0.002 per call.
    """
    r = requests.get(
        f"{BASE}/api/reddit/post/{post_short_id}",
        headers=HEADERS,
    )
    r.raise_for_status()
    data = r.json()["data"]
    return {
        "score": data.get("score"),
        "upvote_ratio": data.get("upvote_ratio"),
        "name": data.get("name"),  # t3_ fullname for the vote call
    }

# Check before voting to avoid redundant calls
state = get_post_vote_state("abc123")
print(f"Current score: {state['score']}")
print(f"Fullname for vote: {state['name']}")

The cheapest Reddit API. Try it free.

Reads from $0.002 per call. $0.50 free credits. No credit card required.

Pricing: $0.005 per Vote and How the Math Scales

The vote endpoint is $0.005 per call, confirmed across the docs index, endpoint detail page, and live /pricing page as of 2026-05-27. The login precondition is $0.012 per call. Session cookies can be cached and reused across many vote calls, so the login cost amortizes.

Endpoint pricing at a glance (pricing, checked 2026-05-27):

  • Vote (POST /api/reddit/vote): $0.005 per call
  • Login (POST /api/reddit/login): $0.012 per call (amortizes across many votes per session)
  • Read (GET /api/reddit/post/:id): $0.002 per call for pre-vote state checks (pricing)
  • Free credit at signup: $0.50 - no credit card required, covers your first ~29 votes including login calls

Cost breakdown chart: redditapis.com pay-per-call vs Reddit's 2023 quoted enterprise pricing structure

Cost model for common scenarios:

# Scenario 1: 100 votes from one login session
login_cost = 0.012       # one login call
vote_cost = 100 * 0.005  # 100 votes at $0.005 each
total = login_cost + vote_cost
print(f"100 votes: ${total:.3f}")  # $0.512

# Scenario 2: 1,000 votes with one re-login mid-batch
login_cost = 0.012 * 2       # two login calls
vote_cost = 1000 * 0.005     # 1,000 votes
total = login_cost + vote_cost
print(f"1,000 votes: ${total:.3f}")  # $5.024

# Scenario 3: 10,000 votes per month with daily re-login
login_cost = 0.012 * 30      # one re-login per day
vote_cost = 10000 * 0.005    # 10,000 votes
total = login_cost + vote_cost
print(f"10,000 votes/month: ${total:.2f}")  # $50.36

For context: Apollo's developer Christian Selig was quoted $12,000 for 50 million requests by Reddit in 2023 (API pricing changes thread, as widely reported at the time; Reddit has not published a standard commercial annual pricing schedule publicly since). At redditapis.com's $0.005/vote rate (pricing), 50 million votes would cost approximately $250,000 - vote calls are priced at a higher per-call rate than read calls, which is expected given the write-scope complexity. The comparison point is that redditapis.com has no $12,000/year floor and no annual commitment: you pay for what you call.

Use /reddit-api-cost-calculator to model your specific volume.


Respecting Reddit Community Norms When Integrating the Vote API

Reddit's developer guidance states that votes must be cast by humans, and that API clients proxying a human's action one-for-one are recognized as legitimate. The March 2026 App label announcement reinforced this: Reddit officially distinguishes between accounts using automation in allowed ways ("apps") and spam bots.

Rate parity visual: human vote frequency vs equivalent script call frequency

Rate parity is the practical design principle: your script's call frequency should match the rhythm of a human-operated account on the same content. A developer who votes on their own post once after publishing, or who participates in communities at a normal human cadence, is well within what the platform recognizes as normal behavior.

The r/redditdev thread on upvoting via the API is worth reading for the community framing:

r/redditdev·u/pupkamajkina

Upvoting posts through the API?!

00
Open on Reddit

The "humans only" note in Reddit's developer docs reads in full: "Note: votes must be cast by humans. That is, API clients proxying a human's action one-for-one are OK." This tutorial is exactly that pattern: one Reddit account, one developer, with the script acting as the account's mechanical proxy for an action the developer would take manually.

What falls outside that frame:

  • Running vote calls across multiple Reddit accounts you control simultaneously
  • Using vote calls on content the account would not genuinely vote on
  • Bulk vote patterns that exceed what a human account would generate in the same window

Reddit applies platform-level quality signals to all write operations regardless of how they were initiated. This is not an API-layer behavior - it is Reddit's own quality detection working at the platform layer.

For rate-limit context in longer pipelines: /blogs/reddit-api-rate-limits-2026


Production Patterns: Retry, Backoff, and Re-login on 401

Two realities of production vote pipelines: session cookies expire, and Reddit's upstream occasionally returns transient 5xx errors. Handle both with explicit logic rather than assuming a 200 response confirms the vote applied at Reddit's layer. The patterns below cover re-login on 401, exponential backoff on 5xx, and pre-batch credit checks.

Key facts about session lifecycle:

  • There is no token-refresh endpoint. When a session expires, re-call POST /api/reddit/login to get fresh cookies.
  • Cookie TTL is not documented by Reddit. Treat 24 hours as a safe ceiling for production scripts.
  • Pre-emptively re-login before long-running batches rather than waiting for a 401.
  • On transient 5xx errors, use exponential backoff with a maximum of 3 attempts.
  • Log the full response body, not just the HTTP status code. Reddit's error responses contain diagnostic detail.

The requests library, documented at requests.readthedocs.io, is the standard HTTP client for these calls. The retry wrapper below uses Python's built-in time module for the backoff sleep intervals.

To check your remaining credit balance before a batch run, use GET /account/me:

# IMPORTANT: /account/me is root-level - NOT under /api/reddit/
# Use: https://api.redditapis.com/account/me  (correct)
# The path /api/reddit/ prefix does NOT apply to account endpoints
r = requests.get(
    "https://api.redditapis.com/account/me",
    headers=HEADERS,
)
data = r.json()
print(f"Credits remaining: {data['credits_remaining']}")

Retry and backoff diagram: exponential backoff on 5xx, re-login on 401

Production retry wrapper:

import time
from requests.exceptions import HTTPError

def vote_with_retry(
    thing_id: str,
    direction: str,
    get_session_fn,
    max_retries: int = 3,
) -> dict:
    """
    Vote with automatic re-login on 401 and exponential backoff on 5xx.
    
    get_session_fn: callable that returns a fresh session dict (re-calls login)
    """
    session = get_session_fn()
    for attempt in range(max_retries):
        try:
            r = requests.post(
                f"{BASE}/api/reddit/vote",
                json={
                    "thing_id": thing_id,
                    "direction": direction,
                    "reddit_session": session["reddit_session"],
                    "loid": session["loid"],
                    "csrf_token": session["csrf_token"],
                },
                headers=HEADERS,
                timeout=15,
            )
            if r.status_code == 401:
                # Session expired - re-login and retry once
                print(f"401 on attempt {attempt+1}, re-logging in...")
                session = get_session_fn()
                continue
            r.raise_for_status()
            return r.json()
        except HTTPError as e:
            status = e.response.status_code
            if status in (502, 503, 504) and attempt < max_retries - 1:
                wait = 2 ** attempt  # 1s, 2s, 4s
                print(f"Transient {status}, retrying in {wait}s (attempt {attempt+1})...")
                time.sleep(wait)
                continue
            # Log the full response body for diagnostics
            print(f"Error body: {e.response.text}")
            raise
    raise RuntimeError(f"Vote failed after {max_retries} attempts")

For additional production patterns (async voting, corpus logging, cost tracking): /blogs/reddit-api-python-tutorial


Using Vote and Comment Together in a Content Workflow

The vote and comment endpoints are designed to work in sequence. A common pattern for content creators: publish a post, upvote it from your own account, then add a contextual comment that seeds the discussion. All three operations run from the same session cookies.

Important note on csrf_token scope: The csrf_token is required for vote calls. It is NOT required for comment calls. Pass only the cookies each endpoint actually requires - do not generalize the csrf_token requirement across all write operations.

import time

# After get_reddit_session() returns session dict...

# Step 1: Upvote your newly published post
# vote requires csrf_token
vote_resp = requests.post(
    f"{BASE}/api/reddit/vote",
    json={
        "thing_id": "t3_abc123",    # your post's fullname
        "direction": "up",
        "reddit_session": session["reddit_session"],
        "loid": session["loid"],
        "csrf_token": session["csrf_token"],  # REQUIRED for vote
    },
    headers=HEADERS,
)
vote_resp.raise_for_status()

# Wait between operations - consistent with normal human interaction cadence
time.sleep(3)  # explicit delay - do not skip this in production

# Step 2: Add a contextual comment
# comment does NOT require csrf_token
comment_resp = requests.post(
    f"{BASE}/api/reddit/comment",
    json={
        "post_url": "https://www.reddit.com/r/python/comments/abc123/your_post_title/",
        "text": "Sharing the data behind this post in the comments...",
        "reddit_session": session["reddit_session"],
        "loid": session["loid"],
        # csrf_token NOT passed here - comment does not require it
    },
    headers=HEADERS,
)
comment_resp.raise_for_status()
print("Vote + comment workflow complete.")

Reddit's algorithm weighs early votes heavily. A vote cast by your own account immediately after you publish is the same action you would take manually if you were watching the post.

For the comment endpoint parameter reference: docs.redditapis.com/docs/write/comment


Where Developers Use the Reddit Vote API in Production

The vote API endpoint fits into several production patterns, all operating from a single Reddit account per customer. The four most common are: content creator self-upvote pipelines, comment moderation tooling, sentiment-action loops, and compound brand-monitoring workflows that combine votes with comments and DMs.

Content creator self-upvote pipeline: The most common use case. A creator publishes a post, their pipeline immediately casts an upvote from the same account, and optionally adds a seeding comment. The goal is to give the post early signal so Reddit's algorithm evaluates it with at least one vote in the first few minutes. This is identical to what the creator would do manually if they were watching the post go live.

Comment moderation tooling: Community moderators build tools that upvote high-quality replies and downvote spam or off-topic content. The vote call executes the action the moderator would take manually, at the cadence a human moderator could realistically achieve. Combined with GET /api/reddit/comments for reading the thread, this becomes a complete moderation assist pipeline.

Sentiment-action loops: A monitoring script reads comments via GET /api/reddit/search or GET /api/reddit/posts, scores them by keyword or sentiment, and upvotes comments that meet a quality threshold. The vote call closes the loop from detection to action in the same script run.

Engagement automation in customer-success workflows: A developer's product generates content on Reddit; a lightweight pipeline votes on that content after it goes live. After a vote succeeds, the DM endpoint extends the workflow: /blogs/how-to-send-reddit-dm-via-api.

Brand-monitoring compound loop: After a vote API integration ships, a complementary tactic is setting up F5Bot (Reddit) and Google Alerts for your product keywords. When brand mentions fire, your script can pull the thread, evaluate whether the post merits engagement, and vote and comment from your account. This compound approach is described in the developer tip below:

Hridoy Reh

Hridoy Reh

@hridoyreh

How to get customers with $0: 1. Set up F5Bot with your keywords. 2. Find discussions from Reddit. 3. Make 100% valuable comments and mention your brand name when necessary. 4. People will be curious and search for your tool on Google. That's how you can get a customer... https… Show more

Embedded post media

The F5Bot plus Google Alerts loop is zero-budget. It compounds brand-mention signals (a factor AI Overviews use for citation weighting) while driving curious searchers directly to your product. Combining it with a vote pipeline means you can engage with brand mentions in a timely way, with your review step before any action executes.

For use case details across all 14 production workloads: /reddit-api-usecases


Where to Go Next

This tutorial covers the complete POST /api/reddit/vote path from auth setup through thing_id formatting, direction values, error handling, and production retry logic. The three resources below extend this foundation into a full Reddit API stack with posts, comments, DMs, and rate-limit context.

Questions about your specific use case? /contact


Start free. $0.50 credit at signup, no card required. First vote in minutes - account creation, one login call, one vote call.

Get your API key ->

Frequently asked questions.

Yes. POST /api/reddit/vote handles Reddit session auth internally. You pass the reddit_session, loid, and csrf_token returned by POST /api/reddit/login, not an OAuth token. One bearer token from your redditapis.com account is the only credential you manage. See the full parameter reference at [docs.redditapis.com/docs/write/vote](https://docs.redditapis.com/docs/write/vote) or start at [/signup](/signup).

Reddit uses fullnames to identify content. Posts use the prefix t3_ followed by the post ID (example: t3_abc123). Comments use t1_ (example: t1_xyz789). Pass the correct fullname as thing_id. Wrong prefix or bare ID is the most common cause of 400 errors. See [docs.redditapis.com/docs/write/vote](https://docs.redditapis.com/docs/write/vote) and the [thing_id format section](/blogs/reddit-vote-api-tutorial-2026#thing_id-format-t3-for-posts-t1-for-comments) below.

direction controls how the vote is cast. up upvotes. down downvotes. none removes an existing vote (the explicit unvote). The endpoint also accepts integer aliases: 1 means up, -1 means down, 0 means none. Same-direction re-vote is a no-op. To remove a vote pass none, do not re-call the same direction. See [docs.redditapis.com/docs/write/vote](https://docs.redditapis.com/docs/write/vote) and [/pricing](/pricing).

The vote endpoint is $0.005 per call, confirmed across the docs index, endpoint detail page, and live pricing page as of 2026-05-27. The login precondition is $0.012 per call. 1,000 votes therefore costs ~$5 plus session-establishment login calls. See the [/pricing page](/pricing) for the canonical figure and [/reddit-api-cost-calculator](/reddit-api-cost-calculator) for budget modelling.

Reddit's official API still works, but write-scope developer onboarding has been documented as slow or inconsistent on r/redditdev. A managed REST proxy like redditapis.com exposes the same write capabilities with immediate access and pay-per-call pricing. See the [PRAW comparison post](/blogs/reddit-data-api-rest-vs-praw-2026) for the side-by-side.

The pattern this tutorial covers is a single account voting on content that account holder published or owns. Using this endpoint across multiple accounts you do not personally own violates Reddit's developer policy and is outside the scope of what this API supports. redditapis.com is not a tool for coordinated voting. See [docs.redditapis.com/docs/auth/login](https://docs.redditapis.com/docs/auth/login) and the [/pricing page](/pricing) for the supported use cases.

Call POST /api/reddit/login with username and password (optional totp_secret for 2FA, proxy for network routing if required). The JSON response returns reddit_session, loid, and csrf_token. Pass all three to /api/reddit/vote. The login call costs $0.012. Full parameter reference at [docs.redditapis.com/docs/auth/login](https://docs.redditapis.com/docs/auth/login) or sign up at [/signup](/signup).

The most common errors are wrong thing_id prefix (missing t3_ or t1_), expired session cookies, missing csrf_token, and the target post being deleted. On 401 re-call /api/reddit/login. On 403 check csrf_token and subreddit voting restrictions. On 404 validate the thing_id exists via GET /api/reddit/post/:id. See [troubleshooting](/blogs/reddit-vote-api-tutorial-2026#common-401-403-and-404-errors-on-post-apiredditvote) and the [Python tutorial](/blogs/reddit-api-python-tutorial) for production patterns.

Keep reading.

Continue exploring related pages.

Similar reads.

More guides on the Reddit API, scraping, pricing, and MCP servers.

Reddit DM API tutorial showing a bearer-token REST request with code in curl, Python, and Node.js
Reddit APIReddit DM

How to Send a Reddit DM via REST API in 2026 (with Code)

Send Reddit DMs via REST API. Bearer token, JSON body, $0.025 per call. Working code in curl, Python, and Node.js. PRAW alternative for AI agents.

RedditAPI·
Reddit API in Python tutorial cover -- no-PRAW, no-OAuth path using plain requests
Reddit APIPython

Reddit API in Python: The Complete No-PRAW Tutorial (2026)

Use the Reddit API in Python without PRAW in 2026. Plain HTTP with requests or httpx, one bearer token. Code examples for posts, comments, search, votes, and DMs from $0.002 per call.

RedditAPI·
How to get Reddit comments via the API guide, an independent third-party tutorial on fetching a post's full comment tree by permalink, expanding more and morechildren nodes, and flattening nested replies in Python
Reddit APIComments

How to Get Reddit Comments via the API: Fetch the Full Comment Tree (2026)

Fetch Reddit comments by permalink, walk the nested tree, expand the more / morechildren nodes, and flatten replies in Python. Copy-paste code and first-party numbers, 2026.

RedditAPI·
Reddit API pagination guide, an independent third-party tutorial on the after cursor, the 100-per-page limit, and getting complete data past the ~1000-item listing ceiling with copy-paste Python
Reddit APIPagination

Reddit API Pagination: The after Cursor and Getting Past the 1000-Item Ceiling (2026)

How Reddit API pagination works: the after cursor, the 100-per-page cap, and getting past the ~1000-item ceiling. Copy-paste Python and first-party numbers, 2026.

RedditAPI·
Independent third-party guide to finding subreddits programmatically via API, discovering communities by keyword and ranking them by activity in Python
Reddit APISubreddit Finder

How to Find Subreddits Programmatically: A Subreddit Finder API Guide (2026)

Find subreddits by keyword at scale in 2026. Discover communities with the search/communities API, rank them by real activity, and compare the native reddit.com/search.json path with copy-paste Python.

RedditAPI·
Reddit Search API tutorial cover, an independent third-party guide to querying subreddits by keyword in Python with native search.json, PRAW, and a managed REST API
Reddit APISearch

Reddit Search API Tutorial: Query Subreddits by Keyword in Python (2026)

Search Reddit posts by keyword in Python in 2026. Native /search.json, PRAW subreddit.search(), and a managed REST endpoint compared, with copy-paste code, parameters, and the 1,000-result cap explained.

RedditAPI·
PRAW vs Reddit REST API 2026: a developer choosing between PRAW and a third-party REST bearer-token path, redditapis.com is an independent third-party not affiliated with Reddit Inc
PRAWPRAW Alternative

PRAW vs Reddit REST API in 2026: When to Switch

A decision matrix for moving off PRAW to a REST plus bearer-token model. Feature parity, a field-name map, a one-hour migration plan, and the cost crossover point.

RedditAPI·
Reddit Data API 2026 cover: surreal editorial illustration with magnifying glass over crystalline data structures in orange and deep blue, redditapis.com not affiliated with Reddit Inc
Reddit APIReddit Data API

Reddit Data API in 2026: REST Endpoints, No PRAW, No OAuth

Pull Reddit posts at $0.002 per call with a third-party REST API. Bearer token, no PRAW, no OAuth flow. Python examples, real endpoints, real pricing.

RedditAPI·