Menu

Rep4Rep API

Automate Rep4Rep from your own scripts: your account, Steam profiles, tasks and requests. JSON in and out.

Authentication

Make an API key in Settings → API key and send it with every request, in the Authorization header:

curl https://r4r.serv.gs/api/v1/user \
  -H "Authorization: Bearer YOUR_API_KEY"

Or as ?key= in the URL (handy for a quick test; the header keeps it out of logs and browser history):

https://r4r.serv.gs/api/v1/user?key=YOUR_API_KEY

Anyone with your key can use your account and points. If it leaks, make a new one in the settings: the old one stops working right away.

Basics

  • Base URL: https://r4r.serv.gs/api/v1
  • Responses are JSON, the result in data. Send parameters as form fields or as a JSON body.
  • Steam profiles are addressed by their SteamID64 (steamId), dates are ISO 8601 in UTC.
  • 300 requests per minute per key. The X-RateLimit-Remaining header says how many are left; past it you get 429 until the minute is over.

Errors

Errors come with an HTTP status and a message; invalid parameters (422) also list them in errors.

401 Missing or invalid API key
402 Not enough credits for the order (reselling)
403 Reseller access required (reselling)
404 Not found, e.g. a steamId that isn't one of your profiles
409 Conflict: the task isn't available anymore, the profile belongs to another account, or you have a running order on it
422 Invalid parameters
429 Too many requests, wait a moment
{"message": "Invalid API key."}

Account

GET /user

The account the key belongs to, and a snapshot of it to plan your next calls. availablePoints is what your requests can still spend (points minus what's held for comments being checked); pendingPoints is what you'll get for your own comments that are still being checked. rateLimit is your key's limit and what's left this minute (this call included). comments counts the last 24 hours across your Steam profiles against their daily limit; nextSlotAt is when the next one frees up. tasksBeingChecked are your comments waiting for their check; weeklyStreak is this week's progress towards the streak reward.

curl https://r4r.serv.gs/api/v1/user \
  -H "Authorization: Bearer YOUR_API_KEY"
{
    "data": {
        "id": 1,
        "username": "you",
        "points": 1250,
        "availablePoints": 1180,
        "pendingPoints": 44,
        "reseller": false,
        "createdAt": "2024-03-01T12:00:00+00:00",
        "rateLimit": {
            "perMinute": 300,
            "remaining": 299
        },
        "comments": {
            "last24h": 7,
            "dailyLimit": 20,
            "nextSlotAt": "2024-03-02T09:14:00+00:00"
        },
        "tasksBeingChecked": 2,
        "runningRequests": 1,
        "steamProfiles": 2,
        "weeklyStreak": {
            "weeks": 3,
            "daysThisWeek": 2,
            "daysNeeded": 4,
            "reward": 200,
            "claimed": false
        }
    }
}

Steam profiles

GET /steam-profiles

Your Steam profiles. Every other call addresses a profile by its steamId (SteamID64). commentsToday is how many comments were posted from it in the last 24 hours; Steam allows about 10 a day.

curl https://r4r.serv.gs/api/v1/steam-profiles \
  -H "Authorization: Bearer YOUR_API_KEY"
{
    "data": [
        {
            "steamId": "76561198000000001",
            "name": "you",
            "profileUrl": "https://steamcommunity.com/profiles/76561198000000001",
            "avatar": "https://avatars.steamstatic.com/…_full.jpg",
            "level": 42,
            "visibility": "public",
            "commentPermission": "public",
            "hasVacBan": false,
            "canReceiveComments": true,
            "problem": null,
            "verified": false,
            "commentsToday": 3,
            "dailyCommentLimit": 10,
            "addedAt": "2024-03-01T12:00:00+00:00"
        }
    ]
}

GET /steam-profiles/{steamId}

One of your Steam profiles.

curl https://r4r.serv.gs/api/v1/steam-profiles/76561198000000001 \
  -H "Authorization: Bearer YOUR_API_KEY"

POST /steam-profiles

Add a Steam profile. A profile that's linked to another account can only be added on the website, by signing in through Steam (409).

profile
Required. A SteamID64, SteamID, or profile URL (also custom URLs).
curl -X POST https://r4r.serv.gs/api/v1/steam-profiles \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d "profile=76561198000000001"

Returns 201 with the profile.

DELETE /steam-profiles/{steamId}

Remove a Steam profile. Its running requests end; comments already posted from it are still checked and paid.

curl -X DELETE https://r4r.serv.gs/api/v1/steam-profiles/76561198000000001 \
  -H "Authorization: Bearer YOUR_API_KEY"

Returns 204, no body.

Tasks

GET /steam-profiles/{steamId}/tasks

Tasks to do from this profile, best paying first: post comment.text on the target's profile (target.commentsUrl), then submit it with POST /tasks. A list can come back empty when there's nothing right now.

limit
Optional. How many, 1 to 25 (default 10).
curl https://r4r.serv.gs/api/v1/steam-profiles/76561198000000001/tasks \
  -H "Authorization: Bearer YOUR_API_KEY"
{
    "data": [
        {
            "requestId": "01HV8Z4M3K2Q7N1P5R9S6T0W2X",
            "target": {
                "steamId": "76561198000000002",
                "name": "someone",
                "commentsUrl": "https://steamcommunity.com/profiles/76561198000000002/allcomments"
            },
            "comment": {
                "id": 4455,
                "text": "+rep great teammate"
            },
            "points": 16,
            "ticket": "eyJpdiI6…"
        }
    ]
}

POST /tasks

Submit a comment you posted. It's checked on Steam about 5 minutes later; you get the points once it's found. With the task's ticket it's accepted up to 60 minutes after you got the task, at the points shown, even if the request was paused, deleted or filled up meanwhile. 409 when the task isn't available anymore and there's no valid ticket, or this profile commented on the target in the last day: get a new one.

steamId
Required. Your profile the comment was posted from.
requestId
Required. From the task.
commentId
Required. From the task (comment.id).
ticket
Recommended. From the task.
curl -X POST https://r4r.serv.gs/api/v1/tasks \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d "steamId=76561198000000001&requestId=01HV8Z4M3K2Q7N1P5R9S6T0W2X&commentId=4455&ticket=eyJpdiI6…"

Returns 201 with the task.

GET /tasks

Comments you submitted, newest first, with their verification status: pending, retrying (not found yet, checked again), verified or failed. Paginated (data, links, meta).

status
Optional. pending, retrying, verified or failed.
steamId
Optional. Only the ones posted from this profile.
perPage
Optional. 1 to 100 (default 50).
page
Optional. Page number.
curl https://r4r.serv.gs/api/v1/tasks \
  -H "Authorization: Bearer YOUR_API_KEY"
{
    "data": [
        {
            "id": 123456,
            "requestId": "01HV8Z4M3K2Q7N1P5R9S6T0W2X",
            "steamId": "76561198000000001",
            "targetSteamId": "76561198000000002",
            "comment": "+rep great teammate",
            "status": "verified",
            "result": "Comment found",
            "points": 22,
            "bonusPoints": 0,
            "nextCheckAt": null,
            "submittedAt": "2024-03-01T12:00:00+00:00",
            "resolvedAt": "2024-03-01T12:05:10+00:00"
        }
    ],
    "links": [
        "…"
    ],
    "meta": [
        "…"
    ]
}

GET /tasks/{id}

One of your submitted comments.

curl https://r4r.serv.gs/api/v1/tasks/123456 \
  -H "Authorization: Bearer YOUR_API_KEY"

Requests

GET /requests

Your requests for comments on your own profiles (Receive Comments), newest first. costPerComment null means Auto (follows the market). problem says why a running request isn't getting comments. Paginated.

status
Optional. active, paused or completed.
curl https://r4r.serv.gs/api/v1/requests \
  -H "Authorization: Bearer YOUR_API_KEY"
{
    "data": [
        {
            "id": "01HV8Z4M3K2Q7N1P5R9S6T0W2X",
            "steamId": "76561198000000001",
            "status": "active",
            "costPerComment": null,
            "commentLimit": 500,
            "commentsReceived": 120,
            "commentList": {
                "id": 8,
                "name": "My comments"
            },
            "problem": null,
            "lastCommentAt": "2024-03-01T12:05:10+00:00",
            "createdAt": "2024-02-20T09:00:00+00:00"
        }
    ],
    "links": [
        "…"
    ],
    "meta": [
        "…"
    ]
}

Comment lists

GET /comment-lists

Lists an order can use as commentListId: public ones with at least 5 comments, most subscribed first, or your own with own=1. comments is how many it has. Paginated.

own
Optional. 1 for your own lists.
tag
Optional. Only lists with this tag, e.g. English.
perPage
Optional. 1 to 100 (default 50).
page
Optional. Page number.
curl https://r4r.serv.gs/api/v1/comment-lists \
  -H "Authorization: Bearer YOUR_API_KEY"
{
    "data": [
        {
            "id": 60527,
            "name": "Various +rep",
            "tag": "English",
            "comments": 100,
            "subscribers": 74251,
            "public": true,
            "own": false
        }
    ]
}

Reselling

GET /reseller

Needs reseller access (403 without). Your credits and what they're worth (amount in cents), the exact exchange rate (creditValue: its credits are worth its amount in cents, so X credits are worth X × amount / credits cents), and what one comment costs in credits right now at each priority. An order's price is fixed when you place it: quantity × the price of its priority. A higher priority pays commenters more, so it's delivered sooner.

curl https://r4r.serv.gs/api/v1/reseller \
  -H "Authorization: Bearer YOUR_API_KEY"
{
    "data": {
        "credits": 6000,
        "creditsValue": {
            "amount": 1998,
            "currency": "USD"
        },
        "creditValue": {
            "credits": 3000,
            "amount": 999,
            "currency": "USD"
        },
        "prices": {
            "low": 17,
            "normal": 20,
            "high": 25
        },
        "minQuantity": 1,
        "maxQuantity": 1000
    }
}

POST /orders

Order comments on any public Steam profile that allows comments from everyone; it doesn't have to be yours. The whole order is charged right away (402 when your credits don't cover it). The comments come from a list (commentListId) or are your own (comments), checked like in the list editor: if any of them can't be posted on Steam, nothing is ordered and errors.comments says why. Send an Idempotency-Key header (up to 64 characters) to retry safely: the same key returns the order placed with it (200) instead of a second one. One running order per profile (409).

profile
Required. A SteamID64, SteamID, or profile URL (also custom URLs).
quantity
Required. 1 to 1000 comments.
priority
Optional. low, normal (default) or high.
commentListId
A list from GET /comment-lists. Or:
comments
Your own comments, as an array (comments[]=…), up to 5,000, each up to 1,000 characters.
curl -X POST https://r4r.serv.gs/api/v1/orders \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -d "profile=76561198000000001&quantity=10&priority=normal&commentListId=60527"

Returns 201 with the order (see GET /orders).

GET /orders

Your orders, newest first. delivered: comments on the profile and checked; pending: still being checked. Paginated.

status
Optional. active, paused, completed or cancelled.
steamId
Optional. Only orders on this profile.
perPage
Optional. 1 to 100 (default 50).
page
Optional. Page number.
curl https://r4r.serv.gs/api/v1/orders \
  -H "Authorization: Bearer YOUR_API_KEY"
{
    "data": [
        {
            "id": "01JB9X2Y3Z4A5B6C7D8E9F0G1H",
            "status": "active",
            "endReason": null,
            "target": {
                "steamId": "76561198000000001",
                "name": "customer",
                "profileUrl": "https://steamcommunity.com/profiles/76561198000000001",
                "canReceiveComments": true
            },
            "priority": "normal",
            "quantity": 10,
            "delivered": 4,
            "pending": 2,
            "costPerComment": 20,
            "creditsCharged": 200,
            "creditsRefunded": 0,
            "settled": false,
            "pausedAt": null,
            "endedAt": null,
            "createdAt": "2026-10-27T12:00:00+00:00"
        }
    ]
}

GET /orders/{orderId}

One order. status is active; paused while the profile is private, has its comments closed or a community ban (it continues once that's fixed, and is cancelled after 12 hours); completed; or cancelled, with endReason cancelled, profile_unavailable, profile_banned, or expired (7 days without a comment). Comments that aren't delivered are refunded automatically, pending ones once they fail. settled is true when the refund is final.

curl https://r4r.serv.gs/api/v1/orders/01JB9X2Y3Z4A5B6C7D8E9F0G1H \
  -H "Authorization: Bearer YOUR_API_KEY"

POST /orders/{orderId}/cancel

Cancel a running order. What isn't delivered is refunded right away, pending comments if they fail. 409 when it isn't running anymore.

curl -X POST https://r4r.serv.gs/api/v1/orders/01JB9X2Y3Z4A5B6C7D8E9F0G1H/cancel \
  -H "Authorization: Bearer YOUR_API_KEY"

Returns 200 with the order.

GET /reseller/transactions

Every change to your credits, newest first: top_up, order_charge, order_refund or adjustment. Paginated.

perPage
Optional. 1 to 100 (default 50).
page
Optional. Page number.
curl https://r4r.serv.gs/api/v1/reseller/transactions \
  -H "Authorization: Bearer YOUR_API_KEY"
{
    "data": [
        {
            "id": 12,
            "type": "order_refund",
            "amount": 80,
            "balanceAfter": 5880,
            "orderId": "01JB9X2Y3Z4A5B6C7D8E9F0G1H",
            "description": "4 comments not delivered",
            "createdAt": "2026-10-28T08:00:00+00:00"
        }
    ]
}