Skip to content
API

Counter-Strike 2 item data

CS2 float API for individual Steam Market listings

Read the wear rating, paint seed, inspect link and observed price of individual CS2 offers. Send an exact Steam market hash name, then page through current offers with one WOK key and the Inspect add-on.

GET /v1/cs2/market-listingsSteam AppID 730 · one page at a time

Updated

First page of live CS2 offersWOK API
curl --fail-with-body --get "https://woksteamapi.com/v1/cs2/market-listings" -H "Authorization: Bearer $WOK_API_KEY" --data-urlencode "name=AK-47 | Redline (Field-Tested)" --data-urlencode "start=0"

Make the first request

Use your WOK key in the Bearer header. The Inspect add-on extends that same key; a Valve Steam Web API key does not authenticate this route. name must be the exact market_hash_name, including exterior and any StatTrak or Souvenir prefix.

Copyable cURL requestWOK API
curl --fail-with-body --get "https://woksteamapi.com/v1/cs2/market-listings" -H "Authorization: Bearer $WOK_API_KEY" --data-urlencode "name=AK-47 | Redline (Field-Tested)" --data-urlencode "start=0"

The example name is a Field-Tested skin. An owned item from your CS2 inventory supplies its exact market hash name. This route observes items listed for sale by the Steam Market; it does not look up a particular player's inventory.

Shortened real listing exampleWOK API
{
  "listings": [{
    "listing_id": "552409902335069142",
    "market_hash_name": "AK-47 | Redline (Field-Tested)",
    "float_value": 0.2967214286327362,
    "paint_seed": 150,
    "total_minor": 3027,
    "currency": "EUR",
    "price_display": "€30.27"
  }],
  "source_start": 0,
  "source_count": 20,
  "total_count": 1336,
  "has_more": true,
  "next_start": 20,
  "coverage": "partial"
}
Read three pages with PythonWOK API
import os
import requests

url = "https://woksteamapi.com/v1/cs2/market-listings"
headers = {"Authorization": f"Bearer {os.environ['WOK_API_KEY']}"}
name = "AK-47 | Redline (Field-Tested)"
start, bucket_id = 0, None

for _ in range(3):  # Explicit cap: at most three 20-lot pages.
    params = {"name": name, "start": start}
    if bucket_id:
        params["bucket_id"] = bucket_id
    response = requests.get(url, headers=headers, params=params, timeout=30)
    response.raise_for_status()
    page = response.json()
    for lot in page["listings"]:
        print(lot["listing_id"], lot["float_value"], lot["price_display"])
    if not page["has_more"] or page["next_start"] is None:
        break
    start, bucket_id = page["next_start"], page["bucket_id"]

The shortened example was observed from the Steam Community Market Redline group. Listings and prices move; use your fresh API response rather than copying the sample values.

Interpret one listing and its price

Every listing is filtered again by its exact market hash name. A missing Steam property remains null; it is never reported as float zero.

FieldMeaning
listing_id, asset_idIdentifiers for the current offer and its individual CS2 asset. Neither is a market hash name.
float_value, float_statusObserved wear rating and whether it was resolved from the Steam inspect certificate or listing property, unavailable, or inconsistent.
paint_seed, paint_index, inspect_linkObserved paint data and the Steam preview action when supplied. The preview certificate is checked against listing properties.
price_minor, fee_minor, total_minorOriginal Steam numeric price components in the returned currency's minor units. Read currency_id, currency and price_display; these values are not automatically USD.
observed_at, cachedUnix observation time in seconds and whether WOK reused a brief shared snapshot. The offer can change or disappear after observation.

For a saved item-type price in USD, use GET /v1/price. Its name-level quote does not represent an individual float, pattern or sticker premium.

Page through current offers without guessing coverage

Each request reads one bounded page of up to 20 Steam source offers. If has_more is true, send the returned next_start as start; valid offsets are multiples of 20. Reuse bucket_id from the first response to skip another name-to-group lookup. Choose a page cap for your application.

source_count describes rows Steam returned before exact-name filtering. listings can be empty on one page while later pages still contain the requested variant.

total_count describes Steam's current filter query. It can include variants that the final exact-name check removes, so it is not a guaranteed exact-name listing count.

coverage="partial" means the response alone does not cover the whole query. Even the last page is partial when earlier pages were returned separately.

WOK briefly caches the same page across API keys and limits simultaneous cold reads. For HTTP 429 or a temporary 503, respect Retry-After. A 402 can mean the Inspect add-on or quota is missing. Steam's Market data interface is subject to change and can temporarily refuse requests; WOK reports that condition instead of inventing a float.

Complete CS2 API mapSteam Market price guideIntegration guideOpenAPI schemaInspect add-on