API Documentation
20+ endpoints, ready-made SDKs in 8 languages, OpenAPI 3.0 spec.
Quick start
-
Create a key
«Overview» tab → Create key
-
Save the token
The full skz_... is shown only once
-
Make requests
Bearer token in the Authorization header
curl https://skyziro.shop/api/v1/account \
-H "Authorization: Bearer skz_..."
const r = await fetch("https://skyziro.shop/api/v1/account", {
headers: { Authorization: "Bearer skz_..." }
});
const { data } = await r.json();
console.log(data.balance, data.available_balance);
import requests
r = requests.get("https://skyziro.shop/api/v1/account",
headers={"Authorization": "Bearer skz_..."})
print(r.json()["data"])
$r = file_get_contents("https://skyziro.shop/api/v1/account", false, stream_context_create([
"http" => ["header" => "Authorization: Bearer skz_..."]
]));
$data = json_decode($r, true)["data"];
SDK in any language
Generate a client from the OpenAPI spec
- Base URL
https://skyziro.shop/api/v1- Authorization
Authorization: Bearer skz_…- Endpoints
- 37
npx @openapitools/openapi-generator-cli \
generate \
-i https://skyziro.shop/api/v1/openapi.json \
-g python -o ./skyziro-sdk
Endpoints by group
Account info
Returns the user profile, balance split into available and reserved funds, plus metadata about the current token.
200 — success response
{
"status": "SUCCESS",
"data": {
"id": 1,
"username": "shop",
"balance": 1000.00,
"reserve": 60.00,
"available_balance": 1000.00,
"currency": "USD",
"token": { "name": "Bot", "abilities": ["*"] }
}
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Token is missing required scope: dashboard:read"
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
Request
Transaction history
All balance movements for the user: top-ups (credit), charges (debit), refunds. Supports filtering and pagination.
Query parameters
type
string
credit | debit (filter)
page
int
default 1
limit
int
default 25, max 100
200 — success response
{
"status": "SUCCESS",
"data": {
"items": [
{ "id": 38, "type": "credit", "amount": 100.00,
"balance_before": 0, "balance_after": 100.00,
"description": "Пополнение TOP-...", "created_at": "..." }
],
"page": 1, "limit": 25, "total": 1, "totalPages": 1
}
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Token is missing required scope: transactions:read"
}
{
"status": "ERROR",
"statusCode": 4,
"statusMessage": "Validation error",
"errors": [
{ "field": "<field>", "message": "<description>" }
]
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
Request
Product list
All available products: keys, accounts, top-ups. Supports search, filter by category/country/price/stock and sorting.
Query parameters
search
string
name search
category
string
category slug
country
string
country code (us, ru, eu)
min_price
number
minimum price
max_price
number
maximum price
in_stock
bool
in-stock only
sort
string
name | price_asc | price_desc | popular
page
int
limit
int
max 100
200 — success response
{
"status": "SUCCESS",
"data": {
"items": [
{ "id": "ab12-...", "source": "shop",
"name": "Forza Horizon 6", "category": "games",
"platform": "Steam", "country": "CIS",
"activation_countries": ["RU","BY","KZ","UA"],
"image_url": "...",
"price_from": 49.69, "in_stock": 19, "items_count": 4 }
],
"page": 1, "limit": 50, "total": 1, "totalPages": 1
}
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Token is missing required scope: catalog:read"
}
{
"status": "ERROR",
"statusCode": 4,
"statusMessage": "Validation error",
"errors": [
{ "field": "<field>", "message": "<description>" }
]
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
Request
Category list
All catalog categories — slug and human-readable name. Useful for building navigation and filters on the client side.
200 — success response
{
"status": "SUCCESS",
"data": {
"items": [
{ "slug": "games", "label": "Игры" },
{ "slug": "giftcards", "label": "Gift Cards" },
{ "slug": "subscriptions", "label": "Подписки" }
]
}
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Token is missing required scope: catalog:read"
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
Request
Category products
Shortcut for /catalog?category={slug}. Returns only products in the given category. Accepts the same query parameters as /catalog.
Path parameters
slug
string
slug from /catalog/categories
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Token is missing required scope: catalog:read"
}
{
"status": "ERROR",
"statusCode": 4,
"statusMessage": "Validation error",
"errors": [
{ "field": "<field>", "message": "<description>" }
]
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
Request
Product details
Full product info: description, variants (items) with prices and stock, DTU account fields if required.
Path parameters
id
string
id from /catalog (format: ab12-... or cp_N)
200 — success response
{
"status": "SUCCESS",
"data": {
"id": "ab12-...", "source": "shop",
"name": "Forza Horizon 6", "category": "games",
"fields": [],
"items": [
{ "id": "var1", "name": "Standard Edition", "price": 49.69, "in_stock": 19 },
{ "id": "var2", "name": "Premium Edition", "price": 87.41, "in_stock": 5 }
]
}
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Token is missing required scope: catalog:read"
}
{
"status": "ERROR",
"statusCode": 3,
"statusMessage": "Not Found"
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
Request
Order list
User order history with pagination. Filterable by status (pending, processing, completed, failed).
Query parameters
status
string
pending | processing | completed | failed | refunded
page
int
limit
int
max 100
reference_id
string
your referenceId / external_id from POST /orders, or the transaction ID from the dashboard — find an order after a timeout
transaction_id
string
transaction ID shown in the dashboard
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Token is missing required scope: orders:read"
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
Request
Order details
Full info about a specific order including delivery keys (if status is completed).
Path parameters
uid
string
ORD-XXXXXX
200 — success response
{
"status": "SUCCESS",
"data": {
"uid": "ORD-K2M3WF", "product_name": "Forza Horizon 6 — Premium",
"category": "games", "quantity": 1,
"price": 87.41, "total": 87.41, "status": "completed",
"delivery": [ { "code": "PPH49-J2C9G-..." } ],
"created_at": "2026-05-20T18:32:47+00:00"
}
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Token is missing required scope: orders:read"
}
{
"status": "ERROR",
"statusCode": 3,
"statusMessage": "Not Found"
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
Request
Create order (purchase / DTU top-up)
Universal order-creation endpoint. If an item has fields, it's a DTU (direct top-up): direct game-account recharge by login/UID with no key issued (Steam, Mobile Legends, Free Fire, Telegram Stars, etc). If fields are empty — a regular key/voucher purchase. Funds are charged atomically with lockForUpdate; Idempotency-Key and referenceId are supported to prevent double charges.
Additional headers
Idempotency-Key
string
опционально (8-128 симв). Повтор с тем же ключом и тем же body — вернёт кэшированный ответ + header Idempotent-Replay: true. Тот же ключ + другое body — 409 Conflict. Кэш живёт 24 часа.
referenceId (body)
string
your request ID (alias: external_id; if omitted, the Idempotency-Key is used). After a timeout repeat the SAME request with the same referenceId: no second order is created — you get the orders of the first request with duplicate: true, and while the first is still running a 409 in_progress with Retry-After. Until the first request finishes, GET /orders?reference_id=… may return an empty list — that does not mean the order does not exist. If the first order failed, use a new referenceId for a new attempt.
Content-Type
application/json
required for JSON body
Request body (JSON)
{
"referenceId": "my-order-001",
"checkOnly": false,
"items": [
{
"item_id": "<DENOMINATION_ID>",
"quantity": 1,
"fields": [
{ "key": "account_number", "value": "<ACCOUNT>" },
{ "key": "amount", "value": "100" }
]
}
]
}
200 — success response
{
"status": "SUCCESS",
"statusCode": 0,
"statusMessage": "OK",
"data": {
"orders": [
{
"uid": "ORD-A7K3PMX9",
"product_name": "Mobile Legends — Diamonds",
"quantity": 1,
"price": 1.50,
"total": 1.50,
"status": "completed",
"delivery": [{ "dtu": true }],
"reference_id": "my-order-001",
"transaction_id": "my-order-001",
"created_at": "2026-06-05T12:00:00+00:00"
}
],
"status": "completed",
"total": 1.50
},
"errors": null
}
Other responses
// В теле — точная копия первого ответа (statusCode: 0).
// Отличается только response-header: Idempotent-Replay: true
// Используйте этот header, чтобы отличить повтор от первого запроса.
{
"status": "SUCCESS",
"statusCode": 0,
"statusMessage": "OK",
"data": { /* тот же payload что и в первом запросе */ },
"errors": null
}
{
"status": "SUCCESS",
"statusCode": 0,
"data": {
"valid": true,
"canRecharge": true,
"price": 1.50,
"currency": "USD",
"attributes": { "nickname": "PlayerOne" }
}
}
{
"status": "SUCCESS",
"statusCode": 1,
"statusMessage": "Accepted",
"data": { "orderId": "ORD-A7K3PMX9", "status": "processing" }
}
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Token is missing required scope: orders:write"
}
{
"status": "ERROR",
"statusCode": 6,
"statusMessage": "Unsupported media type"
}
{
"status": "ERROR",
"statusCode": 9,
"statusMessage": "Insufficient stock"
}
{
"status": "ERROR",
"statusCode": 10,
"statusMessage": "Insufficient balance"
}
{
"status": "ERROR",
"statusCode": 4,
"statusMessage": "Validation error",
"errors": [
{ "field": "items.0.item_id", "message": "Item not found: bad-uuid" },
{ "field": "items.0.fields", "message": "checkOnly requires fields" }
]
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
{
"status": "ERROR",
"statusCode": 11,
"statusMessage": "Provider error",
"errors": [{ "field": "provider", "message": "Account not found" }]
}
Request
Validate DTU account (no charge)
Checks game account existence (UID/login) and whether top-up is possible with the provider BEFORE creating an order. Returns player name, price and currency. No charge happens (quote-only / checkOnly mode).
Request body (JSON)
{
"item_id": "<DENOMINATION_ID>",
"fields": [
{ "key": "account_number", "value": "<ACCOUNT>" },
{ "key": "amount", "value": "100" }
]
}
200 — success response
{
"status": "SUCCESS",
"statusCode": 0,
"data": {
"valid": true,
"canRecharge": true,
"price": 1.50,
"currency": "USD",
"attributes": { "nickname": "PlayerOne" }
}
}
Other responses
{
"status": "SUCCESS",
"statusCode": 0,
"data": { "valid": false, "reason": "Account not found" }
}
{
"status": "ERROR", "statusCode": 1, "statusMessage": "Unauthenticated"
}
{
"status": "ERROR", "statusCode": 2,
"statusMessage": "Token is missing required scope: orders:write"
}
{
"status": "ERROR", "statusCode": 4,
"statusMessage": "Validation error",
"errors": [{ "field": "fields", "message": "fields must contain at least one key/value" }]
}
{
"status": "ERROR", "statusCode": 11,
"statusMessage": "Provider unavailable"
}
Request
Payment methods
Available top-up methods with supported currencies, networks and limits.
200 — success response
{
"status": "SUCCESS",
"data": {
"items": [
{ "code": "crypto", "name": "Cryptocurrency",
"currencies": ["USDT","USDC","BTC","ETH"],
"networks": ["TRON","ETH","BSC","POLYGON"],
"min_amount": 5, "max_amount": 10000, "currency": "USD" }
]
}
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Token is missing required scope: funds:read"
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
Request
Invoice list
User top-up history with pagination and status filter.
Query parameters
status
string
pending | completed | failed | expired
page
int
limit
int
max 100
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Token is missing required scope: funds:read"
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
Request
Invoice details
Status of a specific top-up. Used for polling after invoice creation until confirmation.
Path parameters
uid
string
TOP-XXXXXXXX
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Token is missing required scope: funds:read"
}
{
"status": "ERROR",
"statusCode": 3,
"statusMessage": "Not Found"
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
Request
Create invoice
Creates a crypto invoice via the payment gateway. Returns wallet address and QR code for payment. Supports Idempotency-Key.
Request body (JSON)
{
"amount": 100,
"method": "crypto",
"currency": "USDT",
"network": "TRON"
}
200 — success response
{
"status": "SUCCESS",
"data": {
"invoice": { "uid": "TOP-XXXXXXXX", "status": "pending", ... },
"payment": {
"address": "TXxx...",
"qr_code_url": "https://...",
"amount": 100.0,
"currency": "USDT",
"network": "TRON",
"expires_at": "2026-..."
}
}
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Token is missing required scope: funds:write"
}
{
"status": "ERROR",
"statusCode": 4,
"statusMessage": "Validation error",
"errors": [
{ "field": "<field>", "message": "<description>" }
]
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
{
"status": "ERROR",
"statusCode": 11,
"statusMessage": "Provider unavailable"
}
{
"status": "ERROR",
"statusCode": 7,
"statusMessage": "Conflict: idempotency key in use"
}
Request
Webhook list
All registered webhooks for the user plus the list of available events to subscribe to.
200 — success response
{
"status": "SUCCESS",
"data": {
"items": [ { "id": 1, "url": "https://example.com/hook",
"events": ["order.completed"], "is_active": true } ],
"allowed_events": ["order.created","order.completed",
"order.failed","topup.completed"]
}
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Token is missing required scope: webhooks:read"
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
Request
Subscribe
Registers a URL to receive events. Returns the secret for HMAC validation of incoming deliveries (shown ONCE).
Request body (JSON)
{
"url": "https://example.com/hook",
"events": ["order.completed", "topup.completed"]
}
200 — success response
{
"status": "SUCCESS",
"data": {
"id": 1, "url": "...", "events": [...],
"secret": "whsec_..." // показано один раз!
}
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Token is missing required scope: webhooks:write"
}
{
"status": "ERROR",
"statusCode": 4,
"statusMessage": "Validation error",
"errors": [
{ "field": "<field>", "message": "<description>" }
]
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
Request
Update
Update the URL, event list, or enable/disable the webhook.
Path parameters
id
int
webhook id
Request body (JSON)
{ "is_active": false }
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Token is missing required scope: webhooks:write"
}
{
"status": "ERROR",
"statusCode": 3,
"statusMessage": "Not Found"
}
{
"status": "ERROR",
"statusCode": 4,
"statusMessage": "Validation error",
"errors": [
{ "field": "<field>", "message": "<description>" }
]
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
Request
Delete
Deletes the webhook. Events stop being delivered.
Path parameters
id
int
webhook id
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Token is missing required scope: webhooks:write"
}
{
"status": "ERROR",
"statusCode": 3,
"statusMessage": "Not Found"
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
Request
Test delivery
Sends a test "ping" event to the webhook URL with a valid HMAC signature — for verifying your server validates signatures correctly.
Path parameters
id
int
webhook id
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Token is missing required scope: webhooks:write"
}
{
"status": "ERROR",
"statusCode": 3,
"statusMessage": "Not Found"
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
Request
Каталог игр и дополнений
Все игры (и по желанию дополнения), которые можно отправить подарком. Поиск по названию, App ID или ссылке Steam, пагинация.
- price_from — ваша минимальная цена по всем регионам, для витрины. Точная цена издания в регионе — в GET /steam-gifts/catalog/{app_id} и POST /steam-gifts/price.
- editions=1 — к каждой игре сразу её издания с вашими ценами по регионам. regions=RU,KZ — оставить в изданиях только нужные регионы.
- Весь каталог с ценами: editions=1&limit=200, страницы 1…totalPages — около 24 запросов вместо запроса на каждую игру.
- Дальше — только изменения: updated_since = server_time из прошлого ответа. Придут игры, у которых с тех пор менялись цены или доступность (обновляется раз в 10 минут), и removed_app_ids — снятые с продажи. Первый раз передайте server_time из ответа, с которого начали полную выгрузку.
- Поиск не зависит от регистра, ™ и пунктуации: «fc 26» находит «EA SPORTS FC™ 26».
- Ответ с ETag: пришлите его в If-None-Match — если ничего не изменилось, получите 304 без тела.
Query parameters
q
string
поиск: название, App ID или ссылка store.steampowered.com/app/…
type
string
game (по умолчанию), dlc или all
app_ids
string
только эти App ID, через запятую (до 100)
editions
bool
1 — добавить к каждой игре издания с ценами по регионам
updated_since
string
ISO 8601 (лучше server_time прошлого ответа) — только изменившиеся с этого момента + removed_app_ids
regions
string
с editions=1: только эти регионы, через запятую (RU,KZ)
page
int
страница, с 1
limit
int
на странице, до 200 (по умолчанию 25)
200 — success response
{
"status": "SUCCESS",
"data": {
"items": [
{ "app_id": 3405690, "name": "EA SPORTS FC 26", "type": "game",
"image": "https://…/header.jpg", "editions_count": 1, "available": true,
"price_from": 7.82, "currency": "USD",
"editions": [
{ "sub_id": 1204710, "name": "EA SPORTS FC 26", "is_primary": true,
"regions": [ { "region": "RU", "available": true, "price": 8.50, "requires_quick_invite": false } ] }
] },
{ "app_id": 4496550, "name": "Assassin's Creed Black Flag Resynced - Hellfire Naval Pack", "type": "dlc",
"available": true, "price_from": 6.27, "currency": "USD",
"base_game": { "app_id": 3751950, "name": "Assassin's Creed Black Flag Resynced" } }
],
"page": 1, "limit": 25, "total": 4756, "totalPages": 191,
"server_time": "2026-10-12T21:40:00+00:00"
}
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Steam Gifts is not enabled for your account",
"errors": [ { "code": "steamgifts_access_denied", "message": "Steam Gifts is not enabled for your account", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 4,
"statusMessage": "Validation Error",
"errors": [ { "code": "validation_error", "field": "region", "message": "…" } ]
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
{
"status": "ERROR",
"statusCode": 6,
"statusMessage": "the catalog is being refreshed — retry in a minute",
"errors": [ { "code": "catalog_unavailable", "message": "the catalog is being refreshed — retry in a minute", "retryable": true } ]
}
Request
Игра: издания, регионы, ваши цены
Издания игры и по каждому региону: доступность и ВАША цена — ровно столько спишется с баланса за один подарок.
- Цену в заказе передавать не нужно: мы всегда берём текущую. Чтобы не купить дороже ожидаемого, передайте в заказе max_price_usd.
- requires_quick_invite = true — этот регион дарится только по ссылке-приглашению s.team/p/…: укажите её в recipient.
- type = dlc — дополнение; base_game — игра, без которой его не принять. Покупатель должен владеть ею.
- Если издание одно, sub_id в заказе можно не передавать — возьмём основное (is_primary).
- details=1 — описание из магазина Steam: скриншоты, короткое описание, жанры, дата выхода, разработчик и издатель (lang=ru по умолчанию или en). Мы храним его неделю; details = null — Steam сейчас не ответил, повторите позже.
Path parameters
app_id
int
Steam App ID (из каталога)
Query parameters
details
bool
1 — добавить описание из магазина Steam (скриншоты, жанры, дата выхода…)
lang
string
язык описания: ru (по умолчанию) или en
200 — success response
{
"status": "SUCCESS",
"data": {
"app_id": 3405690, "name": "EA SPORTS FC 26", "type": "game",
"image": "https://…/header.jpg", "primary_sub_id": 1204710,
"editions": [
{ "sub_id": 1204710, "name": "EA SPORTS FC 26", "is_primary": true,
"regions": [
{ "region": "RU", "name": "Россия", "available": true, "price": 8.50, "currency": "USD", "requires_quick_invite": false },
{ "region": "KZ", "name": "Казахстан", "available": true, "price": 8.50, "currency": "USD", "requires_quick_invite": false }
] }
],
"details": {
"available": true,
"short_description": "…",
"genres": ["Спортивные игры", "Симуляторы"],
"release_date": "26 сен. 2025",
"coming_soon": false,
"developers": ["EA Canada & EA Romania"],
"publishers": ["Electronic Arts"],
"header_image": "https://…/header.jpg",
"screenshots": [ { "thumbnail": "https://…/ss_….600x338.jpg", "full": "https://…/ss_….1920x1080.jpg" } ],
"store_url": "https://store.steampowered.com/app/3405690/"
}
}
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Steam Gifts is not enabled for your account",
"errors": [ { "code": "steamgifts_access_denied", "message": "Steam Gifts is not enabled for your account", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
{
"status": "ERROR",
"statusCode": 6,
"statusMessage": "supplier temporarily unavailable — retry shortly",
"errors": [ { "code": "supplier_unavailable", "message": "supplier temporarily unavailable — retry shortly", "retryable": true } ]
}
{
"status": "ERROR",
"statusCode": 3,
"statusMessage": "app_id 123 is not in the catalog",
"errors": [ { "code": "game_not_found", "message": "app_id 123 is not in the catalog", "retryable": false } ]
}
Request
Регионы
Коды и названия регионов доставки. Регион заказа — страна аккаунта Steam получателя.
200 — success response
{
"status": "SUCCESS",
"data": { "regions": [ { "region": "RU", "name": "Россия", "group": null }, { "region": "KZ", "name": "Казахстан", "group": null } ] }
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Steam Gifts is not enabled for your account",
"errors": [ { "code": "steamgifts_access_denied", "message": "Steam Gifts is not enabled for your account", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
{
"status": "ERROR",
"statusCode": 6,
"statusMessage": "supplier temporarily unavailable — retry shortly",
"errors": [ { "code": "supplier_unavailable", "message": "supplier temporarily unavailable — retry shortly", "retryable": true } ]
}
Request
Точная цена сейчас
Сколько спишется за один подарок прямо сейчас (цена берётся у поставщика в момент запроса) и хватает ли баланса. Ничего не списывает.
Поля тела запроса
app_id
int
обязательно
sub_id
int
издание; без него — основное
region
string
обязательно, код из /steam-gifts/regions
Request body (JSON)
{ "app_id": 3405690, "region": "RU" }
200 — success response
{
"status": "SUCCESS",
"data": {
"app_id": 3405690, "sub_id": 1204710, "region": "RU",
"game": "EA SPORTS FC 26", "edition": "EA SPORTS FC 26",
"price": 8.50, "currency": "USD", "available": true,
"balance": 120.00, "enough_balance": true
}
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Steam Gifts is not enabled for your account",
"errors": [ { "code": "steamgifts_access_denied", "message": "Steam Gifts is not enabled for your account", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
{
"status": "ERROR",
"statusCode": 6,
"statusMessage": "supplier temporarily unavailable — retry shortly",
"errors": [ { "code": "supplier_unavailable", "message": "supplier temporarily unavailable — retry shortly", "retryable": true } ]
}
{
"status": "ERROR",
"statusCode": 4,
"statusMessage": "edition not available in region TR",
"errors": [ { "code": "region_unavailable", "message": "edition not available in region TR", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 3,
"statusMessage": "game or edition not found",
"errors": [ { "code": "game_not_found", "message": "game or edition not found", "retryable": false } ]
}
Request
Проверить получателя
Проверяет у поставщика, что ссылка ведёт на существующий профиль Steam. Ничего не списывает.
- Принимаем две формы: ссылку на профиль https://steamcommunity.com/id/ник или /profiles/7656119…, либо ссылку-приглашение https://s.team/p/xxxx-xxxx.
- Ссылки «на себя» вроде steamcommunity.com/my не подходят — нужна ссылка на чужой профиль.
- Лучший вариант для покупателя — ссылка-приглашение: она сама добавляет нашего отправителя в друзья, доставка быстрее.
Поля тела запроса
recipient
string
ссылка на профиль или s.team/p/…
Request body (JSON)
{ "recipient": "https://steamcommunity.com/id/buyer" }
200 — success response
{
"status": "SUCCESS",
"data": { "valid": true, "type": "vanity_url", "steam_id": null, "reason": null }
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Steam Gifts is not enabled for your account",
"errors": [ { "code": "steamgifts_access_denied", "message": "Steam Gifts is not enabled for your account", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 4,
"statusMessage": "Validation Error",
"errors": [ { "code": "validation_error", "field": "region", "message": "…" } ]
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
{
"status": "ERROR",
"statusCode": 6,
"statusMessage": "supplier temporarily unavailable — retry shortly",
"errors": [ { "code": "supplier_unavailable", "message": "supplier temporarily unavailable — retry shortly", "retryable": true } ]
}
Request
Создать заказ (купить и отправить подарок)
Списывает цену с баланса и запускает отправку подарка. Ответ приходит сразу со status = processing; итог — вебхуком или в GET заказа.
- reference_id обязателен — это ваш ID заказа. Повтор запроса с тем же reference_id (например, после таймаута) вернёт тот же заказ без второго списания: ответ 200 и заголовок Idempotent-Replayed: true. Новый заказ — новый reference_id.
- Тот же reference_id с другой игрой, регионом или получателем — ошибка 409 reference_id_conflict, ничего не списывается.
- dry_run: true — пробный заказ: проверяем цену, баланс, лимит ключа и получателя у поставщика, но ничего не покупаем. Удобно для тестов и предпросмотра.
- max_price_usd — потолок: если наша цена выше, заказ не создаётся (409 price_above_max).
- resale_usd — за сколько вы продали подарок покупателю. Если это меньше нашей цены, заказ придерживается без списания (status = on_hold) — решите, доставлять ли в минус.
- Если доставка не удастся, деньги вернутся на баланс автоматически (status = failed).
Additional headers
Idempotency-Key
string
необязательно — дополнительная защита от дублей на уровне HTTP; основная — reference_id
Поля тела запроса
app_id
int
обязательно — игра
sub_id
int
издание; без него — основное
region
string
обязательно — регион из /steam-gifts/regions (страна аккаунта получателя)
recipient
string
обязательно — ссылка на профиль Steam или s.team/p/…
reference_id
string
обязательно — ваш уникальный ID заказа, 1–128 печатных ASCII без пробелов
max_price_usd
number
не покупать, если цена выше
resale_usd
number
ваша цена продажи покупателю, USD — защита от продажи в минус
note
string
заметка к заказу, до 500 символов
dry_run
boolean
true — только проверить, ничего не покупать
Request body (JSON)
{
"app_id": 3405690,
"region": "RU",
"recipient": "https://s.team/p/abcd-1234",
"reference_id": "shop-1042",
"max_price_usd": 9.00,
"resale_usd": 12.00
}
201 — заказ создан (200 — повтор того же reference_id)
{
"status": "SUCCESS",
"data": { "uid": "ORD-K2M3WF", "reference_id": "shop-1042", "status": "processing", … }
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Steam Gifts is not enabled for your account",
"errors": [ { "code": "steamgifts_access_denied", "message": "Steam Gifts is not enabled for your account", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 4,
"statusMessage": "Validation Error",
"errors": [ { "code": "validation_error", "field": "region", "message": "…" } ]
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
{
"status": "ERROR",
"statusCode": 6,
"statusMessage": "supplier temporarily unavailable — retry shortly",
"errors": [ { "code": "supplier_unavailable", "message": "supplier temporarily unavailable — retry shortly", "retryable": true } ]
}
{
"status": "SUCCESS",
"data": {
"dry_run": true, "ok": true,
"would_charge": 8.50, "currency": "USD",
"app_id": 3405690, "sub_id": 1204710, "region": "RU", "game": "EA SPORTS FC 26",
"balance": 120.00, "balance_after": 111.50,
"spending_limit_left": null,
"recipient_check": { "valid": true, "type": "vanity_url", "steam_id": null }
}
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "insufficient SkyZiro balance: the order costs $8.50, your balance is $3.20",
"errors": [ { "code": "insufficient_balance", "message": "insufficient SkyZiro balance: the order costs $8.50, your balance is $3.20", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "the spending limit of this API key does not cover the order: $8.50 needed, $2.00 left",
"errors": [ { "code": "spending_limit_exceeded", "message": "the spending limit of this API key does not cover the order: $8.50 needed, $2.00 left", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 4,
"statusMessage": "reference_id "shop-1042" was already used for another order (ORD-K2M3WF) with different app_id/sub_id/region/recipient",
"errors": [ { "code": "reference_id_conflict", "message": "reference_id "shop-1042" was already used for another order (ORD-K2M3WF) with different app_id/sub_id/region/recipient", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 4,
"statusMessage": "recipient must be a Steam profile URL (steamcommunity.com/id/… or /profiles/…) or an s.team/p invite link",
"errors": [ { "code": "invalid_recipient", "message": "recipient must be a Steam profile URL (steamcommunity.com/id/… or /profiles/…) or an s.team/p invite link", "retryable": false } ]
}
Request
Order list
Ваши заказы, созданные через API, — новые сверху. Заказы с площадок (Digiseller, GGsel) и ручные здесь не показываются.
- Не дошёл ответ на создание? Найдите заказ по reference_id.
- Синхронизация без вебхуков: запоминайте время последнего опроса и запрашивайте updated_since — получите только изменившиеся заказы, от старых к новым.
Query parameters
status
string
processing | delivered | failed | awaiting_recipient | needs_quick_invite | on_hold
reference_id
string
найти заказ по вашему ID
updated_since
string
ISO 8601 — только изменившиеся с этого момента, по возрастанию updated_at
page
int
страница, с 1
limit
int
до 100 (по умолчанию 25)
200 — success response
{
"status": "SUCCESS",
"data": {
"items": [ { "uid": "ORD-K2M3WF", "reference_id": "shop-1042", "status": "delivered", … } ],
"page": 1, "limit": 25, "total": 1, "totalPages": 1
}
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Steam Gifts is not enabled for your account",
"errors": [ { "code": "steamgifts_access_denied", "message": "Steam Gifts is not enabled for your account", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 4,
"statusMessage": "Validation Error",
"errors": [ { "code": "validation_error", "field": "region", "message": "…" } ]
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
Request
Заказ: статус и что делать
Текущее состояние заказа (при запросе сверяем его с поставщиком). Ветвитесь по status, partner_phase и actions — таблицы в разделе «Как работает заказ».
- partner_phase = needs_partner_action — ваш ход: что можно сделать, перечислено в actions (кнопки покупателю — строго из этого списка).
- reason.text_ru — готовый текст для покупателя, его можно показывать как есть.
- Опрашивайте не чаще раза в 10–15 секунд, а лучше подпишитесь на вебхуки.
Path parameters
uid
string
номер заказа, ORD-XXXXXX
200 — success response
{
"status": "SUCCESS",
"data": {
"uid": "ORD-K2M3WF",
"reference_id": "shop-1042",
"status": "processing",
"app_id": 3405690, "sub_id": 1204710,
"game": "EA SPORTS FC 26", "edition": "EA SPORTS FC 26",
"region": "RU",
"recipient": "https://steamcommunity.com/id/buyer",
"price": 8.50, "currency": "USD",
"sender_profile_url": "https://steamcommunity.com/profiles/76561199…",
"recipient_steam_id": null,
"steam_transid": null,
"delivered_at": null,
"fail_reason": null,
"loss": null,
"reason": {
"code": "awaiting_friend_accept", "cause": null, "final": false,
"buyer_action": "accept_friend",
"message": "Our sender has sent the recipient a Steam friend request…",
"text_ru": "Мы отправили вам заявку в друзья в Steam. Примите её: Steam → Друзья → Заявки в друзья.",
"not_before": null
},
"operator_handling": false,
"needs_recipient": false,
"awaiting_friend_accept": true,
"actions": ["change_recipient", "cancel"],
"partner_phase": "needs_partner_action",
"cancel_state": null,
"delivered_after_cancel": false,
"created_at": "2026-10-12T16:40:11+00:00",
"updated_at": "2026-10-12T16:41:02+00:00"
}
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Steam Gifts is not enabled for your account",
"errors": [ { "code": "steamgifts_access_denied", "message": "Steam Gifts is not enabled for your account", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 3,
"statusMessage": "order ORD-XXXXXX not found among your API orders",
"errors": [ { "code": "order_not_found", "message": "order ORD-XXXXXX not found among your API orders", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
Request
Сменить получателя
Новая ссылка на получателя. Когда доступно: в actions есть change_recipient, или status = awaiting_recipient.
- Заказ в работе (processing) — новый получатель уходит в тот же заказ, без нового списания.
- status = awaiting_recipient — поставщик не нашёл получателя при создании, подарок не куплен и деньги уже вернулись. Вызов создаёт заказ заново и снова списывает цену.
- Если цена с момента заказа изменилась — 409 price_changed с новой ценой; повторите запрос с accept_price, чтобы согласиться.
- Если заявку в друзья не приняли — лучше всего прислать ссылку-приглашение s.team/p/…: она добавляет в друзья сама.
Path parameters
uid
string
номер заказа, ORD-XXXXXX
Поля тела запроса
recipient
string
обязательно — ссылка на профиль или s.team/p/…
accept_price
number
согласие на новую цену после 409 price_changed (только для awaiting_recipient)
Request body (JSON)
{ "recipient": "https://s.team/p/abcd-1234" }
200 — success response
{
"status": "SUCCESS",
"data": { "uid": "ORD-K2M3WF", "reference_id": "shop-1042", "status": "processing", … }
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Steam Gifts is not enabled for your account",
"errors": [ { "code": "steamgifts_access_denied", "message": "Steam Gifts is not enabled for your account", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 3,
"statusMessage": "order ORD-XXXXXX not found among your API orders",
"errors": [ { "code": "order_not_found", "message": "order ORD-XXXXXX not found among your API orders", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 4,
"statusMessage": "Validation Error",
"errors": [ { "code": "validation_error", "field": "region", "message": "…" } ]
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
{
"status": "ERROR",
"statusCode": 6,
"statusMessage": "supplier temporarily unavailable — retry shortly",
"errors": [ { "code": "supplier_unavailable", "message": "supplier temporarily unavailable — retry shortly", "retryable": true } ]
}
{
"status": "ERROR",
"statusCode": 4,
"statusMessage": "supplier price changed from $8.50 to $9.10 — repeat the request with accept_price=9.10 to proceed",
"errors": [ { "code": "price_changed", "message": "supplier price changed from $8.50 to $9.10 — repeat the request with accept_price=9.10 to proceed", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "insufficient SkyZiro balance: this costs $8.50, your balance is $3.20",
"errors": [ { "code": "insufficient_balance", "message": "insufficient SkyZiro balance: this costs $8.50, your balance is $3.20", "retryable": false } ]
}
Request
Прислать ссылку-приглашение
Игру в этот регион дарят только по ссылке-приглашению (status = needs_quick_invite или в actions есть send_quick_link). Пришлите свежую ссылку s.team/p/… — доставка продолжится в том же заказе, без нового списания.
- Ссылку покупатель берёт в Steam: Друзья → Добавить друга → «Ссылка для быстрого приглашения». Она действует 30 дней и один раз.
Path parameters
uid
string
номер заказа, ORD-XXXXXX
Поля тела запроса
link
string
обязательно — https://s.team/p/…
Request body (JSON)
{ "link": "https://s.team/p/abcd-1234/WXYZ" }
200 — success response
{
"status": "SUCCESS",
"data": { "uid": "ORD-K2M3WF", "reference_id": "shop-1042", "status": "processing", … }
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Steam Gifts is not enabled for your account",
"errors": [ { "code": "steamgifts_access_denied", "message": "Steam Gifts is not enabled for your account", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 3,
"statusMessage": "order ORD-XXXXXX not found among your API orders",
"errors": [ { "code": "order_not_found", "message": "order ORD-XXXXXX not found among your API orders", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
{
"status": "ERROR",
"statusCode": 6,
"statusMessage": "supplier temporarily unavailable — retry shortly",
"errors": [ { "code": "supplier_unavailable", "message": "supplier temporarily unavailable — retry shortly", "retryable": true } ]
}
{
"status": "ERROR",
"statusCode": 4,
"statusMessage": "the supplier would not accept this action for this order right now — see actions in GET /steam-gifts/orders/{uid}",
"errors": [ { "code": "action_not_allowed", "message": "the supplier would not accept this action for this order right now — see actions in GET /steam-gifts/orders/{uid}", "retryable": false } ]
}
Request
Покупатель принял заявку в друзья
Наш отправитель (sender_profile_url) прислал покупателю заявку в друзья, а покупатель принял её уже после того, как поставщик перестал ждать. Доступно, когда в actions есть friend_accepted. Доставка продолжится в том же заказе.
- Пока заказ просто ждёт заявку (awaiting_friend_accept = true), вызывать не нужно — поставщик увидит принятие сам.
Path parameters
uid
string
номер заказа, ORD-XXXXXX
Поля тела запроса
confirmed_by
string
необязательно: кто подтвердил (покупатель, ваш оператор) — останется в журнале заказа
Request body (JSON)
{ "confirmed_by": "buyer" }
200 — success response
{
"status": "SUCCESS",
"data": { "uid": "ORD-K2M3WF", "reference_id": "shop-1042", "status": "processing", … }
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Steam Gifts is not enabled for your account",
"errors": [ { "code": "steamgifts_access_denied", "message": "Steam Gifts is not enabled for your account", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 3,
"statusMessage": "order ORD-XXXXXX not found among your API orders",
"errors": [ { "code": "order_not_found", "message": "order ORD-XXXXXX not found among your API orders", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
{
"status": "ERROR",
"statusCode": 6,
"statusMessage": "supplier temporarily unavailable — retry shortly",
"errors": [ { "code": "supplier_unavailable", "message": "supplier temporarily unavailable — retry shortly", "retryable": true } ]
}
{
"status": "ERROR",
"statusCode": 4,
"statusMessage": "the supplier would not accept this action for this order right now — see actions in GET /steam-gifts/orders/{uid}",
"errors": [ { "code": "action_not_allowed", "message": "the supplier would not accept this action for this order right now — see actions in GET /steam-gifts/orders/{uid}", "retryable": false } ]
}
Request
Подтвердить, что основная игра есть
Дополнение, а поставщик не видит у получателя основную игру (в actions есть confirm_base_game). Если покупатель подтверждает, что игра у него есть, — вызовите: проверка снимется и заказ продолжится.
- Подтверждайте только после явного ответа покупателя: если игры на самом деле нет, подарок принять не смогут и деньги пропадут.
- reason.not_before — раньше этого времени повторно не проверить (409 base_game_recheck_too_soon).
Path parameters
uid
string
номер заказа, ORD-XXXXXX
Поля тела запроса
confirmed_by
string
необязательно: кто подтвердил (покупатель, ваш оператор) — останется в журнале заказа
Request body (JSON)
{ "confirmed_by": "buyer" }
200 — success response
{
"status": "SUCCESS",
"data": { "uid": "ORD-K2M3WF", "reference_id": "shop-1042", "status": "processing", … }
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Steam Gifts is not enabled for your account",
"errors": [ { "code": "steamgifts_access_denied", "message": "Steam Gifts is not enabled for your account", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 3,
"statusMessage": "order ORD-XXXXXX not found among your API orders",
"errors": [ { "code": "order_not_found", "message": "order ORD-XXXXXX not found among your API orders", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
{
"status": "ERROR",
"statusCode": 6,
"statusMessage": "supplier temporarily unavailable — retry shortly",
"errors": [ { "code": "supplier_unavailable", "message": "supplier temporarily unavailable — retry shortly", "retryable": true } ]
}
{
"status": "ERROR",
"statusCode": 4,
"statusMessage": "the supplier would not accept this action for this order right now — see actions in GET /steam-gifts/orders/{uid}",
"errors": [ { "code": "action_not_allowed", "message": "the supplier would not accept this action for this order right now — see actions in GET /steam-gifts/orders/{uid}", "retryable": false } ]
}
Request
Подтвердить, что игры у покупателя нет
Проверка поставщика решила, что игра у получателя уже есть (reason.code = already_owned, в actions есть confirm_ownership), а покупатель говорит, что нет. Вызов снимает проверку и продолжает заказ.
- Если «уже есть» ответила сама касса Steam — 409 ownership_refused_by_steam: это окончательно, нужен другой получатель или отмена.
Path parameters
uid
string
номер заказа, ORD-XXXXXX
Поля тела запроса
confirmed_by
string
необязательно: кто подтвердил (покупатель, ваш оператор) — останется в журнале заказа
Request body (JSON)
{ "confirmed_by": "buyer" }
200 — success response
{
"status": "SUCCESS",
"data": { "uid": "ORD-K2M3WF", "reference_id": "shop-1042", "status": "processing", … }
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Steam Gifts is not enabled for your account",
"errors": [ { "code": "steamgifts_access_denied", "message": "Steam Gifts is not enabled for your account", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 3,
"statusMessage": "order ORD-XXXXXX not found among your API orders",
"errors": [ { "code": "order_not_found", "message": "order ORD-XXXXXX not found among your API orders", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
{
"status": "ERROR",
"statusCode": 6,
"statusMessage": "supplier temporarily unavailable — retry shortly",
"errors": [ { "code": "supplier_unavailable", "message": "supplier temporarily unavailable — retry shortly", "retryable": true } ]
}
{
"status": "ERROR",
"statusCode": 4,
"statusMessage": "the supplier would not accept this action for this order right now — see actions in GET /steam-gifts/orders/{uid}",
"errors": [ { "code": "action_not_allowed", "message": "the supplier would not accept this action for this order right now — see actions in GET /steam-gifts/orders/{uid}", "retryable": false } ]
}
Request
Покупатель сменил страну аккаунта
Издатель не продаёт игру в стране аккаунта получателя (в actions есть confirm_region_change). После того как покупатель сменил страну аккаунта Steam на регион заказа — вызовите, и заказ продолжится.
- Доставка возможна только в регион заказа. region можно не передавать; если передан — он должен совпадать с регионом заказа (иначе 422 region_mismatch). Для другой страны оформите новый заказ.
Path parameters
uid
string
номер заказа, ORD-XXXXXX
Поля тела запроса
region
string
необязательно — код страны, должен совпадать с регионом заказа
Request body (JSON)
{ "region": "KZ" }
200 — success response
{
"status": "SUCCESS",
"data": { "uid": "ORD-K2M3WF", "reference_id": "shop-1042", "status": "processing", … }
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Steam Gifts is not enabled for your account",
"errors": [ { "code": "steamgifts_access_denied", "message": "Steam Gifts is not enabled for your account", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 3,
"statusMessage": "order ORD-XXXXXX not found among your API orders",
"errors": [ { "code": "order_not_found", "message": "order ORD-XXXXXX not found among your API orders", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
{
"status": "ERROR",
"statusCode": 6,
"statusMessage": "supplier temporarily unavailable — retry shortly",
"errors": [ { "code": "supplier_unavailable", "message": "supplier temporarily unavailable — retry shortly", "retryable": true } ]
}
{
"status": "ERROR",
"statusCode": 4,
"statusMessage": "the supplier would not accept this action for this order right now — see actions in GET /steam-gifts/orders/{uid}",
"errors": [ { "code": "action_not_allowed", "message": "the supplier would not accept this action for this order right now — see actions in GET /steam-gifts/orders/{uid}", "retryable": false } ]
}
Request
Отменить заказ
Отменяет заказ и возвращает его стоимость на баланс. Если заказ уже у поставщика, он сначала отменяется там — после этого подарок не уйдёт.
- 200 — отменён, в ответе refunded — сколько вернулось на баланс; status = failed. Повторная отмена отменённого заказа тоже отвечает 200.
- 202 — поставщик прямо сейчас доставляет: отмена принята, мы повторяем её сами раз в минуту до часа, cancel_state = pending. Деньги вернутся, когда поставщик подтвердит (придёт вебхук steamgifts.order.failed).
- 409 order_cancel_too_late — деньги у поставщика уже двинулись: заказ ещё может быть доставлен или вернётся возвратом, cancel_state = awaiting_supplier. Дождитесь итога.
Path parameters
uid
string
номер заказа, ORD-XXXXXX
Поля тела запроса
reason
string
необязательно — причина, до 200 символов
Request body (JSON)
{ "reason": "покупатель передумал" }
200 — success response
{
"status": "SUCCESS",
"data": { "uid": "ORD-K2M3WF", "status": "failed", …, "refunded": 8.50 }
}
Other responses
{
"status": "SUCCESS",
"data": { "uid": "ORD-K2M3WF", "status": "processing", …, "cancel_state": "pending", "refunded": 0 }
}
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Steam Gifts is not enabled for your account",
"errors": [ { "code": "steamgifts_access_denied", "message": "Steam Gifts is not enabled for your account", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 3,
"statusMessage": "order ORD-XXXXXX not found among your API orders",
"errors": [ { "code": "order_not_found", "message": "order ORD-XXXXXX not found among your API orders", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
{
"status": "ERROR",
"statusCode": 4,
"statusMessage": "money at the supplier has already moved — the order may still be delivered or refunded; wait for the outcome",
"errors": [ { "code": "order_cancel_too_late", "message": "money at the supplier has already moved — the order may still be delivered or refunded; wait for the outcome", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 6,
"statusMessage": "the supplier did not confirm the cancellation — nothing was changed, retry later",
"errors": [ { "code": "supplier_unavailable", "message": "the supplier did not confirm the cancellation — nothing was changed, retry later", "retryable": true } ]
}
Request
Доставить в минус
Заказ на удержании (status = on_hold): вы продали подарок дешевле нашей цены (resale_usd). Вызов списывает цену и отправляет подарок — вы осознанно уходите в минус. Не хотите — отмените заказ.
- Если цена изменилась с момента заказа — 409 price_changed; повторите с accept_price.
Path parameters
uid
string
номер заказа, ORD-XXXXXX
Поля тела запроса
accept_price
number
согласие на новую цену после 409 price_changed
200 — success response
{
"status": "SUCCESS",
"data": { "uid": "ORD-K2M3WF", "reference_id": "shop-1042", "status": "processing", … }
}
Other responses
{
"status": "ERROR",
"statusCode": 1,
"statusMessage": "Unauthenticated"
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "Steam Gifts is not enabled for your account",
"errors": [ { "code": "steamgifts_access_denied", "message": "Steam Gifts is not enabled for your account", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 3,
"statusMessage": "order ORD-XXXXXX not found among your API orders",
"errors": [ { "code": "order_not_found", "message": "order ORD-XXXXXX not found among your API orders", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
{
"status": "ERROR",
"statusCode": 6,
"statusMessage": "supplier temporarily unavailable — retry shortly",
"errors": [ { "code": "supplier_unavailable", "message": "supplier temporarily unavailable — retry shortly", "retryable": true } ]
}
{
"status": "ERROR",
"statusCode": 2,
"statusMessage": "insufficient SkyZiro balance: this costs $8.50, your balance is $3.20",
"errors": [ { "code": "insufficient_balance", "message": "insufficient SkyZiro balance: this costs $8.50, your balance is $3.20", "retryable": false } ]
}
{
"status": "ERROR",
"statusCode": 4,
"statusMessage": "order is not awaiting a loss decision",
"errors": [ { "code": "not_on_hold", "message": "order is not awaiting a loss decision", "retryable": false } ]
}
Request
Healthcheck
Lightweight monitoring endpoint — returns current server time. No token required.
200 — success response
{
"status": "SUCCESS",
"data": { "pong": true, "time": "2026-..." }
}
Other responses
{
"status": "ERROR",
"statusCode": 5,
"statusMessage": "Too Many Requests"
}
Request
OpenAPI 3.0 spec
Full OpenAPI 3.0 spec of all endpoints. Used for SDK auto-generation via openapi-generator.
Request