Skip to main content
POST
Buy listings from your balance
Эндпоинт orders позволяет покупать от 1 до 10 листингов в одном атомарном запросе. Списание производится с вашего баланса CSBoard по живой цене продажи в момент исполнения — не по той цене, которую вы видели при запросе /v1/listings. Чтобы защититься от движений цены между запросом и покупкой, всегда указывайте max_price_usd как верхнюю границу итога. Эндпоинт идемпотентен: повтор с тем же Idempotency-Key воспроизводит исходный заказ, а не создаёт дубликат списания. Требуется аутентификация. Отправьте ключ как Authorization: Bearer csb_pub_.... Требуется возможность торговли. Для API-ключа должны быть включены покупки. Настройте это в профиле CSBoard.

Предварительные условия

Перед оформлением заказа убедитесь, что:
  1. Ключ с включённой торговлей — покупки должны быть включены для вашего API-ключа в настройках профиля CSBoard.
  2. Привязанный аккаунт Steam и trade URL — к аккаунту CSBoard должен быть привязан аккаунт Steam с валидным trade URL, чтобы предметы можно было доставить.
  3. Достаточный баланс — баланс CSBoard должен покрывать суммарную стоимость предметов по их живым ценам.

Заголовки запроса

string
Необязательно, 8–128 символов (например, UUID) — идентификатор этой попытки заказа. Если вы повторяете запрос с тем же ключом, сервер отвечает 200 с заголовком Idempotent-Replayed: true и исходным ответом заказа вместо повторной покупки. Пока первый запрос ещё выполняется, повтор получает 409 idempotency_in_progress. Так можно безопасно повторять запрос при сетевых таймаутах без риска двойного списания.

Тело запроса

string[]
обязательно
Массив из 1–10 уникальных ID листингов для покупки. Получайте их из поля id ответов GET /v1/listings. Каждый ID должен встречаться в запросе только один раз.
number
Верхняя граница итоговой цены в USD, проверяется атомарно в момент исполнения. Если живой итог по всем предметам превышает это значение, весь заказ отклоняется с ошибкой price_moved и списания не происходит. Настоятельно рекомендуется — без него у вас нет защиты от переплаты.
string
Альтернатива заголовку Idempotency-Key. Если переданы оба, заголовок имеет приоритет. Используйте что-то одно.
integer
по умолчанию:"730"
Игра, к которой относятся item_ids: 730 — CS2, 570 — Dota 2, 252490 — Rust. Не передавайте поле для CS2. Отправляйте тот же appId, с которым получили id из GET /v1/listings. Где ваш ключ может покупать, показывает tradable в GET /v1/games.

Поля ответа

Новый заказ отвечает 201 Created. Идемпотентный повтор отвечает 200 с тем же телом.
string
обязательно
Уникальный идентификатор заказа. Передайте его в GET /v1/orders/{id}, чтобы следить за доставкой.
string
обязательно
Внутреннее состояние заказа в момент формирования ответа, например paid или pending_delivery. Это не нормализованный словарь status из GET /v1/orders — следите за заказом там или через вебхуки.
string
обязательно
Всегда USD.
number
обязательно
Сумма, списанная с вашего баланса, в USD.
integer
Количество предметов в заказе.
object[]
По одной записи на каждый купленный предмет.
string | null
обязательно
Способ доставки, если он уже известен: instant (доставка ботом) или pending (трейд ещё должен отправить продавец или поставщик). Заказы Dota 2 и Rust всегда отвечают pending.
integer | null
обязательно
Примерное время доставки в минутах, когда мы можем его назвать. Для заказов Dota 2 и Rust всегда null.
datetime
Временная метка ISO 8601 создания заказа.
datetime | null
Временная метка ISO 8601 последнего изменения заказа.

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

Пример ответа

Коды ошибок

Всегда указывайте max_price_usd в запросе. Цены на живом маркетплейсе могут измениться между моментом запроса /v1/listings и моментом исполнения заказа. Без этой верхней границы с баланса может быть списана более высокая сумма, чем вы планировали, и автоматического отката нет.
Предметы, доставляемые в режиме hold, попадают под торговый холд Steam. Проверяйте поле tradable_at исходного листинга (из GET /v1/listings), чтобы узнать, когда именно удерживаемый предмет станет доступен для обмена в вашем инвентаре Steam.
Dota 2 и Rust. Заказы с appId 570 или 252490 ставятся в очередь на доставку и отвечают delivery: "pending" с expected_minutes: null. Следите за ними через GET /v1/orders/{id}. Верхняя граница цены, проверка баланса и идемпотентность работают так же, как для CS2.

Авторизации

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

Send your key as a Bearer token on every request: Authorization: Bearer csb_pub_.... Generate keys in your CSBoard profile.

Заголовки

Idempotency-Key
string

Optional, 8–128 characters. A retried request with the same key replays the original order (200 with Idempotent-Replayed: true) instead of buying twice; while the first request is still running it answers 409 idempotency_in_progress.

Тело

application/json
item_ids
string[]
обязательно

1–10 unique ids from /v1/listings. Some items can't be combined in a single order — if so the order is rejected and you can split it.

Required array length: 1 - 10 elements
max_price_usd
number

Total ceiling in USD. Strongly recommended — your overcharge protection, enforced atomically inside the locked debit.

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

Optional; or send the Idempotency-Key header. Replays the original order on retry.

Required string length: 8 - 128
autoclaim
boolean

Sticky per-account setting (not per-order). Send true once to switch your key into auto-claim mode: every held order is then auto-released the moment its hold clears (your bot must auto-accept the Steam trade offer within ~15 minutes). Send false to switch back to manual claiming via POST /orders/{id}/claim. Omit to leave the setting unchanged.

appId
enum<integer>
по умолчанию:730

Game the item_ids belong to: 730 = CS2 (the default), 570 = Dota 2, 252490 = Rust. Send the same appId you read the ids with from GET /listings. A game this key may not buy in answers 400 unsupported_game — tradable in GET /games tells you in advance.

Доступные опции:
730,
570,
252490

Ответ

Idempotent replay: a request with an Idempotency-Key (or idempotency_key) already used for a completed order returns that original response body, with the header Idempotent-Replayed: true. Nothing new is bought.

The order as it stands the moment it was created. status here is the internal state at that instant (for example paid or pending_delivery), not the normalised vocabulary of GET /orders — read the order there, or subscribe to webhooks, to follow it.

order_id
string
обязательно

Order id. Use it with GET /orders/{id}.

status
string
обязательно

Internal order state when the response was built, e.g. paid or pending_delivery. Poll GET /orders/{id} for the public status.

currency
enum<string>
обязательно
Доступные опции:
USD
charged_total_usd
number
обязательно

Total debited from your balance, in USD.

delivery
enum<string> | null
обязательно

How the order is being delivered, when known: instant (bot delivery) or pending (a seller or supplier still has to send the trade). Dota 2 and Rust orders always answer pending.

Доступные опции:
instant,
pending,
null
expected_minutes
integer | null
обязательно

Rough delivery estimate in minutes, when we can state one. Always null for Dota 2 and Rust orders.

item_count
integer

Number of items in the order.

items
object[]

One entry per item bought.

created_at
string<date-time>
updated_at
string<date-time> | null