# How to Scrape Official Steam Community Market Prices

> Valve's official Steam Community Market exposes a public `priceoverview` route that returns one item's lowest sell listing, median price, and volume without an API key or API fee. The route is undocumented and is not an official Steam Market API, so design for throttling and response changes.

## Request one exact item

Send a GET request to `https://steamcommunity.com/market/priceoverview/` with `country=US`, `currency=1`, `appid=730`, and an exact URL-encoded `market_hash_name`.

For example, the name portion of `AK-47 | Redline (Field-Tested)` must be encoded before it is placed in the query string. Do not remove the wear or change punctuation: Steam treats the complete market hash name as the item identity.

| Parameter | Purpose |
| --- | --- |
| `appid` | `730` for Counter-Strike 2 |
| `market_hash_name` | Exact URL-encoded Steam item name |
| `currency` | Steam currency identifier; `1` requests USD |
| `country` | Country code used with price display and fees |

## Inspect the response shape

A representative successful body for `Fever Case` is `{"success":true,"lowest_price":"$0.89","volume":"59,569","median_price":"$0.89"}`. Prices and volume are display strings, not JSON numbers.

| Field | Type | Meaning |
| --- | --- | --- |
| `success` | Boolean | Whether Steam returned a recognized result |
| `lowest_price` | Localized string | Current lowest sell listing |
| `median_price` | Localized string | Steam's current median summary |
| `volume` | Localized string | Steam's displayed sale-volume summary |

Keep the raw strings, then parse them with rules tied to the requested currency and locale. A failure may be `{"success":false}`, an empty body, or HTML instead of JSON.

Do not substitute one field for another. `lowest_price` is a current sell listing. `median_price` is Steam's summary statistic, not a historical series. `volume` is Steam's summary volume value, not the number of active listings. Fields can be absent even when the JSON object itself is valid.

## Turn a request into a collector

1. Start with exact names from a maintained CS2 catalog.
2. Encode every name and record the requested country and currency.
3. Require `success=true` before accepting fields.
4. Store an observation timestamp beside the raw response.
5. Treat HTTP 429, HTML, null JSON, and missing fields as failures rather than zero prices.
6. Add bounded retry delays and cache results instead of polling unchanged items repeatedly.

Steam publishes no request allowance for this Market route. The 100,000-call figure in the Steam Web API terms applies to the documented Web API, not `priceoverview`.

## The managed alternative

The endpoint is free to call, but it handles only one exact item per request. Catalog scheduling, blocks, missing fields, retries, storage, freshness checks, and historical retention become the real work. A collector that quietly accepts HTML or a missing field can publish a false zero while still reporting successful HTTP requests.

If one Steam item is all you need, scraping can still be reasonable. If collection is only a prerequisite, [cs2.sh](https://cs2.sh/) provides [current prices](/docs/prices-latest) and [historical OHLC](/docs/prices-history) without operating a Steam collector.

## The same data from cs2.sh

`priceoverview` returns one item per request as localized display strings. `GET /v1/prices/latest` returns every tracked item at once as typed numbers, across six marketplaces, on all plans.

```bash
curl -X POST https://api.cs2.sh/v1/prices/latest \
  -H "Authorization: Bearer <<YOUR_API_KEY>>" \
  -H "Accept-Encoding: gzip" --compressed \
  -H "Content-Type: application/json" \
  -d '{"items": ["AK-47 | Redline (Field-Tested)"]}'
```

```json
"steam": {
  "updated_at": "2026-07-26T18:52:21.42Z",
  "collected_at": "2026-07-26T18:52:56.46Z",
  "ask": 169.14,
  "ask_volume": 70,
  "bid": 155.05,
  "bid_volume": 2951
}
```

| `priceoverview` | cs2.sh |
| --- | --- |
| `lowest_price`, a localized string | `ask`, a number in USD |
| `volume`, a localized summary string | `ask_volume` and `bid_volume`, active order counts |
| No buy-order price | `bid`, the highest buy order |
| No timestamp | `updated_at` and `collected_at` per source |
| One item per request | Every tracked item, or up to 100 by name |
| Steam only | BUFF, Youpin, CSFloat, Skinport, Steam, C5Game |

`median_price` has no cs2.sh equivalent in current prices because it is a summary statistic rather than a live order. The comparable series is `POST /v1/archive/steam`, which returns Steam's own median sale price and purchase count per bucket, daily from April 26, 2013.

Disclosure: this free DIY guide is published by cs2.sh. The [Steam Subscriber Agreement](https://store.steampowered.com/subscriber_agreement/) currently restricts automated interaction with Steam. This article documents a public read route and does not grant permission to automate it. Endpoint behavior was checked on August 5, 2026.
