Skip to main content

Freshness & timestamps

Every quote carries timing and staleness metadata so you can trust or discount it.

fetchedAtWhen SkinPricer last fetched this market's quote.
ingestedAtWhen the quote reached SkinPricer's price store, shortly after fetchedAt. Not a measure of the price's age.
ingestLatencyMsfetchedAt → ingestedAt delay, in milliseconds.
isStaleTrue when the quote's or listing's fetchedAt is more than 30 minutes old (a uniform threshold across all markets).
sourceUpdatedAtWhen the market itself produced the data, where it states one. fetchedAt is only when SkinPricer last checked, and a check can confirm an unchanged copy, so the data can be much older than fetchedAt. Omitted when the market states no time, which is most markets.
sourceTimeKindWhere sourceUpdatedAt comes from: payload (the market's own generation time, the strongest), last_modified (a verified file timestamp) or cdn_age (cache headers). none means no usable time. Omitted with sourceUpdatedAt.
sourceAgeSecondsHow old the market's data already was when SkinPricer observed it, in seconds: the observation minus sourceUpdatedAt. Omitted with sourceUpdatedAt.
isSourceStaleisStale judged on sourceUpdatedAt instead of fetchedAt: true when the market's own data is more than 30 minutes old. Not sent yet. Once enabled, it is omitted wherever sourceUpdatedAt is.
updatedAtOn NBBO bestAsk / bestBid: the source quote's last-update time.
marketCount / freshMarketCountMarkets contributing a quote vs. those still fresh.
confidence0 to 1 score from coverage, freshness, and cross-market agreement.
calculatedAtWhen SkinPricer computed the aggregate / NBBO in the response.

isStale uses one uniform 30-minute threshold across every market, not a per-market window. To judge how old a price is, use sourceUpdatedAt where it is present and fetchedAt otherwise. isStale is measured from fetchedAt (true when it is more than 30 minutes old). ingestedAt is when the quote reached SkinPricer's price store; ingestedAt minus fetchedAt is SkinPricer's processing delay, not the age of the price. Treat isStale=true as a soft signal rather than a hard drop on thinly traded items, since a slightly old quote may still be the only one.

Source age

Only some markets say when they produced their data. As of October 2026 that is Skinport, Market.CSGO, rust.tm and CSFloat. CSFloat rebuilds its price list about once an hour, so its data can be close to an hour old while fetchedAt is a minute old. Every other market omits the source fields: absent means unknown, never zero and never the same as fetchedAt. Buy orders carry no source time yet. Skinport's sourceAgeSeconds reads 0, because each poll is stamped with its snapshot's own time. The max ages below still use fetchedAt, so source age changes nothing about which quotes are served.

Max age & listing counts

steamcommunity30 minutes
Every other market30 minutes

Past its market's max age, a quote drops out of pricing, NBBO, and depth. Listing rows are still returned after that, each flagged isStale, but listing counts include only listings within the max age: totalListings on listings and listingsCount on market health. A count can therefore be 0 while stale listing rows are still returned, for example while a market's crawl is paused.

Guides using this endpoint

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.