Skip to content
API

Steam Community Market

Steam Market API for listings, quotes and history

Choose a market observation deliberately: steam_market is the lowest-listing snapshot, while steam and steam_avg are sale median observations when available. Every quote keeps source and updated_at so your application can show its freshness.

GET /v1/items?source=steam_marketBearer authentication

Updated

curlWOK API
curl --fail-with-body \
  -H "Authorization: Bearer $WOK_API_KEY" \
  --get "https://woksteamapi.com/v1/items" \
  --data-urlencode "game=cs2" \
  --data-urlencode "q=AK-47 | Redline (Field-Tested)" \
  --data-urlencode "source=steam_market"
Listingslowest-listing observations
Sale medianssteam and steam_avg when available
200 namesmaximum batch quote
365 daysobserved daily OHLC history

Which Steam Market price does your application need?

Start with a game key and the exact market_hash_name from an item. The catalog request above searches saved observations; it does not contact Steam during that request.

Saved sourceWhat it describesSafe use
steam_marketObserved lowest listing from a bounded Community Market sweep.Compare an asking price; check updated_at and stock context before displaying it.
steam or steam_avgSaved sale-median observations when available.Compare with the listing source; availability varies by item and game.
steam_buySeparate saved buy-order observation when available.Treat it as a different side of the market. It is excluded from automatic inventory valuation.

Use GET /v1/items?game=cs2&source=steam_market to filter catalog rows by an exact saved source. A search in q is a substring, so match items[].market_hash_name exactly in your client and follow next_cursor. GET /v1/price instead returns WOK's selected default quote; it does not accept price_source or strict.

Python: find one exact saved listing and check its age

The quickstart above returns a search page. This Python example keeps the same filters while following next_cursor as needed, accepts only the exact market name and steam_market source, then applies an example 24-hour client policy to updated_at. Choose an age limit for your own workflow. The timestamp describes the saved source observation, not when this request ran; a catalog read does not refresh Steam or guarantee a newer price. Each catalog page uses one WOK request unit.

Python: exact Steam Market listingWOK API
import os
import time
import requests

market_name = "AK-47 | Redline (Field-Tested)"  # Use an exact market_hash_name.
params = {"game": "cs2", "source": "steam_market",
          "q": market_name, "limit": 200}
headers = {"Authorization": f"Bearer {os.environ['WOK_API_KEY']}"}
quote = None

with requests.Session() as session:
    while True:
        response = session.get(
            "https://woksteamapi.com/v1/items",
            headers=headers, params=params, timeout=15,
        )
        response.raise_for_status()
        page = response.json()
        for item in page["items"]:
            if item["market_hash_name"] != market_name:
                continue  # q is a substring search, not an exact lookup.
            quote = next((price for price in item["prices"]
                          if price["source"] == "steam_market"), None)
            break
        if quote is not None or not page["has_more"]:
            break
        params["cursor"] = page["next_cursor"]  # Keep all filters unchanged.

if quote is None:
    print("No saved Steam Market listing for this exact item")
else:
    age_hours = max(0, time.time() - quote["updated_at"]) / 3600
    max_age_hours = 24  # Example application policy, not a WOK freshness SLA.
    if age_hours > max_age_hours:
        print(f"Saved listing is {age_hours:.1f} hours old; hide its value")
    else:
        print({"price_usd": quote["price_usd"],
               "observed_at": quote["updated_at"],
               "age_hours": round(age_hours, 1)})

Read only observed price history

30-day Steam Market history requestWOK API
curl --fail-with-body -H "Authorization: Bearer $WOK_API_KEY" --get "https://woksteamapi.com/v1/price-history" --data-urlencode "game=cs2" --data-urlencode "name=AK-47 | Redline (Field-Tested)" --data-urlencode "source=steam_market" --data-urlencode "days=30"

The history guide explains OHLC fields and gaps. A 30-day request can return fewer than 30 daily points: WOK records observations only after an item enters its tracked set, and no missing day is fabricated. Prices are USD estimates, not guaranteed proceeds after fees.

Need the float of an individual current CS2 offer? The CS2 Market float API guide covers the separate live, paginated listing route. Its prices use Steam's returned native currency rather than this saved USD catalog.

Current CS2 listing floatsOne quote or a 200-name batchApply prices to owned itemsSeparate BUFF163 CS2 observationsDota 2 inventory exampleTF2 backpack example

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" \
  --get "https://woksteamapi.com/v1/items" \
  --data-urlencode "game=cs2" \
  --data-urlencode "q=AK-47 | Redline (Field-Tested)" \
  --data-urlencode "source=steam_market"
JavaScript (Node.js)WOK API
// Node.js: keep the API key on your server.
const url = new URL("https://woksteamapi.com/v1/items");
url.search = new URLSearchParams({
  game: "cs2",
  q: "AK-47 | Redline (Field-Tested)",
  source: "steam_market"
});
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 quote = await response.json();
PythonWOK API
import os
import requests

response = requests.get(
    "https://woksteamapi.com/v1/items",
    headers={"Authorization": f"Bearer {os.environ['WOK_API_KEY']}"},
    params={
        "game": "cs2",
        "q": "AK-47 | Redline (Field-Tested)",
        "source": "steam_market",
    },
    timeout=10,
)
response.raise_for_status()
quote = response.json()

Response example

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

JSON

application/json
{
  "game": "cs2",
  "query": "AK-47 | Redline (Field-Tested)",
  "source": "steam_market",
  "items": [
    {
      "game": "cs2",
      "market_hash_name": "AK-47 | Redline (Field-Tested)",
      "source_count": 1,
      "prices": [
        {
          "source": "steam_market",
          "price_usd": 12.1,
          "volume": 3,
          "updated_at": 1787572800.0
        }
      ]
    }
  ],
  "next_cursor": null,
  "has_more": false
}

Response schema

Stable fields for typed clients, storage and error handling.

Steam Market API for listings, quotes and history response schema
FieldTypeMeaning
gamestringRequested named game key.
querystringSearch text; q is a substring search, not an exact-name assertion.
sourcestring|nullExact saved source filter; buff selects BUFF163 for CS2.
items[].market_hash_namestringExact market hash name to match before using a quote.
items[].source_countintegerNumber of returned source rows for this item.
items[].prices[].sourcestringSource of this observation.
items[].prices[].price_usdnumberSaved source observation in USD.
items[].prices[].volumeintegerSource activity/count metadata, never a player's item count.
items[].prices[].updated_atnumberSource observation timestamp, not the time of this API request.
next_cursorstring|nullOpaque cursor for the next page with the same filters.
has_morebooleanWhether another page is available.

Limits and error behavior

Rules clients should handle explicitly in production.

GET /v1/price requires an exact market hash name. A valid item with no catalog match returns HTTP 404. If rows exist but no price passes selection, price=0, source='' and updated_at=0 represent no usable quote, not a zero-value item.

POST /v1/prices accepts 1 through 200 names. Unknown names are omitted from its result, so compare response keys with the requested list.

Prices are USD observations, not guaranteed sale proceeds. Fees, liquidity and item-specific attributes can change the realizable value.

steam_market is WOK's lowest-listing observation from the bounded Steam Market sweep; steam/steam_avg are sale-median observations when present.

Use a market hash name, not a localized display label. The catalog can only match names observed for the selected game.

A lowest listing is an observation, not a guaranteed executable price. Fees, currency conversion, availability and liquidity must be handled by the client.

Cache and freshness semantics

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

GET /v1/price updated_at belongs to the selected source, not the newest timestamp from an unrelated market. Its default selection comes from the server configuration.

sources keeps the available source-level observations. A missing key means that source has no saved catalog match for the item. A saved observation is not a promise of a real-time executable quote.

GET /v1/items exposes per-source updated_at values and cursor pagination when an integration needs to inspect the catalog directly.

GET /v1/price-history returns observed daily OHLC points for 1 through 365 days; it does not synthesize days with no observations.

GET /v1/price and POST /v1/prices do not accept price_source or strict. The batch quote omits updated_at; use GET /v1/items with source and inspect each source row when selection or freshness is required.

Frequently asked questions

Direct answers about access, freshness and result semantics.

Is this the Steam Store game price API?

No. This page covers Community Market item observations such as listings and sale medians, not the regional price of a game or DLC in the Steam Store.

What does steam_market mean?

It is WOK's lowest-listing observation from a bounded Community Market sweep. It is useful for comparison, but it is not a guaranteed executable sale price.

Does a catalog request fetch a live Steam Market listing?

No. GET /v1/items reads WOK's saved catalog. Check each observation's updated_at and source; a missing item or date is unavailable data, not a zero market price.

Can I request history?

Yes. GET /v1/price-history returns observed daily OHLC points for one market hash name, source and period up to 365 days. It does not backfill dates before WOK observed the item.