Skip to main content
POST
Buy and deliver to a Steam trade URL
This endpoint lets you buy and deliver items directly to any Steam trade URL you supply — not just the trade URL linked to your account. The trade URL is built from the partner and token fields. Purchases are funded only from your settled (reversal-safe) balance, making it suitable for wholesale volume and automated delivery workflows. Save one custom_id per withdrawal. A cached success returns Idempotent-Replayed: true for up to 24 hours. If the response is lost, read order status with the saved id. An empty result can precede order creation. Keep the withdrawal pending until reconciled.
This endpoint ships behind a kill-switch and requires a trading-enabled, reversal-clean account. When the kill-switch is off it returns 403 external_buy_disabled.
Authentication required. Send your key as Authorization: Bearer csb_pub_.... Trading capability required. Buying must be enabled for the key, and the account must be reversal-clean.

Request body

string[]
required
1–100 unique listing ids to buy.
string
required
Steam trade URL partner value (1–32 chars). Together with token, forms the destination trade URL items are delivered to.
string
required
Steam trade URL token value (1–32 chars). Together with partner, forms the destination trade URL.
number
Total price ceiling in USD. If the live total exceeds it, the order is rejected with price_moved and nothing is charged. Strongly recommended.
string
Withdrawal identifier (1–128 characters). After the cached response expires, reusing the same id can start a new purchase.
boolean
default:"false"
If true, skip items that are no longer available instead of failing the whole request.
integer
default:"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 /v1/listings. Dota 2 and Rust take up to 10 ids per order and are queued, so every skin answers pending first.

Response fields

object
required

Example request

Example response

Error codes

Funds come exclusively from your settled balance. Check settled_balance_usd on GET /v1/balance before a large batch, and always send max_price_usd as overcharge protection.

Unavailable items

Listings can leave the catalogue between your read and your buy. The 409 item_unavailable body lists every missing id in unavailable_ids. On a CS2 buy (no appId, or 730) it may also carry unknown_ids: the missing ids we have no record of at all. Either the id is not a CSBoard listing id, or the listing left the catalogue more than an hour ago. A Steam asset id is the usual mix-up — CSBoard listing ids are never all digits, so send the id of a row from /v1/listings or the stream.
To drop sold listings before you try to buy them, subscribe to the gone events of GET /v1/listings/stream.

Authorizations

Authorization
string
header
required

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.

Body

application/json
item_ids
string[]
required

1–100 unique listing ids to buy.

Required array length: 1 - 100 elements
partner
string
required

Steam trade URL partner value. With token, forms the destination trade URL.

Required string length: 1 - 32
token
string
required

Steam trade URL token value. With partner, forms the destination trade URL.

Required string length: 1 - 32
max_price_usd
number

Total ceiling in USD. Order is rejected with price_moved if the live total exceeds it.

custom_id
string

Save one key per withdrawal. A cached success can be replayed for up to 24 hours. After expiry the same value may start a new purchase.

Required string length: 1 - 128
skip_unavailable
boolean
default:false

If true, skip items that are no longer available instead of failing the whole request.

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>
default: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. Dota 2 and Rust take up to 10 ids per order. A game this key may not buy in answers 400 unsupported_game — tradable in GET /games tells you in advance.

Available options:
730,
570,
252490

Response

Purchase accepted and debited from settled balance.

data
object
required