API VERSION 1

Steam inventories,
minus the sharp edges.

ItemData exposes fresh, normalized Steam inventory data through one cursor-paginated HTTP endpoint with a stable response model.

BASE URLhttps://itemdata.wizov.dev/v1HTTPS
Durable caching for public inventories.

Normal 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.

01 · QUICKSTART

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.

RequestcURL
curl "https://itemdata.wizov.dev/v1/inventory?steam_id=76561198000000000&game=cs2" \
  -H "Authorization: Bearer $ITEMDATA_API_KEY"
02 · AUTHENTICATION

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.

RecommendedAuthorization: Bearer isk_…
Never expose keys

Call ItemData from your backend, not public browser code.

03 · ENDPOINT
GET

/inventory

Fetch one inventory using a SteamID64, SteamID3, SteamID2, vanity name, or Steam Community profile URL.

A single-inventory request returns exactly one Steam page. Follow the cursor to retrieve another page.

Do not send last_assetid after a response with more_items=false: that response is terminal and has no next page.

PARAMETERTYPEDESCRIPTION
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.

Response headers
X-ItemData-More-Itemsmore_items
X-ItemData-Next-Cursorlast_assetid
X-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.
LIVE EXPLORER

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.

GET/v1/inventory?steam_id=76561198000000000&game=cs2&pretty=1
Sent only to your configured ItemData API origin and never stored.
ResponseExample response
{
  "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
}
04 · STEAMWEBAPI COMPATIBILITY

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 reference

Supported 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.

05 · GAME VALUES

Supported economies

cs2Counter-Strike 2730 / 2
dota2Dota 2570 / 2
rustRust252490 / 2
tf2Team Fortress 2440 / 2
06 · ERRORS

Errors you can act on

Every error uses the same envelope with a stable machine-readable code and a human-readable message.

400invalid_requestA query parameter is missing or malformed.
401missing_api_key / invalid_api_keyThe API key is missing or invalid.
402insufficient_creditsThe account does not have enough credits.
403inactive_api_keyThe key has been revoked or disabled.
429rate_limit_exceededThe per-key request rate has been exceeded.
502invalid_upstream_response / upstream_errorSteam returned an invalid or unexpected response.
503cache_unavailable / refresh_in_progress / upstream_unavailableA refresh is already in progress or a dependency is temporarily unavailable; honor Retry-After before retrying.
504upstream_timeoutThe upstream request exceeded its deadline.