Skip to main content

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

Покупка Dota 2 и Rust с доставкой на любой trade URLPOST /v1/market/buy теперь принимает appId в теле, как POST /v1/orders: 570 для Dota 2, 252490 для Rust. Без appId эндпоинт покупает CS2, как раньше.
  • Оплата и доставка те же, что у CS2: только settled-баланс, скины уходят на trade URL из partner + token.
  • В заказе Dota 2 или Rust до 10 id. Больше — 400 too_many_items.
  • Заказы Dota 2 и Rust ставятся в очередь, поэтому каждый скин сначала отвечает pending. Следите за заказом через GET /v1/orders/info или вебхук order.updated.

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

Dota 2 и Rust через тот же API — игра выбирается параметром appIdТеперь CSBoard продаёт не только CS2, но и предметы Dota 2 и Rust, а API добирается до них через один новый параметр. Передайте appId из Steam — 570 для Dota 2, 252490 для Rust, — и эндпоинт ответит по этой игре. Без параметра вы получаете CS2 — байт в байт как раньше.
  • appId работает как query-параметр в GET /v1/listings, GET /v1/prices и GET /v1/listings/availability и как поле тела в POST /v1/orders.
  • У строк Dota 2 и Rust те же ключи, что и у строк CS2. Поля, которые есть только в CS2, равны null, а stickers — [], так что один парсер читает все три игры.
  • Фильтры только для CS2 (wear, min_float, max_float, stat_trak, souvenir, available_after, sort=newest) с другой игрой дают 400 invalid_param, а не молча игнорируются.
  • appId, который ваш ключ использовать не может, получает 400 unsupported_game со списком supported_app_ids. Новый эндпоинт GET /v1/games показывает игры, доступные ключу, и можно ли в них покупать.
  • Заказы Dota 2 и Rust отвечают delivery: "pending" и expected_minutes: null.
SSE-стрим, массовый снапшот и POST /v1/market/buy остаются только для CS2.Фид цен без ключа: GET /v1/public/pricesGET /v1/public/prices возвращает одну минимальную цену на каждый market_hash_name в CS2, Dota 2 или Rust. Ни API-ключ, ни баланс не нужны. Фазы CS2 Doppler объединены под базовым названием Steam, поэтому каждый ключ совпадает с реальным названием в Steam. Фид пересобирается раз в минуту, лимит — 1 запрос в минуту с одного IP.Выставляйте свои скины на P2P-маркет через API — бесплатноПять новых эндпоинтов позволяют ключу выставлять CS2-предметы своего владельца на P2P-маркет CSBoard. Без требований к балансу и без торгового доступа — подойдёт любой действующий ключ.Правила для продавца с сайта действуют без изменений, а проданный предмет по-прежнему нужно отправить через Steam и подтвердить в Steam Guard, прежде чем выплата попадёт на баланс. Одно сознательное отличие: цена ниже половины нашей рыночной отклоняется с 422 price_below_market. Через ключ это нельзя обойти подтверждением, поэтому утёкшим ключом не получится слить ваш инвентарь. Запись ограничена 30 запросами в минуту на ключ. Весь процесс по шагам — в руководстве по P2P-листингу.

Исправления

Покупка, упавшая по таймауту, теперь отвечает 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/orders — 250 в минуту, а не 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.
  • Отслеживайте жизненный цикл (pending → offer_sent → received → completed) и зачисленные суммы через 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 — больше никакой пост-фильтрации ответа.Примеры использования см. в Рыночные данные.