Freshness & timestamps
Every quote carries timing and staleness metadata so you can trust or discount it.
fetchedAt. Not a measure of the price's age.fetchedAt is more than 30 minutes old (a uniform threshold across all markets).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.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.sourceUpdatedAt. Omitted with sourceUpdatedAt.isStale 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.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
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.