/v1/pricing/:marketHashName/history
Time-bucketed historical price series for an item (avg/median/min/max plus best bid/ask in cents). Filter by from/to (ISO), listingType (SELL_OFFER | BUY_ORDER | SALE_HISTORY), and salesWindow. Granularity is chosen automatically from the range, or requested with interval (snapped to the stored 10m / 1h / 1d rollups and echoed as effectiveInterval). For one series per market instead of the cross-market aggregate, see history by market.
Returns a series of time buckets, oldest to newest. Each bucket summarizes the prices seen in that window (avg / median / min / max) plus the best bid, best ask, and spread at the time: the shape behind a price chart.
listingType picks what you're charting: SELL_OFFER (asks, the default), BUY_ORDER (bids), or SALE_HISTORY (completed sales, paired with salesWindow). Bucket granularity is chosen automatically from your from/to range, or requested with interval. Buckets are served from stored 10-minute, 1-hour, and 1-day rollups, so a requested interval snaps to the nearest one (MINUTE_5 and MINUTE_15 to 10m, HOUR_1 and HOUR_6 to 1h, DAY_1 to 1d); the response's effectiveInterval tells you which width you got.
volume is the rolling sale count for that bucket when listingType=SALE_HISTORY (the number of completed sales, not a traded-notional figure), and null for SELL_OFFER / BUY_ORDER. totalQuantity carries buy-order quantity on BUY_ORDER buckets. Treat null as "not applicable here", not zero.
Game-scoped variant: GET /v2/pricing/:marketHashName/history serves both games with a required game=cs2|rust parameter. On thin Rust items prefer bestAskCents / bestBidCents over the venue-equal medianPrice - see Games: CS2 & Rust.
Parameters
SELL_OFFER | BUY_ORDER | SALE_HISTORY. Default: SELL_OFFER.24h | 7d | 30d | 90d. Only when listingType=SALE_HISTORY.MINUTE_5 | MINUTE_15 | HOUR_1 | HOUR_6 | DAY_1. Overrides the granularity otherwise derived from from/to, snapping to the nearest stored rollup (MINUTE_5/MINUTE_15 → 10m, HOUR_1/HOUR_6 → 1h, DAY_1 → 1d); effectiveInterval in the response reports the width served. An unknown value returns 400.Response fields
SELL_OFFER | BUY_ORDER | SALE_HISTORY.10m | 1h | 1d. Can differ from the requested interval, which snaps to these stored rollups.Nested and shared shapes link to the API Objects reference.
Errors
interval / listingType, or an invalid date range.Authorization header, unsupported scheme, or a key that is unknown, inactive, expired, or revoked.Guides using this endpoint
export SKINPRICER_API_KEY="sp_live_•••"
curl -G "https://pricing.skinpricer.com/v1/pricing/AK-47%20%7C%20Redline%20(Field-Tested)/history" \
--data-urlencode "interval=HOUR_1" \
-H "Authorization: ApiKey $SKINPRICER_API_KEY"// npm i @skinpricer/sdk
import { SkinpricerClient } from "@skinpricer/sdk";
const client = new SkinpricerClient({
apiKey: process.env.SKINPRICER_API_KEY!,
authScheme: "ApiKey",
});
const series = await client.history.get("AK-47 | Redline (Field-Tested)", { interval: "HOUR_1" });
console.log(series.history.length, "buckets");import os
import requests
res = requests.get(
"https://pricing.skinpricer.com/v1/pricing/AK-47%20%7C%20Redline%20(Field-Tested)/history",
params={"interval": "HOUR_1"},
headers={"Authorization": f"ApiKey {os.environ['SKINPRICER_API_KEY']}"},
timeout=10,
)
res.raise_for_status()
print(res.json()){
"canonicalItemId": "cmlofca920lka01yozajhixt3",
"name": "Glock-18 | Water Elemental (Factory New)",
"listingType": "SELL_OFFER",
"salesWindow": null,
"effectiveInterval": "1d",
"history": [
{
"timestamp": "2026-05-25T00:00:00.000Z",
"avgPrice": 4923,
"medianPrice": 4222,
"minPrice": 3522,
"maxPrice": 8805,
"listingCount": 1442,
"totalQuantity": null,
"volume": null,
"bestBidCents": null,
"bestAskCents": 3522,
"spreadBps": null
}
]
}