API

Quickstart

Authenticate, read the market, and place your first order.

Open raw markdownWhole API docs, for pasting into AI assistants

The CS Deals API gives you the marketplace: live listings and prices, buying, withdrawing to Steam, and a WebSocket feed of market activity.

Get an API key

Keys are created from Settings → API on the website. Creating and revoking a key is deliberately browser-only: those routes reject requests that don't come from the site, so a leaked key can never mint another one.

Two things are required before a key is issued:

  • A linked Discord or Telegram account, so we have a way to reach you. Link one from Settings → Connected Accounts.
  • A short description of what you'll use the key for. Keep it accurate; it's what we read first if your traffic ever looks unusual.

Providing a fake Discord/Telegram will lead to API termination in the event we need to reach out and verify the legitimacy of your requests.

The key is shown once. Store it somewhere safe.

Authenticate

Send it as a bearer token on every request:

curl "https://api.cs.deals/public/v1/listings?page=1&limit=500" \
  -H "Authorization: Bearer csd_your_key_here"

GET /public/v1 is the only route that works without a key. To confirm a key is live, call GET /auth/api-key.

An API key carries your full account authority, including buying and withdrawing. Treat it like a password: never ship it in client-side code, and revoke it from Settings the moment it leaks.

Money is always integer cents

Every price, balance and amount in this API is an integer in cents. 4250 means $42.50. There are no floats and no currency codes to pass around. If you are porting from the v1 API, this is the single most common source of bugs.

Field names are snake_case everywhere. CS Deals ids are integers; external Steam identifiers are strings and always carry a steam_ prefix (steam_asset_id, steam_offer_id). Timestamps are ISO 8601 strings, on REST and WebSocket alike.

Errors

Failures return a JSON body with a stable machine-readable code:

{ "error": "LISTING_PRICE_CHANGED", "data": { "listing_ids": [12345] } }

Branch on error, never on the HTTP status or the message text. data is present when the error carries detail: which listings were out of stock, which were too expensive, and so on.

Rate limits

Limits are per endpoint, counted per minute:

EndpointLimit
GET /public/v1/listings60
GET /public/v1/book6
GET /public/v1/prices60
GET /public/v1/sales60
POST /public/v1/purchase30
GET /public/v1/user60
GET /public/v1/orders60
GET /public/v1/backpack30
GET /public/v1/trades60

POST /public/v1/withdraw is not rate-limited. Exceeding a limit returns RATE_LIMITED with HTTP 429. Back off and retry.

Next

The guides follow the life of an item on the platform:

Bought items sit in your backpack until you either sell them again or withdraw them to Steam. There is no cart: an order is one call that fills completely or not at all.