# How to Get CSFloat Doppler Sales History

> cs2.sh serves daily CSFloat completed-sale average price and volume by Doppler phase from 2022 onward through `POST /v1/archive/csfloat`.

This series measures completed sales. It is distinct from the current listing floor and bid OHLC, which describe active orders.

## Per-phase sale archive

Doppler sale history is nested under the requested base item's `variants` object. Phase 1-4 use `p1` through `p4`; the gem codes are `ruby`, `sapphire`, and `blackpearl`. Each observed UTC day contains:

- `date`, the day of the aggregate.
- `price`, the arithmetic average of completed-sale prices that day in USD.
- `volume`, the number of completed sales behind that average.

The archive starts in 2022 and refreshes once or twice per day. Rare gems can have fewer returned days and much lower volume than numbered phases.

## Query Doppler completed sales

Send the base Doppler `market_hash_name` and date range to `POST /v1/archive/csfloat`. Read `variants` and match the phase by its stable `version`. Keep `volume` with every price so a one-sale day is not interpreted like a high-volume day.

A sale-count-weighted summary of multiple daily averages uses each day's `volume` as its weight. That can approximate a mean across the represented sales, but it remains derived from daily aggregates. The archive does not return individual transactions.

For quoted market movement, use [CSFloat Doppler price history](/resources/how-to-get-csfloat-doppler-price-history), which returns ask and bid OHLC rather than sale aggregates.

## Applicable endpoints

| Endpoint | Returns | Plans |
| --- | --- | --- |
| `POST /v1/archive/csfloat` | Daily completed-sale average and count by phase | Scale, Enterprise |
| `POST /v1/prices/history` | Phase listing and bid OHLC | Scale, Enterprise |
| `GET /v1/prices/latest` | Current phase asks and bids | All plans |

## What the archive cannot answer

- `price` is a daily arithmetic average, not a median or an individual sale record.
- Float, seed, and stickers are not broken out within the daily phase aggregate. Sparse gem days can move because of item-specific premiums.
- Missing dates mean no returned daily aggregate. Filling them with the prior price creates sale evidence that is not present.
- Steam's native sale archive does not accept variant names. It cannot replace CSFloat's phase-level sale series.

The [CSFloat archive contract](/docs/api-reference/archive-csfloat) details the UTC and exclusive-end semantics.
