Skip to content
API

Steam data API

Steam API for inventories, profiles, Rust stats and prices

WOK is a server-side REST API for public Steam data. Use one key for normalized inventories, profile lookup, published Rust stats, batch requests and item values without operating your own proxy fleet.

GET /v1/inventoryBearer authentication

Updated

curlWOK API
curl --fail-with-body \
  -H "Authorization: Bearer $WOK_API_KEY" \
  "https://woksteamapi.com/v1/inventory?steam_id=76561198090744629&game=cs2&top=10"
RESTserver-side JSON endpoints
8 gamesCS2, Rust, TF2, Dota 2, PUBG, s&box, Unturned and PAYDAY 2
ProfilesSteamID64, URL or vanity input
OpenAPItyped public contract

Start with the data your application needs

Use a public inventory to identify owned items, a market hash name to quote an item, or a profile lookup to resolve a player.

Use the Steam price API for quotes, catalog search and observed history without rescanning a player's inventory. The market source guide explains listing observations and missing prices.

One key, three different questions

QuestionRequestWhat to inspect
Who is this public player?GET /v1/profile?steam_id=...Stable steamid, current name, photo and visibility; optional fields may be absent.
Which game items are public?GET /v1/inventory?steam_id=...&game=cs2&top=0status, grouped items, unpriced and inventory cache age.
What is one saved item quote?GET /v1/price?game=cs2&name=...Selected price, source, other saved sources and updated_at.

Use the same WOK key in the Authorization: Bearer header for all three. A visible profile does not imply a visible inventory; a saved item quote does not prove that any player owns it. For game-specific route maps and source limits, read the CS2 API, Rust API, TF2 API or Dota 2 API overview.

Which Steam Web API method maps to WOK?

Use this map when adapting an existing Steam integration. Authenticate WOK requests with your WOK key on a trusted server; a Valve key cannot authenticate WOK and a WOK key cannot call Valve methods.

Valve or Steam sourceWOK routeScope and limit
ISteamUser/GetPlayerSummariesGET /v1/profileCurrent public identity, avatar and visibility; resolve a vanity URL here before using SteamID64-only routes.
ISteamUser/GetFriendListGET /v1/friendsPublic friend list only; private lists remain unavailable. Page through next_cursor when present.
IPlayerService/GetOwnedGamesGET /v1/games; GET /v1/rust/playtimeVisible library and playtime; hidden game details are unknown, not zero hours.
ISteamUserStats/GetUserStatsForGameGET /v1/rust/stats or /v1/rust/summaryPublished lifetime Rust counters for AppID 252490. Steam does not provide a per-server kill or resource breakdown here.
ISteamUserStats/GetPlayerAchievementsGET /v1/rust/achievementsPublished Rust achievements and numeric achieved flags; availability depends on Steam visibility.
Public Steam Community inventoryGET /v1/inventoryGrouped public inventory items for eight named games or a numeric AppID; item values depend on saved market observations.
IInventoryService/GetInventoryPublisher-only method; no WOK equivalentSteamworks publisher inventory permissions, item grants and trading are outside WOK's public read-only API.

For the complete parameter and error contract, use the WOK API reference or OpenAPI schema. The Steam API key guide explains which credential belongs to each service.

Steam Web API or WOK: which integration fits?

The official Steam Web API and WOK serve different jobs. WOK is an independent service, not a Valve endpoint or a replacement for Steamworks publisher access.

NeedStart hereWhy
Official methods for your Steamworks appValve Steam Web APIPublisher-only methods and permissions belong to your Steamworks publisher account. A WOK key cannot authenticate them.
Public player identityWOK Steam profile API or an appropriate official methodResolve a SteamID64 or vanity URL into public fields; private data remains unavailable.
Public inventories with item valuesWOK inventory APIOne documented response across eight games includes status, grouped items, matched USD prices and cache metadata. Values are estimates, not an item appraisal.

For a read-only manual check, use the public inventory checker. For a server application, compare authentication and limits in the Steam API key guide and 30-day plans. Never put a private API key in a browser bundle.

Quickstart

Use WOK from a trusted server. Keep the API key outside browser bundles and public repositories.

curlWOK API
curl --fail-with-body \
  -H "Authorization: Bearer $WOK_API_KEY" \
  "https://woksteamapi.com/v1/inventory?steam_id=76561198090744629&game=cs2&top=10"
JavaScript (Node.js)WOK API
// Node.js: keep the API key on your server.
const url = new URL("https://woksteamapi.com/v1/inventory");
url.search = new URLSearchParams({
  steam_id: "76561198090744629",
  game: "cs2",
  top: "10"
});
const response = await fetch(url, {
  headers: { Authorization: `Bearer ${process.env.WOK_API_KEY}` }
});
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);
const inventory = await response.json();
PythonWOK API
import os
import requests

response = requests.get(
    "https://woksteamapi.com/v1/inventory",
    headers={"Authorization": f"Bearer {os.environ['WOK_API_KEY']}"},
    params={
        "steam_id": "76561198090744629",
        "game": "cs2",
        "top": 10,
    },
    timeout=30,
)
response.raise_for_status()
inventory = response.json()

Response example

The values below illustrate the response shape. Field names and types match the public contract.

JSON

application/json
{
  "steamid": "76561198090744629",
  "game": "cs2",
  "status": "ok",
  "total": 24.68,
  "items_total": 2,
  "sellable": 2,
  "untradable": 0,
  "untradable_value": 0.0,
  "tradelocked": 0,
  "tradelocked_value": 0.0,
  "unpriced": 0,
  "items": [
    {
      "markethashname": "Example market item",
      "count": 2,
      "game": "cs2",
      "tradable": 1,
      "marketable": 1,
      "pricemedian": 12.34,
      "prices": {
        "steam": 12.34
      }
    }
  ],
  "meta": {
    "cached": true,
    "shared": false,
    "lane": "cache",
    "saved": false,
    "ms": 0,
    "bytes": 0,
    "paid_bytes": 0,
    "upstream_attempts": 0,
    "detail": "",
    "cache_age": 42,
    "cache_ttl": 1800,
    "price_source": "steam"
  }
}

Response schema

Stable fields for typed clients, storage and error handling.

Steam API for inventories, profiles, Rust stats and prices response schema
FieldTypeMeaning
steamidstringCanonical 17-digit SteamID64.
gamestringDocumented key: cs2, rust, tf2, dota2, pubg, sandbox, unturned or payday2. Numeric Steam appids are also accepted and returned as app<appid> without catalog pricing.
statusstringok, empty, private, notfound, limited or error.
totalnumberPriced sellable inventory total in USD.
items_totalintegerNumber of item instances before top truncation.
sellableintegerTradable and marketable item instances, including unpriced ones; total sums matched values.
untradableintegerItem instances excluded from sellable value.
untradable_valuenumberValue of excluded untradable items in USD.
tradelockedintegerItem instances currently trade locked.
tradelocked_valuenumberValue of trade-locked items in USD.
unpricedintegerInstances without a usable price.
items[]arrayItems with market names, count, trade state, prices and optional inspect links.
items[].markethashnamestringCanonical price-catalog market hash name.
items[].marketnamestringSteam market display name when supplied.
items[].typestringSteam-supplied item type text; not a WOK-normalized category.
items[].countintegerGrouped item instance count.
items[].tradableintegerSteam tradability flag, 0 or 1.
items[].marketableintegerSteam marketability flag, 0 or 1.
items[].tradelockedbooleanWhether the grouped item is trade locked.
items[].tradelockuntilnumber|nullUnix expiry when a trade lock is known.
items[].pricemediannumber|nullSelected source median price in USD.
items[].pricesourcestringSelected catalog source; empty when the item is unpriced.
items[].priceupdatedatnumber|nullSelected source observation time, separate from inventory cache age.
items[].pricesobjectPer-source USD prices.
items[].inspect_linksarrayOptional CS2 inspect actions.
metaobjectCache age/TTL, cached/shared flags, timing, bytes, lane and upstream-attempt metadata.
meta.cachedbooleanWhether the inventory snapshot was reused.
meta.sharedbooleanWhether this request joined an in-flight singleflight fetch.
meta.cache_ageintegerSnapshot age in seconds.
meta.cache_ttlintegerApplied freshness window in seconds.

Limits and error behavior

Rules clients should handle explicitly in production.

The Steam inventory must be public. Private, missing and empty inventories are distinct statuses, not successful empty data.

top accepts 0 through 100. top=0 returns every item row; items_total still describes the complete inventory when a top limit is used.

Prices are USD. An item can be valid while pricemedian is null; use unpriced instead of treating missing prices as zero-value evidence.

A partial or malformed Steam inventory is not saved as a successful snapshot. On GET /v1/inventory, validation/auth failures use HTTP 400/401/402/404/422/429; Steam outcomes private, notfound, limited and error are returned with HTTP 200 in response.status. The compatibility GET /steam/api/inventory maps them to 403/404/429/502 (empty to 410).

WOK is an independent data API, not Valve's publisher-only Steamworks Inventory Service. It reads public community data and does not grant, consume or trade items.

Cache and freshness semantics

How to tell whether data was reused, shared or refreshed.

Successful inventory snapshots use a 1,800-second default TTL. Negative defaults are 21,600 seconds for empty, 3,600 seconds for private and 600 seconds for not found.

For authenticated inventory responses that reach validation/result handling, read X-Wok-Cache-Age and X-Wok-Cache-TTL when present; authentication and quota errors may omit them.

Identical concurrent misses are coalesced. A waiter receives X-Wok-Singleflight: 1 and does not start another Steam inventory fetch.

Use refresh_prices=1 or POST /v1/inventory/refresh-prices only with an active compatible OK/EMPTY snapshot. Repricing never fetches Steam or resets inventory age/TTL; 404 inventory_cache_miss means run a normal inventory scan. refresh_prices=1 cannot be combined with no_cache=1; prices_updated_at identifies the repricing operation.

Frequently asked questions

Direct answers about access, freshness and result semantics.

Is WOK the official Valve Steam Web API?

No. WOK is an independent server-side data API for public Steam community inventories and profiles. It does not grant, consume or trade items.

Which WOK endpoint should I call first?

Use GET /v1/profile for a public player's identity, GET /v1/inventory for their public items, GET /v1/price for one market hash name and POST /v1/inventories for a roster. These operations use a WOK key, not a Valve publisher key.

Which games are supported?

The named catalog supports CS2, Rust, Team Fortress 2, Dota 2, PUBG, s&box, Unturned and PAYDAY 2 through documented game values. Numeric Steam AppIDs are also accepted for inventory-only integrations.

Can I use the API directly in a browser?

Keep the API key on your server. A browser bundle, desktop client or public repository cannot safely hold a private API key.