Public API

Free REST API for FunPay and G2G — games, listing categories, search filters, and seller stats. No API key required.
v1

Conventions

  • Base URL: https://rmthub.com

  • All v1 endpoints live under /api/v1/. The current major version is in the URL.

  • Most endpoints accept anonymous requests. To get a higher rate limit, send an API key as `Authorization: Bearer rmthub_live_…`. Create one at /profile/api-keys after signing in.

  • 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

Authentication & rate limits

v1 endpoints work without authentication and are subject to per-IP rate limits (30 requests/minute and 500 requests/day). If you send a valid `Authorization: Bearer rmthub_live_…` header, the per-key limits apply instead — set per key, default 60/minute and 1 000/day, and admin-adjustable. Every response carries `X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset` headers; 429 responses additionally include `Retry-After` (seconds). Invalid or revoked keys return 401.

Anonymous (no API key)

Per minute: 30 / IP

Per day: 500 / IP

Authenticated with a key

Per minute: per-key (default 60)

Per day: per-key (default 1 000)

Get an API key

Endpoints

10 documented

FunPay

GET

/api/v1/funpay/users/{username}

Return a FunPay seller's public profile and review statistics — revenue, breakdowns by time period and game, and lifetime aggregates.


Path parameters
username
string
Required

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 referencedata.user
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 referencedata.stats
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 referencedata.timeGroupedStats[]
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 referencemeta
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
400
Body
{"error":"Username parameter is required"}
When

Empty username parameter.

400
Body
{"error":"Username cannot be empty"}
When

Whitespace-only username.

400
Body
{"error":"Username too long"}
When

username longer than 100 characters.

404
Body
{"error":"User \"<name>\" not found"}
When

No user with this username in the database.

500
Body
{"error":"Internal server error","details":"…"}
When

Catch-all — details is included when the underlying error is an Error.

GET

/api/v1/funpay/users/{username}/top-positions

Return a FunPay seller's leaderboard placements — global and per-game top-seller ranks across time periods.


Path parameters
username
string
Required

FunPay username, URL-encoded. Must be 1–100 characters.

Query parameters
locale
string
Not required
Default: en
Allowed values
en
ru

Set to ru for Russian period labels; defaults to English.

Example request
GET /api/v1/funpay/users/Russper/top-positions HTTP/1.1
Host: rmthub.com
Accept: application/json

curl 'https://rmthub.com/api/v1/funpay/users/Russper/top-positions'
Example response
{
  "data": {
    "user": {
      "id": 9221663,
      "username": "Russper",
      "url": "https://funpay.com/users/9221663/"
    },
    "summary": {
      "bestGlobalRank": 5,
      "gameCount": 3,
      "positionCount": 12
    },
    "global": [
      {
        "period": "all_time",
        "periodLabel": "All time",
        "rank": 5,
        "totalAmount": 12450,
        "reviewsCount": 482,
        "rankChange": { "diff": 2, "previousRank": 7 },
        "revenueChange": { "diff": 320, "percent": 3 }
      }
    ],
    "byGame": [
      {
        "game": "Valorant",
        "period": "this_month",
        "periodLabel": "This month",
        "rank": 1,
        "totalAmount": 4200,
        "reviewsCount": 160,
        "rankChange": null,
        "revenueChange": null
      }
    ],
    "lastUpdated": "2026-07-14T10:00:00.000Z"
  },
  "meta": {
    "version": "1.0",
    "fetchedAt": "2026-07-14T12:00:00.000Z",
    "total": 12
  }
}
Response field referencedata.user
id
number

FunPay numeric id.

username
string

Display name.

url
string

Canonical FunPay profile URL.

Response field referencedata.summary
bestGlobalRank
number | null

Best (lowest) global leaderboard rank, or null if none.

gameCount
number

Number of distinct games with a top-seller placement.

positionCount
number

Total placement entries (global + per-game).

Response field referencedata.global[]
period
string

Stable machine key (all_time, this_month, last_month, …).

periodLabel
string

Human-readable period label.

rank
number

Leaderboard position (1 = first place).

totalAmount
number

Revenue in this leaderboard bucket (USD-equivalent).

reviewsCount
number

Review count in this bucket.

rankChange
object | null

Rank movement: diff (positive = improved) and previousRank; null when unavailable.

revenueChange
object | null

Revenue movement: diff and percent; null when unavailable.

Response field referencedata.byGame[]
period
string

Stable machine key (all_time, this_month, last_month, …).

periodLabel
string

Human-readable period label.

rank
number

Leaderboard position (1 = first place).

totalAmount
number

Revenue in this leaderboard bucket (USD-equivalent).

reviewsCount
number

Review count in this bucket.

rankChange
object | null

Rank movement: diff (positive = improved) and previousRank; null when unavailable.

revenueChange
object | null

Revenue movement: diff and percent; null when unavailable.

game
string

Game display name (byGame only).

gameSlug
string

URL-safe game slug (byGame only). Omitted when unknown.

Response field referencedata
lastUpdated
string | null

ISO-8601 UTC timestamp of the last index rebuild.

Response field referencemeta
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.

total
number

Equals data.summary.positionCount.

Errors
400
Body
{"error":"Username parameter is required"}
When

Empty username parameter.

400
Body
{"error":"Username cannot be empty"}
When

Whitespace-only username.

400
Body
{"error":"Username too long"}
When

username longer than 100 characters.

404
Body
{"error":"No top positions found for user \"<name>\""}
When

Seller has no indexed leaderboard placements.

500
Body
{"error":"Internal server error"}
When

Unexpected server error.

GET

/api/v1/funpay/leaderboards/sellers

Paginated FunPay top sellers — the same rankings shown on /funpay?category=top_sellers. Supports all-time and rolling time periods, per-game filters, banned sellers, and search. Cache-Control: public, max-age=3600.

Quick examples:
All time
This month
Banned sellers

Query parameters
locale
string
Not required
Allowed values
en
ru

Response labels and RMTHub URLs. Omit for English.

period
string
Not required
Default: all_time
Allowed values (23)
all_time, banned, this_month, month_ago, 2_months_ago, 3_months_ago, 4_months_ago, 5_months_ago, 6_months_ago, 7_months_ago, 8_months_ago, 9_months_ago, 10_months_ago, 11_months_ago, year_ago, 2_years_ago, 3_years_ago, 4_years_ago, 5_years_ago, 6_years_ago, 7_years_ago, 8_years_ago, 9_years_ago

Which leaderboard slice to return. See allowed values — same keys as the /funpay filter parameter.

gameSlug
string
Not required

Filter to one game (slug from GET /api/v1/funpay/games). Omit for all games. Ignored when period=banned.

game
string
Not required

Same as gameSlug but pass the display name instead. Do not use together with gameSlug.

page
integer
Not required
Default: 1

Page number, starting at 1.

limit
integer
Not required
Default: 20

Rows per page. Default 20, maximum 100.

search
string
Not required

Filter by FunPay username or numeric user id.

Example request
GET /api/v1/funpay/leaderboards/sellers HTTP/1.1
Host: rmthub.com
Accept: application/json

curl 'https://rmthub.com/api/v1/funpay/leaderboards/sellers?period=all_time&page=1&limit=20'
Example response
{
  "data": {
    "period": "all_time",
    "periodLabel": "All time",
    "game": null,
    "sellers": [
      {
        "rank": 1,
        "id": 7771234,
        "username": "Roymi",
        "url": "https://funpay.com/users/7771234/",
        "profileUrl": "https://rmthub.com/en/funpay/7771234",
        "totalAmount": 12450,
        "reviewsCount": 482
      }
    ],
    "sourceUrl": "https://rmthub.com/en/funpay?category=top_sellers&filter=all_time&page=1"
  },
  "meta": {
    "version": "1.0",
    "fetchedAt": "2026-07-14T12:00:00.000Z",
    "total": 842,
    "page": 1,
    "limit": 20
  }
}
Response field referencedata
period
string

Stable machine key for the selected leaderboard period.

periodLabel
string

Human-readable period label for the requested locale.

game
object | null

Selected game filter as { name, slug }, or null when all games.

sellers
array

Ranked seller rows for this page.

sourceUrl
string

Canonical RMTHub /funpay page for this leaderboard view.

Response field referencedata.game
name
string

Game display name.

slug
string

URL-safe game slug.

Response field referencedata.sellers[]
rank
number

Global rank on this leaderboard (1 = first place).

id
number

FunPay numeric id.

username
string

Display name.

url
string

Canonical FunPay profile URL.

profileUrl
string

RMTHub seller profile page for the requested locale.

totalAmount
number

Revenue in this leaderboard bucket (USD-equivalent).

reviewsCount
number

Review count in this bucket.

Response field referencemeta
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.

total
number

Total matching sellers across all pages.

page
number

Current page number.

limit
number

Page size used for this response.

Errors
400
Body
{"error":"Invalid period \"<period>\""}
When

Unknown period value.

400
Body
{"error":"limit must be between 1 and 100"}
When

page or limit out of range.

400
Body
{"error":"search must be at most 100 characters"}
When

search exceeds 100 characters.

404
Body
{"error":"Game \"<slug>\" not found"}
When

gameSlug does not match any catalog game.

404
Body
{"error":"No leaderboard data for period \"<period>\""}
When

No precomputed leaderboard for this period/filter combination.

429
Body
{"error":"Rate limit exceeded…"}
When

Per-minute or per-day rate limit exceeded.

500
Body
{"error":"Internal server error"}
When

Unexpected server error.

GET

/api/v1/funpay/leaderboards/games

Paginated FunPay top games — the same rankings shown on /funpay?category=top_games. Use category=top_new_games for fresh breakout titles. Cache-Control: public, max-age=3600.

Quick examples:
Top games
This month
New games

Query parameters
locale
string
Not required
Allowed values
en
ru

Response labels and RMTHub URLs. Omit for English.

category
string
Not required
Default: top_games
Allowed values
top_games
top_new_games

Which games list to return. new_games is an alias for top_new_games.

period
string
Not required
Default: all_time
Allowed values (22)
all_time, this_month, month_ago, 2_months_ago, 3_months_ago, 4_months_ago, 5_months_ago, 6_months_ago, 7_months_ago, 8_months_ago, 9_months_ago, 10_months_ago, 11_months_ago, year_ago, 2_years_ago, 3_years_ago, 4_years_ago, 5_years_ago, 6_years_ago, 7_years_ago, 8_years_ago, 9_years_ago

Time window for top_games. Ignored when category=top_new_games (always all_time).

page
integer
Not required
Default: 1

Page number, starting at 1.

limit
integer
Not required
Default: 20

Rows per page. Default 20, maximum 100.

search
string
Not required

Filter by game name substring.

Example request
GET /api/v1/funpay/leaderboards/games HTTP/1.1
Host: rmthub.com
Accept: application/json

curl 'https://rmthub.com/api/v1/funpay/leaderboards/games?period=all_time&page=1&limit=20'
Example response
{
  "data": {
    "category": "top_games",
    "categoryLabel": "Top games",
    "period": "all_time",
    "periodLabel": "All time",
    "games": [
      {
        "rank": 1,
        "game": "Valorant",
        "gameSlug": "valorant",
        "totalAmount": 42000,
        "reviewsCount": 1600
      }
    ],
    "sourceUrl": "https://rmthub.com/en/funpay?category=top_games&filter=all_time&page=1"
  },
  "meta": {
    "version": "1.0",
    "fetchedAt": "2026-07-14T12:00:00.000Z",
    "total": 120,
    "page": 1,
    "limit": 20
  }
}
Response field referencedata
category
string

Stable category key: top_games or top_new_games.

categoryLabel
string

Human-readable category label.

period
string

Stable machine key for the selected period.

periodLabel
string

Human-readable period label.

games
array

Ranked game rows for this page.

sourceUrl
string

Canonical RMTHub /funpay page for this leaderboard view.

Response field referencedata.games[]
rank
number

Rank on this leaderboard (1 = first place).

game
string

Game display name.

gameSlug
string | null

URL-safe slug derived from the game name, or null.

totalAmount
number

Total review revenue for this game in the bucket (USD-equivalent).

reviewsCount
number

Review count in this bucket.

Response field referencemeta
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.

total
number

Total matching games across all pages.

page
number

Current page number.

limit
number

Page size used for this response.

Errors
400
Body
{"error":"Invalid period \"<period>\""}
When

Unknown period value for top_games.

400
Body
{"error":"category top_new_games only supports period all_time"}
When

top_new_games requested with a period other than all_time.

400
Body
{"error":"limit must be between 1 and 100"}
When

page or limit out of range.

404
Body
{"error":"No leaderboard data for period \"<period>\""}
When

No precomputed leaderboard for this period.

429
Body
{"error":"Rate limit exceeded…"}
When

Per-minute or per-day rate limit exceeded.

500
Body
{"error":"Internal server error"}
When

Unexpected server error.

GET

/api/v1/funpay/games

List every FunPay game in the RMTHub catalog with lot categories (subfolders). The full catalog is returned in one response — suitable for game pickers, filters, or offline caches. Responses include Cache-Control: public, max-age=3600.


Example request
GET /api/v1/funpay/games HTTP/1.1
Host: rmthub.com
Accept: application/json

curl 'https://rmthub.com/api/v1/funpay/games'
Example response
{
  "data": {
    "games": [
      {
        "id": "https://funpay.com/en/lots/3486/",
        "slug": "abyss-of-dungeons",
        "name": "Abyss of Dungeons",
        "nameRu": "Бездна подземелий",
        "url": "https://funpay.com/en/lots/3486/",
        "lastUpdated": "2026-06-18",
        "subfolders": [
          { "name": "Accounts", "nameRu": "Аккаунты", "url": "https://funpay.com/en/lots/3486/" },
          { "name": "Top Up",   "nameRu": "Пополнение", "url": "https://funpay.com/en/lots/3487/" },
          { "name": "Other",    "url": "https://funpay.com/en/lots/3490/" }
        ]
      }
    ]
  },
  "meta": {
    "version": "1.0",
    "fetchedAt": "2026-06-18T14:00:00.000Z",
    "total": 855
  }
}
Response field referencedata.games[]
id
string

Stable identifier — the FunPay lots URL (same as url). Use when referencing a game in other RMTHub APIs.

slug
string

URL-safe slug derived from the game name. Use in GET /api/v1/funpay/games/{gameSlug}/fees and /filters.

name
string

Display name on FunPay (English catalog).

nameRu
string

Optional Russian display name from the scraped FunPay RU catalog. Omitted when unavailable or identical to name.

url
string

Canonical FunPay lots URL for the game.

lastUpdated
string | null

UTC calendar date (YYYY-MM-DD) of the last scraper update, or null.

subfolders
array

Lot categories within the game.

subfolders[].name
string

Category label (e.g. Accounts, Top Up).

subfolders[].nameRu
string

Optional Russian category label. Omitted when unavailable or identical to subfolders[].name.

subfolders[].url
string

FunPay URL for that category's lots page.

Response field referencemeta
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.

total
number

Number of games in data.games.

Errors
429
Body
{"error":"Rate limit exceeded…"}
When

Per-minute or per-day rate limit exceeded.

500
Body
{"error":"Internal server error"}
When

Unexpected server error.

GET

/api/v1/funpay/games/{gameSlug}/fees

FunPay seller fee data for each lot category within a game. Scoped by game slug only (~3–15 rows). Not a bulk dump of the full fees collection. Cache-Control: public, max-age=3600.


Path parameters
gameSlug
string
Required

URL-safe slug (e.g. abyss-of-dungeons). Must be 1–200 characters.

Example request
GET /api/v1/funpay/games/abyss-of-dungeons/fees HTTP/1.1
Host: rmthub.com
Accept: application/json

curl 'https://rmthub.com/api/v1/funpay/games/abyss-of-dungeons/fees'
Example response
{
  "data": {
    "game": {
      "id": "https://funpay.com/en/lots/3486/",
      "slug": "abyss-of-dungeons",
      "name": "Abyss of Dungeons",
      "nameRu": "Бездна подземелий",
      "url": "https://funpay.com/en/lots/3486/",
      "lastUpdated": "2026-06-18",
      "subfolders": [
        { "name": "Accounts", "nameRu": "Аккаунты", "url": "https://funpay.com/en/lots/3486/" },
        { "name": "Top Up",   "nameRu": "Пополнение", "url": "https://funpay.com/en/lots/3487/" }
      ]
    },
    "fees": [
      {
        "subfolder": "Accounts",
        "subfolderRu": "Аккаунты",
        "subfolderUrl": "https://funpay.com/en/lots/3486/",
        "feePercent": 14.89,
        "lastUpdated": "2026-06-17"
      }
    ]
  },
  "meta": {
    "version": "1.0",
    "fetchedAt": "2026-06-18T14:00:00.000Z",
    "total": 3
  }
}
Response field referencedata.game
id
string

Stable identifier — the FunPay lots URL (same as url).

slug
string

URL-safe slug derived from the game name.

name
string

Display name on FunPay (English catalog).

nameRu
string

Optional Russian display name from the scraped FunPay RU catalog. Omitted when unavailable or identical to name.

url
string

Canonical FunPay lots URL for the game.

lastUpdated
string | null

UTC calendar date (YYYY-MM-DD) of the last scraper update, or null.

subfolders
array

Lot categories within the game.

subfolders[].name
string

Category label (e.g. Accounts, Top Up).

subfolders[].nameRu
string

Optional Russian category label. Omitted when unavailable or identical to subfolders[].name.

subfolders[].url
string

FunPay URL for that category's lots page.

Response field referencedata.fees[]
subfolder
string

Category name (e.g. Accounts, Top Up).

subfolderRu
string

Optional Russian category name. Omitted when unavailable or identical to subfolder.

subfolderUrl
string | null

FunPay lots page URL for this category, or null.

feePercent
number | null

FunPay fee as a percentage (e.g. 14.89 = 14.89%), or null if not scraped.

lastUpdated
string | null

UTC calendar date (YYYY-MM-DD) of last scrape, or null.

Response field referencemeta
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.

total
number

Number of fee rows in data.fees.

Errors
404
Body
{"error":"Game \"<slug>\" not found"}
When

No game with this slug in the catalog.

500
Body
{"error":"Internal server error"}
When

Unexpected server error.

GET

/api/v1/funpay/games/{gameSlug}/filters

Scraped lot-filter options for a FunPay game — servers, regions, item types, etc. Without category, returns data.categories grouped by lot category; with category, returns data.selects for that category only. Cache-Control: public, max-age=86400.


Path parameters
gameSlug
string
Required

URL-safe slug (e.g. lineage-2-free). Must be 1–200 characters.

Query parameters
category
string
Not required

Optional lot category name (e.g. Adena). Must match a category from the game catalog.

Example request
GET /api/v1/funpay/games/lineage-2-free/filters HTTP/1.1
Host: rmthub.com
Accept: application/json

curl 'https://rmthub.com/api/v1/funpay/games/lineage-2-free/filters'
Example response
{
  "data": {
    "game": {
      "id": "https://funpay.com/en/chips/10/",
      "slug": "lineage-2-free",
      "name": "Lineage 2 Free",
      "nameRu": "Lineage 2 Бесплатный",
      "url": "https://funpay.com/en/chips/10/",
      "lastUpdated": "2026-07-03",
      "subfolders": [
        { "name": "Adena",    "nameRu": "Адена",    "url": "https://funpay.com/en/chips/10/" },
        { "name": "Accounts", "nameRu": "Аккаунты", "url": "https://funpay.com/en/lots/11/" },
        { "name": "Items",    "nameRu": "Предметы", "url": "https://funpay.com/en/lots/3/" }
      ]
    },
    "categories": {
      "Adena": {
        "Server": ["Aden.land x20", "Asterios.tm Prime x1"]
      },
      "Accounts": {
        "Server": ["Aden.land x20"],
        "Race": ["Human", "Elf"]
      },
      "Items": {
        "Item type": ["Armor Sets", "Weapon", "Armor"]
      }
    },
    "categoryNamesRu": {
      "Adena": "Адена",
      "Accounts": "Аккаунты",
      "Items": "Предметы"
    },
    "categoriesRu": {
      "Adena": {
        "Сервер": ["Aden.land x20", "Asterios.tm Prime x1"]
      },
      "Accounts": {
        "Сервер": ["Aden.land x20"],
        "Раса": ["Human", "Elf"]
      },
      "Items": {
        "Тип предмета": ["Armor Sets", "Weapon", "Armor"]
      }
    }
  },
  "meta": {
    "version": "1.0",
    "fetchedAt": "2026-07-03T14:00:00.000Z",
    "total": 3
  }
}
Response field referencedata.game
id
string

Stable identifier — the FunPay lots URL (same as url).

slug
string

URL-safe slug derived from the game name.

name
string

Display name on FunPay (English catalog).

nameRu
string

Optional Russian display name from the scraped FunPay RU catalog. Omitted when unavailable or identical to name.

url
string

Canonical FunPay lots URL for the game.

lastUpdated
string | null

UTC calendar date (YYYY-MM-DD) of the last scraper update, or null.

subfolders
array

Lot categories within the game.

subfolders[].name
string

Category label (e.g. Accounts, Top Up).

subfolders[].nameRu
string

Optional Russian category label. Omitted when unavailable or identical to subfolders[].name.

subfolders[].url
string

FunPay URL for that category's lots page.

Response field referencedata
categories
object

Present when category is omitted. Map of lot category name to filter selects (English keys).

categoryNamesRu
object

Present when category is omitted and RU category labels are available. Map of English lot category name to Russian display name.

categoriesRu
object

Present when category is omitted and scraped RU filter data exists. Same shape as categories, keyed by English lot category name, with Russian filter dimension names.

category
string

Present when category query param is set. Echo of the requested lot category (English name).

categoryRu
string

Present when category query param is set and a Russian category label is available.

selects
object

Present when category query param is set. English filter name to option strings for that category.

selectsRu
object

Present when category query param is set and scraped RU filter data exists. Russian filter name to option strings.

Response field referencemeta
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.

total
number

Without category: number of lot categories in data.categories. With category: option count in data.selects.

Errors
400
Body
{"error":"Category \"<name>\" not found for this game"}
When

category does not match any lot category for this game.

404
Body
{"error":"Game \"<slug>\" not found"}
When

No game with this slug in the catalog.

500
Body
{"error":"Internal server error"}
When

Unexpected server error.

G2G

GET

/api/v1/g2g/games

Browse every game on the G2G marketplace — from World of Warcraft and CS2 to mobile titles. Each entry includes a slug for the categories and filters endpoints. Sorted by popularity (offer count) and refreshed from RMTHub’s G2G market index. Free to use, no API key required.


Example request
GET /api/v1/g2g/games HTTP/1.1
Host: rmthub.com
Accept: application/json

curl 'https://rmthub.com/api/v1/g2g/games'
Example response
{
  "data": {
    "games": [
      {
        "name": "World of Warcraft",
        "slug": "world-of-warcraft",
        "lastUpdated": "2026-06-18"
      }
    ]
  },
  "meta": {
    "version": "1.0",
    "fetchedAt": "2026-06-18T14:00:00.000Z",
    "total": 1200
  }
}
Response field referencedata.games[]
name
string

Display name as shown on G2G and RMTHub market pages.

slug
string

URL-safe slug. Use in GET /api/v1/g2g/games/{gameSlug}/categories and /filters.

lastUpdated
string | null

UTC calendar date (YYYY-MM-DD) of the last market index update, or null.

Response field referencemeta
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.

total
number

Number of games in data.games.

Errors
429
Body
{"error":"Rate limit exceeded…"}
When

Per-minute or per-day rate limit exceeded.

500
Body
{"error":"Internal server error"}
When

Unexpected server error.

GET

/api/v1/g2g/games/{gameSlug}/categories

See what you can buy for a game on G2G — gold, accounts, in-game items, boosting, and other services. Each category links to the live G2G listing page and includes an id you can pass to the filters endpoint.


Path parameters
gameSlug
string
Required

URL-safe game slug (same as the games endpoint).

Example request
GET /api/v1/g2g/games/world-of-warcraft/categories HTTP/1.1
Host: rmthub.com
Accept: application/json

curl 'https://rmthub.com/api/v1/g2g/games/world-of-warcraft/categories'
Example response
{
  "data": {
    "game": {
      "slug": "world-of-warcraft",
      "name": "World of Warcraft",
      "lastUpdated": "2026-06-18"
    },
    "categories": [
      {
        "seoTerm": "wow-gold",
        "label": "Game coins",
        "marketingTitle": "WoW Gold",
        "url": "https://www.g2g.com/categories/wow-gold"
      }
    ]
  },
  "meta": {
    "version": "1.0",
    "fetchedAt": "2026-06-18T14:00:00.000Z",
    "total": 4
  }
}
Response field referencedata.game
name
string

Display name as shown on G2G and RMTHub market pages.

slug
string

URL-safe slug. Use in GET /api/v1/g2g/games/{gameSlug}/categories and /filters.

lastUpdated
string | null

UTC calendar date (YYYY-MM-DD) of the last market index update, or null.

Response field referencedata.categories[]
seoTerm
string

Category id for the filters endpoint (e.g. wow-gold, wow-item).

label
string

Short service label (e.g. Game coins, Accounts).

marketingTitle
string | null

English marketing title from G2G, or null.

url
string

Canonical G2G category URL.

Response field referencemeta
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.

total
number

Number of categories in data.categories.

Errors
404
Body
{"error":"Game \"<slug>\" not found"}
When

No game with this slug in the catalog.

500
Body
{"error":"Internal server error"}
When

Unexpected server error.

GET

/api/v1/g2g/games/{gameSlug}/filters

The same dropdown filters shoppers see on G2G — servers, item types, boosting options, and nested choices (e.g. weapon type, then character class). One request returns every category for the game; regional categories include all market regions (EU, US, etc.).


Path parameters
gameSlug
string
Required

URL-safe game slug (same as the games endpoint).

Example request
GET /api/v1/g2g/games/world-of-warcraft/filters HTTP/1.1
Host: rmthub.com
Accept: application/json

curl 'https://rmthub.com/api/v1/g2g/games/world-of-warcraft/filters'
Example response
{
  "data": {
    "game": {
      "slug": "world-of-warcraft",
      "name": "World of Warcraft",
      "lastUpdated": "2026-06-18"
    },
    "categories": {
      "wow-gold": {
        "regions": [
          {
            "code": "EU",
            "name": "Europe",
            "relations": [
              {
                "label": "Server",
                "options": [{ "value": "Aegwynn [EU] - Alliance" }]
              }
            ]
          }
        ]
      },
      "wow-boosting-service": {
        "relations": [
          {
            "label": "Service Type",
            "options": [{ "value": "Powerleveling" }]
          }
        ]
      }
    }
  },
  "meta": {
    "version": "1.0",
    "fetchedAt": "2026-06-18T14:00:00.000Z",
    "total": 42
  }
}
Response field referencedata.game
name
string

Display name as shown on G2G and RMTHub market pages.

slug
string

URL-safe slug. Use in GET /api/v1/g2g/games/{gameSlug}/categories and /filters.

lastUpdated
string | null

UTC calendar date (YYYY-MM-DD) of the last market index update, or null.

Response field referencedata
categories
object

Map of category id (seoTerm) → filters. Keys match the categories endpoint.

Response field referencedata.categories.*
regions
array

Present on regional categories (gold, items, accounts). One entry per market region.

relations
array

Present on non-regional categories (e.g. boosting).

Response field referencedata.categories.*.regions[]
code
string

Short region code (e.g. EU, US).

name
string

Display name (e.g. Europe, United States).

relations
array

Filter dimensions for this region.

Response field referencedata.categories.*.relations[]
label
string

Human-readable dimension name (e.g. Item Type, Server).

options
array

Selectable values for this dimension.

Response field referencedata.categories.*.relations[].options[]
value
string

Display label.

options
array

Nested sub-options for grouped filters (e.g. boosting service types); omitted for leaf values.

Response field referencemeta
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.

total
number

Total count of top-level filter options across all categories and regions.

Errors
404
Body
{"error":"Game \"<slug>\" not found"}
When

No game with this slug in the catalog.

500
Body
{"error":"Internal server error"}
When

Unexpected server error.