Steam inventories,
minus the sharp edges.
ItemData exposes fresh, normalized Steam inventory data through one cursor-paginated HTTP endpoint with a stable response model.
https://itemdata.wizov.dev/v1HTTPSNormal public requests can reuse a durable page snapshot. Use no_cache=true to force a coordinated refresh; requests carrying a Steam session bypass shared-cache reads and writes.
Make your first request
Create a key in the console, keep it in an environment variable, then send it as a Bearer token. A successful call returns one Steam page with assets and descriptions; continue with its cursor.
curl "https://itemdata.wizov.dev/v1/inventory?steam_id=76561198000000000&game=cs2" \
-H "Authorization: Bearer $ITEMDATA_API_KEY"Keep the key server-side
Send your key in the Authorization header. Query-string keys are supported for compatibility, but Bearer authentication avoids leaking credentials into logs and browser history.
Authorization: Bearer isk_…Call ItemData from your backend, not public browser code.
/inventory
Fetch one inventory using a SteamID64, SteamID3, SteamID2, vanity name, or Steam Community profile URL.
Do not send last_assetid after a response with more_items=false: that response is terminal and has no next page.
steam_idrequiredstringSteamID64, SteamID3, SteamID2, vanity name, or Steam Community profile URL.gameenumOne of cs2, rust, dota2, or tf2. dota is accepted as an alias for dota2. Defaults to cs2.languagestringLanguage requested from Steam for descriptions. Defaults to english.start_assetidstringSteam cursor for the page to fetch. Use body last_assetid from the preceding response only when more_items is true.include_non_tradablebooleanInclude assets that cannot currently be traded.no_cachebooleanBypass both public snapshots and the confirmed-private marker, then fetch fresh data without publishing another shared object. A success=false result still removes an older public snapshot. Adds 1 fresh-fetch credit, for 2 credits total only after success.try_first_seven_days_blocked_itemsbooleanCS2 only. Tries the internal partner-session pool before the public endpoint, forces include_non_tradable=true, bypasses shared cache state, and costs 2 credits after success. It cannot be combined with steam_login_secure.with_no_tradablealiasbooleanEquivalent switches for including non-tradable assets; if both are supplied, their values must match.formatenumResponse formatting: json, prettyjson, or pretty. All variants return JSON.prettyaliasbooleanSet to 1 for indented JSON output; alias for a pretty format.The Steam page size is fixed server-side at 2,000 items for every game. The count and limit query parameters are not accepted.
Pagination headers mirror more_items and last_assetid. Cache, age, charged-credit, and pricing-version headers make cache and billing behavior observable.
Each successful normal public /v1/inventory page costs 1 credit. A successful fresh cache bypass—with no_cache=true, with any Steam session, or with both together—costs 2 credits total.
An upstream Steam 401 is a cacheable empty public page and uses normal credits. An upstream Steam 403 is a zero-credit private result cached once per SteamID64 for 72 hours across every game. These upstream statuses are separate from ItemData API-key HTTP 401/403 responses.
Use X-ItemData-Inventory-Source to preserve cursor semantics: keep try_first_seven_days_blocked_items=true after partner, but omit it after public-fallback.
X-ItemData-More-Itemsmore_itemsX-ItemData-Next-Cursorlast_assetidX-ItemData-CacheHIT, MISS, STALE, or BYPASS for the public page or account-wide private state returned.X-ItemData-Inventory-Sourcepublic for the normal endpoint, partner when the internal session pool succeeded, or public-fallback when the first partner page fell back to a fresh public request.AgeWhole seconds since the public page or confirmed private state was observed at Steam.X-ItemData-Billing-Statusconfirmed after durable accounting. A rare pending value means the successful payload is returned while an ambiguous database COMMIT is handled with at-most-once billing; charged-credit headers are then omitted.X-ItemData-Credits-ChargedCredits charged for the successful request: normally 1, or 2 for a successful no_cache refresh or Steam-session fetch. Present only for confirmed billing.X-ItemData-Credit-Pricing-VersionVersion of the server-side credit rules used for this request.Try the endpoint
Enter your own key to send a real request. The key stays in this page's memory and is never saved by the explorer.
{
"success": true,
"steam_id": "76561198000000000",
"game": "cs2",
"appid": 730,
"total_inventory_count": 184,
"items": [
{
"assetid": "34589211402",
"market_hash_name": "AK-47 | Slate (Field-Tested)",
"tradable": true
}
],
"last_assetid": "34589211402",
"more_items": true
}Compatible where semantics stay honest
ItemData accepts SteamWebAPI-style parameters when their semantics match, including no_cache=true for a forced public refresh. It rejects or omits only unsupported enrichment and global operations.
Open the SteamWebAPI inventory referenceSupported compatibility
start_assetidLive Steam cursor from last_assetid, valid only while more_items is true.include_non_tradable / with_no_tradableEquivalent switches for including non-tradable assets; if both are supplied, their values must match.pretty=1Returns indented JSON; the response format remains JSON.game=dotaAccepted as an alias for dota2.no_cacheSupported for public inventories. true forces a fresh upstream fetch; a successful response costs 2 credits total.try_first_seven_days_blocked_itemsSupported for CS2. On a partner response, continue with the flag and returned cursor. After public-fallback, continue with the public cursor without this flag.Not supported
count, limitItemData controls the Steam page size server-side and fixes it at 2,000 items for every game.stateItemData does not expose an alternate inventory-state selector.parse, raw, mode, currency, markets, with_prices, phase, sort-by-priceItemData does not perform price, float, or market enrichment.trade_url, blocked modesTrade-URL and blocked-inventory modes are outside this endpoint's contract.offset, search, group, selectThese would require global semantics across multiple live cursor pages, so ItemData does not promise them.Responses are JSON only; XML and other output formats are not supported.
Filtering, grouping, selecting, or offsetting one live page would produce misleading results for the full inventory. Fetch pages by cursor and apply global operations only after collecting them.
Supported economies
cs2Counter-Strike 2730 / 2dota2Dota 2570 / 2rustRust252490 / 2tf2Team Fortress 2440 / 2Errors you can act on
Every error uses the same envelope with a stable machine-readable code and a human-readable message.
invalid_requestA query parameter is missing or malformed.missing_api_key / invalid_api_keyThe API key is missing or invalid.insufficient_creditsThe account does not have enough credits.inactive_api_keyThe key has been revoked or disabled.rate_limit_exceededThe per-key request rate has been exceeded.invalid_upstream_response / upstream_errorSteam returned an invalid or unexpected response.cache_unavailable / refresh_in_progress / upstream_unavailableA refresh is already in progress or a dependency is temporarily unavailable; honor Retry-After before retrying.upstream_timeoutThe upstream request exceeded its deadline.