Справочник разработчика
Avan Market API
Быстрый старт
Покупка скина для вашего клиента — это четыре шага:
- Получите API-ключ в личном кабинете на avan.market и пополните баланс.
-
Найдите нужный скин через поиск или прайс-лист —
вам нужен его
id. -
Отправьте покупку с параметрами трейд-ссылки получателя и своим
custom_id. - Следите за статусом через WebSockets, пока он не станет конечным.
curl https://api.avan.market/v1/user/balance \
-H "Authorization: Bearer $AVAN_API_KEY"
curl -X POST https://api.avan.market/v1/market/buy \
-H "Authorization: Bearer $AVAN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"id": "8f3a1d6e-b204-4c59-a6e7-1b9d5c0f7e23",
"partner": "358881436",
"token": "l6LFC3R8",
"max_price": 3.60,
"custom_id": "order-10457"
}'
Адрес API
Все методы вызываются относительно одного адреса:
https://api.avan.market/v1/
Формат данных
-
Запросы и ответы — JSON в кодировке UTF-8. Для
POST-запросов нужен заголовокContent-Type: application/json. - Все цены и суммы указаны в долларах США (USD).
-
Даты приходят в формате ISO 8601 по UTC. Фильтры по времени и поле
last_update— UNIX-время в секундах. - Массивы в строке запроса передаются повтором параметра:
ids[]=a&ids[]=b. - В ответах могут появляться новые поля — это не считается изменением версии. Не рассчитывайте на то, что набор полей закрыт.
Игры
В параметрах и ответах игра задаётся её App ID в Steam, в адресе прайс-листа — коротким словом.
| Игра | App ID | В адресе прайс-листа |
|---|---|---|
| Counter-Strike 2 | 730 | cs |
| Dota 2 | 570 | dota |
| Rust | 252490 | rust |
| Team Fortress 2 | 440 | tf |
Авторизация
К каждому запросу нужно приложить ваш API-ключ. Он указывается в заголовке Authorization по
схеме Bearer:
Authorization: Bearer [API_KEY]
- Ключ создаётся в личном кабинете на avan.market, в разделе «API Ключ», и показывается один раз — сохраните его сразу.
- Раздел открывается после того, как вы потратили на маркете от 10 $ суммарно. Эта сумма не является платой за подключение и никуда не списывается.
- Ключ даёт доступ к вашему балансу. Храните его только на своём сервере и не передавайте в браузер или мобильное приложение.
- Если ключ попал к посторонним, перевыпустите его в кабинете — старый перестанет работать в течение 30 секунд.
Что вернёт сервер, если ключа нет или он неверный
Статус ответа: 401
{
"code": "unauthorized",
"message": "Missing or invalid API key."
}
Лимиты запросов
v1/market/buy)Лимиты считаются на API-ключ, а не на IP-адрес. Счётчики независимы: запросы на покупку не расходуют общий лимит, а остальные методы — лимит покупки.
Счётчик обнуляется через 60 секунд после первого запроса. Когда лимит исчерпан, подождите до минуты и повторите запрос.
Кроме того, один аккаунт может держать не больше 10 запросов покупки, выполняющихся одновременно. Одиннадцатый получит 429 с кодом too_many_concurrent_purchases — повторите его, когда завершится один из предыдущих.
Что вернёт сервер, если лимит превышен
Статус ответа: 429
{
"code": "rate_limited",
"message": "Request limit exceeded. Retry in a minute."
}
Ошибки
Успешный ответ приходит со статусом 200 (прайс-лист может ответить 304, см. прайс-листы). Любой другой статус означает ошибку, и в
теле ответа будет поле message с описанием.
| Статус | Когда возникает | Что делать |
|---|---|---|
401 | Ключ не передан, неверен или отозван | Проверить заголовок Authorization |
403 | Аккаунт заблокирован | Обратиться в поддержку |
404 | Метод или объект не найден | Проверить адрес и идентификатор |
409 | Запрос корректен, но выполнить его нельзя: скин уже продан, не хватает баланса | Смотреть поле code — см. ошибки покупки |
422 | Параметры не прошли проверку | В errors — сообщения по каждому полю |
429 | Превышен лимит запросов | Подождать до минуты и повторить запрос |
500, 502, 503, 504 | Сбой на стороне Avan Market | Повторить позже. Покупку — только после проверки по custom_id, см. советы |
Ошибка проверки параметров — 422
{
"message": "The partner field is required. (and 1 more error)",
"errors": {
"partner": [
"The partner field is required."
],
"token": [
"The token field is required."
]
}
}
Запрос нельзя выполнить — 409
{
"code": "skin_unavailable",
"message": "The skin is already sold or reserved."
}
Поле code — короткое постоянное имя ошибки. Проверяйте в коде именно его: текст в
message может меняться.
Пагинация
Длинные списки отдаются частями. В API два вида пагинации — какой из них использует метод, указано в его описании.
По страницам — история покупок
Нужная страница выбирается параметром page в строке запроса. Например,
GET /v1/market/history?page=4:
{
"data": [
...
],
"meta": {
"current_page": 4,
"last_page": 6,
"per_page": 200,
"total": 1150
}
}
Блок meta описывает выдачу целиком. В примере у аккаунта 1150 покупок, по 200 на страницу,
то есть 6 страниц. Номер полученной страницы возвращается в
meta.current_page — так легко убедиться, что пришла именно она.
По курсору — поиск скинов
Каталог меняется каждую секунду, поэтому у поиска нет номеров страниц и общего количества. Вместо этого в
ответе приходит курсор meta.next_page:
{
"data": [
...
],
"meta": {
"per_page": 200,
"next_page": "eyJwIjoiZDJjNWI4ZjEtM2E0Ni00ZTcwLTliMWMtN2U0ZjBhNmQ4YzkyIn0"
}
}
Чтобы получить следующую часть, передайте это значение в параметре next_page:
GET /v1/market/search?game=730&next_page=eyJwIjoi...
- Когда
meta.next_pageравенnull, выдача закончилась. - Курсор работает только с теми же фильтрами, с которыми был получен.
- Курсор — непрозрачная строка: не разбирайте и не составляйте её сами.
Как проходит покупка
Ответ 200 на запрос покупки означает, что покупка создана и деньги списаны, но скин ещё не
передан. Дальше покупка проходит несколько этапов, и на каждом у неё меняется
статус.
| Этап | Что происходит | Статус |
|---|---|---|
| 1. Покупка принята | Скин зарезервирован за вами, цена списана с баланса. Покупка проходит проверку на стороне Avan Market | "0" |
| 2. Трейд отправлен | Получателю в Steam ушёл трейд-оффер, ждём его решения | "2" |
| 3а. Скин передан | Получатель принял трейд. Покупка завершена | "3" |
| 3б. Передать не удалось | Покупка не прошла проверку либо трейд отклонён, истёк, отменён или не был создан. Деньги возвращаются на баланс, если трейд отклонил не сам получатель | "6", "7", "8", "10" |
Срок выдачи
Не каждый скин можно передать сразу: на часть предметов действует временное ограничение обмена в Steam.
Срок виден заранее в поле delivery предмета: 1 — трейд уходит сразу после
проверки покупки, 2 — в течение 12 часов. Пока срок не наступил, покупка остаётся в статусе
"0".
Возврат денег
Если покупка завершилась любым конечным статусом, кроме "3", её цена возвращается на баланс.
Причина записывается в поле return_reason, а если часть суммы была удержана — в поле
return_charged_commission.
| return_reason | Когда |
|---|---|
trade_declined | Получатель отклонил трейд |
trade_canceled | Трейд был отменён: получатель не принял его вовремя либо покупка не прошла проверку |
trade_create_failed | Трейд не удалось создать: закрытый инвентарь, недействительная ссылка, ограничения Steam |
item_unavailable | Предмет оказался недоступен для передачи |
return_charged_commission.
Что нужно от получателя
Аккаунт и трейд-ссылка получателя заранее не проверяются. Если трейд создать не удалось — например,
из-за трейд-бана или закрытого инвентаря, — покупка завершится статусом "10", а деньги
вернутся на баланс.
- Инвентарь Steam открыт, а аккаунт не ограничен в обменах.
- Трейд-ссылка действующая: после её пересоздания в Steam старый
tokenперестаёт работать. - Трейд нужно принять до истечения срока, иначе он будет отменён и покупка завершится статусом
"6".
Советы по покупке скинов
-
Новые лоты в реальном времени приходят только событием
skin_addedв WebSockets. Поиск и витрина сайта отстают на несколько минут, а прайс-лист пересобирается раз в минуту — они подходят для сверки, а не для гонки за свежими лотами. -
Статусы держите в памяти по событиям из канала покупок.
/v1/market/info— запасной путь: после переподключения и в случаях, когда сокет недоступен. -
Давайте каждой покупке свой
custom_idи делайте повтор идемпотентным. Не получили ответ (обрыв, таймаут,5xx) — запросите/v1/market/info?custom_ids[]=…. Пустойdataзначит, что покупки нет и запрос можно отправить снова. Если покупка уже есть, повтор ответитduplicate_custom_idи вернёт её вdata, второй раз скин не спишется. - Ставьте на запрос покупки таймаут не меньше 35 секунд: резерв скина и списание могут занять до 30 секунд.
-
Перед покупкой нескольких скинов сверьте цены методом
/v1/market/check-basket, а в самой покупке передавайтеmax_price— цена может измениться между проверкой и покупкой. -
При обрыве WebSocket переподключайтесь с растущей паузой (1, 2, 4, 8 секунд, но не больше 30) и после
подключения сверяйте статусы незавершённых покупок методом
/v1/market/info: сообщения, отправленные во время обрыва, не повторяются. -
Прайс-лист не нужно скачивать чаще, чем он обновляется, — раз в минуту. Передавайте
If-None-Match, чтобы не получать документ заново, если он не менялся.
Каталог и события
JSON-прайс-листы
Прайс-лист — это JSON-документ с полными данными обо всех предметах, которые сейчас выставлены на продажу. У каждой игры свой прайс-лист — выберите нужную.
-
Ответ большой — запрашивайте его со сжатием: заголовок
Accept-Encoding: gzip. -
Прайс-лист пересобирается раз в минуту. Поле
last_updateпоказывает, когда он был собран. -
В ответе есть заголовок
ETag. Передайте его значение в заголовкеIf-None-Matchследующего запроса: если прайс-лист с тех пор не пересобирался, придёт пустой ответ304. -
Сразу после перезапуска сервиса, пока прайс-лист ещё не собран, метод отвечает
503— повторите запрос через минуту. - Прайс-лист подходит для полной сверки каталога раз в несколько минут. Чтобы узнавать о новых скинах сразу, используйте WebSockets.
Ответ — Counter-Strike 2
{
"status": "success",
"last_update": 1773826887,
"items": [
{
"id": "9b2f6c1e-4d7a-4f0b-8a3e-5c1d2e7f9a40",
"game_id": 730,
"name": "AWP | Asiimov (Field-Tested)",
"price": 148.5,
"delivery": 1,
"asset_id": "53540956125",
"class_id": "7993037085",
"float": "0.2744107246398926",
"paint_seed": 932,
"name_tag": null,
"inspect_link": "steam://run/730//+csgo_econ_action_preview%20B9A9415A72297CB8A1B0992EBB91BF89BD810F72114CBAF916BDDBB6B1B9A9628A842CE72507FCF5801504DBB6B1B9A9029C84A50FF207FCB9B08005DBB6B1B9A9339C841D20A007FC59E06505D13A393939B5C9B17896EAA2",
"stickers": [
{
"slot": 0,
"name": "Sticker | ZywOo (Foil) | Katowice 2019",
"wear": 0,
"image": "https://community.cloudflare.steamstatic.com/economy/image/i0CoZ81Ui0m-9KwlBY1L_18myuGuq1wfhWSaZgMttyVfPaERSR0Wqmu7LAocGJai0ki7VeTHjMGgIXSA7FVwptelsxb0SBrOhI_38i1k6f2nZOo-IvPAX2bHwrtw5rFtSii2zR9-sT7Tn4mvdC7BO1chWZckROZZska4jJS5YAEgste8"
}
]
}
]
}
730 — Counter-Strike 2, 570 —
Dota 2, 252490 — Rust, 440 — Team Fortress 2
1 — сразу, 2 — в течение 12 часов
Ответ — Dota 2
{
"status": "success",
"last_update": 1773826887,
"items": [
{
"id": "3e8a1f52-7c94-4b6d-9f20-a1d4c7e85b13",
"game_id": 570,
"name": "Dragonclaw Hook",
"price": 412.3,
"delivery": 1,
"asset_id": "29384710562",
"class_id": "57949762",
"stickers": [
{
"slot": null,
"name": "Inscribed Towers Destroyed",
"wear": null,
"image": "https://cdn.steamstatic.com/apps/570/icons/econ/sockets/gem_stat.30d7935c1f0a1b9e8e28c691c2bd28f7d5f471bc.png"
}
]
}
]
}
730 — Counter-Strike 2, 570 —
Dota 2, 252490 — Rust, 440 — Team Fortress 2
1 — сразу, 2 — в течение 12 часов
Ответ — Rust
{
"status": "success",
"last_update": 1773826887,
"items": [
{
"id": "c47d9a06-2b5e-4e13-b8f7-6d0a3f91e2c5",
"game_id": 252490,
"name": "Tempered AK47",
"price": 38.5,
"delivery": 1,
"asset_id": "5193846207",
"class_id": "2143471514"
}
]
}
730 — Counter-Strike 2, 570 —
Dota 2, 252490 — Rust, 440 — Team Fortress 2
1 — сразу, 2 — в течение 12 часов
Ответ — Team Fortress 2
{
"status": "success",
"last_update": 1773826887,
"items": [
{
"id": "f15b7e3a-90c2-4a68-8d41-2e6c9b0a7d38",
"game_id": 440,
"name": "Mann Co. Supply Crate Key",
"price": 2.14,
"delivery": 1,
"asset_id": "14872039561",
"class_id": "101785959"
}
]
}
730 — Counter-Strike 2, 570 —
Dota 2, 252490 — Rust, 440 — Team Fortress 2
1 — сразу, 2 — в течение 12 часов
WebSockets
Через WebSocket сервер сам сообщает об изменениях — это быстрее опроса методов и не расходует лимит запросов.
Подключение
wss://socket.avan.market/api?token=[TOKEN]
-
Получите токен подключения методом
/v1/user/get-ws-tokenи передайте его в параметреtoken. Сам API-ключ в WebSocket не передаётся. - Обмен идёт сообщениями в формате JSON. Специальная библиотека не нужна — подойдёт любой WebSocket-клиент.
-
Токен действует ограниченное время. Когда срок истекает, сервер закрывает соединение с кодом
4002— запросите новый токен и подключитесь заново. - Одновременно можно держать не больше 10 соединений на аккаунт и не больше 20 подписок на соединение.
- Раз в 30 секунд сервер проверяет соединение служебным ping — обычные WebSocket-клиенты отвечают на него сами.
const { data } = await fetch("https://api.avan.market/v1/user/get-ws-token", {
headers: { Authorization: `Bearer ${API_KEY}` },
}).then((response) => response.json());
const socket = new WebSocket(`wss://socket.avan.market/api?token=${data.token}`);
socket.onopen = () => {
socket.send(JSON.stringify({ action: "subscribe", channel: "catalog" }));
socket.send(JSON.stringify({ action: "subscribe", channel: `purchases:${data.user_id}` }));
};
socket.onmessage = (event) => {
const message = JSON.parse(event.data);
if (message.type === "message") {
console.log(message.channel, message.data.event, message.data);
}
};
socket.onclose = (event) => {
console.log("closed", event.code);
};
Что отправляет клиент
| Действие | Сообщение |
|---|---|
| Подписаться на канал | {"action": "subscribe", "channel": "catalog"} |
| Отписаться от канала | {"action": "unsubscribe", "channel": "catalog"} |
| Проверить соединение | {"action": "ping"} |
Что отправляет сервер
type | Когда приходит | Другие поля |
|---|---|---|
connected | Сразу после подключения | user_id, expires_at |
subscribed | Подписка оформлена | channel |
unsubscribed | Подписка снята | channel |
message | Событие в канале | channel, data — само событие |
pong | Ответ на ping | — |
error | Запрос клиента не выполнен | code, иногда channel |
Событие приходит в поле data сообщения с type: "message". В примере выше data
сокращён, а в примерах ниже показано его полное содержимое.
{
"type": "message",
"channel": "catalog",
"data": {
"id": "9b2f6c1e-4d7a-4f0b-8a3e-5c1d2e7f9a40",
"price": 148.5,
"event": "skin_price_changed"
}
}
Ошибки и коды закрытия
| Значение | Что означает |
|---|---|
forbidden | Подписка на чужой личный канал |
unknown_channel | Такого канала нет |
too_many_subscriptions | Больше 20 подписок на одном соединении |
invalid_json, unknown_action, message_too_large | Сообщение клиента не разобрано |
Код закрытия 4001 | Токен не передан, неверен или уже истёк |
Код закрытия 4002 | Срок токена истёк во время работы |
Код закрытия 4003 | Больше 10 соединений на аккаунт |
Код закрытия 4004 | Клиент не успевает читать сообщения |
Канал каталога
Один канал на все игры — отбирайте нужную по полю game_id. В событии
skin_price_changed поле price содержит уже новую цену.
Канал
catalog
События
| Что произошло | Событие |
|---|---|
| На маркете появился скин | skin_added |
| Скин снят с продажи | skin_deleted |
| У скина поменялась цена | skin_price_changed |
Сообщения всех трёх событий устроены одинаково: это тот же объект предмета, что и в
прайс-листе соответствующей игры, и к нему добавлено поле event с
названием события. От события к событию меняется только значение event, а набор полей зависит
от игры — переключайте вкладки, чтобы сравнить.
Сообщение — Counter-Strike 2
{
"id": "9b2f6c1e-4d7a-4f0b-8a3e-5c1d2e7f9a40",
"game_id": 730,
"name": "AWP | Asiimov (Field-Tested)",
"price": 148.5,
"delivery": 1,
"asset_id": "53540956125",
"class_id": "7993037085",
"float": "0.2744107246398926",
"paint_seed": 932,
"name_tag": null,
"inspect_link": "steam://run/730//+csgo_econ_action_preview%20B9A9415A72297CB8A1B0992EBB91BF89BD810F72114CBAF916BDDBB6B1B9A9628A842CE72507FCF5801504DBB6B1B9A9029C84A50FF207FCB9B08005DBB6B1B9A9339C841D20A007FC59E06505D13A393939B5C9B17896EAA2",
"stickers": [
{
"slot": 0,
"name": "Sticker | ZywOo (Foil) | Katowice 2019",
"wear": 0,
"image": "https://community.cloudflare.steamstatic.com/economy/image/i0CoZ81Ui0m-9KwlBY1L_18myuGuq1wfhWSaZgMttyVfPaERSR0Wqmu7LAocGJai0ki7VeTHjMGgIXSA7FVwptelsxb0SBrOhI_38i1k6f2nZOo-IvPAX2bHwrtw5rFtSii2zR9-sT7Tn4mvdC7BO1chWZckROZZska4jJS5YAEgste8"
}
],
"event": "skin_added"
}
730 — Counter-Strike 2, 570 — Dota 2,
252490 — Rust, 440 — Team Fortress 2
1 — сразу, 2 — в течение 12 часов
skin_added, skin_deleted или
skin_price_changed
Сообщение — Dota 2
{
"id": "3e8a1f52-7c94-4b6d-9f20-a1d4c7e85b13",
"game_id": 570,
"name": "Dragonclaw Hook",
"price": 412.3,
"delivery": 1,
"asset_id": "29384710562",
"class_id": "57949762",
"stickers": [
{
"slot": null,
"name": "Inscribed Towers Destroyed",
"wear": null,
"image": "https://cdn.steamstatic.com/apps/570/icons/econ/sockets/gem_stat.30d7935c1f0a1b9e8e28c691c2bd28f7d5f471bc.png"
}
],
"event": "skin_price_changed"
}
730 — Counter-Strike 2, 570 — Dota 2,
252490 — Rust, 440 — Team Fortress 2
1 — сразу, 2 — в течение 12 часов
skin_added, skin_deleted или
skin_price_changed
Сообщение — Rust
{
"id": "c47d9a06-2b5e-4e13-b8f7-6d0a3f91e2c5",
"game_id": 252490,
"name": "Tempered AK47",
"price": 38.5,
"delivery": 1,
"asset_id": "5193846207",
"class_id": "2143471514",
"event": "skin_deleted"
}
730 — Counter-Strike 2, 570 — Dota 2,
252490 — Rust, 440 — Team Fortress 2
1 — сразу, 2 — в течение 12 часов
skin_added, skin_deleted или
skin_price_changed
Сообщение — Team Fortress 2
{
"id": "f15b7e3a-90c2-4a68-8d41-2e6c9b0a7d38",
"game_id": 440,
"name": "Mann Co. Supply Crate Key",
"price": 2.14,
"delivery": 1,
"asset_id": "14872039561",
"class_id": "101785959",
"event": "skin_added"
}
730 — Counter-Strike 2, 570 — Dota 2,
252490 — Rust, 440 — Team Fortress 2
1 — сразу, 2 — в течение 12 часов
skin_added, skin_deleted или
skin_price_changed
Канал ваших покупок
Личный канал: в него приходят изменения только ваших покупок. userId — идентификатор вашего
аккаунта, он возвращается вместе с токеном подключения.
Канал
purchases:{userId}
События
| Что произошло | Событие |
|---|---|
| У покупки изменился статус или данные трейд-оффера | purchase_updated |
Сообщение
Сообщение содержит покупку целиком — тот же объект, что возвращает метод
/v1/market/info, — и поле event.
{
"purchase_id": "1f0c7a3e-5b2d-4c8f-9a61-3d7e2b9c4f50",
"custom_id": "order-10457",
"created_at": "2026-03-18T09:41:27.000Z",
"steam_id": "76561198319147164",
"skin": {
"id": "8f3a1d6e-b204-4c59-a6e7-1b9d5c0f7e23",
"name": "AK-47 | Slate (Field-Tested)",
"price": 3.48,
"status": "2",
"steam_trade_offer_id": "6981204573",
"error": null,
"return_reason": null,
"return_charged_commission": null
},
"event": "purchase_updated"
}
- Сообщение всегда описывает текущее состояние покупки, поэтому его достаточно просто сохранить поверх прежнего.
- Одно и то же состояние может прийти дважды. Покупка в конечном статусе больше не меняется — сообщения по ней после этого можно игнорировать.
Методы API
Баланс
Возвращает текущий баланс вашего аккаунта. Сумма указана в долларах США (USD).
Ответ
{
"data": {
"balance": 1284.37
}
}
Купить скин
Списывает цену скина с баланса и отправляет его получателю трейд-оффером в Steam. Ответ 200
означает, что покупка создана, — дальше следите за её статусом. Подробнее —
в разделе «Как проходит покупка».
partner и token берутся из трейд-ссылки получателя:
https://steamcommunity.com/tradeoffer/new/?partner=358881436&token=l6LFC3R8
Параметры
Передаются в теле запроса в формате JSON.
partner= в его трейд-ссылке Steamtoken=duplicate_custom_id
Ответ
{
"data": {
"purchase_id": "1f0c7a3e-5b2d-4c8f-9a61-3d7e2b9c4f50",
"custom_id": null,
"created_at": "2026-03-18T09:41:27.000Z",
"steam_id": "76561198319147164",
"skin": {
"id": "8f3a1d6e-b204-4c59-a6e7-1b9d5c0f7e23",
"name": "AK-47 | Slate (Field-Tested)",
"price": 3.48,
"status": "0",
"steam_trade_offer_id": null,
"error": null,
"return_reason": null,
"return_charged_commission": null
}
}
}
trade_canceled{
"message": "The partner field is required. (and 1 more error)",
"errors": {
"partner": [
"The partner field is required."
],
"token": [
"The token field is required."
]
}
}
Ошибки покупки
Если покупка не создана, деньги не списываются. Причину показывает поле code.
| Статус | code | Когда возникает | Можно ли повторить |
|---|---|---|---|
409 | skin_unavailable | Скин уже продан или зарезервирован другим покупателем | Нет |
409 | price_exceeded | Цена скина выше max_price | Да, с новым max_price |
409 | insufficient_balance | На балансе не хватает денег | Да, после пополнения |
409 | duplicate_custom_id | Этот custom_id уже занят прошлой покупкой. Она возвращается в поле data | Не нужно — покупка уже создана |
422 | invalid_trade_link | Из partner и token не получается рабочая трейд-ссылка | Да, с верной ссылкой |
403 | account_blocked | Ваш аккаунт заблокирован | Нет, обратитесь в поддержку |
500–504 | — | Сбой на стороне Avan Market или Steam, результат неизвестен | Только после проверки по custom_id |
Найти скины
Возвращает скины, которые прямо сейчас можно купить, — до 200 за один ответ. Следующая часть выдачи запрашивается по курсору.
Параметры
730 — Counter-Strike 2, 570 — Dota 2,
252490 — Rust, 440 — Team Fortress 2
name, вместе с качеством:
AWP | Asiimov (Field-Tested). Не больше 100 за один запрос
meta.next_page из предыдущего ответа
Ответ
{
"data": [
{
"id": "d2c5b8f1-3a46-4e70-9b1c-7e4f0a6d8c92",
"game_id": 730,
"name": "Glock-18 | Vogue (Field-Tested)",
"price": 1.86,
"delivery": 1,
"asset_id": "40217735519",
"class_id": "5114539218",
"float": "0.3127450406551361",
"paint_seed": null,
"name_tag": null,
"inspect_link": null,
"stickers": [
{
"slot": 0,
"name": "Sticker | ZywOo (Foil) | Katowice 2019",
"wear": 0,
"image": "https://community.cloudflare.steamstatic.com/economy/image/i0CoZ81Ui0m-9KwlBY1L_18myuGuq1wfhWSaZgMttyVfPaERSR0Wqmu7LAocGJai0ki7VeTHjMGgIXSA7FVwptelsxb0SBrOhI_38i1k6f2nZOo-IvPAX2bHwrtw5rFtSii2zR9-sT7Tn4mvdC7BO1chWZckROZZska4jJS5YAEgste8"
}
]
}
],
"meta": {
"per_page": 200,
"next_page": "eyJwIjoiZDJjNWI4ZjEtM2E0Ni00ZTcwLTliMWMtN2U0ZjBhNmQ4YzkyIn0"
}
}
1 — сразу, 2 — в течение 12 часовnext_page. null, если выдача закончилась
{
"message": "The selected game is invalid.",
"errors": {
"game": [
"The selected game is invalid."
]
}
}
Статусы купленных скинов
Показывает, что сейчас происходит с купленными скинами: возвращает текущий статус каждой покупки.
- Нужно передать хотя бы один из двух параметров.
-
Покупки, которые не найдены, в ответ не попадают — ошибки при этом не будет. Так можно проверить,
создалась ли покупка с вашим
custom_id. - Для постоянного наблюдения за статусами используйте WebSockets, а этот метод — для сверки после обрыва соединения.
Параметры
custom_id, указанные при покупке. Не больше 200 за один запрос
purchase_id из ответов на покупку, в формате UUID. Не больше 200 за один запрос
Ответ
{
"data": [
{
"purchase_id": "1f0c7a3e-5b2d-4c8f-9a61-3d7e2b9c4f50",
"custom_id": null,
"created_at": "2026-03-18T09:41:27.000Z",
"steam_id": "76561198319147164",
"skin": {
"id": "8f3a1d6e-b204-4c59-a6e7-1b9d5c0f7e23",
"name": "AK-47 | Slate (Field-Tested)",
"price": 3.48,
"status": "6",
"steam_trade_offer_id": "6981204573",
"error": null,
"return_reason": "trade_canceled",
"return_charged_commission": null
}
}
]
}
trade_canceled{
"message": "The purchase ids field must not have more than 200 items.",
"errors": {
"purchase_ids": [
"The purchase ids field must not have more than 200 items."
]
}
}
Значения поля status
Статус покупки приходит строкой с числовым кодом. Покупка в конечном статусе больше не меняется: следить за ней дальше не нужно.
| Код | Название | Что означает | Конечный |
|---|---|---|---|
"0" |
Processing | Покупка обрабатывается, трейд ещё не отправлен | Нет |
"2" |
Active | Трейд отправлен и ждёт, пока получатель его примет | Нет |
"3" |
Accepted | Трейд принят, скин передан | Да |
"6" |
Canceled | Трейд отменён либо покупка не прошла проверку | Да |
"7" |
Declined | Получатель отклонил трейд | Да |
"8" |
InvalidItems | Предмет оказался недоступен для передачи | Да |
"10" |
CreateFailed | Не удалось создать трейд | Да |
История покупок
Возвращает все покупки вашего аккаунта, от новых к старым, — по 200 на страницу. Пагинация — по страницам.
Параметры
Ответ
{
"data": [
{
"purchase_id": "1f0c7a3e-5b2d-4c8f-9a61-3d7e2b9c4f50",
"custom_id": null,
"created_at": "2026-03-18T09:41:27.000Z",
"steam_id": "76561198319147164",
"skin": {
"id": "8f3a1d6e-b204-4c59-a6e7-1b9d5c0f7e23",
"name": "AK-47 | Slate (Field-Tested)",
"price": 3.48,
"status": "6",
"steam_trade_offer_id": "6981204573",
"error": null,
"return_reason": "trade_canceled",
"return_charged_commission": null
}
}
],
"meta": {
"current_page": 1,
"last_page": 6,
"per_page": 200,
"total": 1150
}
}
trade_canceled{
"message": "The start unix time field must be an integer.",
"errors": {
"start_unix_time": [
"The start unix time field must be an integer."
]
}
}
Проверка наличия перед покупкой
Показывает, какие скины из списка ещё можно купить и по какой цене. Проверка ничего не резервирует: между ней и покупкой скин может уйти другому покупателю, а цена — измениться.
Параметры
Ответ
{
"data": {
"available_skins": {
"41c7e9a2-6f58-4d03-b1a4-9e2c8d5f0b76": 0.37,
"8f3a1d6e-b204-4c59-a6e7-1b9d5c0f7e23": 3.48
},
"unavailable_skin_ids": []
}
}
{
"message": "The ids field is required.",
"errors": {
"ids": [
"The ids field is required."
]
}
}
Токен для WebSockets
Возвращает временный токен для подключения к WebSockets. Запрашивайте новый токен при каждом подключении и когда истекает срок прежнего.
Ответ
{
"data": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI0ODIxMyIsImV4cCI6MTc3MzgzMDQ4N30.Vx3kQ9mT2rLp8sNa6fWcY1hJ4bZoEu7dG0iKqRyM5tC",
"user_id": 48213,
"expires_at": 1773830487
}
}
purchases:{userId}