Skip to main content
POST
/
orders
Buy listings from your balance
curl --request POST \
  --url https://csboard.com/v1/orders \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "item_ids": [
    "itm_8841201",
    "itm_8841340"
  ],
  "max_price_usd": 30,
  "idempotency_key": "6f9c2b10-1a2b-4c3d-8e4f-5a6b7c8d9e0f"
}
'
{
  "order_id": "ord_01J9Z3K8Q2",
  "status": "processing",
  "items": [
    {
      "item_id": "itm_8841201",
      "charged_usd": 14.37,
      "delivery": "hold"
    },
    {
      "item_id": "itm_8841340",
      "charged_usd": 12.1,
      "delivery": "instant"
    }
  ],
  "total_charged_usd": 26.47,
  "balance_after_usd": 73.53,
  "created_at": "2026-06-29T17:12:04Z"
}
The orders endpoint lets you buy between 1 and 10 listings in a single atomic request. The charge is debited from your CSBoard balance at the live asking price at the moment of execution — not at the price you saw when you queried /v1/listings. To protect yourself from price movements between lookup and purchase, always include max_price_usd as a total ceiling. The endpoint is idempotent: retrying with the same Idempotency-Key replays the original order rather than creating a duplicate charge. Authentication required. Send your key as Authorization: Bearer csb_pub_.... Trading capability required. The API key must have buying enabled. Configure this in your CSBoard profile.

Prerequisites

Before placing an order, ensure:
  1. Trading-enabled key — buying must be turned on for your API key in your CSBoard profile settings.
  2. Linked Steam account and trade URL — your CSBoard account must have a Steam account connected with a valid trade URL so items can be delivered.
  3. Sufficient balance — your CSBoard balance must cover the total cost of the items at their live prices.

Request headers

Idempotency-Key
string
Optional. A unique string (e.g. a UUID) that identifies this order attempt. If you retry a request with the same key, the server replays the original order response instead of executing a second purchase. Use this to safely retry on network timeouts without risk of double-charging.

Request body

item_ids
string[]
required
Array of 1–10 unique listing IDs to purchase. Obtain these from the id field of GET /v1/listings responses. Each ID must appear only once per request.
max_price_usd
number
Total price ceiling in USD, enforced atomically at execution time. If the live total of all items exceeds this value, the entire order is rejected with a price_moved error and you are not charged. Strongly recommended — without it you have no overcharge protection.
idempotency_key
string
Alternative to the Idempotency-Key header. If both are provided, the header takes precedence. Use one or the other, not both.

Response fields

order_id
string
required
Unique identifier for this order, e.g. ord_01J9Z3K8Q2.
status
string
required
Current order status: processing, completed, or failed.
items
object[]
Per-item breakdown of the order.
total_charged_usd
number
required
Sum of all per-item charges. This is the total amount debited from your balance.
balance_after_usd
number
Your CSBoard balance immediately after the debit.
created_at
datetime
ISO 8601 timestamp of when the order was created.

Example request

curl -X POST https://csboard.com/v1/orders \
  -H "Authorization: Bearer csb_pub_..." \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 6f9c2b10-1a2b-4c3d-8e4f-5a6b7c8d9e0f" \
  -d '{
    "item_ids": ["itm_8841201", "itm_8841340"],
    "max_price_usd": 30.00
  }'

Example response

{
  "order_id": "ord_01J9Z3K8Q2",
  "status": "processing",
  "items": [
    {
      "item_id": "itm_8841201",
      "charged_usd": 14.37,
      "delivery": "hold"
    },
    {
      "item_id": "itm_8841340",
      "charged_usd": 12.10,
      "delivery": "instant"
    }
  ],
  "total_charged_usd": 26.47,
  "balance_after_usd": 73.53,
  "created_at": "2026-06-29T17:12:04Z"
}

Error codes

HTTP statusCodeMeaning
409price_movedThe live total of your items exceeded max_price_usd. Order rejected; no charge made. The response includes current_total_usd showing the actual price.
402insufficient_balanceYour balance is too low to cover the order total.
400steam_account_requiredNo linked Steam account or valid trade URL on your CSBoard account.
403trading_not_enabledThe API key does not have buying enabled. Enable it in your profile.
401unauthorizedMissing or invalid API key.
429rate_limit_exceededOver 30 requests/min. Wait for the Retry-After header value before retrying.
Always include max_price_usd in your request. Prices on a live marketplace can change between the moment you query /v1/listings and the moment your order executes. Without this ceiling, your balance could be debited at a higher price than you intended, and there is no automatic rollback.
Items delivered via hold are subject to a Steam trade hold. Check the tradable_at field on the original listing (from GET /v1/listings) to see exactly when a held item will become tradable in your Steam inventory.

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.

Headers

Idempotency-Key
string

Optional. A retried request with the same key replays the original order instead of buying twice.

Body

application/json
item_ids
string[]
required

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.

idempotency_key
string

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

Response

Order accepted and debited.

order_id
string
required
status
enum<string>
required
Available options:
processing,
completed,
failed
total_charged_usd
number
required
items
object[]
balance_after_usd
number
created_at
string<date-time>