For developers & AI agents

CSBoard API

Market data over our marketplace — live listings, floats, stickers, minAsk prices, FX rates — plus opt-in buying straight from your balance. Free to read, key-gated, built for automation.

Point your AI agent here

The entire API in one file — auth, every endpoint, JSON samples, and the MCP config.

https://csboard.com/docs/llms.txt
Access

Authentication

Base URL
https://csboard.com/v1
Header
Authorization: Bearer csb_pub_...

Send your key as a Bearer token on every request. Keys are generated in your profile — grab one here. Only /v1/health works without a key; every other endpoint requires one.

curl
curl https://csboard.com/v1/listings \
  -H "Authorization: Bearer csb_pub_..."
Limits

Rate limits

30requests / minute
Pointed endpoints — listings, prices, currency
30requests / minute
Buying — POST /v1/orders (spends money)
1request / minute
Bulk snapshot — full catalog dump

Limits are per key. Exceeding one returns 429 with { "code": "rate_limit_exceeded" } and a Retry-After header. More than 30 bad keys per minute from one IP triggers a 5-minute ban. Need more headroom? Contact us to raise your key’s limit.

Reference

Endpoints

GET/v1/healthNo auth

Liveness + freshness probe. No key required — use it to check the API is up and the price list is fresh.

Request
curl
curl https://csboard.com/v1/health

groups = count of priced item groups. price_list_age_seconds = age of the materialized price list (freshness).

GET/v1/listingsAuth required

Live buyable listings across the marketplace — each with float, paint seed, stickers, and the asking price in USD.

Query parameters
NameDescription
searchstringFull-text match on market hash name.
categorystringe.g. Rifle, Knife, Gloves.
wearenumFactory New | Minimal Wear | Field-Tested | Well-Worn | Battle-Scarred.
raritystringe.g. Classified, Covert.
min_pricenumberMinimum price in USD.
max_pricenumberMaximum price in USD.
min_floatnumberMinimum float value.
max_floatnumberMaximum float value.
stat_trakonly | excludeFilter StatTrak™ items.
souvenironly | excludeFilter Souvenir items.
sortenumid | newest | price_asc | price_desc. Default id.
cursorstringKeyset cursor from next_cursor.
limitnumber1–200. Default 50.
Request
curl
curl "https://csboard.com/v1/listings?category=Rifle&wear=Minimal%20Wear&stat_trak=only&limit=1" \
  -H "Authorization: Bearer csb_pub_..."

Each Listing carries id, market_hash_name, wear, doppler_phase, float_value, paint_seed, stickers[], price_usd, category, rarity, image, inspect_link, tradable, tradable_at, delivery — where delivery is "instant" or "hold", and each sticker is { name, image, slot, wear }.

GET/v1/pricesAuth required

The minAsk price list — one row per market hash name (+ wear + Doppler phase), with the cheapest current ask and how many are listed.

Query parameters
NameDescription
searchstringFull-text match on market hash name.
categorystringe.g. Rifle, Knife, Gloves.
wearenumFactory New … Battle-Scarred.
raritystringe.g. Classified, Covert.
min_pricenumberMinimum price in USD.
max_pricenumberMaximum price in USD.
cursorstringKeyset cursor from next_cursor.
limitnumber1–500. Default 100.
Request
curl
curl "https://csboard.com/v1/prices?search=AK-47%20Redline&limit=1" \
  -H "Authorization: Bearer csb_pub_..."

Each row is { market_hash_name, wear, doppler_phase, min_price_usd, qty }.

GET/v1/prices/snapshot.ndjson.gzAuth required

Full gzipped NDJSON dump of the price list — one price row JSON per line. Use this for full-catalog ingestion (e.g. comparison sites), not pagination. Rate limited to 1 request/minute.

Request
curl
curl --compressed \
  -H "Authorization: Bearer csb_pub_..." \
  https://csboard.com/v1/prices/snapshot.ndjson.gz

Supports ETag / If-None-Match — an unchanged snapshot returns 304 Not Modified, so you only download when the catalog actually moved.

GET/v1/currencyAuth required

FX rates with USD as the base. Every price in this API is USD — use this to convert to a local currency. Same rate table the site + payment flows use (cached ~1h).

Request
curl
curl https://csboard.com/v1/currency \
  -H "Authorization: Bearer csb_pub_..."

Response is { base, rates, updated_at, rub_source, base_source }. rates maps currency code → units per 1 USD.

Write scope

Buying (orders)

Buy skins straight from your CSBoard balance. Buying is opt-in and deliberately locked down:

  • Enable trading first. A normal key only reads. Flip on buying for your key at your profile. Until then POST /v1/orders returns 403 trading_not_enabled — a leaked read key can never spend.
  • Balance only. Buys debit your existing CSBoard balance. Top up on the site; there is no card/crypto over the API.
  • One price source, no drift surprises. You are charged the LIVE price at execution. price_usd from /v1/listings is authoritative (it equals the charge); /v1/prices is an indicative grouped snapshot that can lag. Always send max_price_usd — a ceiling enforced atomically inside the locked debit. If the live price moved past it the order is rejected with price_moved and the current total, never overcharging you.
  • Idempotent. Send an Idempotency-Key header (or idempotency_key in the body). A retried request replays the original order instead of buying twice.
POST/v1/ordersAuth required

Buy 1–10 listings by id, debited from your balance. Requires trading enabled + a linked Steam account & trade URL.

Query parameters
NameDescription
item_idsstring[]1–10 unique ids from /v1/listings. Do not mix external-market items with platform items.
max_price_usdnumberTotal ceiling in USD. Strongly recommended — your overcharge protection.
idempotency_keystringOptional; or send the Idempotency-Key header. Replays the original order on retry.
Request
curl
curl -X POST https://csboard.com/v1/orders \
  -H "Authorization: Bearer csb_pub_..." \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 6f9c2b10-1a2b-4c3d-9e8f-0a1b2c3d4e5f" \
  -d '{ "item_ids": ["000012e8-1f4a-4c2b-9d3e-7a1b2c3d4e5f"], "max_price_usd": 268.00 }'

Recommended flow: read the item from /v1/listings, take its price_usd, then POST with max_price_usd set to that (optionally + a small tolerance). A 409 price_moved means re-read and retry with the new price.

GET/v1/orders/:idAuth required

Status of one of your orders. Poll it to watch delivery. 404 if the order isn't on your account.

Request
curl
curl https://csboard.com/v1/orders/clx123abc... \
  -H "Authorization: Bearer csb_pub_..."
GET/v1/balanceAuth required

Your CSBoard balance in USD. Check it before buying.

Request
curl
curl https://csboard.com/v1/balance \
  -H "Authorization: Bearer csb_pub_..."

trading_enabled reflects whether buying is turned on for your key.

Paging

Pagination

List endpoints return a next_cursor. Pass it back as ?cursor= to get the next page. A null cursor means you’ve reached the end. These are keyset cursors — stable at any depth, no offset drift.

curl
curl "https://csboard.com/v1/listings?cursor=eyJpZCI6IjAwMDAxMmU4In0" \
  -H "Authorization: Bearer csb_pub_..."
Failures

Errors

Every error returns JSON of the shape { "code": "...", "detail": "..." }.

StatusCode
401missing_api_keyNo Authorization header sent.
invalid_api_keyKey not found, revoked, or malformed.
402insufficient_balanceBalance < order total. Carries required_usd / current_usd.
kyc_requiredVerify identity (kyc_url) before this purchase, then retry.
403trading_not_enabledBuying is off for this key — enable it in your profile.
account_restrictedAccount restricted — contact support.
409price_movedLive price passed max_price_usd. Re-read /v1/listings and retry.
item_unavailableOne or more items sold out.
idempotency_in_progressSame Idempotency-Key still processing — retry shortly.
429rate_limit_exceededPer-key request limit hit. See Retry-After.
snapshot_rate_limitedSnapshot is limited to 1/min per key.
too_many_failed_auth>30 bad keys/min from your IP — 5-min ban.
501not_implementedEndpoint off by design (e.g. withdraw).
Model Context Protocol

MCP server

Use CSBoard from Claude Desktop or Cursor. Run npx @csboard/mcp with your CSBOARD_API_KEY and the catalog + prices become tools. Drop this into your MCP config and restart your client.

json
{
  "mcpServers": {
    "csboard": {
      "command": "npx",
      "args": ["-y", "@csboard/mcp"],
      "env": { "CSBOARD_API_KEY": "csb_pub_..." }
    }
  }
}
Tools
search_listingsget_priceslist_cheapesthealth
Scope

Not available via API

Withdrawals stay off the API by design — manage payouts at your profile. This endpoint returns 501.

POST/v1/withdrawWithdraw funds — manage on the site