Новые возможности
Покупка 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.
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. Без требований к балансу и без торгового доступа — подойдёт любой действующий ключ.GET /v1/p2p/inventory— ваши предметы: какие можно выставить сейчас и почему нельзя остальные.POST /v1/p2p/listings— публикация одного предмета или до 50 сразу;Idempotency-Keyобязателен.GET /v1/p2p/listings,PATCH /v1/p2p/listings/{id}иDELETE /v1/p2p/listings/{id}— просмотр, изменение цены и снятие с продажи.
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, чтобы проверить его, и обратитесь в поддержку, чтобы запросить доступ.
Fixes
Precise 402 error codes onPOST /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.
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 — больше никакой пост-фильтрации ответа.Примеры использования см. в Рыночные данные.