Skip to content
LogoLogo

Errors and limits

Application errors

Several routes report failure inside an HTTP 200 response. A buy-order rejection can return success: 25 with a human-readable message, for example when the account exceeds its wallet-based active-order limit.

{
  "success": 25,
  "message": "This buy order cannot be placed …"
}

Treat success: true and success: 1 as success only for endpoints documented with those shapes. Numeric codes are endpoint-specific.

Null payloads

The structured search and listing POST endpoints can return literal JSON null with HTTP 200. Accept null as a transient or empty response and retry with bounded backoff.

Redirects and HTML

Page and eligibility routes can return 302. Routes normally used for JSON can return HTML when redirected, challenged, logged out, or rendered through a different frontend path. Validate Content-Type before decoding.

Confirmations

A successful sell request can still require account confirmation. Inspect:

  • requires_confirmation;
  • needs_mobile_confirmation;
  • needs_email_confirmation.

The item is not necessarily active until confirmation completes.

Rate control

Steam publishes no limits for these routes. The figures below are the community's working consensus, not a contract, and they are enforced per client rather than per endpoint family:

RouteObserved ceiling
GET /market/priceoverview/~20 per minute, ~1,000 per day
GET /market/search/render/~20 per minute
GET /market/itemordershistogram~10 distinct items per hour

The histogram limit counts distinct item_nameid values, not requests, so re-polling a small watchlist is far cheaper than sweeping the catalog. Budget it deliberately: it is the only route that exposes live buy-order depth.

Use conservative concurrency, cache immutable metadata, add jittered exponential backoff, and stop on repeated 429 or 5xx responses. Do not rotate accounts or IPs to evade enforcement.