Quick start
Three steps from zero to a delivered code.
# 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…{
"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.
{
"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 / 201 | Success. 201 when an order was created. |
| 400 | Bad input — a missing field, a bad quantity, an unknown offer. |
| 401 | Missing, malformed or revoked API key. |
| 402 | Insufficient balance. Nothing was charged, nothing was ordered. |
| 404 | Unknown endpoint, category or order. |
| 409 | Stock or quantity conflict — the offer moved while you were ordering. |
| 429 | Rate limit hit. Wait for the seconds in Retry-After. |
| 502 | Upstream supplier unavailable. Safe to retry. |
Who am I
/meConfirms 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(){
"ok": true,
"user": {
"email": "[email protected]",
"name": "Your name"
}
}Wallet balance
/balanceYour 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(){
"ok": true,
"balance": "124.50",
"currency": "USDT"
}List gift-card categories
/giftcardsEvery 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(){
"ok": true,
"total": 575,
"items": [
{
"category_id": "steam_wallet_us",
"name": "Steam Wallet (US)",
"imageurl": "https://…/steam.webp"
}
]
}Denominations & live prices
/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.
| Field | Type | |
|---|---|---|
card_id | string | Pass this back when you order. |
price | string | Your price in USDT. |
stock | integer | Codes available right now. |
min_qty / max_qty | integer | Allowed 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(){
"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
}
]
}List top-up categories
/topupsGames 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(){
"ok": true,
"total": 311,
"items": [
{
"category_id": "pubg_mobile_auto",
"name": "PUBG Mobile (Auto)",
"imageurl": "https://…/pubg.webp"
}
]
}Packs & required fields
/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.
| Field | Type | |
|---|---|---|
offer_id | string | Pass this back when you order. |
fields[].key | string | The key to use in your order payload. |
fields[].type | string | text 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(){
"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" }
]
}Buy a gift card
/ordersCharges your balance and delivers immediately. The response already contains the codes when delivery succeeded — no polling needed in the normal case.
| Field | Type | |
|---|---|---|
items | array | One to twenty lines. required |
items[].category_id | string | From the catalogue. required |
items[].card_id | string | The denomination. required |
items[].quantity | integer | 1–100, within the offer’s limits. required |
email | string | Where 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(){
"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
/ordersSame 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.
| Field | Type | |
|---|---|---|
items[].kind | string | Set to topup. required |
items[].offer_id | string | The pack. required |
items[].fields | object | Keys 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(){
"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
/ordersThe 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(){
"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
/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.
| Field | Type | |
|---|---|---|
status | string | paid · delivered · partial · action_required |
lines[].codes | array | The 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(){
"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 →