Limits and errors
Allowance is shared by the account: creating more keys does not increase a plan. The approved launch plans below are implemented; purchases stay unavailable until production payment verification is complete.
| Plan | Price / 30 days | Requests / UTC calendar month | Requests / minute |
|---|---|---|---|
| Free | $0 | 1,000 | 20 |
| Builder | $20 | 10,000 | 60 |
| Trader | $50 | 100,000 | 180 |
Free uses real data, not a sandbox: item metadata without current quotes, plus Steam daily ask snapshots for the last 30 completed UTC days. GET /v1/items/{item_id}/history selects this window and Steam automatically. Other markets, today’s prices, hourly history, market comparisons, full exports, indexes, ROI and exchange rates require a paid plan. Missing observations stay missing. Daily resolution is not a guarantee that every item has a new observation each day.
Owner-scoped portfolio access remains available with an explicitly consented personal token; it does not include a live market-price feed. Both paid plans can read the available market datasets; they differ in quota, RPM, key and export ceilings, not source freshness. Neither plan promises a real-time sniper feed.
After credential, request and plan validation, each admitted protected data-access attempt consumes one request, including a read failure. Rejected rate-limit or plan checks do not consume another unit. A batch of up to 100 items counts as one request. Crypto purchases are prepaid for 30 days, without automatic renewal. A purchase or renewal does not reset used calendar-month quota.
Headers: X-RateLimit-Limit, X-RateLimit-Remaining, X-Quota-Remaining, Retry-After, X-Request-Id. Monthly usage is recorded durably before execution; a cache restart does not reset it. On minute-limit rejections, X-Quota-Remaining can be absent because the monthly balance was not read. A monthly denial can still consume a minute attempt; it does not consume another monthly unit.
| HTTP | Client action |
|---|---|
| 400 | Correct parameters, range or cursor. Do not retry unchanged. |
| 401 | Check key validity and expiry. Never send the key to support. |
| 403 | Check the error code: plan_upgrade_required needs a paid plan; insufficient_scope needs an appropriate key scope. |
| 404 | Item or endpoint does not exist. |
| 413 | Reduce the request body. |
| 429 | Follow Retry-After; do not bypass quotas with extra keys. |
| 503 | Retry a bounded number of times with backoff; display unavailability. |
Retries need an overall timeout, an attempt cap and jitter. If the monthly allowance is exhausted, do not leave the application in an infinite retry loop.
Hourly market history is limited to 31 inclusive UTC days and 1,000 rows per request. Invalid ranges or mismatched cursors return 400 before monthly quota is consumed. A successful empty window or a dependency failure after admission still consumes one request.
Full market snapshots have separate account-wide concurrency and rolling 24-hour start limits. A response can fail after HTTP 200: require a valid matching end record before accepting the export.