detail, not message. Match on code — it is stable and safe to branch on. detail is human-readable and may be reworded without notice.
Some errors carry extra fields alongside
code and detail. price_moved includes the current total, item_unavailable may include unavailable_ids, unsupported_game includes supported_app_ids, price_drift includes current_total_usd and min_total_usd, and price_below_market includes market_usd and floor_usd. Ignore unknown fields rather than rejecting the body.Authentication
Rate limits
Reading market data
Buying
P2P listing
Instant sell
The full list is in the Instant Sell guide.
Webhooks
Not available through the API
Retry rules
The distinction that matters is whether money moved.Safe to retry
429 (after Retry-After), price_updating, market_unavailable, 503, and network timeouts. Nothing was charged. Reuse the same Idempotency-Key so a request that actually succeeded replays instead of buying twice.Do not retry unchanged
400, 401, 403, invalid_webhook_url, unsupported_item. The request is wrong; repeating it produces the same error and, on auth failures, an IP ban.Decide, then retry
price_moved and item_unavailable. The market changed under you. Re-read the listing, apply your own pricing rule, and issue a new order with a new idempotency key.Check before retrying
order_failed, idempotency_in_progress, and any timeout on POST. Call GET /v1/orders/info with your custom_id first — the order may already exist.