Upvote Service V1 API

API Documentation

Use the Upvote Service API to manage balances, buy Reddit accounts, create comment or post tasks, place manual voting orders, and verify webhooks from your own application.

https://api.upvote.net/v1

Authentication

Every request requires an API key passed in the X-API-Key header.

Pagination

List endpoints use request-body pagination with skip and take. Maximum take is 500.

Error Format

Errors return error.code and error.message with standard HTTP status codes.

Introduction

Native docs for the current V1 API

All V1 endpoints are prefixed with /v1. Requests are rate limited, require an API key, and use a consistent error structure across profile, marketplace, task, manual order, and webhook workflows.

Authentication Header
X-API-Key: your_api_key_here
Error Shape
{
  "error": {
    "code": "invalid_request",
    "message": "A human-readable description of the error"
  }
}

400

Bad request - check your parameters

401

Unauthorized - invalid or missing API key

404

Resource not found

429

Rate limit exceeded

500

Internal server error

Me

Current user profile and balance

Use the Me endpoints to inspect the authenticated account identity and current funding state before placing orders or tasks.

GET/me/

Get current user profile

Returns the authenticated user profile with id, email, status, and creation date.

Request Example
curl https://api.upvote.net/v1/me/ \
  --header 'X-API-Key: YOUR_SECRET_TOKEN'
Response Example
{
  "id": "string",
  "email": "string",
  "status": "string",
  "created_at": "2026-04-22T15:00:56.623Z"
}
GET/me/balance

Get current user balance

Returns wallet balance, balance in cents, and remaining vote balance.

Request Example
curl https://api.upvote.net/v1/me/balance \
  --header 'X-API-Key: YOUR_SECRET_TOKEN'
Response Example
{
  "balance": 1,
  "balance_cents": 1,
  "vote_balance": 1
}

Reddit Accounts

Marketplace products and account purchases

The Reddit Accounts group covers product discovery, individual product details, purchase execution, and paginated order history for purchased accounts.

GET/redacc/products

List available products

Returns marketplace products for Reddit accounts, optionally filtered by category.

FieldTypeRequiredDescription
categoryquery stringNoOptional product category filter.
Request Example
curl 'https://api.upvote.net/v1/redacc/products?category=' \
  --header 'X-API-Key: YOUR_SECRET_TOKEN'
Response Example
[
  {
    "product_id": 1,
    "product_name": "string",
    "price": 1,
    "categories": ["string"],
    "attributes": {
      "age": null,
      "post_karma": null,
      "comment_karma": null,
      "total_karma": null
    }
  }
]
GET/redacc/products/{product_id}

Get product details

Returns a single Reddit account product by product id.

FieldTypeRequiredDescription
product_idpath stringYesMarketplace product identifier.
Request Example
curl 'https://api.upvote.net/v1/redacc/products/{product_id}' \
  --header 'X-API-Key: YOUR_SECRET_TOKEN'
POST/redacc/purchase

Purchase a Reddit account

Purchases a Reddit account product and returns credentials plus order metadata.

FieldTypeRequiredDescription
product_idintegerYesWooCommerce product id.
Request Example
curl https://api.upvote.net/v1/redacc/purchase \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: YOUR_SECRET_TOKEN' \
  --data '{
  "product_id": 1
}'
Response Example
{
  "order_id": "string",
  "product_id": 1,
  "product_name": "string",
  "price": 1,
  "attributes": {},
  "categories": ["string"],
  "credentials": {
    "user_pass": "string",
    "email_pass_recovery": "string"
  },
  "purchased_at": "2026-04-22T15:00:56.623Z",
  "created_at": "2026-04-22T15:00:56.623Z"
}
GET/redacc/orders/{order_id}

Get order details

Returns a purchased Reddit account order by id.

FieldTypeRequiredDescription
order_idpath stringYesPurchased account order id.
Request Example
curl 'https://api.upvote.net/v1/redacc/orders/{order_id}' \
  --header 'X-API-Key: YOUR_SECRET_TOKEN'
POST/redacc/orders/list

List orders

Returns paginated Reddit account purchase orders.

FieldTypeRequiredDescription
skipintegerYesPagination offset, minimum 0.
takeintegerYesPage size, minimum 1 and maximum 500.
Request Example
curl https://api.upvote.net/v1/redacc/orders/list \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: YOUR_SECRET_TOKEN' \
  --data '{
  "skip": 0,
  "take": 1
}'
Response Example
{
  "total": 1,
  "items": [{}]
}

Comment Tasks

Comment, reply, and post task creation

These endpoints create managed Reddit content tasks and return the shared CommentTaskResponse shape for comments, replies, and posts.

POST/comment-tasks/comment

Create a comment task

Creates a scheduled or immediate comment task on a Reddit thread, with optional add-ons and initial upvotes.

FieldTypeRequiredDescription
thread_urlstring (uri)YesReddit thread URL to comment on.
contentstringYesComment body content.
schedule_atstring (date-time)NoOptional scheduled execution time.
initial_upvotes_orderInitialUpvotesOrderNoOptional starter vote order for the created comment.
add_onsarray<object>NoOptional follow-up comments with their own content and initial_upvotes_order.
Request Example
curl https://api.upvote.net/v1/comment-tasks/comment \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: YOUR_SECRET_TOKEN' \
  --data '{
  "thread_url": "https://www.reddit.com/r/example/comments/thread_id/post_title/",
  "content": "Comment body",
  "schedule_at": "2026-04-23T12:00:00.000Z",
  "initial_upvotes_order": {
    "number_of_votes": 20,
    "vote_type": 1,
    "speed": {
      "vote": 5,
      "minute": 60
    }
  },
  "add_ons": [
    {
      "content": "Second supporting comment"
    }
  ]
}'
Response Example
{
  "order_id": "string",
  "task_type": "comment",
  "status": "pending",
  "failure_reason": null,
  "thread_url": null,
  "subreddit_url": null,
  "post_title": null,
  "content": "string",
  "price": 1,
  "result_url": null,
  "scheduled_at": null,
  "parent_order_id": null,
  "created_at": "2026-04-22T15:00:56.623Z",
  "add_ons": [{}]
}
POST/comment-tasks/reply

Create a reply task

Replies directly to a Reddit comment URL, optionally with a scheduled execution and starter votes.

FieldTypeRequiredDescription
thread_urlstring (uri)YesReddit comment URL to reply to.
contentstringYesReply body content.
schedule_atstring (date-time)NoOptional scheduled execution time.
initial_upvotes_orderInitialUpvotesOrderNoOptional starter vote order for the reply.
Request Example
curl https://api.upvote.net/v1/comment-tasks/reply \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: YOUR_SECRET_TOKEN' \
  --data '{
  "thread_url": "https://www.reddit.com/r/example/comments/thread_id/post_title/comment_id/",
  "content": "Reply body"
}'
POST/comment-tasks/post

Create a post task

Creates a Reddit post task in a subreddit with a title, content body, optional starter votes, and schedule time.

FieldTypeRequiredDescription
subreddit_urlstring (uri)YesTarget subreddit URL.
post_titlestringYesTitle of the Reddit post.
contentstringYesBody content for the post.
schedule_atstring (date-time)NoOptional scheduled execution time.
initial_upvotes_orderInitialUpvotesOrderNoOptional starter vote order for the post.
Request Example
curl https://api.upvote.net/v1/comment-tasks/post \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: YOUR_SECRET_TOKEN' \
  --data '{
  "subreddit_url": "https://www.reddit.com/r/example/",
  "post_title": "Launch post title",
  "content": "Post content"
}'
GET/comment-tasks/{order_id}

Get task details

Returns a single comment, reply, or post task using the shared CommentTaskResponse shape.

FieldTypeRequiredDescription
order_idpath stringYesTask order id.
Request Example
curl 'https://api.upvote.net/v1/comment-tasks/{order_id}' \
  --header 'X-API-Key: YOUR_SECRET_TOKEN'
POST/comment-tasks/list

List tasks

Returns paginated comment, reply, and post tasks with optional filters by status or task type.

FieldTypeRequiredDescription
skipintegerYesPagination offset, minimum 0.
takeintegerYesPage size, minimum 1 and maximum 500.
task_typestringNoOptional filter: comment, reply, or post.
statusstringNoOptional task status filter.
Request Example
curl https://api.upvote.net/v1/comment-tasks/list \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: YOUR_SECRET_TOKEN' \
  --data '{
  "skip": 0,
  "take": 20,
  "task_type": "comment",
  "status": "pending"
}'

Manual Orders

Manual voting orders

Manual Orders lets you create direct upvote or downvote orders against Reddit URLs and inspect the resulting order objects over time.

POST/manual-orders/

Create manual voting order

Creates upvote or downvote orders against one or more Reddit post or comment URLs.

FieldTypeRequiredDescription
post_urlsarray<string>YesOne or more Reddit post or comment URLs.
number_of_votesintegerYesRequested number of votes.
vote_typeintegerYes1 for upvote, -1 for downvote.
speedSpeedYesVote delivery speed settings.
delay_minuteintegerNoOptional delay before delivery starts.
random_range_number_of_votesRandomRangeNoOptional randomized vote count range.
random_range_speed_per_minRandomRangeNoOptional randomized speed range.
Request Example
curl https://api.upvote.net/v1/manual-orders/ \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: YOUR_SECRET_TOKEN' \
  --data '{
  "post_urls": [
    "https://www.reddit.com/r/example/comments/thread_id/post_title/"
  ],
  "number_of_votes": 50,
  "vote_type": 1,
  "speed": {
    "vote": 10,
    "minute": 60
  },
  "delay_minute": 0
}'
Response Example
{
  "orders": [
    {
      "order_id": "string",
      "post_url": "string",
      "post_type": "string",
      "vote_type": 1,
      "requested_vote": 1,
      "voted_number": 1,
      "status": "pending",
      "speed": {
        "vote": 1,
        "minute": 1
      },
      "delay_minute": 1,
      "created_at": "2026-04-22T15:00:56.623Z"
    }
  ]
}
GET/manual-orders/{order_id}

Get order details

Returns one manual voting order by order id.

FieldTypeRequiredDescription
order_idpath stringYesManual order id.
Request Example
curl 'https://api.upvote.net/v1/manual-orders/{order_id}' \
  --header 'X-API-Key: YOUR_SECRET_TOKEN'
POST/manual-orders/list

List orders

Returns paginated manual voting orders with optional post_type and vote_type filters.

FieldTypeRequiredDescription
skipintegerYesPagination offset, minimum 0.
takeintegerYesPage size, minimum 1 and maximum 500.
post_typestringNoOptional filter: post, comment, or subreddit.
vote_typeintegerNoOptional filter: 1 or -1.
Request Example
curl https://api.upvote.net/v1/manual-orders/list \
  --request POST \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: YOUR_SECRET_TOKEN' \
  --data '{
  "skip": 0,
  "take": 20,
  "vote_type": 1,
  "post_type": "post"
}'

Webhooks

Signed delivery for terminal events

When a task or manual order reaches a terminal state, Upvote sends a POST request to your configured webhook URL. Verify the signature before processing every delivery.

Event types

comment_task.completedComment, reply, or post task completed successfully
comment_task.refundedComment, reply, or post task failed and was refunded
manual_order.completedManual voting order completed
manual_order.partiallyManual voting order partially completed
manual_order.failedManual voting order failed

Delivery headers

Content-Typeapplication/json
User-Agentupvote-webhooks/1.0
X-Webhook-Event-IdUnique event id for deduplication
X-Webhook-Event-TypeEvent type string
X-Webhook-TimestampUnix timestamp in seconds
X-Webhook-SignatureHMAC-SHA256 signature in the format sha256=<hex>
Webhook Payload
{
  "event_id": "evt_550e8400-e29b-41d4-a716-446655440000",
  "event_type": "manual_order.completed",
  "created_at": "2026-04-10T12:00:00.000Z",
  "data": { ... }
}

Retry policy

  • First attempt is immediate.
  • One retry happens 5 minutes later after a failure.
  • Maximum attempts: 2 total.
  • Endpoints must return a 2xx status within 10 seconds.
  • After all retries fail, the delivery is marked as dead.
Node.js verification
const crypto = require("crypto");

function verifyWebhook(req, webhookSecret) {
  const timestamp = req.headers["x-webhook-timestamp"];
  const signature = req.headers["x-webhook-signature"];
  const rawBody = JSON.stringify(req.body);

  const signedPayload = timestamp + "." + rawBody;
  const expected = "sha256=" + crypto
    .createHmac("sha256", webhookSecret)
    .update(signedPayload)
    .digest("hex");

  return crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(expected)
  );
}
Python verification
import hmac
import hashlib

def verify_webhook(timestamp, signature, raw_body, webhook_secret):
    signed_payload = f"{timestamp}.{raw_body}"
    expected = "sha256=" + hmac.new(
        webhook_secret.encode(),
        signed_payload.encode(),
        hashlib.sha256
    ).hexdigest()
    return hmac.compare_digest(signature, expected)

Models

Core schema shapes

These are the core models referenced by the task and manual order endpoints throughout the V1 API.

Error

{
  "error": {
    "code": "invalid_request",
    "message": "A human-readable description of the error"
  }
}

Speed

{
  "vote": 10,
  "minute": 60
}

RandomRange

{
  "from": 1,
  "to": 5
}

InitialUpvotesOrder

{
  "number_of_votes": 20,
  "vote_type": 1,
  "speed": {
    "vote": 5,
    "minute": 60
  },
  "delay_minute": 0
}

CommentTaskResponse

{
  "order_id": "string",
  "task_type": "comment",
  "status": "pending",
  "thread_url": null,
  "subreddit_url": null,
  "content": "string",
  "price": 1
}

ManualOrderResponse

{
  "order_id": "string",
  "post_url": "string",
  "post_type": "string",
  "vote_type": 1,
  "requested_vote": 1,
  "voted_number": 1,
  "status": "pending"
}