Skip to main content
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 — заголовок является стандартным механизмом и предпочтителен.

События

Listing
Листинг появился в каталоге. Полезная нагрузка — ровно тот объект Listing, который возвращает GET /v1/listings, включая listed_at.Срабатывает как для действительно нового инвентаря, так и для перевыставлений — предметов, вернувшихся из отменённых заказов, истёкших трейд-офферов или снятых холдов. Перевыставленный предмет для вас новый, даже если существовал раньше.
object
Листинг покинул каталог — продан, зарезервирован или снят. Полезная нагрузка — { "id": "..." }.Именно на это событие нужно реагировать. Убирать предметы в момент продажи — это разница между тем, что ваши запросы на покупку проходят, и тем, что они узнают о пропаже предмета постфактум. Эту половину картины опрос не даёт ни на какой частоте.
object
Ваш Last-Event-ID старше сохранённой истории, поэтому повтор был бы неполным. Полезная нагрузка — { "reason": "last_event_id_expired", "detail": "..." }.Перечитайте GET /v1/listings?sort=newest, чтобы восстановить своё состояние, затем переподключитесь без Last-Event-ID. Мы присылаем это событие вместо того, чтобы молча отдать вам частичный повтор, который вы приняли бы за полный.

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

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

Лимиты

Три одновременных потока на один API-ключ. Само соединение не ограничено по частоте — события идут с той скоростью, с какой меняется каталог.

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

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

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

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.

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

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

Ответ

An open SSE stream. Stays open until you disconnect.

The response is of type string.