SC Tools/API К ценам

API аукциона STALZONE

Открытый API с ценами аукциона: медианы продаж за сутки, неделю и месяц, сетка цен артефактов по редкости и заточке, графики, оборот и лоты, выставленные прямо сейчас. Ключ не нужен.

Адресauction.sctools.tech
ФорматJSON, UTF-8
ДоступБез ключа, CORS *
РегионRU

Данные собираются из официального 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'

Из браузера:

JavaScript
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

0обычный
1необычный
2особый
3редкий
4исключительный
5легендарный
6уникальный

Заточка ptn и уровни lvl

Заточка артефакта — число от 0 до 15. Для цен заточки объединены в четыре корзины, иначе по высоким уровням было бы слишком мало продаж:

КорзинаЗаточка ptnlvl в фильтрах
0-40–40
5-95–95
10-1410–1410
151515

Цена

  • Все цены — в рублях игры, целые или с двумя знаками после запятой.
  • Лот может быть пачкой: price — цена всей пачки, unit_price — цена за штуку. Все медианы считаются по цене за штуку, поэтому большие пачки их не искажают.
  • Поле avg_price исторически называется «средней», но это медиана.

Время

Все даты — UTC в формате ISO 8601: 2026-11-06T14:20:44Z.

Оборот за сутки

GET/api/leaders

20 предметов с самым большим оборотом за последние 24 часа. Ответ кэшируется на 45 секунд.

ПолеТипОписание
hoursintОкно в часах, всегда 24.
generated_atdatetimeКогда посчитан список.
items[].rankintМесто, с 1.
items[].item_idstringId предмета.
items[].namestringНазвание на русском.
items[].kindstringartefact или general.
items[].turnoverintОборот: сумма цен проданных лотов.
items[].lotsintСколько лотов продано.
items[].unitsintСколько штук продано (с учетом пачек).
GET /api/leaders
{
  "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 }
  ]
}

Предмет

GET/api/items/{item_id}

Медианы цены и 10 последних продаж. Формат зависит от типа: у артефакта — сетка по редкости и заточке в averages, у остальных предметов — медианы по периодам в medians. Второе поле при этом пустое.

ПолеТипОписание
item_id, name, kindstringId, название, тип.
on_auctionboolБывает ли предмет на аукционе. Предметы, которые там не продаются, перепроверяются раз в неделю.
bootstrap_doneboolИстория предмета загружена полностью.
last_scan_atdatetimeКогда история последний раз сверялась с игрой.
lots_per_hourfloatТемп продаж: сколько лотов продано за последние сутки, деленное на 24.
keep_all_lotsboolУ предмета хранится вся доступная история, а не только месяц.
averagesobjectТолько артефакты. averages[qlt][корзина], где qlt — строка от "0" до "6", корзина — 0-4, 5-9, 10-14, 15.
…avg_pricefloat | nullМедиана цены за штуку по 50 последним продажам за 30 дней. null, если продаж не было.
…lots_usedintПо скольким продажам посчитана медиана (не больше 50).
…lots_monthintСколько всего продаж в корзине за 30 дней.
mediansobjectТолько обычные предметы. Ключи day, week, month, all; в каждом avg_price (медиана цены за штуку по всем продажам периода) и lots.
recent_lots[]array10 последних продаж: t, amount, price, unit_price, у артефактов еще qlt, ptn, spawn_time (мс, когда артефакт появился в мире), upgrade_bonus.
GET /api/items/wgvd — артефакт, сокращено
{
  "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 }
  ]
}
GET /api/items/dm6l2 — обычный предмет, сокращено
{
  "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 }
  ]
}

Цены списком

POST/api/prices

Цены до 100 позиций за один запрос — удобно, чтобы оценить сборку или инвентарь. У артефакта берется медиана корзины, в которую попадает ptn (12 → 10-14). У обычного предмета qlt и ptn не влияют на цену, но передать их нужно: подойдут нули.

Поле запросаТипОписание
items[]array, 1–100Позиции.
items[].idstringId предмета.
items[].qltint, 0–6Редкость.
items[].ptnint, 0–15Заточка.
Поле ответаТипОписание
items[]arrayВ том же порядке, что в запросе.
…id, name, qlt, ptnПовтор запроса и название.
…ptn_bucketstring | nullКорзина заточки; у обычных предметов null.
…pricefloat | nullМедиана цены за штуку. Артефакт — по 50 последним продажам корзины за 30 дней; обычный предмет — по всей хранимой истории.
…lots_usedintПо скольким продажам посчитана цена.
…lots_monthintПродаж за 30 дней.
…errorstring | nullunknown_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" }
  ]
}

График цены

GET/api/items/{item_id}/chart

Медиана цены за штуку по интервалам за четыре периода. Периода без продаж в ответе нет.

ПараметрТипОписание
qltint, 0–6Только эта редкость.
lvl0, 5, 10, 15Только корзина заточки, начинающаяся с этого уровня.
ptnint, 0–15Только точная заточка. Если передан lvl, ptn не учитывается.
Ключ seriesПериодИнтервал bucket
day24 часа1h
week7 дней1d
month30 дней1d
allвся хранимая историяподбирается так, чтобы точек было не больше 50: от 1h до 30d

Точка: t — начало интервала (UTC), price — медиана за штуку, lots — продаж в интервале. Интервалы без продаж пропускаются.

GET /api/items/wgvd/chart?qlt=3&lvl=0 — сокращено
{
  "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 } ] }
  }
}

Активные лоты

GET/api/items/{item_id}/lots

Лоты, которые выставлены на аукционе сейчас. Сервис держит копию списка по каждому предмету и регулярно сверяет ее с игрой (см. свежесть данных).

ПараметрТипОписание
sortstringunit — дешевле за штуку (по умолчанию), price — дешевле по цене выкупа, new — недавно выставленные, ending — скоро закончатся. В сортировках по цене лоты без выкупа идут в конце.
qltint, 0–6Только эта редкость.
ptnint, 0–15Только эта заточка.
lvl0, 5, 10, 15Только корзина заточки.
buyout_onlybooltrue — только лоты, которые можно выкупить сразу.
limitint, 1–500Сколько строк вернуть. По умолчанию 50.
offsetintСдвиг для постраничного чтения.
ПолеТипОписание
api_totalint | nullСколько лотов предмета показала игра при последней сверке.
storedintСколько активных лотов предмета известно сервису.
matchedintСколько из них подходит под фильтры — для постраничного чтения.
min_unit_pricefloat | nullСамая низкая цена выкупа за штуку среди подходящих лотов.
synced_atdatetime | nullПоследняя сверка с игрой.
full_synced_atdatetime | nullПоследний полный перебор всех лотов предмета.
lots[].amountintШтук в лоте.
lots[].copiesintСколько одинаковых лотов выставлено. Игроки часто выставляют пачку одинаковых лотов; они приходят одной строкой.
lots[].buyout_priceint | nullЦена выкупа всего лота; null — выкупа нет, только ставки.
lots[].unit_pricefloat | nullЦена выкупа за штуку.
lots[].start_priceintСтартовая ставка.
lots[].current_priceint | nullТекущая ставка, если ее кто-то сделал.
lots[].start_time, end_timedatetimeКогда лот выставлен и когда снимется.
lots[].qlt, ptn, spawn_timeint | nullСвойства артефакта; у обычных предметов null.
lots[].additionalobject | nullВсе дополнительные свойства лота, как их отдает игра, например bonus_properties или it_transf_count.
GET /api/items/wgvd/lots?qlt=3&limit=2
{
  "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 } }
  ]
}

Состояние сервиса

GET/api/health

Насколько загружены данные и как идет сбор. Полезно проверить перед массовыми запросами или показать у себя индикатор.

ПолеОписание
statusok, если сервис отвечает.
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Сбой сервисаповторите запрос позже
GET /api/items/wgvd/lots?limit=9999 → 422
{
  "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.