ReSellCodesAPI v1

API Documentation

ReSellCodes API v1 is a REST API for wholesale resellers: read the catalogue at the prices set for your account, order gift card codes, game keys, in-game top-ups, Steam wallet top-ups, Steam Gifts and Telegram, and collect the delivered codes. JSON only. HTTPS only.

Open the interactive reference → · OpenAPI 3.1 spec

Quickstart

Three calls take you from an empty terminal to delivered codes. Before the first one: create an account (the key is issued on the spot), top the balance up in USDT, and copy your key from Dashboard → API.

Step 1 · read the catalogue at your prices

curl "https://resell.codes/api/v1/gift-cards/categories/roblox_ru/cards" \
  -H "Authorization: Bearer rsc_live_xxxxxxxxxxxxxxxxxxxx"
{
  "object": "gift_card_offers",
  "category_id": "roblox_ru",
  "name": "Roblox (RU)",
  "offers": [
    { "card_id": "199_robux", "name": "199 Robux", "price_usd": "2.8100", "stock": 689, "min_quantity": 1, "max_quantity": 100 }
  ]
}

Sample response — take card_id and the price from your own call, never from this page. The $2.81 figure is what the public Roblox (RU) table showed on 8 September 2026; prices are per-account and move with the market. Category ids come from GET /gift-cards/categories?q=roblox.

Step 2 · place the order

curl -X POST https://resell.codes/api/v1/gift-cards/order \
  -H "Authorization: Bearer rsc_live_xxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"category_id":"roblox_ru","card_id":"199_robux","quantity":2}'
{
  "object": "order",
  "number": 12,
  "type": "gift_card",
  "channel": "api",
  "status": "processing",
  "charged_usd": "5.6200",
  "status_reason": null,
  "fail_code": null,
  "created_at": "2026-09-08T13:15:00.000Z",
  "status_history": [ { "status": "created", "reason": null, "at": "2026-09-08T13:15:00.000Z" } ],
  "category_id": "roblox_ru",
  "category_name": "Roblox (RU)",
  "card_id": "199_robux",
  "card_name": "199 Robux",
  "quantity": 2,
  "codes": []
}

Your balance is charged here — quantity × the catalogue price, nothing added on top. Keep number: it is how you reach this order everywhere else. Fast items often come back as completed with the codes already filled in.

Step 3 · collect the codes by order number

curl https://resell.codes/api/v1/orders/12 \
  -H "Authorization: Bearer rsc_live_xxxxxxxxxxxxxxxxxxxx"
{
  "object": "order",
  "number": 12,
  "type": "gift_card",
  "status": "completed",
  "charged_usd": "5.6200",
  "card_name": "199 Robux",
  "quantity": 2,
  "codes": ["RBXXXXXXXXXXXXXX", "RBYYYYYYYYYYYYYY"]
}

Trimmed response. Poll this endpoint while status is created or processing — a few seconds apart is plenty; most orders finish within minutes, some take longer (see Order statuses). Game keys arrive the same way in keys; top-ups deliver into the player's account and carry no codes.

Same three steps for the other product families — only the catalogue and the order endpoint change: /game-keys + /game-keys/order, /top-ups/categories + /top-ups/order, /steam-gifts/games + /steam-gifts/order, /steam-topup/rates + /steam-topup/order. Status always comes from GET /orders/{number}.

Cost, minimums and limits

The questions that decide whether the integration is worth writing, answered before the endpoint reference.

What does API access cost?

Nothing beyond the goods themselves. There is no subscription, no setup fee and no per-call charge: registering issues a key automatically, and you pay only for the orders you place. The price a catalogue endpoint returns for your account is the price charged to your balance — quantity × that price, nothing added at checkout.

How much money do I need to start?

There is no minimum order — a single code is a valid order. The only floor is the balance top-up: 3 USD minimum, 10,000 USD maximum per payment. Top-ups are USDT only, in the TRC-20, BEP-20, TON or Aptos networks, and an order is charged from that balance the moment it is created.

What happens if an order cannot be filled?

The charge comes back to your balance automatically. The order ends in the refund state and a matching CREDIT transaction named “Refund · order #12” appears in your history, so the order and the money stay auditable. The same happens when the price or the stock of an item changes before the order is executed: the charge is returned and fail_code says why (price_changed, stock_short, offer_gone). If an order ends as failed and the amount is still missing, open a ticket and support settles it.

What are the rate limits?

A new account gets 30 requests per minute and 5,000 per day. Every response carries the X-RateLimit-Limit-Minute, X-RateLimit-Remaining-Minute and the matching daily headers, so you can throttle from the response instead of guessing; going over returns 429 with Retry-After in seconds. Limits are per account and can be raised — ask support if your integration needs a bigger budget.

Where do I get the API key?

In the dashboard, section API. Signing up issues the key immediately — there is no application form and no approval step. It looks like rsc_live_ followed by 48 hex characters and travels in the Authorization: Bearer header. You can rotate it yourself on the Profile page; the previous key stops working the moment you do.

Create an account · Dashboard → API · Top up the balance

What can be ordered through the API?

Gift card codes, game keys, in-game top-ups by player ID, Steam wallet top-ups for CIS accounts, Steam Gifts, Telegram Stars and Premium, and manually-fulfilled services with an order chat. Each product type has its own catalogue endpoint and its own order endpoint, and every order type reports progress through GET /orders/{number}.

How are the codes delivered?

On the order itself. Poll GET /orders/{number}: when status becomes completed, gift card codes are in the codes array and game keys in the keys array. The same codes are visible on that order in the dashboard. Top-ups have no codes — they land straight in the player's account.

How do I reach support?

A ticket in the dashboard (fastest, and it keeps the history with the order) or Telegram @ReSellCodeSupport. The project has no email address, so nothing waits in a mailbox nobody reads.

Open a ticket · @ReSellCodeSupport

Overview

The API lets you programmatically access your own account. Authentication is a single API key you carry as a Bearer token. Every response is JSON; all monetary values are strings with four decimals in USD (for example "150.0000") so you never lose precision to floating point.

The surface covers a full reselling cycle: catalogues priced for your account, an order endpoint per product family, order status with the delivered codes, and your balance and transaction history. It keeps growing; existing fields will not be removed without a new version.

Base URL

https://resell.codes/api/v1

All endpoints below are relative to this base. Requests must use HTTPS.

Authentication

Find your API key in your dashboard under API. Send it in the Authorization header of every request:

Authorization: Bearer rsc_live_xxxxxxxxxxxxxxxxxxxx
The key reads your account and spends your balance — keep it server-side and never ship it in client code. A key is rsc_live_ plus 48 hex characters; if it leaks, rotate it yourself on the Profile page in the dashboard and the old one stops working immediately.

Requests without a valid key return 401 Unauthorized. A suspended account returns 403 Forbidden.

Rate limits

Each account has a per-minute and a per-day request limit. Every response includes your current budget in headers:

HeaderMeaning
X-RateLimit-Limit-MinuteRequests allowed per minute
X-RateLimit-Remaining-MinuteRemaining this minute
X-RateLimit-Limit-DayRequests allowed per day
X-RateLimit-Remaining-DayRemaining today

Exceeding a limit returns 429 Too Many Requests with a Retry-After header (seconds to wait). Back off until then.

Errors

Errors use standard HTTP status codes and a consistent JSON body:

{
  "error": {
    "type": "unauthorized",
    "message": "Invalid API key."
  }
}
StatustypeWhen
400invalid_requestA query parameter was invalid
401unauthorizedMissing or invalid API key
403forbiddenAccount suspended
404not_foundResource does not exist or isn't yours
429rate_limitedRate limit exceeded

Pagination

List endpoints are cursor-paginated and return the newest items first. Pass limit (1–100, default 20). The response includes has_more and next_cursor; to fetch the next page, send next_cursor back as the cursor parameter. When next_cursor is null, you've reached the end.

Get account

GET /me

Returns your account: balance, lifetime totals and rate limits.

Example

curl https://resell.codes/api/v1/me \
  -H "Authorization: Bearer rsc_live_xxxxxxxxxxxxxxxxxxxx"

Response

{
  "object": "account",
  "nickname": "reseller1",
  "email": "you@example.com",
  "status": "ACTIVE",
  "balance_usd": "150.0000",
  "total_orders": 12,
  "total_spent_usd": "1840.5000",
  "created_at": "2026-06-01T09:12:44.000Z"
}

List transactions

GET /transactions

Your balance transactions, newest first. You only ever see your own.

Query parameters

NameTypeDescription
limitintegeroptional1–100, default 20
cursorintegeroptionalA transaction number; returns items older than it
directionstringoptionalCREDIT or DEBIT
typestringoptionalDEPOSIT, ORDER or ADJUSTMENT
statusstringoptionalPENDING, COMPLETED or CANCELLED

Example

curl "https://resell.codes/api/v1/transactions?limit=2&direction=CREDIT" \
  -H "Authorization: Bearer rsc_live_xxxxxxxxxxxxxxxxxxxx"

Response

{
  "object": "list",
  "data": [
    {
      "object": "transaction",
      "number": 1024,
      "direction": "CREDIT",
      "type": "DEPOSIT",
      "status": "COMPLETED",
      "amount_usd": "50.0000",
      "balance_after": "150.0000",
      "note": "USDT · TRC-20",
      "created_at": "2026-07-25T19:03:14.530Z"
    },
    {
      "object": "transaction",
      "number": 1007,
      "direction": "CREDIT",
      "type": "DEPOSIT",
      "status": "COMPLETED",
      "amount_usd": "100.0000",
      "balance_after": "100.0000",
      "note": "USDT · TON",
      "created_at": "2026-07-20T11:41:02.100Z"
    }
  ],
  "limit": 2,
  "has_more": true,
  "next_cursor": 1007
}
Fetch the next page by passing cursor=1007.

Get a transaction

GET /transactions/{number}

Fetch a single transaction by its number. A number that isn't yours returns 404 — the API never reveals whether someone else's transaction exists.

Example

curl https://resell.codes/api/v1/transactions/1024 \
  -H "Authorization: Bearer rsc_live_xxxxxxxxxxxxxxxxxxxx"

Response

{
  "object": "transaction",
  "number": 1024,
  "direction": "CREDIT",
  "type": "DEPOSIT",
  "status": "COMPLETED",
  "amount_usd": "50.0000",
  "balance_after": "150.0000",
  "note": "USDT · TRC-20",
  "created_at": "2026-07-25T19:03:14.530Z"
}

Steam top-up rates

GET /steam-topup/rates

Current exchange rates for Steam wallet top-ups. Four currencies are supported: USD, RUB, UAH, KZT. The minimum top-up is 0.15 USD.

curl https://resell.codes/api/v1/steam-topup/rates \
  -H "Authorization: Bearer rsc_live_xxxxxxxxxxxxxxxxxxxx"
{
  "object": "steam_rates",
  "base": "USD",
  "rates": { "USD": 1, "RUB": 78.12, "UAH": 44.87, "KZT": 474.84 },
  "min_topup_usd": "0.15",
  "updated_at": "2026-07-25T20:38:10.220Z"
}

Check a Steam login

POST /steam-topup/check-login

Verify a Steam login can receive a wallet top-up before creating an order.

curl -X POST https://resell.codes/api/v1/steam-topup/check-login \
  -H "Authorization: Bearer rsc_live_xxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"steam_login":"ricardomoe3y"}'
{
  "object": "steam_login_check",
  "steam_login": "ricardomoe3y",
  "can_refill": true
}

Create a Steam top-up

POST /steam-topup/order

Places a Steam wallet top-up for a given login. Your balance is charged immediately (face value minus your discount); the top-up is then fulfilled asynchronously. If the top-up is rejected, the charge is refunded automatically. Each order type has its own creation endpoint.

Body

FieldTypeDescription
steam_loginstringrequiredThe Steam account login
currencystringrequiredUSD, RUB, UAH or KZT
amountstringrequiredAmount in that currency (USD ≤ 2 decimals)

Example

curl -X POST https://resell.codes/api/v1/steam-topup/order \
  -H "Authorization: Bearer rsc_live_xxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"steam_login":"ricardomoe3y","currency":"USD","amount":"10"}'

Response

{
  "object": "order",
  "number": 12,
  "type": "steam_topup",
  "status": "processing",
  "steam_login": "ricardomoe3y",
  "currency": "USD",
  "amount": "10",
  "amount_usd": "10.0000",
  "charged_usd": "9.7000",
  "status_reason": null,
  "fail_code": null,
  "created_at": "2026-07-25T21:00:00.000Z",
  "status_history": [
    { "status": "created", "reason": null, "at": "2026-07-25T21:00:00.000Z" },
    { "status": "processing", "reason": null, "at": "2026-07-25T21:00:01.000Z" }
  ]
}
Statuses: created → processing → completed. failed means it could not be delivered; refund means the charge was returned to your balance. Details and the fail_code list: Order statuses.

List orders

GET /orders

Your orders of every type, newest first. Same cursor pagination as transactions; optional status filter (CREATED, PROCESSING, COMPLETED, FAILED, REFUND) and optional type filter (GIFT_CARD, GAME_KEY, GAME_TOPUP, STEAM_TOPUP, STEAM_GIFT, TELEGRAM_STARS, TELEGRAM_PREMIUM, MANUAL_SERVICE).

curl "https://resell.codes/api/v1/orders?limit=20&status=COMPLETED" \
  -H "Authorization: Bearer rsc_live_xxxxxxxxxxxxxxxxxxxx"

Get an order

GET /orders/{number}

One of your orders by number, including full status history. A number that isn't yours returns 404.

curl https://resell.codes/api/v1/orders/12 \
  -H "Authorization: Bearer rsc_live_xxxxxxxxxxxxxxxxxxxx"

Order statuses

Every order type — codes, keys, top-ups, Steam, Telegram, manual services — moves through the same states, reported by GET /orders/{number} and in the status_history array. Branch on status and fail_code; status_reason is free text for humans.

statusMeaningWhat to do
createdAccepted and charged; being sent for execution.Poll.
processingAccepted and being executed. Nothing to do on your side — it ends as completed or, if it cannot be delivered, as failed / refund.Poll. Most orders finish within minutes; a longer interval is fine if it takes longer.
completedDelivered. Gift card codes are in codes, game keys in keys; top-ups land in the player's account.Done.
failedCould not be delivered.Read fail_code. If the charge has not come back, open a ticket.
refundThe charge was returned to your balance as a CREDIT transaction “Refund · order #N”.Read fail_code; the money is spendable again immediately.

fail_code values

fail_code is present only when status is failed or refund; status_reason carries the same reason as a sentence. Every code below comes with the refund.

fail_codeMeaningWhat to do
out_of_stockThe item ran out before the order could be filled.Order again later.
stock_shortFewer in stock than ordered.Order the available quantity — check the catalogue for the current stock.
price_changedThe price changed before the order was executed.Re-read the catalogue price and order again.
offer_goneThe item is no longer available.Pick another item.
account_problemThe login, username, player id or recipient was rejected or not found.Check the account details and order again.
region_restrictedThe target account or region is not eligible.—
limit_exceededA quantity or frequency limit was hit.Retry later or with a smaller quantity.
timed_outExecution did not finish in time.Order again.
cancelledThe order was cancelled before execution.Order again if still needed.
declinedAny other rejection.Order again; if it repeats, open a ticket.
{
  "object": "order",
  "number": 12,
  "type": "gift_card",
  "status": "refund",
  "charged_usd": "5.6200",
  "status_reason": "The price changed — please order again.",
  "fail_code": "price_changed",
  "created_at": "2026-09-19T10:02:10.000Z",
  "codes": []
}

Trimmed response of a refunded order. The matching CREDIT transaction is already on the balance.

A refund always comes with the money: the matching CREDIT transaction is in /transactions under the order number. Nothing to claim, nothing to wait for.

Buy Telegram Stars

POST /telegram/stars/buy

Send Stars to a Telegram username. Your balance is charged immediately; delivery is asynchronous. Quantity 50–10000. Live pricing: GET /telegram/stars.

Body

FieldTypeDescription
telegram_usernamestringrequiredRecipient (with or without @)
quantityintegerrequired50–10000 stars
curl -X POST https://resell.codes/api/v1/telegram/stars/buy \
  -H "Authorization: Bearer rsc_live_xxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"telegram_username":"durov","quantity":50}'
{
  "object": "order",
  "number": 42,
  "type": "telegram_stars",
  "status": "processing",
  "telegram_username": "durov",
  "stars": 50,
  "charged_usd": "0.7631",
  "status_reason": null,
  "created_at": "2026-07-26T22:40:00.000Z",
  "status_history": [ ... ]
}

Buy Telegram Premium

POST /telegram/premium/buy

Gift Telegram Premium to a username. Charged immediately. Plans: 3, 6 or 12 months. Live pricing: GET /telegram/premium.

Body

FieldTypeDescription
telegram_usernamestringrequiredRecipient (with or without @)
monthsintegerrequired3, 6 or 12
curl -X POST https://resell.codes/api/v1/telegram/premium/buy \
  -H "Authorization: Bearer rsc_live_xxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"telegram_username":"durov","months":3}'

Manual services — list & offers

Manually-fulfilled services. Some (e.g. Roblox Robux via login) require buyer input (account credentials) and have an order chat; others (loaded accounts) are simple transfers. Prices from the offers endpoint already include your markup.

GET /manual-services
curl https://resell.codes/api/v1/manual-services \
  -H "Authorization: Bearer rsc_live_xxxxxxxxxxxxxxxxxxxx"
{
  "object": "list",
  "data": [
    { "id": "roblox", "name": "Roblox (Robux via login)", "kind": "replenishment", "chat": true, "info": "...", "image": "..." },
    { "id": "xbox_loaded_accounts_us", "name": "Xbox Loaded Accounts (US)", "kind": "transfer", "chat": false, "info": "...", "image": "..." }
  ]
}
GET /manual-services/{id}/offers

Returns the offers and the fields the buyer must provide when ordering.

{
  "object": "manual_offers",
  "service_id": "roblox",
  "kind": "replenishment",
  "chat": true,
  "fields": [ { "code": "username", "name": "Username" }, { "code": "password", "name": "Password" } ],
  "offers": [ { "id": "62148018", "name": "80 Robux", "price_usd": "0.9741", "delivery_minutes": 180, "note": null } ]
}

Create a manual-service order

POST /manual-services/order

Charges your balance immediately. fields must contain every field code from the offers response.

curl -X POST https://resell.codes/api/v1/manual-services/order \
  -H "Authorization: Bearer rsc_live_xxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"service_id":"roblox","product_id":"62148018","fields":{"username":"myacct","password":"secret"}}'
The order runs through the same lifecycle as other orders (created → processing → completed/failed/refund). Track it via GET /orders/{number}.

Order chat

Manual services with chat: true have an order chat — the executor may ask for a code or confirmation. Text and image attachments are supported.

GET /orders/{number}/chat
curl https://resell.codes/api/v1/orders/42/chat \
  -H "Authorization: Bearer rsc_live_xxxxxxxxxxxxxxxxxxxx"
{ "object": "chat", "order": 1234, "can_send": true, "messages": [ { "id": "m1", "from": "executor", "text": "…", "at": "2026-10-10T12:00:00.000Z" } ] }
POST /orders/{number}/chat

Send a message — multipart/form-data with body (text) and/or image (file).

curl -X POST https://resell.codes/api/v1/orders/42/chat \
  -H "Authorization: Bearer rsc_live_xxxxxxxxxxxxxxxxxxxx" \
  -F "body=Here is the code: 123456" \
  -F "image=@screenshot.png"

Steam Gifts — games & offers

Gift a Steam game or edition to a friend. The catalog is huge (~173k games); the games list returns the top games (cached ~10 min), and per-game offers/prices are fetched on demand (cached ~30 min).

GET /steam-gifts/games?limit=100
{ "object": "list", "data": [ { "app_id": 730, "name": "Counter-Strike 2" }, { "app_id": 570, "name": "Dota 2" } ] }
GET /steam-gifts/games/{appid}

Offers (editions) with per-region prices — prices already include your markup.

{
  "object": "steam_gift_offers",
  "app_id": 730,
  "offers": [
    {
      "sub_id": 54029,
      "name": "Prime Status Upgrade",
      "regions": [
        { "region": "RU", "price_usd": "14.4467" },
        { "region": "UA", "price_usd": "14.3357" }
      ]
    }
  ]
}

Order a Steam gift

POST /steam-gifts/order

Charges your balance immediately. The gift is delivered to the Steam friend invite URL you provide.

FieldTypeDescription
app_idintegerrequiredSteam app id
sub_idintegerrequiredThe offer/edition
regionstringrequiredRegion from the offer (e.g. RU, UA, KZ, CIS)
invite_urlstringrequiredSteam friend invite link
app_namestringoptionalFor display in your order history
curl -X POST https://resell.codes/api/v1/steam-gifts/order \
  -H "Authorization: Bearer rsc_live_xxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"app_id":730,"sub_id":54029,"region":"RU","invite_url":"https://s.team/p/xxxxx","app_name":"Counter-Strike 2"}'

Gift cards — categories & cards

Buy gift-card codes. Prices already include your markup. Order 1–100 at once; codes are delivered on the order once it completes.

GET /gift-cards/categories?q=
{ "object": "list", "total": 1, "data": [ { "category_id": "roblox_ru", "name": "Roblox (RU)", "image": "/api/media/..." } ] }
GET /gift-cards/categories/{id}/cards
{
  "object": "gift_card_offers",
  "category_id": "roblox_ru",
  "name": "Roblox (RU)",
  "offers": [
    { "card_id": "199_robux", "name": "199 Robux", "price_usd": "2.5750", "stock": 689, "min_quantity": 1, "max_quantity": 100 }
  ]
}

Gift cards — brands

The flat catalogue categories grouped into brands with per-region subcategories (e.g. App Store & iTunes → CA, AT, …). Handy for building a storefront. Use the category_id of a subcategory with the endpoints above.

GET /gift-cards/brands?q=
{
  "object": "list",
  "total": 1,
  "data": [
    { "brand": "App Store & iTunes", "subcategories": [
      { "category_id": "appstore_ca", "region": "CA", "image": "/api/media/..." },
      { "category_id": "appstore_at", "region": "AT", "image": "/api/media/..." }
    ] }
  ]
}

Buy gift-card codes

POST /gift-cards/order

Charges your balance immediately. Poll GET /orders/{number} — once status is completed, the codes array is populated.

curl -X POST https://resell.codes/api/v1/gift-cards/order \
  -H "Authorization: Bearer rsc_live_xxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"category_id":"roblox_ru","card_id":"199_robux","quantity":2}'
{
  "object": "order",
  "number": 12,
  "type": "gift_card",
  "status": "completed",
  "category_name": "Roblox (RU)",
  "card_name": "199 Robux",
  "quantity": 2,
  "charged_usd": "5.1500",
  "codes": ["RBXXXXXXXXXXXXXX", "RBYYYYYYYYYYYYYY"]
}

Game keys — games & offers

Buy game key codes (Steam, Xbox, EA, Rockstar). Prices already include your markup. Order 1–100 at once; keys are delivered on the order once it completes.

GET /game-keys?q=&region=&platform=
{
  "object": "list",
  "total": 1,
  "data": [
    {
      "game_id": "7_days_to_die_global",
      "name": "7 Days to Die",
      "region": "GLOBAL",
      "platform": "Steam",
      "region_restriction": false,
      "image": "https://cdn.cloudflare.steamstatic.com/steam/apps/251570/header.jpg"
    }
  ]
}
GET /game-keys/{game_id}/keys
{
  "object": "game_key_offers",
  "game_id": "7_days_to_die_global",
  "name": "7 Days to Die",
  "region": "GLOBAL",
  "platform": "Steam",
  "region_restriction": false,
  "keys": [
    { "key_id": "7_days_to_die", "name": "7 Days to Die", "price_usd": "17.2971", "stock": 1, "min_quantity": 1, "max_quantity": 1 }
  ]
}

Game keys — region restriction

When a game has region_restriction: true, check which countries can activate the key before selling it.

GET /game-keys/{game_id}/region-restriction
{
  "object": "region_restriction",
  "game_id": "ace_attorney_investigations_collection_cis",
  "region": "CIS",
  "has_availability": true,
  "available": [ { "code": "AM", "name": "Armenia" }, { "code": "BY", "name": "Belarus" } ],
  "unavailable": [ { "code": "US", "name": "United States" } ]
}

Buy game keys

POST /game-keys/order

Charges your balance immediately. Poll GET /orders/{number} — once status is completed, the keys array is populated.

curl -X POST https://resell.codes/api/v1/game-keys/order \
  -H "Authorization: Bearer rsc_live_xxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"game_id":"7_days_to_die_global","key_id":"7_days_to_die","quantity":1}'
{
  "object": "order",
  "number": 15,
  "type": "game_key",
  "status": "completed",
  "game_name": "7 Days to Die",
  "key_name": "7 Days to Die",
  "quantity": 1,
  "region": "GLOBAL",
  "platform": "Steam",
  "charged_usd": "17.2971",
  "keys": ["XXXXX-YYYYY-ZZZZZ"]
}

Game top-ups — categories & offers

In-game top-ups (UC, diamonds, robux, …) delivered straight to the player's account. Prices already include your markup. One top-up per order.

GET /top-ups/categories?q=
{ "object": "list", "total": 1, "data": [ { "category_id": "pubg_mobile_auto", "name": "PUBG Mobile (Auto)", "note": "Region: Global…", "image": "/api/media/..." } ] }
GET /top-ups/categories/{id}/offers

Each category declares the buyer inputs (fields) you must collect and send with the order.

{
  "object": "top_up_offers",
  "category_id": "pubg_mobile_auto",
  "name": "PUBG Mobile (Auto)",
  "fields": [ { "key": "player_id", "label": "Player ID", "type": "text" } ],
  "offers": [
    { "offer_id": "60_uc", "name": "60 UC", "price_usd": "0.9161" },
    { "offer_id": "325_uc", "name": "325 UC", "price_usd": "4.5835" }
  ]
}
GET /top-ups/brands?q=

Categories grouped into brands with per-region subcategories (region defaults to GLOBAL when unspecified). Delivery-mode suffixes like "(Auto)" become the subcategory's variant — one brand, many modes.

{
  "object": "list",
  "total": 1,
  "data": [
    { "brand": "PUBG Mobile", "subcategories": [
      { "category_id": "pubg_mobile_auto", "name": "PUBG Mobile (Auto)", "region": "GLOBAL", "variant": "Auto", "image": "/api/media/..." },
      { "category_id": "pubg_mobile_fast", "name": "PUBG Mobile (Fast)", "region": "GLOBAL", "variant": "Fast", "image": "/api/media/..." }
    ] }
  ]
}

Buy a game top-up

POST /top-ups/order

Charges your balance immediately. fields keys must match the category's fields[].key. Poll GET /orders/{number} until completed — delivery goes straight to the player's account, there are no codes.

curl -X POST https://resell.codes/api/v1/top-ups/order \
  -H "Authorization: Bearer rsc_live_xxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"category_id":"pubg_mobile_auto","offer_id":"60_uc","fields":{"player_id":"5123456789"}}'
{
  "object": "order",
  "number": 16,
  "type": "game_topup",
  "status": "processing",
  "category_name": "PUBG Mobile (Auto)",
  "offer_name": "60 UC",
  "fields": { "player_id": "5123456789" },
  "charged_usd": "0.9161"
}