Перейти к основному содержанию
GET
Stream listings as they appear and disappear
Лента изменений каталога через Server-Sent Events. Одно соединение заменяет любой цикл опроса. Опрос не может дёшево ответить на вопрос «что нового?» — любой клиент, который пытается, в итоге раз за разом перечитывает одну и ту же первую страницу, и ответ почти всегда «ничего». А на вопрос «что исчезло?» опрос не отвечает вообще: поллер узнаёт о продаже предмета, только попытавшись его купить и получив отказ. Этот эндпоинт присылает и то, и другое. Требуется аутентификация. Отправьте ключ как Authorization: Bearer csb_pub_....

Query-параметры

Фильтры применяются на нашей стороне, до отправки вам. Они нужны для экономии вашего трафика — одно соединение уже несёт весь каталог, поэтому несколько подключений под разные сегменты не нужны.
number
Присылать только листинги с ценой не ниже указанной (USD).
number
Присылать только листинги с ценой не выше указанной (USD).
string
Только эта категория, например Rifle, Knife, Gloves.
string
Только этот уровень редкости, например Classified, Covert.
string
Только этот диапазон износа: Factory New, Minimal Wear, Field-Tested, Well-Worn, Battle-Scarred.
string
Точное market_hash_name (регистр не учитывается) — поток по одному конкретному предмету.
string
Фильтр StatTrak™. only или exclude.
string
Фильтр Souvenir. only или exclude.
string
Продолжить после этого id события. Используйте, только если ваш клиент не умеет отправлять заголовок Last-Event-ID — заголовок является стандартным механизмом и предпочтителен.
string
Типы событий через запятую: new, update, gone. По умолчанию все три.update составляет около 80% потока, почти всё это изменения цен. Если вы только покупаете новые листинги и убираете проданные, events=new,gone даёт ту же картину того, что сейчас в продаже, примерно в пять раз меньшим объёмом. Без gone у вас останутся уже проданные листинги.

События

Listing
Листинг появился в каталоге. Полезная нагрузка — ровно тот объект Listing, который возвращает GET /v1/listings, включая listed_at.Срабатывает как для действительно нового инвентаря, так и для перевыставлений — предметов, вернувшихся из отменённых заказов, истёкших трейд-офферов или снятых холдов. Перевыставленный предмет для вас новый, даже если существовал раньше.Один листинг на один физический предмет — то же правило, что у GET /v1/listings и снимка. Когда один и тот же скин продаётся через нескольких поставщиков, объявляется только самая дешёвая копия, остальные — нет. Если позже появится копия дешевле, та, что у вас, снимается событием gone, а дешёвая приходит как new. Если ваша копия продана, а другая осталась, она приходит как new. Поэтому у вас никогда нет двух цен на один предмет, и ваша картина в любой момент совпадает со снимком.
Listing
Листинг, который вы уже получили, изменился: сдвинулась цена price_usd или пришли float_value / paint_seed после его события new. Полезная нагрузка — полный объект Listing, как у new, с текущими значениями. Замените свою копию по id; если листинга с таким id у вас ещё нет — добавьте его.С new, update и gone можно держать весь каталог у себя — один раз загрузить снапшот, дальше применять стрим — вместо опроса GET /v1/listings. Фильтры применяются к update так же, как к new, кроме min_price / max_price: листинг, который у вас есть и чья цена ушла за ваш диапазон, всё равно придёт, чтобы он не остался у вас по старой цене. Часть маркетов присылает float и паттерн через несколько минут после выставления лота, поэтому они могут прийти в update. Износ наклеек приходит таким, каким его отдаёт маркет: если маркет его не знает, он null и здесь, и в /v1/listings.Лоты от $100 оцениваются относительно следующего листинга того же предмета, поэтому update приходит и тогда, когда меняется тот листинг. Всё равно передавайте max_price_usd в заказе: цена проверяется заново при покупке, и более высокая отклоняется с price_moved, а не списывается.
object
Листинг покинул каталог — продан, зарезервирован или снят — либо перестал представлять свой предмет, потому что появилась копия того же скина дешевле (см. new). Полезная нагрузка — { "id": "..." }. gone для id, который вы не получали, — норма: игнорируйте его.Именно на это событие нужно реагировать. Убирать предметы в момент продажи — это разница между тем, что ваши запросы на покупку проходят, и тем, что они узнают о пропаже предмета постфактум. Эту половину картины опрос не даёт ни на какой частоте.
object
Ваш Last-Event-ID старше сохранённой истории, поэтому повтор был бы неполным. Полезная нагрузка — { "reason": "last_event_id_expired", "detail": "..." }. То же событие с "reason": "stream_rebased" приходит один раз в открытое соединение, когда меняются правила потока (как 28 октября 2026) и собранный раньше вид нельзя дополнить вперёд; соединение после этого закрывается.Перечитайте GET /v1/listings?sort=newest (или перезагрузите снимок), чтобы восстановить своё состояние, затем переподключитесь без Last-Event-ID. Мы присылаем это событие вместо того, чтобы молча отдать вам частичный повтор, который вы приняли бы за полный.

Переподключение без пропусков

У каждого события есть id. Отправьте последний обработанный id обратно в заголовке Last-Event-ID при переподключении — и получите ровно то, что пропустили, включая наши деплои, которые по своей природе рвут открытые соединения. Каждые 25 секунд приходит комментарий : heartbeat. Более долгую тишину считайте мёртвым соединением и переподключайтесь; браузерный EventSource делает это сам и сам же отправляет Last-Event-ID.

Лимиты

Три одновременных потока на один API-ключ. Само соединение не ограничено по частоте — события идут с той скоростью, с какой меняется каталог. Событие new уходит примерно через 0,3 секунды после появления листинга в каталоге, всем ключам одновременно, так что опрос /v1/listings не увидит листинг раньше. Подробнее — в разделе «Опрос или стрим». Четвёртое подключение получает 429 too_many_streams с Retry-After: 90. Соединение, оборванное без закрытия, держит свой слот до 90 секунд, поэтому переподключению сразу после сбоя сети, возможно, придётся подождать столько же. Соединение, отставшее больше чем на 8 МБ (около 40 секунд полного потока), закрывается. Переподключитесь с Last-Event-ID, и поток продолжится с последнего обработанного события. Если это повторяется, ваш клиент читает медленнее, чем идёт поток: сузьте его через events и фильтры выше.

Пример запроса

Пример потока

Пример клиента

EventSource не умеет выставлять заголовок Authorization — в серверной среде используйте SSE-клиент, который это умеет (или передайте ключ так, как позволяет ваш HTTP-клиент). Сниппет выше показывает обработку событий, а не аутентификацию.

Коды ошибок

Если вы используете стрим, опрашивать /v1/listings по таймеру не нужно вообще — оставьте его для первичной загрузки каталога и для восстановления после resync. Если удерживать долгоживущее соединение вы не можете, следующий по эффективности вариант — GET /v1/listings с параметром available_after, который превращает каждый опрос в чтение дельты.

Авторизации

Authorization
string
header
обязательно

Send your key as a Bearer token on every request: Authorization: Bearer csb_pub_.... Generate keys in your CSBoard profile. Calls made with a key are metered only by that key's own limits — there is no per-IP limit on top — and every answer carries X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset and X-RateLimit-Bucket for the bucket the call spent. See Rate limits.

Параметры запроса

min_price
number

Only stream listings at or above this USD price.

max_price
number

Only stream listings at or below this USD price.

category
string

e.g. Rifle, Knife, Gloves.

rarity
string

e.g. Classified, Covert.

wear
enum<string>

Exact wear name.

Доступные опции:
Factory New,
Minimal Wear,
Field-Tested,
Well-Worn,
Battle-Scarred
name
string

Exact market_hash_name (case-insensitive).

stat_trak
enum<string>

Filter StatTrak™ items.

Доступные опции:
only,
exclude
souvenir
enum<string>

Filter Souvenir items.

Доступные опции:
only,
exclude
delivery
enum<string>

Narrow new events to one delivery bucket (instant or hold). gone events are never filtered — a missed removal is the ghost listing this feed exists to prevent.

Доступные опции:
instant,
up_to_12h,
hold
last_event_id
string

Resume after this event id. Use only if your client cannot send the Last-Event-ID header.

min_refund_percent
number

Narrow new events to listings whose refund_percent is at least this (0-100). gone events are never filtered.

Требуемый диапазон: 0 <= x <= 100
events
string

Event types to receive, comma-separated: new, update, gone. Default: all three. update is about 80% of the feed, almost all price changes; events=new,gone keeps what is for sale at about a fifth of the bytes.

Пример:

"new,gone"

Ответ

An open SSE stream. Stays open until you disconnect.

The response is of type string.