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-Remainingheader 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
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"
}
]
}
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.
{ "data": [ { "id": 60527, "name": "Various +rep", "tag": "English", "comments": 100, "subscribers": 74251, "public": true, "own": false } ] }