SteamWebAPI to WOK API
Migrate from SteamWebAPI to WOK
Start with compatible endpoint paths. Validate prices, grouping, errors and quotas before switching your customers.
BASE_URL + API_KEY- BASE_URL = "https://www.steamwebapi.com"
+ BASE_URL = "https://woksteamapi.com"
- API_KEY = "your-steamwebapi-key"
+ API_KEY = "your-wok-key"
The legacy ?key= parameter works. Prefer a server-side Bearer header so the key stays out of URL logs.

Map the endpoints you use
WOK supports the inventory and profile paths below, not every SteamWebAPI feature or parameter. Native endpoints have different contracts.
| Current call | WOK API | Notes |
|---|---|---|
/steam/api/inventory | GET /steam/api/inventory | Success is an item array. Grouped by default; validate missing prices, item fields and HTTP errors. |
/steam/api/profile | GET /steam/api/profile | One profile object. Check the documented fields rather than assuming full field parity. |
| Inventory totals and metadata | GET /v1/inventory | Native object with status, total, items and meta. Not an array replacement. |
| Multiple inventories | POST /v1/inventories | Native results[] envelope with per-pair success and errors. Adapt the payload and parser. |
| Price lookups | POST /v1/prices | Look up market hash names without scanning Steam; use the price API guide. |
Reference: WOK OpenAPI. FACEIT has its own documented WOK endpoints; it is not a claim of SteamWebAPI endpoint compatibility.
Run a compatibility request
Set WOK_API_KEY in your server environment. Use a public SteamID64; the Python example requires the requests package.
inventorycurl --fail-with-body --max-time 35 -G "https://woksteamapi.com/steam/api/inventory" \
-H "Authorization: Bearer $WOK_API_KEY" \
--data-urlencode "steam_id=76561198090744629" \
--data-urlencode "game=cs2" \
--data-urlencode "currency=USD" \
--data-urlencode "price_source=auto" \
--data-urlencode "group=1"
requestsimport os
import requests
response = requests.get(
"https://woksteamapi.com/steam/api/inventory",
headers={"Authorization": f"Bearer {os.environ['WOK_API_KEY']}"},
params={
"steam_id": "76561198090744629",
"game": "cs2",
"currency": "USD",
"price_source": "auto",
"group": 1,
},
timeout=35,
)
response.raise_for_status() # Handle 403/410/429/5xx in your application.
items = response.json()
if not isinstance(items, list):
raise ValueError("Expected the WOK compatibility inventory array")
print("Sellable value (USD):", response.headers.get("X-Wok-Total"))
for item in items:
# Missing prices are unknown values, not proof that an item is worthless.
print(item["markethashname"], item["count"],
item["pricemedian"], item["pricesource"])
Choose a price source when needed
Pass price_source explicitly when comparing valuations. An omitted value uses the key or server default; auto explicitly chooses automatic selection.
autosteamsteam_buyskinportmarketbackpacktfbuffmix
?price_source=steam_buy&strict=1
auto uses an ordered preference, not the highest available price, and excludes BUFF163. mix selects the lowest eligible market price and can include a BUFF163 observation no older than 72 hours after an outlier check. Steam buy orders are excluded from both. Choose buff&strict=1 for BUFF-only values or steam_buy explicitly for a buy-order value.
strict=1 prevents fallback outside the selected mode; steam remains a family of Steam observations, not one feed. With a missing strict-source price, pricemedian can be null. Inspect pricesource, priceupdatedat and prices rather than assuming every item has that source.
Values are USD, not cents. The legacy currency parameter does not convert WOK responses. BUFF163 pricing covers supported CS2 catalog items; it does not provide BUFF account trading or order execution.
Check the contract before cutover
Replay a small set of saved responses in staging, then compare bounded live requests for the same SteamID, game and source.
| Check | WOK behavior and acceptance check |
|---|---|
| Items and units | group=1 groups equivalent rows with count; group=0 exposes individual assetid strings. Check quantities, tradability and null prices. Use X-Wok-Total for the compatibility sellable total in USD, not a sum of every row. |
| HTTP errors | Compatibility inventory: 403 private, 404 not found, 410 empty, 429 rate or capacity limit, 502 upstream failure. Handle authentication, quota and validation errors separately. Do not turn a failed scan into a zero-value inventory. |
| Native responses | A native inventory can return HTTP 200 with status=private, notfound, limited or error. For batches, inspect every results[].ok and results[].error; HTTP 200 does not mean all pairs succeeded. |
| Freshness | X-Wok-Cache-Age and X-Wok-Cache-TTL describe the inventory snapshot. Each item's priceupdatedat describes its selected catalog source. A cache hit can contain repriced items without a new Steam scan. |
| Repricing and retries | refresh_prices=1 reprices an active snapshot locally; a missing snapshot returns 404 INVENTORY_CACHE_MISS. Do not combine it with no_cache=1. Use bounded retries with backoff, and Retry-After when supplied. |
For native inventory batches, reserve one quota unit per player-game pair, with at most 80 pairs per call. A 20-player workload across eight games needs 160 units and at least two batches. GET /v1/key reports your effective remaining quotas without consuming a unit.
Route a small share of traffic only after these checks pass. Keep your previous configuration for rollback, and compare error rate, missing prices, inventory age and latency under the same workload. WOK is independent of SteamWebAPI; this guide does not promise complete feature parity.
Inventory response referenceCS2 inventory examplesInventory valuation rulesRate-limit handling
Plans
Prepaid access starts at 30 days and does not renew automatically. Pay by card, SBP, SberPay or USDT.
FREE DEVELOPER
Free
- inventory calls / 30 days
- 1 000
- per day
- 100
- RPM
- 30
START
$12
- inventory calls / 30 days
- 300 000
- per day
- 10,000
- RPM
- 120
PRO
$29
- inventory calls / 30 days
- 700 000
- per day
- 24,000
- RPM
- 300
MAX
$59
- inventory calls / 30 days
- 2 000 000
- per day
- 80,000
- RPM
- 600
ULTRA
$119
- inventory calls / 30 days
- 7 000 000
- per day
- 240,000
- RPM
- 1200
TITAN
$199
- inventory calls / 30 days
- 9 000 000
- per day
- 350,000
- RPM
- 1500
Docs, OpenAPI and SDKsFull pricing detailsSteamWebAPI alternative