API reference

Read the catalogue, check your balance and buy gift cards or game top-ups from your own code. JSON in, JSON out — and the codes come back in the same response.

Get your API key → Base URL https://lvlkey.com/api/v1
Free with any accountREST · JSON120 req/minPaid from USDT balance

Quick start

Three steps from zero to a delivered code.

1Create a keyOn your API page. It is shown once — store it as an environment variable.
2Top up your balanceSend USDT (TRC20 or BEP20) to your personal deposit address. Orders spend this balance.
3OrderPick a category, pick a denomination, POST it. The response carries the code.
Everything is priced in USDT and every price you read from the API is the price you are charged — the server re-checks it when the order is placed.
# 1 — check the key works
curl https://lvlkey.com/api/v1/me -H "X-API-Key: $LVLKEY_KEY"

# 2 — see what you can spend
curl https://lvlkey.com/api/v1/balance -H "X-API-Key: $LVLKEY_KEY"

# 3 — buy a 5 USD Steam card
curl -X POST https://lvlkey.com/api/v1/orders \
  -H "X-API-Key: $LVLKEY_KEY" -H "Content-Type: application/json" \
  -d '{"items":[{"category_id":"steam_wallet_us","card_id":"5_usd","quantity":1}]}'

Authentication

Send your key in an X-API-Key header. Authorization: Bearer <key> works too, if that fits your HTTP client better.

Keys look like lk_…, belong to one account, and can spend that account’s balance — treat them like a password. Only a hash is stored on our side, so a lost key cannot be recovered: revoke it and create another.

X-API-Key: lk_27a418add87e6a8f837c0e8f677…
Response 401
{
  "ok": false,
  "error": "invalid or missing API key — send it as \"X-API-Key: lk_…\""
}

Rate limits

120 requests per minute per key, on a rolling window. Over the limit you get 429 and a Retry-After header with the seconds left.

Each account can hold up to five active keys — use one per bot or environment so you can revoke a single one without breaking the rest.

Response 429
{
  "ok": false,
  "error": "rate limit exceeded — 120 requests per minute"
}

Errors

Every response carries ok. When it is false you also get a human-readable error — safe to log, safe to show to your own users.

Failures never charge the balance. An order either completes and is charged, or it does neither.

200 / 201Success. 201 when an order was created.
400Bad input — a missing field, a bad quantity, an unknown offer.
401Missing, malformed or revoked API key.
402Insufficient balance. Nothing was charged, nothing was ordered.
404Unknown endpoint, category or order.
409Stock or quantity conflict — the offer moved while you were ordering.
429Rate limit hit. Wait for the seconds in Retry-After.
502Upstream supplier unavailable. Safe to retry.
Account

Who am I

GET/me

Confirms the key works and tells you which account it belongs to. The cheapest way to test your setup.

curl https://lvlkey.com/api/v1/me \
  -H "X-API-Key: $LVLKEY_KEY"
const res = await fetch('https://lvlkey.com/api/v1/me', {
  headers: { 'X-API-Key': process.env.LVLKEY_KEY }
});
const data = await res.json();
import os, requests

r = requests.get('https://lvlkey.com/api/v1/me',
    headers={'X-API-Key': os.environ['LVLKEY_KEY']})
data = r.json()
Response 200
{
  "ok": true,
  "user": {
    "email": "[email protected]",
    "name": "Your name"
  }
}

Wallet balance

GET/balance

Your spendable USDT. Every order is charged against this balance, so check it before a batch of orders.

curl https://lvlkey.com/api/v1/balance \
  -H "X-API-Key: $LVLKEY_KEY"
const res = await fetch('https://lvlkey.com/api/v1/balance', {
  headers: { 'X-API-Key': process.env.LVLKEY_KEY }
});
const data = await res.json();
import os, requests

r = requests.get('https://lvlkey.com/api/v1/balance',
    headers={'X-API-Key': os.environ['LVLKEY_KEY']})
data = r.json()
Response 200
{
  "ok": true,
  "balance": "124.50",
  "currency": "USDT"
}
Gift cards

List gift-card categories

GET/giftcards

Every brand and region we sell, each with the category_id you use everywhere else. Around 575 categories.

curl https://lvlkey.com/api/v1/giftcards \
  -H "X-API-Key: $LVLKEY_KEY"
const res = await fetch('https://lvlkey.com/api/v1/giftcards', {
  headers: { 'X-API-Key': process.env.LVLKEY_KEY }
});
const data = await res.json();
import os, requests

r = requests.get('https://lvlkey.com/api/v1/giftcards',
    headers={'X-API-Key': os.environ['LVLKEY_KEY']})
data = r.json()
Response 200
{
  "ok": true,
  "total": 575,
  "items": [
    {
      "category_id": "steam_wallet_us",
      "name": "Steam Wallet (US)",
      "imageurl": "https://…/steam.webp"
    }
  ]
}

Denominations & live prices

GET/giftcards/{category_id}

Face values for one category with the price you pay in USDT and current stock. Prices already include our markup — what you see is what is charged.

FieldType
card_idstringPass this back when you order.
pricestringYour price in USDT.
stockintegerCodes available right now.
min_qty / max_qtyintegerAllowed quantity range per order.
curl https://lvlkey.com/api/v1/giftcards/{category_id} \
  -H "X-API-Key: $LVLKEY_KEY"
const res = await fetch('https://lvlkey.com/api/v1/giftcards/{category_id}', {
  headers: { 'X-API-Key': process.env.LVLKEY_KEY }
});
const data = await res.json();
import os, requests

r = requests.get('https://lvlkey.com/api/v1/giftcards/{category_id}',
    headers={'X-API-Key': os.environ['LVLKEY_KEY']})
data = r.json()
Response 200
{
  "ok": true,
  "category_id": "steam_wallet_us",
  "name": "Steam Wallet (US)",
  "offers": [
    {
      "card_id": "5_usd",
      "name": "5 USD",
      "price": "5.46",
      "stock": 42,
      "min_qty": 1,
      "max_qty": 10
    }
  ]
}
Game top-ups

List top-up categories

GET/topups

Games and apps that are credited straight to a player account — no code to redeem. 311 categories across 218 titles.

curl https://lvlkey.com/api/v1/topups \
  -H "X-API-Key: $LVLKEY_KEY"
const res = await fetch('https://lvlkey.com/api/v1/topups', {
  headers: { 'X-API-Key': process.env.LVLKEY_KEY }
});
const data = await res.json();
import os, requests

r = requests.get('https://lvlkey.com/api/v1/topups',
    headers={'X-API-Key': os.environ['LVLKEY_KEY']})
data = r.json()
Response 200
{
  "ok": true,
  "total": 311,
  "items": [
    {
      "category_id": "pubg_mobile_auto",
      "name": "PUBG Mobile (Auto)",
      "imageurl": "https://…/pubg.webp"
    }
  ]
}

Packs & required fields

GET/topups/{category_id}

Returns the packs and a fields array describing exactly what the buyer must supply — a player ID, a server, a zone. Send those keys back in fields when you order.

FieldType
offer_idstringPass this back when you order.
fields[].keystringThe key to use in your order payload.
fields[].typestringtext or select (then options lists the allowed values).
curl https://lvlkey.com/api/v1/topups/{category_id} \
  -H "X-API-Key: $LVLKEY_KEY"
const res = await fetch('https://lvlkey.com/api/v1/topups/{category_id}', {
  headers: { 'X-API-Key': process.env.LVLKEY_KEY }
});
const data = await res.json();
import os, requests

r = requests.get('https://lvlkey.com/api/v1/topups/{category_id}',
    headers={'X-API-Key': os.environ['LVLKEY_KEY']})
data = r.json()
Response 200
{
  "ok": true,
  "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": "0.97" }
  ]
}
Orders

Buy a gift card

POST/orders

Charges your balance and delivers immediately. The response already contains the codes when delivery succeeded — no polling needed in the normal case.

FieldType
itemsarrayOne to twenty lines. required
items[].category_idstringFrom the catalogue. required
items[].card_idstringThe denomination. required
items[].quantityinteger1–100, within the offer’s limits. required
emailstringWhere the receipt goes. Defaults to your account e-mail.
curl -X POST https://lvlkey.com/api/v1/orders \
  -H "X-API-Key: $LVLKEY_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "category_id": "steam_wallet_us",
        "card_id": "5_usd",
        "quantity": 1
      }
    ]
  }'
const res = await fetch('https://lvlkey.com/api/v1/orders', {
  method: 'POST',
  headers: {
    'X-API-Key': process.env.LVLKEY_KEY,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
  "items": [
    {
      "category_id": "steam_wallet_us",
      "card_id": "5_usd",
      "quantity": 1
    }
  ]
})
});
const data = await res.json();
import os, requests

r = requests.post('https://lvlkey.com/api/v1/orders',
    headers={'X-API-Key': os.environ['LVLKEY_KEY']},
    json={
  "items": [
    {
      "category_id": "steam_wallet_us",
      "card_id": "5_usd",
      "quantity": 1
    }
  ]
})
data = r.json()
Response 201
{
  "ok": true,
  "order": {
    "token": "3c75dee6eda2252bbb1b2ccb8aef06f6",
    "status": "delivered",
    "total": "5.46",
    "created_at": "2026-08-06T12:08:14+00:00",
    "delivered_at": "2026-08-06T12:08:20+00:00",
    "lines": [
      {
        "kind": "giftcard",
        "category_name": "Steam Wallet (US)",
        "offer_name": "5 USD",
        "qty": 1,
        "unit_price": "5.46",
        "codes": ["XXXXX-XXXXX-XXXXX"]
      }
    ]
  }
}

Buy a game top-up

POST/orders

Same endpoint, with kind: "topup" and the account details from the category’s fields. A top-up cannot be reversed once sent — validate the ID in your own flow first.

FieldType
items[].kindstringSet to topup. required
items[].offer_idstringThe pack. required
items[].fieldsobjectKeys exactly as returned by the category. required
curl -X POST https://lvlkey.com/api/v1/orders \
  -H "X-API-Key: $LVLKEY_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "kind": "topup",
        "category_id": "pubg_mobile_auto",
        "offer_id": "60_uc",
        "quantity": 1,
        "fields": { "player_id": "5123456789" }
      }
    ]
  }'
const res = await fetch('https://lvlkey.com/api/v1/orders', {
  method: 'POST',
  headers: {
    'X-API-Key': process.env.LVLKEY_KEY,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
  "items": [
    {
      "kind": "topup",
      "category_id": "pubg_mobile_auto",
      "offer_id": "60_uc",
      "quantity": 1,
      "fields": { "player_id": "5123456789" }
    }
  ]
})
});
const data = await res.json();
import os, requests

r = requests.post('https://lvlkey.com/api/v1/orders',
    headers={'X-API-Key': os.environ['LVLKEY_KEY']},
    json={
  "items": [
    {
      "kind": "topup",
      "category_id": "pubg_mobile_auto",
      "offer_id": "60_uc",
      "quantity": 1,
      "fields": { "player_id": "5123456789" }
    }
  ]
})
data = r.json()
Response 201
{
  "ok": true,
  "order": {
    "token": "9be1…",
    "status": "delivered",
    "total": "0.97",
    "lines": [
      {
        "kind": "topup",
        "category_name": "PUBG Mobile (Auto)",
        "offer_name": "60 UC",
        "qty": 1,
        "unit_price": "0.97",
        "target": "Player Id: 5123456789",
        "codes": ["Player Id: 5123456789", "Reference: ord-528113"]
      }
    ]
  }
}

List your orders

GET/orders

The 50 most recent orders placed by this account — from the API or from the website.

curl https://lvlkey.com/api/v1/orders \
  -H "X-API-Key: $LVLKEY_KEY"
const res = await fetch('https://lvlkey.com/api/v1/orders', {
  headers: { 'X-API-Key': process.env.LVLKEY_KEY }
});
const data = await res.json();
import os, requests

r = requests.get('https://lvlkey.com/api/v1/orders',
    headers={'X-API-Key': os.environ['LVLKEY_KEY']})
data = r.json()
Response 200
{
  "ok": true,
  "orders": [
    {
      "token": "3c75dee6…",
      "total": "5.46",
      "status": "delivered",
      "created_at": "2026-08-06T12:08:14+00:00",
      "delivered_at": "2026-08-06T12:08:20+00:00"
    }
  ]
}

Fetch one order

GET/orders/{token}

Use it to re-read codes or to follow an order that is still paid — reading it also nudges an interrupted delivery to finish.

FieldType
statusstringpaid · delivered · partial · action_required
lines[].codesarrayThe codes, or the top-up receipt. null until delivered.
curl https://lvlkey.com/api/v1/orders/{token} \
  -H "X-API-Key: $LVLKEY_KEY"
const res = await fetch('https://lvlkey.com/api/v1/orders/{token}', {
  headers: { 'X-API-Key': process.env.LVLKEY_KEY }
});
const data = await res.json();
import os, requests

r = requests.get('https://lvlkey.com/api/v1/orders/{token}',
    headers={'X-API-Key': os.environ['LVLKEY_KEY']})
data = r.json()
Response 200
{
  "ok": true,
  "order": {
    "token": "3c75dee6…",
    "status": "delivered",
    "total": "5.46",
    "email": "[email protected]",
    "fail_note": null,
    "lines": [ … ]
  }
}

Ready to build?

Create a key in your account — it takes one click.

Get your API key →