How to Scrape Official Steam Community Market Listings
Updated
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_namefrom the resolved asset. - Original and converted currency identifiers.
price,fee,converted_price, andconverted_feein 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.
"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.