Data quality and semantics
Prices are not sales
Section titled “Prices are not sales”asks are seller offers. bids are buy orders. Their spread is not guaranteed profit: fees, purchase/withdrawal availability, trade locks and liquidity matter. Daily price history is not a feed of completed transactions.
Quotes use integer USD cents: amount: 12345, currency: USD, minor_units: 2 means USD 123.45. Large capitalization values and decimal index/FX values are strings to preserve precision. Do not implicitly convert large monetary values to JavaScript Number.
rate_per_usd means units of the target currency per 1 USD. steam and cbr rates are not interchangeable.
Time and missing data
Section titled “Time and missing data”generated_atis the API response generation time.as_ofis the source observation time when known.as_of: nullmeans unknown; never substitute the current time.cache_recently_checkeddescribes the cache, not a new trade or marketplace quote.- Empty history means no available observations, not a zero price.
The local pipeline supports 30-minute shared-feed refreshes and the first verified cached frame per UTC hour. Hourly history reads those frames; it does not promise all-game catalog or historical coverage. checked_at is cache verification, ingested_at mirror publication, and source_observed_at remains null without actual source timestamps. The daily /history remains separate. Never fabricate hourly observations by repeating daily values.
Identity
Section titled “Identity”Do not merge items by name alone: Doppler phases can share market_hash_name. Use item_id and phase. Indexes retain methodology and membership versions; verify compatibility before combining versions into one continuous series.
History windows
Section titled “History windows”Daily/index/ROI/FX history requests span at most 366 calendar days; hourly market history spans at most 31. Split longer periods into sequential windows. When meta.next_page is present, continue using after and unchanged filters. For catalog pagination, pass meta.next_cursor as cursor. Do not retry empty windows indefinitely.