Skip to main content

Исправления

Покупка, упавшая по таймауту, теперь отвечает 504, а не 500. Если маркетплейс перестал отвечать посреди покупки, результат по-настоящему неизвестен — она могла и пройти. POST /market/buy и POST /orders возвращают для этого случая 504 upstream_timeout и прямо об этом пишут.Главное: ключ идемпотентности теперь удерживается, а не освобождается. Повторная отправка того же custom_id / Idempotency-Key воспроизведёт исходный результат, а не купит второй раз; ретрай, присланный пока исход не определён, получит 409 idempotency_in_progress. Прежде чем считать 504 неудачей, опросите список заказов. Детерминированные ошибки (цена ушла, не хватает баланса, предмет недоступен) не изменились.Проигранная гонка теперь отвечает 409 concurrent_update. Если два заказа одновременно затронули одни и те же предметы, транзакция проигравшего откатывается целиком — ничего не списано и ничего не зарезервировано. Раньше это выглядело как 500, теперь это 409 с Retry-After, потому что повтор здесь и есть правильное действие.

Новые возможности

Не опрашивайте новые листинги — подпишитесь на нихДо сегодняшнего дня единственным способом заметить новый инвентарь было чаще опрашивать GET /v1/listings, а эта нагрузка не делится между клиентами: десять интеграторов по 300 запросов в минуту — это десять отдельных глубоких сканирований одной и той же таблицы, возвращающих почти одинаковые строки. Хуже того, то, что все опрашивали, не могло ответить на вопрос: sort=newest сортировал по моменту создания записи, поэтому предметы, возвращающиеся в каталог из отменённых заказов, истёкших трейд-офферов и снятых холдов, никогда не всплывали наверх — с какой бы частотой их ни опрашивали.Три дополнения, полностью обратно совместимые:
  • Новый эндпоинт GET /v1/listings/stream — Server-Sent Events. Одно соединение заменяет любой цикл опроса и присылает события gone наравне с new. Эта вторая половина недоступна опросу в принципе: поллер узнаёт о продаже, только попытавшись купить и получив отказ. Переподключение происходит без пропусков через стандартный заголовок Last-Event-ID, в том числе через наши деплои.
  • Новый query-параметр available_after у GET /v1/listings — превращает опрос в чтение дельты. Обычный ответ — пустая страница. Перекрывайте вотермарку примерно на 60 секунд и дедуплицируйте по id; в описании параметра объяснено, почему это перекрытие обязательно.
  • Новое поле listed_at у каждого Listing — момент попадания предмета в каталог, и именно по нему теперь сортирует sort=newest. Перевыставленные предметы всплывают наравне с действительно новыми.
Форма существующих ответов не меняется: sort=newest сохранил и название, и направление сортировки — он просто перестал скрывать перевыставления.

Исправления

Исправлены лимиты в документацииОпубликованные лимиты были занижены: точечные чтения — 100 запросов в минуту, а не 30, а POST /v1/orders250 в минуту, а не 30. Если вы рассчитывали клиент по старым цифрам, запас у вас больше, чем вы думали. А если собирались просить повышение — сначала попробуйте available_after или стрим.

Новые возможности

Instant Sell API (по приглашению)Продавайте скины CS2 программно через сеть ботов CSBoard. Получите котировку по Steam-инвентарю, создайте заказ на продажу — и средства зачислятся на баланс CSBoard после снятия Steam-блокировки на защиту трейда (~8 дней).
  • Получайте котировку по любому Steam-инвентарю через POST /v1/sell/quotes — для каждого подходящего предмета возвращается точная сумма в USD, которая будет вам зачислена.
  • Создавайте заказы через POST /v1/sell/orders с опциональной защитой от изменения цены min_total_usd и идемпотентностью через external_id.
  • Отслеживайте жизненный цикл (pendingoffer_sentreceivedcompleted) и зачисленные суммы через GET /v1/sell/orders/:id. Крупные корзины могут разбиваться максимум на 3 ботов.
  • Каждый оффер содержит Steam-профиль отправляющего бота и trade_offer_id, чтобы вы могли показать продавцам проверки против выдачи себя за другого.
  • Доступ выдаётся по аккаунту — вызовите GET /v1/sell/status, чтобы проверить его, и обратитесь в поддержку, чтобы запросить доступ.
Полное пошаговое руководство см. в гайде Instant Sell.

Fixes

Precise 402 error codes on POST /v1/market/buyThe endpoint now distinguishes the two out-of-funds cases instead of always returning insufficient_settled_balance:
  • insufficient_balance — the account balance is simply lower than the order total. Top up and retry.
  • insufficient_settled_balance — the balance covers the total, but part of it is still inside the reversal window and cannot fund external delivery yet.
Both responses now include balance_usd alongside required_usd and settled_usd, so a bot can tell the cases apart programmatically. If your integration matched on the insufficient_settled_balance code for generic low-funds handling, match on HTTP 402 instead.Held orders also gained a small post-unlock grace before claimable flips to true — claiming at the exact unlock instant previously failed on the marketplace side.

Новые возможности

Claim заказов из холда через APIЗаказы, попавшие под холд маркетплейса (status: "hold" с меткой hold_until), теперь можно забрать программно. После того как hold_until прошёл, вызовите POST /v1/orders/:id/claim, чтобы освободить заказ. После успешного claim маркетплейс отправляет Steam-трейд, который ваш бот должен принять за ~15 минут. Часть заказов доставляется автоматически — в этом случае вызов является безвредным no-op.Настройка аккаунта autoclaimУстановите autoclaim: true в POST /v1/orders или POST /v1/market/buy — и каждый заказ из холда будет автоматически забираться в момент снятия блокировки, без отдельного вызова claim. Флаг является «липким» на уровне аккаунта.Точный фильтр name для листингов и ценПередавайте параметр запроса name в GET /v1/listings или GET /v1/prices, чтобы получить один предмет по его точному market_hash_name (без учёта регистра). В отличие от search, который выполняет нечёткое сопоставление слов и может выдавать пересекающиеся названия (например, Spectrum Case и Spectrum 2 Case), name возвращает только тот предмет, который вы запросили. Когда переданы оба параметра, приоритет имеет name — больше никакой пост-фильтрации ответа.Примеры использования см. в Рыночные данные.