Skip to main content
Buying through the CSBoard API lets you acquire CS2 skins programmatically — straight from your balance, with atomic overcharge protection and built-in idempotency. Before your first order goes through, you need to complete a short one-time setup. Follow the steps below in order.
A standard read key can never spend money. Trading is deliberately opt-in — a leaked or compromised read key cannot place orders or drain your balance until you explicitly enable it.

Setup

1

Enable trading on your key

Go to your API profile and flip the buying toggle for the key you want to use. Until you do this, every call to POST /v1/orders returns 403 trading_not_enabled.
2

Link your Steam account and trade URL

Orders are delivered directly to Steam, so you must have a linked Steam account and a valid trade URL set in your profile. Without one, the API returns 400 steam_account_required.
3

Fund your CSBoard balance

Purchases are debited from your existing CSBoard balance. Top up on the site — there is no card or crypto payment path through the API itself.
4

Find listings to buy

Query GET /v1/listings to find items and collect their id fields. Every id in the response is a stable reference you pass directly to the orders endpoint.
5

Place your order

POST the listing IDs to /v1/orders. Include max_price_usd and an Idempotency-Key — both are explained in detail below.

Overcharge protection

You are always charged the live price at execution, not the price you saw when you browsed listings. Markets move — a listing you fetched 30 seconds ago may have been relisted at a higher price by the time your order lands. Use max_price_usd as a total ceiling. The debit is atomic: if the live total at execution exceeds your ceiling, the entire order is rejected with 409 price_moved — nothing is charged and no items are transferred.
Always read price_usd from GET /v1/listings immediately before placing an order — that value is authoritative and equals the exact charge. The /v1/prices endpoint returns an indicative grouped snapshot that can lag the live per-item price.
If the price moved and you receive a 400, the response body includes current_total_usd so you can decide whether to re-submit with a higher ceiling or abort:

Idempotency

Network failures happen. Without idempotency, a retry after a timeout could buy the same item twice. Prevent that by sending a unique Idempotency-Key header with every order request.
  • If the server receives two requests with the same key, it replays the original order result — the purchase is never executed a second time.
  • You can also pass idempotency_key in the request body instead of the header; both have the same effect.
  • Use a UUID v4 generated per order attempt, not per retry.

Example response

A successful order returns 200 with the order details and your remaining balance:

Delivery

Each item in the order response includes a delivery field:
  • instant — the item is tradable now and will be sent to your Steam trade URL immediately.
  • hold — the item is under a Steam trade hold. Check the listing’s tradable_at field (ISO 8601 timestamp) to see when it becomes tradable.

Error reference


Next steps