How to Scrape Official Steam Community Market Listings

Updated

Endpoints used: GET /v1/prices/latest

Valve's official Steam Community Market exposes market/listings/730/<market_hash_name>/render/ for individual listing IDs, assets, inspect actions, and fee components. This is a free undocumented web route, not an official API, and grouped pages mean every response must be matched to the exact requested item.

Form the listing URL#

URL-encode the complete market_hash_name in the path. Add query, start, count, country, language, currency, and filter as query parameters. A typical first page uses an empty query and filter, start=0, count=10, country=US, language=english, and currency=1.

Send the exact item page as the referer. Record both the requested URL and final URL because a redirect can change the identity being displayed.

Join listings to assets#

The render response is not a flat list. listinginfo is keyed by listing ID, while assets is grouped by app ID, context ID, and asset ID. Each listing's asset reference points into that nested map.

A shortened response shape looks like {"success":true,"start":0,"pagesize":1,"total_count":1153,"listinginfo":{"<listingid>":{"converted_price":3648,"converted_fee":546,"asset":{"appid":730,"contextid":"2","id":"<assetid>"}}},"assets":{"730":{"2":{"<assetid>":{"classid":"<classid>","market_hash_name":"AK-47 | Redline (Field-Tested)"}}}}}. The IDs, counts, and prices are volatile; the important part is the join from listinginfo.<listingid>.asset.id to the same key below assets.730.2.

For every listing, preserve:

  • Listing ID and asset ID.
  • App ID, context ID, class ID, and instance ID.
  • Exact market_hash_name from the resolved asset.
  • Original and converted currency identifiers.
  • price, fee, converted_price, and converted_fee in integer minor units.
  • Inspect or market actions when present.

The buyer-facing converted total is converted_price + converted_fee. Keep the components as well as the total so a later fee change does not erase the original response.

Handle pagination and grouped pages#

Use start, pagesize, and total_count to advance through results. Save a page only after its listing-to-asset references resolve cleanly.

Steam can redirect an exact-name listing URL to a grouped path beginning with G. The cs2.sh collector uses the ordinary bMarketOptOut=1 preference cookie when it needs an exact classic item page, then still verifies the returned item's name. A response for another group member must never be labeled as the requested item.

Ordinary HTTP clients may also receive a redirect, an HTML interstitial, or a stripped page instead of the expected JSON. Treat those as access failures. Do not turn them into zero listings and do not attempt to defeat an access-control response.

When raw listings are unnecessary#

Raw Steam listings are appropriate for an asset browser, inspect-link tool, or listing-specific filter. cs2.sh public plans intentionally return item-level prices and full orderbook levels rather than Steam listing IDs. Live raw Steam listings are an Enterprise option.

Individual listing collection is one of the most expensive Steam paths to maintain: responses mix HTML and structured maps, exact pages can redirect into groups, and a successful page can still omit the expected asset. If the product only needs the lowest sell listing, highest buy order, active-order counts, or depth, cs2.sh provides current prices and full Steam orderbooks without paging through individual assets.

The same data from cs2.sh#

If the product needs prices and depth rather than individual listing IDs, GET /v1/market/steam/latest returns the full bid and ask ladder for every tracked regular item, on all plans, with no paging and no listing-to-asset join.

json
"USP-S | Printstream (Factory New)": {
  "updated_at": "2026-07-26T18:52:21.42Z",
  "collected_at": "2026-07-26T18:52:56.46Z",
  "top": { "ask": 169.14, "ask_volume": 70, "bid": 155.05, "bid_volume": 2951 },
  "depth": {
    "ask_levels": 2,
    "bid_levels": 2,
    "asks": { "prices": [169.14, 169.4], "volumes": [1, 1] },
    "bids": { "prices": [155.05, 154.88], "volumes": [1, 1] }
  }
}

The ladders are columnar: prices and volumes are parallel arrays, so level n is prices[n] at volumes[n]. Ask prices sort ascending and bid prices descending. The response is about 100 MB uncompressed, so Accept-Encoding: gzip is required.

What this does not replace: listing IDs, asset IDs, inspect actions, and per-listing fee components. Those exist only in the render route. cs2.sh public plans return item-level prices and orderbook levels rather than Steam listing identity.

Disclosure: this free DIY guide is published by cs2.sh. Steam does not support this route as a public developer contract. Check the Steam Subscriber Agreement and obtain any permission your use requires. The request and grouped-page behavior were checked on August 5, 2026.