# How to Scrape Official Steam Community Market Listings

> 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](https://cs2.sh/) provides [current prices](/docs/prices-latest) and [full Steam orderbooks](/docs/market-steam-latest) 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](https://store.steampowered.com/subscriber_agreement/) and obtain any permission your use requires. The request and grouped-page behavior were checked on August 5, 2026.
