Skip to main content
GET/v1/pricing/:marketHashName/historyPRO+

/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

marketHashNamestringrequired
Path segment. URL-encoded market_hash_name.
fromstringoptional
Query. ISO 8601 start. Default: now − 30d.
tostringoptional
Query. ISO 8601 end. Default: now.
listingTypestringoptional
Query. SELL_OFFER | BUY_ORDER | SALE_HISTORY. Default: SELL_OFFER.
salesWindowstringoptional
Query. 24h | 7d | 30d | 90d. Only when listingType=SALE_HISTORY.
intervalstringoptional
Query. Requested bucket width: 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

HistoryResponseTime-bucketed price series for an item.
canonicalItemIdstring
Canonical item id.
namestring
Market hash name.
listingTypestring
SELL_OFFER | BUY_ORDER | SALE_HISTORY.
salesWindowstringnullable
Only set when listingType=SALE_HISTORY.
effectiveIntervalstring
Bucket width actually served: 10m | 1h | 1d. Can differ from the requested interval, which snaps to these stored rollups.
One row per time bucket, oldest → newest.

Nested and shared shapes link to the API Objects reference.

Errors

400Unknown interval / listingType, or an invalid date range.
401Missing Authorization header, unsupported scheme, or a key that is unknown, inactive, expired, or revoked.
403Valid key, but the subscription is inactive/expired or the plan does not include this endpoint.
429Rate limit exceeded; see Retry-After + X-RateLimit-* headers. Pooled per account across all keys.
5xxUpstream snapshot unavailable or a server-side issue. Retry with backoff.

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())
Response 200
{
  "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
    }
  ]
}
Response headers
X-RateLimit-Limit: <per-minute, set by your plan>
X-RateLimit-Remaining: <remaining this minute>
X-RateLimit-Reset: <seconds to reset>
X-RateLimit-Remaining-Month: <left this month, capped plans>
X-Request-ID: req_xxxxxxxxxxxxxxxx

Usage & licensing

Access to the API and its data is governed by our Terms of Service. You may not resell or redistribute the data, use it to build a competing service, or exceed your plan’s rate limits, and you must attribute SkinPricer as the source wherever the Terms permit you to display it. Abuse may be throttled or suspended.