Skip to main content
GET/v1/aggregations/min-pricesDEVELOPER+

Aggregated Min Prices

Batch lookup of the lowest ask per market for up to 100 items at once. Pass market hash names (or canonical item ids); each item comes back with its minimum price on every requested market. Response is snake_case. Prices are integer USD cents.

A batch helper: hand it up to 100 market hash names (or canonical item ids) and get each item's lowest ask on every requested market in one round-trip, instead of calling /v1/nbbo per item. Response is snake_case. Items with no data (or names that aren't tracked) are silently dropped. There's no notFound[], so diff the returned items against what you asked for. You only get a 400 when *none* of the requested items resolve.

offers is the total listings tracked for that item on that market (the quote size), not a count conditioned on price; is_stale flags a quote past its freshness window (still returned as a fallback). The bid-side mirror, max-orders, is the same shape with orders[] instead of prices[].

Parameters

marketHashNamesstringoptional
Query. CSV of market hash names, max 100. Provide this OR ids.
idsstringoptional
Query. CSV of canonical item ids, max 100. Provide this OR marketHashNames.
marketsstringoptional
Query. CSV of market ids to restrict the response, e.g. skinport,csfloat,buff163.

Response fields

MinPricesResponseLowest ask per market for the requested items. snake_case.
One entry per requested item.

Nested and shared shapes link to the API Objects reference.

Response 200

{
  "items": [
    {
      "canonical_item_id": "cmlofca920lka01yozajhixt3",
      "market_hash_name": "Glock-18 | Water Elemental (Factory New)",
      "prices": [
        {
          "market_name": "csfloat",
          "offers": 132,
          "price": 6500,
          "updated_at": "2026-06-23T21:52:27.427Z",
          "is_stale": false,
          "ingested_at": "2026-06-23T21:55:56.923Z",
          "ingest_latency_ms": 209496
        },
        {
          "market_name": "skinport",
          "offers": 40,
          "price": 6516,
          "updated_at": "2026-06-23T21:51:53.531Z",
          "is_stale": false,
          "ingested_at": "2026-06-23T21:54:30.775Z",
          "ingest_latency_ms": 157244
        }
      ]
    }
  ]
}

Errors

400Neither marketHashNames nor ids supplied, more than 100 items, or none of the requested items resolve to a tracked item.
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.

Companion endpoints

GET/v1/aggregations/max-orders

The bid-side mirror: highest buy order per market for the same ids. Same envelope, but each item carries orders[] (with price = highest bid, plus a total_quantity) instead of prices[].

Full reference →
curl "https://pricing.skinpricer.com/v1/aggregations/min-prices" \
  -H "Authorization: ApiKey sk_live_•••••••••••"

Authenticated endpoint — call it with your API key from your own client (see the code sample).

Response headers
X-RateLimit-Limit: <per-minute, set by your plan>
X-RateLimit-Remaining: <remaining this minute>
X-RateLimit-Reset: <seconds to reset>
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.