Public API
Public REST API for FunPay statistics and analytics
Conventions
Base URL: https://rmthub.com
All v1 endpoints live under /api/v1/. The current major version is in the URL.
No login required for the endpoints listed on this page.
All responses are JSON with Content-Type: application/json.
Every successful response is wrapped in { data, meta }. data holds the resource; meta includes the version that produced the response and a fetchedAt timestamp.
Errors return { error: "<message>" }. 4xx for client errors, 5xx for server errors. 5xx may also include a details field for debugging.
Numeric fields are returned as JSON numbers (no stringified numbers).
Versioning
Endpoints
1 documented
/api/v1/funpay/users/{username}
Find a FunPay user by username and return their full public profile — revenue, review history broken down by time period and game, and lifetime aggregates.
Path parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| username | string | yes | — | FunPay username, URL-encoded. Must be 1–100 characters. |
Example request
GET /api/v1/funpay/users/Roymi HTTP/1.1
Host: rmthub.com
Accept: application/json
curl 'https://rmthub.com/api/v1/funpay/users/Roymi'Example response
{
"data": {
"user": {
"id": 7771234,
"username": "Roymi",
"url": "https://funpay.com/users/7771234/",
"avatarUrl": "https://funpay.com/img/users/7771234/avatar.jpg",
"reviewsCount": 482,
"banned": false,
"status": "active",
"registrationDate": "15 Mar 2020"
},
"stats": {
"totalAmount": 12450,
"totalReviews": 482,
"averagePerReview": 25.83,
"gamesPlayed": 6,
"byTimePeriod": {
"thisMonth": { "amount": 320, "count": 14 },
"lastMonth": { "amount": 410, "count": 18 }
},
"byGame": {
"Valorant": { "amount": 4200, "count": 160 },
"CS2": { "amount": 3800, "count": 140 }
},
"byTimePeriodWithPercentage": [
{ "period": "thisMonth", "amount": 320, "count": 14, "percentage": 3 },
{ "period": "lastMonth", "amount": 410, "count": 18, "percentage": 3 }
],
"byGameWithPercentage": [
{ "game": "Valorant", "amount": 4200, "count": 160, "percentage": 34 },
{ "game": "CS2", "amount": 3800, "count": 140, "percentage": 30 }
]
},
"timeGroupedStats": [
{
"key": "thisMonth",
"label": "This month",
"amount": 320,
"count": 14,
"percentage": 3
}
]
},
"meta": {
"version": "1.0",
"fetchedAt": "2026-06-07T19:09:00.000Z"
}
}Response field reference — data.user
| Field | Type | Notes |
|---|---|---|
| id | number | FunPay numeric id, returned as a JSON number. |
| username | string | Display name. |
| url | string | Canonical FunPay profile URL. |
| avatarUrl | string | null | Absolute URL of the user's FunPay avatar image, or null if not available. |
| reviewsCount | number | Total review count, returned as a JSON number. |
| banned | boolean | FunPay ban flag. |
| status | string | Free-form status text from FunPay. |
| registrationDate | string | null | Registration date as shown on the FunPay profile (e.g. "15 Mar 2020"), or null if not available. |
Response field reference — data.stats
| Field | Type | Notes |
|---|---|---|
| totalAmount | number | Lifetime revenue, in USD-equivalent (whole units). |
| totalReviews | number | Lifetime review count. |
| averagePerReview | number | totalAmount / totalReviews, rounded to 2 decimals. |
| gamesPlayed | number | Number of distinct games the user has reviews for. |
| byTimePeriod | object | Map of period key (thisMonth, lastMonth, 2MonthsAgo, …) to { amount, count }. |
| byGame | object | Map of game name to { amount, count }. |
| byTimePeriodWithPercentage | array | Same as byTimePeriod plus a percentage field (integer 0–100, rounded). |
| byGameWithPercentage | array | Same as byGame plus a percentage field (integer 0–100, rounded). |
Response field reference — data.timeGroupedStats[]
| Field | Type | Notes |
|---|---|---|
| key | string | Stable machine identifier (thisMonth, lastMonth, …). |
| label | string | Human-readable period label (English). |
| amount | number | Total revenue in this bucket. |
| count | number | Number of reviews in this bucket. |
| percentage | number | Integer 0–100 share of the lifetime total. |
Response field reference — meta
| Field | Type | Notes |
|---|---|---|
| version | string | API version that produced this response (e.g. "1.0"). |
| fetchedAt | string | ISO-8601 UTC timestamp of when the server built the response. |
Errors
| Status | Body | When |
|---|---|---|
400 | {"error":"Username parameter is required"} | Empty username parameter. |
400 | {"error":"Username cannot be empty"} | Whitespace-only username. |
400 | {"error":"Username too long"} | username longer than 100 characters. |
404 | {"error":"User \"<name>\" not found"} | No user with this username in the database. |
500 | {"error":"Internal server error","details":"…"} | Catch-all — details is included when the underlying error is an Error. |