API аукциона STALZONE
Открытый API с ценами аукциона: медианы продаж за сутки, неделю и месяц, сетка цен артефактов по редкости и заточке, графики, оборот и лоты, выставленные прямо сейчас. Ключ не нужен.
Данные собираются из официального API игры: история продаж по 103 артефактам и примерно 1400 другим предметам, которые бывают на аукционе, и все активные лоты по ним. Сервис сам считает медианы и хранит историю, так что вам не нужно тратить свой лимит API игры.
Быстрый старт
Найти предмет по названию и получить его id:
curl 'https://auction.sctools.tech/api/search?q=чернильница'
Медиана цены редкой (qlt=3) Чернильницы без заточки за 30 дней:
curl -X POST 'https://auction.sctools.tech/api/prices' \
-H 'Content-Type: application/json' \
-d '{"items":[{"id":"wgvd","qlt":3,"ptn":0}]}'Самые дешевые лоты, которые можно выкупить прямо сейчас:
curl 'https://auction.sctools.tech/api/items/wgvd/lots?qlt=3&buyout_only=true&limit=10'
Из браузера:
const r = await fetch('https://auction.sctools.tech/api/items/wgvd');
const item = await r.json();
console.log(item.name, item.averages['3']['0-4'].avg_price);Понятия
Id предмета
Короткая строка из базы игры, например wgvd (Чернильница) или dm6l2 (Протоартефакт). Удобнее всего искать через поиск: он понимает и название, и id. Тот же id используется в открытой базе предметов игры.
Тип предмета
Поле kind:
artefact— артефакт. Цены считаются отдельно по редкостиqltи заточкеptn, история хранится 35 дней.general— все остальное: оружие, броня, расходники, ресурсы. Цена одна на предмет, история — до 10 000 последних продаж, поэтому у редких предметов она уходит дальше месяца.
Редкость qlt
Заточка ptn и уровни lvl
Заточка артефакта — число от 0 до 15. Для цен заточки объединены в четыре корзины, иначе по высоким уровням было бы слишком мало продаж:
| Корзина | Заточка ptn | lvl в фильтрах |
|---|---|---|
0-4 | 0–4 | 0 |
5-9 | 5–9 | 5 |
10-14 | 10–14 | 10 |
15 | 15 | 15 |
Цена
- Все цены — в рублях игры, целые или с двумя знаками после запятой.
- Лот может быть пачкой:
price— цена всей пачки,unit_price— цена за штуку. Все медианы считаются по цене за штуку, поэтому большие пачки их не искажают. - Поле
avg_priceисторически называется «средней», но это медиана.
Время
Все даты — UTC в формате ISO 8601: 2026-11-06T14:20:44Z.
Поиск предметов
/api/searchИщет по названию (без учета регистра, по подстроке) и по id. Выдача отсортирована по обороту за сутки; при равном обороте выше точное совпадение id, затем названия, затем совпадение в начале названия.
| Параметр | Тип | Описание |
|---|---|---|
q | string, 1–64 | Обязательный. Часть названия или id. |
limit | int, 1–60 | Сколько предметов вернуть. По умолчанию 20. |
Ответ такой же, как у оборота за сутки; предметы без продаж за сутки тоже попадают в выдачу, с нулями.
{
"hours": 24,
"generated_at": "2026-11-06T14:54:26Z",
"items": [
{ "rank": 1, "item_id": "wgvd", "name": "Чернильница", "kind": "artefact",
"turnover": 6291928, "lots": 38, "units": 38 }
]
}Оборот за сутки
/api/leaders20 предметов с самым большим оборотом за последние 24 часа. Ответ кэшируется на 45 секунд.
| Поле | Тип | Описание |
|---|---|---|
hours | int | Окно в часах, всегда 24. |
generated_at | datetime | Когда посчитан список. |
items[].rank | int | Место, с 1. |
items[].item_id | string | Id предмета. |
items[].name | string | Название на русском. |
items[].kind | string | artefact или general. |
items[].turnover | int | Оборот: сумма цен проданных лотов. |
items[].lots | int | Сколько лотов продано. |
items[].units | int | Сколько штук продано (с учетом пачек). |
{
"hours": 24,
"generated_at": "2026-11-06T14:54:26Z",
"items": [
{ "rank": 1, "item_id": "1pyq", "name": "Оружейный модуль", "kind": "general",
"turnover": 3073807053, "lots": 1180, "units": 1180 },
{ "rank": 2, "item_id": "y3nmw", "name": "Продвинутые запчасти", "kind": "general",
"turnover": 1793112571, "lots": 11333, "units": 36099 }
]
}Предмет
/api/items/{item_id}Медианы цены и 10 последних продаж. Формат зависит от типа: у артефакта — сетка по редкости и заточке в averages, у остальных предметов — медианы по периодам в medians. Второе поле при этом пустое.
| Поле | Тип | Описание |
|---|---|---|
item_id, name, kind | string | Id, название, тип. |
on_auction | bool | Бывает ли предмет на аукционе. Предметы, которые там не продаются, перепроверяются раз в неделю. |
bootstrap_done | bool | История предмета загружена полностью. |
last_scan_at | datetime | Когда история последний раз сверялась с игрой. |
lots_per_hour | float | Темп продаж: сколько лотов продано за последние сутки, деленное на 24. |
keep_all_lots | bool | У предмета хранится вся доступная история, а не только месяц. |
averages | object | Только артефакты. averages[qlt][корзина], где qlt — строка от "0" до "6", корзина — 0-4, 5-9, 10-14, 15. |
…avg_price | float | null | Медиана цены за штуку по 50 последним продажам за 30 дней. null, если продаж не было. |
…lots_used | int | По скольким продажам посчитана медиана (не больше 50). |
…lots_month | int | Сколько всего продаж в корзине за 30 дней. |
medians | object | Только обычные предметы. Ключи day, week, month, all; в каждом avg_price (медиана цены за штуку по всем продажам периода) и lots. |
recent_lots[] | array | 10 последних продаж: t, amount, price, unit_price, у артефактов еще qlt, ptn, spawn_time (мс, когда артефакт появился в мире), upgrade_bonus. |
{
"item_id": "wgvd",
"name": "Чернильница",
"kind": "artefact",
"on_auction": true,
"bootstrap_done": true,
"last_scan_at": "2026-11-06T14:38:16Z",
"keep_all_lots": false,
"averages": {
"3": {
"0-4": { "avg_price": 65045.0, "lots_used": 50, "lots_month": 254 },
"5-9": { "avg_price": 150000.0, "lots_used": 7, "lots_month": 7 },
"10-14": { "avg_price": 700000.0, "lots_used": 5, "lots_month": 5 },
"15": { "avg_price": 1000000.5, "lots_used": 24, "lots_month": 24 }
}
},
"medians": {},
"recent_lots": [
{ "t": "2026-11-06T14:20:44Z", "amount": 1, "price": 75000, "unit_price": 75000.0,
"qlt": 3, "ptn": 0, "spawn_time": 1793963473479, "upgrade_bonus": 0 }
]
}{
"item_id": "dm6l2",
"name": "Протоартефакт",
"kind": "general",
"keep_all_lots": true,
"averages": {},
"medians": {
"day": { "avg_price": 3249.75, "lots": 5975 },
"week": { "avg_price": 3500.0, "lots": 49840 },
"month": { "avg_price": 3000.0, "lots": 124120 },
"all": { "avg_price": 3000.0, "lots": 124120 }
},
"recent_lots": [
{ "t": "2026-11-06T14:50:24Z", "amount": 2, "price": 3500, "unit_price": 1750.0,
"qlt": null, "ptn": null, "spawn_time": null, "upgrade_bonus": null }
]
}Цены списком
/api/pricesЦены до 100 позиций за один запрос — удобно, чтобы оценить сборку или инвентарь. У артефакта берется медиана корзины, в которую попадает ptn (12 → 10-14). У обычного предмета qlt и ptn не влияют на цену, но передать их нужно: подойдут нули.
| Поле запроса | Тип | Описание |
|---|---|---|
items[] | array, 1–100 | Позиции. |
items[].id | string | Id предмета. |
items[].qlt | int, 0–6 | Редкость. |
items[].ptn | int, 0–15 | Заточка. |
| Поле ответа | Тип | Описание |
|---|---|---|
items[] | array | В том же порядке, что в запросе. |
…id, name, qlt, ptn | Повтор запроса и название. | |
…ptn_bucket | string | null | Корзина заточки; у обычных предметов null. |
…price | float | null | Медиана цены за штуку. Артефакт — по 50 последним продажам корзины за 30 дней; обычный предмет — по всей хранимой истории. |
…lots_used | int | По скольким продажам посчитана цена. |
…lots_month | int | Продаж за 30 дней. |
…error | string | null | unknown_item — такого id нет; invalid_ptn — заточка вне корзин. |
curl -X POST 'https://auction.sctools.tech/api/prices' \
-H 'Content-Type: application/json' \
-d '{"items":[{"id":"wgvd","qlt":3,"ptn":0},{"id":"dm6l2","qlt":0,"ptn":0},{"id":"zzzz","qlt":0,"ptn":0}]}'{
"items": [
{ "id": "wgvd", "name": "Чернильница", "qlt": 3, "ptn": 0, "ptn_bucket": "0-4",
"price": 65045.0, "lots_used": 50, "lots_month": 254, "error": null },
{ "id": "dm6l2", "name": "Протоартефакт", "qlt": 0, "ptn": 0, "ptn_bucket": null,
"price": 3000.0, "lots_used": 124120, "lots_month": 124120, "error": null },
{ "id": "zzzz", "name": "zzzz", "qlt": 0, "ptn": 0, "ptn_bucket": null,
"price": null, "lots_used": 0, "lots_month": 0, "error": "unknown_item" }
]
}График цены
/api/items/{item_id}/chartМедиана цены за штуку по интервалам за четыре периода. Периода без продаж в ответе нет.
| Параметр | Тип | Описание |
|---|---|---|
qlt | int, 0–6 | Только эта редкость. |
lvl | 0, 5, 10, 15 | Только корзина заточки, начинающаяся с этого уровня. |
ptn | int, 0–15 | Только точная заточка. Если передан lvl, ptn не учитывается. |
Ключ series | Период | Интервал bucket |
|---|---|---|
day | 24 часа | 1h |
week | 7 дней | 1d |
month | 30 дней | 1d |
all | вся хранимая история | подбирается так, чтобы точек было не больше 50: от 1h до 30d |
Точка: t — начало интервала (UTC), price — медиана за штуку, lots — продаж в интервале. Интервалы без продаж пропускаются.
{
"item_id": "wgvd",
"name": "Чернильница",
"kind": "artefact",
"aggregation": "median_unit",
"qlt": 3, "ptn": null, "lvl": 0,
"series": {
"day": { "bucket": "1h", "points": [ { "t": "2026-11-05T20:00:00Z", "price": 110000.0, "lots": 1 } ] },
"week": { "bucket": "1d", "points": [ { "t": "2026-10-30T00:00:00Z", "price": 48332.5, "lots": 6 } ] },
"month": { "bucket": "1d", "points": [ { "t": "2026-10-07T00:00:00Z", "price": 55777.0, "lots": 8 } ] },
"all": { "bucket": "1d", "points": [ { "t": "2026-10-02T00:00:00Z", "price": 45000.0, "lots": 2 } ] }
}
}Активные лоты
/api/items/{item_id}/lotsЛоты, которые выставлены на аукционе сейчас. Сервис держит копию списка по каждому предмету и регулярно сверяет ее с игрой (см. свежесть данных).
| Параметр | Тип | Описание |
|---|---|---|
sort | string | unit — дешевле за штуку (по умолчанию), price — дешевле по цене выкупа, new — недавно выставленные, ending — скоро закончатся. В сортировках по цене лоты без выкупа идут в конце. |
qlt | int, 0–6 | Только эта редкость. |
ptn | int, 0–15 | Только эта заточка. |
lvl | 0, 5, 10, 15 | Только корзина заточки. |
buyout_only | bool | true — только лоты, которые можно выкупить сразу. |
limit | int, 1–500 | Сколько строк вернуть. По умолчанию 50. |
offset | int | Сдвиг для постраничного чтения. |
| Поле | Тип | Описание |
|---|---|---|
api_total | int | null | Сколько лотов предмета показала игра при последней сверке. |
stored | int | Сколько активных лотов предмета известно сервису. |
matched | int | Сколько из них подходит под фильтры — для постраничного чтения. |
min_unit_price | float | null | Самая низкая цена выкупа за штуку среди подходящих лотов. |
synced_at | datetime | null | Последняя сверка с игрой. |
full_synced_at | datetime | null | Последний полный перебор всех лотов предмета. |
lots[].amount | int | Штук в лоте. |
lots[].copies | int | Сколько одинаковых лотов выставлено. Игроки часто выставляют пачку одинаковых лотов; они приходят одной строкой. |
lots[].buyout_price | int | null | Цена выкупа всего лота; null — выкупа нет, только ставки. |
lots[].unit_price | float | null | Цена выкупа за штуку. |
lots[].start_price | int | Стартовая ставка. |
lots[].current_price | int | null | Текущая ставка, если ее кто-то сделал. |
lots[].start_time, end_time | datetime | Когда лот выставлен и когда снимется. |
lots[].qlt, ptn, spawn_time | int | null | Свойства артефакта; у обычных предметов null. |
lots[].additional | object | null | Все дополнительные свойства лота, как их отдает игра, например bonus_properties или it_transf_count. |
{
"item_id": "wgvd",
"name": "Чернильница",
"kind": "artefact",
"api_total": 76,
"stored": 76,
"matched": 25,
"synced_at": "2026-11-06T14:29:49Z",
"full_synced_at": "2026-11-06T14:29:49Z",
"min_unit_price": 79000.0,
"lots": [
{ "amount": 1, "copies": 1, "start_price": 0, "current_price": null,
"buyout_price": 79000, "unit_price": 79000.0,
"start_time": "2026-11-06T12:05:18Z", "end_time": "2026-11-07T00:05:18Z",
"qlt": 3, "ptn": 0, "spawn_time": 1781021437368,
"additional": { "it_transf_count": 1, "qlt": 3, "upgrade_bonus": 0.0, "spawn_time": 1781021437368 } },
{ "amount": 1, "copies": 1, "start_price": 80000, "current_price": null,
"buyout_price": 82000, "unit_price": 82000.0,
"start_time": "2026-11-06T10:19:17Z", "end_time": "2026-11-08T10:19:17Z",
"qlt": 3, "ptn": 0, "spawn_time": 1793908229675,
"additional": { "qlt": 3, "upgrade_bonus": 0.0, "spawn_time": 1793908229675 } }
]
}Состояние сервиса
/api/healthНасколько загружены данные и как идет сбор. Полезно проверить перед массовыми запросами или показать у себя индикатор.
| Поле | Описание |
|---|---|
status | ok, если сервис отвечает. |
ready | История всех артефактов загружена. |
items_total, bootstrap_done | Артефактов всего и загружено. |
general_total, general_on_auction | Обычных предметов в каталоге и сколько из них бывает на аукционе. |
general_ready | Обычные предметы загружены. |
lots | Продаж в базе. |
active | Сбор активных лотов: active_items_tracked, active_items_synced, active_lots_stored и другие счетчики. |
Остальные поля служебные (нагрузка на API игры, текущие задачи) и могут меняться.
Ошибки
Ошибка приходит с HTTP-кодом и телом {"detail": …}.
| Код | Когда | Пример detail |
|---|---|---|
404 | Нет предмета с таким id | "Unknown item id" |
400 | Недопустимое значение sort или lvl | "lvl must be 0, 5, 10 or 15" |
422 | Параметр вне диапазона или неверного типа | список ошибок с полями loc, msg, input |
5xx | Сбой сервиса | повторите запрос позже |
{
"detail": [
{ "type": "less_than_equal", "loc": ["query", "limit"],
"msg": "Input should be less than or equal to 500", "input": "9999", "ctx": { "le": 500 } }
]
}В ценах списком неизвестный id не ломает весь запрос: у такой позиции просто "error": "unknown_item".
Свежесть данных
- Продажи. История каждого предмета сверяется с игрой тем чаще, чем чаще он продается: от раза в 30 секунд у самых ходовых до раза в 30 минут у редких. Время последней сверки —
last_scan_at. - Активные лоты. Самые дешевые и самые новые лоты предмета обновляются от раза в минуту до раза в 30 минут, тоже по скорости продаж; лоты артефактов — не реже раза в 5 минут. Полный перебор всех лотов крупных предметов — раз в 30 минут – 3 часа. Лоты с истекшим сроком убираются сразу. Время сверки —
synced_at. - Хранение. Продажи артефактов хранятся 35 дней, у остальных предметов — до 10 000 последних продаж.
- Каталог. Список предметов обновляется раз в сутки; новые предметы появляются в поиске на следующий день.
synced_at показывает, насколько свежий список.Правила и лимиты
- Ключ и регистрация не нужны, CORS открыт для любых сайтов.
- Жесткого лимита запросов сейчас нет, но сервис общий. Кэшируйте ответы у себя: данные по предмету чаще раза в минуту обновлять бессмысленно.
- Для оценки многих предметов используйте один
POST /api/prices, а не сотню отдельных запросов. - Сервис может ограничить клиентов, которые создают чрезмерную нагрузку.
- Новые поля в ответах могут появляться без предупреждения — не завязывайтесь на точный набор полей. Существующие поля не удаляются и не меняют смысл.
OpenAPI
Машиночитаемое описание всех методов — /openapi.json. По нему можно сгенерировать клиент на любом языке. Интерактивная консоль, где можно отправить запрос из браузера, — /swagger.