Items
The catalogue: search, details, prices, order books, sales history and definition archives.
Search and paginate items
/api/itemReturns a paginated list of items, with rich filtering for tags, flags, price, and currency.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| filter | query | no | Free-text filter applied to item name and description. |
| type | query | no | Item type slug, e.g. rifle, helmet. Repeatable as comma-separated list. |
| rarity | query | no | Rarity tag (e.g. common, rare). |
| collection | query | no | Item collection slug. |
| itemType | query | no | Alias for type. |
| itemCollection | query | no | Alias for collection. |
| category | query | no | Top-level category (e.g. weapon, clothing). |
| color | query | no | Accent color id from GET /item/colors (e.g. color_red). |
| minPrice | query | no | Inclusive minimum price (in selected currency). |
| maxPrice | query | no | Inclusive maximum price (in selected currency). |
| sort | query | no | Sort key. One of name_asc, name_desc, price_asc, price_desc, supply_asc, supply_desc, demand_asc, demand_desc, subscribers_asc, subscribers_desc, ath_asc, ath_desc, atl_asc, atl_desc, newest, oldest, popularity. Defaults to name_asc, which is also what an unrecognised value falls back to — this parameter never rejects. Legacy aliases name, -name, price, -price, -subscriptions, timeAccepted, -timeAccepted are still accepted for backwards compatibility; prefer the canonical keys above.One of: |
| page | query | no | 1-based page index. Defaults to 1. |
| pageSize | query | no | Items per page. Defaults to 24, max 500. Values above the cap are clamped, never rejected. |
| glow | query | no | Filter by glow flag (true/false). |
| glowsight | query | no | Filter by glow-sights flag. |
| cutout | query | no | Filter by cutout flag. |
| commodity | query | no | Filter by commodity flag. |
| marketable | query | no | Filter by marketable flag. |
| tradable | query | no | Filter by tradable flag. |
| returning | query | no | Filter by has-returned-to-store flag. |
| banned | query | no | Filter by banned flag. |
| publisherDrop | query | no | Filter by publisher-drop flag. |
| twitchDrop | query | no | Filter by twitch-drop flag. |
| lootCrateDrop | query | no | Filter by loot-crate-drop flag. |
| craftable | query | no | Filter by craftable flag. |
| manipulated | query | no | Filter by manipulated-market flag. |
| owned | query | no | Filter by whether the authenticated user owns the item: true returns only items in your Steam inventory, false only items that are not. It has no effect when signed out — the endpoint stays anonymous and the parameter is ignored rather than rejected, matching v1. The inventory read is scoped to the session, so it can never be pointed at another user, and it is scoped to the resolved app. |
| currency | query | no | 3-letter currency code (e.g. USD). Defaults to USD. |
Request
curl "https://api.scmm.app/api/item?filter=<filter>"Response
array<object>- total*
number - page*
number - pageSize*
number
One item with prices, store and market metadata
/api/item/{id}The endpoint most integrations start from: one item with its identifiers, icons, tags, store history, Steam order-book summary and per-market offers. The {id} accepts either the item guid or its nameHash — the field the v1 API called marketHashName — so a v1 consumer can join on the name it already stores.
buyNowPrice and buyNowFrom name the cheapest offer, and they prefer Steam’s own storefront and market over a cheaper third party. For the genuinely cheapest offer across markets use GET /api/item/prices, which answers a different question and can differ.
Money is in the resolved currency’s hundredths. Three of the caller’s own preferences shape the response when a session is present: whether market fees are included, and which markets and payment types are considered when electing the cheapest offer.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| id | path | yes | Item guid, or the item’s nameHash — the field v1 called marketHashName. |
| currency | query | no | 3-letter currency code. |
Request
curl "https://api.scmm.app/api/item/<id>?currency=USD"Response
- iconAccentColour*
string | nullAccent colour as a bare
#rrggbbhex. - iconAccentColourName*
string | nullThe colour bucket
iconAccentColourresolves to — the same vocabularyGET /api/item/colorslists and thecolor=filter accepts.nullwhen no palette has been derived for this item yet, or when its icon could not be read. It always agrees with what thecolor=filter matches on. - notes*
array<string> | null - changes*
map<string, string> | null array<object> | null- iconDominantColours*
array<string> | nullDominant icon colours as bare
#rrggbbhexes. - iconDominantColourNames*
array<string> | nullThe colour bucket each
iconDominantColoursentry resolves to, positionally aligned with it — indexinames hexi. It uses the same bucketing asiconAccentColourName, so the vocabulary matchesGET /api/item/colors. An entry isnullwhen its hex could not be parsed. array<object> | null- workshopLinks
array<string> | null - marketMarketType*
enum | null - buyNowFrom*
enum | null array<object>array<object>array<object>- craftingComponents
map<string, number> | null - breaksIntoComponents
map<string, number> | null object | null- actions*
array - guid*
string - assetDescriptionId*
number | null - classId
number | null - itemDefinitionId*
number | null - workshopFileId*
number | null - workshopFileUrl*
string | null - workshopFileIsUnavailable
boolean - creatorProfileId
string | null - creatorId*
string | null - creatorName*
string | null - creatorAvatarUrl*
string | null - itemShortName
string | null - nameHash*
string | null - nameWorkshop*
string | null - nameId*
number | null - descriptionWorkshop*
string | null - priceFormat
string | null - iconLargeUrl*
string | null - previewUrl*
string | null - timeUpdated
string | null - timeRefreshed
string | null - sellStart
string | null - sellEnd
string | null - lastCheckedSupplyTotalsOn
string | null - supplyTotal
number | null - supplyTotalKnown
number | null - supplyTotalEstimated
number | null - supplyTotalMarketsKnown
number | null - supplyTotalInvestorsKnown
number | null - supplyTotalInvestorsEstimated
number | null - supplyTotalOwnersKnown
number | null - supplyTotalOwnersEstimated
number | null - subscriptionsCurrent
number | null - subscriptionsLifetime
number | null - subscriptions
number | null - favouritedCurrent
number | null - favouritedLifetime
number | null - views
number | null - votesUp
number | null - votesDown
number | null - storeItemGuid
string | null - storeSteamId
number | null - storePrice
number | null - storePriceUsd
number | null - marketItemGuid
string | null - marketId*
string | null - marketListingId
string | null - isAvailableOnStore*
boolean - hasReturnedToStoreBefore*
boolean - isAvailableOnMarket*
boolean - marketBuyOrderCount*
number | null - marketBuyOrderHighestPrice*
number | null - marketSellOrderCount*
number | null - marketSellOrderLowestPrice*
number | null - market1hrSales*
number | null - market1hrValue*
number | null - market24hrSales*
number | null - market24hrValue*
number | null - market168hrValue*
number | null - premiumVs7dAvgPercent*
number | null - marketLastSaleValue*
number | null - marketLastSaleOn*
string | null - marketHighestValue*
number | null - marketLowestValue*
number | null - marketRankIndex*
number | null - marketRankTotal*
number | null - marketLiquidityScore*
number | null - marketLast30dSales*
number | null - change7dPercent*
number | null - change30dPercent*
number | null - change90dPercent*
number | null - athPercent*
number | null - change7dDays*
number | null - change30dDays*
number | null - change90dDays*
number | null - changeAsOf*
string | null - timeMarketHighestValue*
string | null - timeMarketLowestValue*
string | null - timeMarketFirstSold*
string | null - isBeingManipulated*
boolean - manipulationReason*
string | null - buyNowPrice*
number | null - buyNowFee
number | null - buyNowUrl*
string | null - isCommodity
boolean - isMarketable
boolean - marketableRestrictionDays
number | null - isTradable
boolean - tradableRestrictionDays
number | null - isPublisherDrop
boolean - isTwitchDrop
boolean - isLootCrateDrop
boolean - isCraftingComponent
boolean - isCraftable
boolean - isBreakable
boolean - isBanned
boolean - banReason
string | null - isAccepted
boolean - id*
number - appId*
number - name*
string - itemType*
string - hasGlow*
boolean | null - backgroundColour*
string | null - foregroundColour*
string | null - iconUrl*
string | null - timeCreated*
string | null - timeAccepted*
string | null - itemCollection*
string | null - description*
string | null - isPermanent*
boolean - hasGlowSights*
boolean | null - glowRatio*
number | null - hasCutout*
boolean | null - cutoutRatio*
number | null - isDraft*
boolean
Steam Community Market buy-order book
/api/item/{id}/buyOrdersStanding buy orders on the Steam Community Market for one item, highest first, as an offset page (start, count). This is the bid side: what buyers are offering to pay, not what sellers ask. Prices are in the resolved currency’s hundredths.
Steam counts units wanted rather than orders, so the quantity on a row is directly comparable with a sell order’s.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| id | path | yes | Item guid, or the item’s nameHash — the field v1 called marketHashName. |
| start | query | no | Order index to start at. Defaults to 0. |
| count | query | no | Number of orders to return. Max 100. Defaults to 10. |
| currency | query | no | 3-letter currency code. |
Request
curl "https://api.scmm.app/api/item/<id>/buyOrders?start=1"Response
array<object>- start*
number - count*
number - total*
number
Median Steam market price over time
/api/item/{id}/pricesThe Steam Community Market sales series for one item: one point per bucket with the median sale price and the volume behind it. Prices are frozen at observation time and never re-converted, so this series is in USD hundredths whatever currency the rest of the response uses.
It is Steam only. For the third-party markets, use GET /api/item/{id}/prices/history.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| id | path | yes | Item guid, or the item’s nameHash — the field v1 called marketHashName. |
| period | query | no | Time window, one of 7d, 30d, 60d, 90d, 1y, all. Defaults to 30d. The granularity changes with the window: 7d buckets hourly, 30d, 60d and 90d daily, and 1y and all weekly. Widening the window therefore returns fewer points over a longer span — a year is 53 weekly points against a quarter’s 90 daily ones. Each point is an average of the observations inside its bucket and volume is their sum, and a bucket with no observation is absent rather than zero — never interpolate across a gap. A bucket is timestamped at its start rather than at the newest observation inside it, so in weekly mode the last point can be dated up to six days before the freshest data you have — that data is inside it rather than missing, and the bucket keeps filling until its week ends. Compare totals rather than point counts when you switch windows: volume is conserved, the number of points is not. all reads the item’s whole history at the weekly grain and is not capped — an item first listed in 2015 returns roughly 580 points. An unrecognised value is answered with the default rather than rejected.One of: |
Request
curl "https://api.scmm.app/api/item/<id>/prices?period=7d"Response
- timestamp*
string - price*
number - volume*
number
Per-market price history, one series per market
/api/item/{id}/prices/historyOne archived daily observation per market per day, for each third-party market that prices this item. Prices are in USD hundredths, frozen at observation time and never re-converted, exactly like :id/sales/market. A day with no point means no observation was made that day — never a price of zero, and never a reason to interpolate across it.
Five of the seventeen markets publish a sold count we capture, and soldCount/soldWindow carry it as units that changed hands: SteamCommunityMarket, CSDeals and DMarket as an exact daily count (soldWindow: "1d"), Skinport as the vendor’s trailing 24-hour aggregate ("24h") — a different quantity at the same grain, which is why the window travels on every point. The other twelve are null: ten because the vendor publishes no sold count at all, which is a permanent limitation rather than an outage, and two that publish one we do not collect nightly. The archive also holds a historical series imported from three vendors’ own trade histories: RustTM up to six thousand sales per item, RustSkins the last fifty sales per item and CS.Deals the last five thousand sales per item, the whole ledger on quieter items. For one of them — RustSkins — that series is not maintained, so past its newest dated point soldCount returns to null. null also appears on any day a market could not be reached, and on every day before 2026-08-27, when capture began. null means not published and 0 means the market reported no sales: never read one as the other, and never derive a sold count from supply, because supply is a level and a sold count is a flow, so differencing supply recovers only a fraction of real sales.
Warning: the most recent day’s soldCount is provisional. Treat the last point as incomplete rather than as a zero. Capture resumes from the start of the newest already-counted day, so the freshest bucket is written while its UTC day is still running and is corrected from partial to complete by the following night’s run. In practice it commonly reads 0 on the current day for markets that will end the day with real sales. Every earlier point is final and only the newest one moves, so an average or a rate computed over a window that includes today will run low unless the last bucket is excluded.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| id | path | yes | Item guid, or the item’s nameHash — the field v1 called marketHashName. |
| period | query | no | Time window, one of 7d, 30d, 60d, 90d, 1y, all. Defaults to 30d. Unlike :id/prices, this series is never re-bucketed: it is one point per UTC day at every window, so period changes how far back the series reaches and nothing else. A wider window always returns the same points plus older ones. Each series is budgeted at 1,826 points (five years at one point per day, the retention window) and a response shares a fixed row budget across its series; a series over its share is sampled evenly across its window with the oldest and newest points kept, so a cap coarsens a series and never shortens it. An unrecognised value is answered with the default rather than rejected.One of: |
| markets | query | no | Comma-separated MarketType values. Omit for every market with data. Unknown values are ignored; a filter naming only unknown values returns an empty array. |
| priceKind | query | no | Which quantity to return, one of ask, sale or all. Defaults to ask, which is what every point archived before 2026-09-03 is and what this endpoint has always returned.
An ask is the cheapest listing a market was offering that day. A sale is a transaction — what somebody actually paid. Every point carries its own priceKind, so a mixed response is always readable.
Warning: do not plot the two kinds on one axis. The gap between an ask and a sale is the market’s spread, not noise, and a series that mixes them is not slightly wrong but unreadable. An ask and a sale can also share one market-day, so a mixed series must be keyed on the timestamp and the kind together rather than on the timestamp alone.
Note: sale points are not all the same grain. A market that publishes individual trades gives a figure for the day it is filed under; a market that publishes only a trailing aggregate — the ones whose sold counts carry a 24h window rather than 1d — gives that aggregate as read at capture time, covering a rolling 24 hours and offset from the calendar day by the hour the capture runs.
Note: an unrecognised value falls back to ask rather than to everything, which is the opposite of how fields and stats behave elsewhere in this API. A typo there costs you some fields; here it would hand you two quantities that cannot be compared, so it degrades to the narrower answer.One of: |
Request
curl "https://api.scmm.app/api/item/<id>/prices/history?period=7d"Response
- market*
enum array<object>One point per observed UTC day. A missing day means no observation, never a price of zero.
Daily market-sale volume, all recorded history
/api/item/{id}/sales/marketDaily sale volume and median sale price for one item on the Steam Community Market, one point per day.
This is the deepest series this API publishes. It reaches back to the first day Steam recorded a sale for the item, which for a long-standing item is years rather than months, and it costs no credential. The window defaults to the last 30 days; pass maxDays=0 for every day we hold. The default is a window rather than a ceiling. Pass ochl=true to receive open, high, low and close candles alongside the median and the volume.
Note: this is Steam alone, and it is a sale volume rather than a count of open listings. For the third-party markets use GET /api/marketplace/prices/history, whose depth is bounded by when we began archiving each market and is reported on every response.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| id | path | yes | Item guid, or the item’s nameHash — the field v1 called marketHashName. |
| maxDays | query | no | Lookback window in days. 0 means all time. Defaults to 30. |
| ochl | query | no | When true (or 1), populates open/high/low/close fields per point. |
Request
curl "https://api.scmm.app/api/item/<id>/sales/market?maxDays=30"Response
- date*
string - median*
number - high*
number | null - low*
number | null - open*
number | null - close*
number | null - volume*
number
Daily store-sale volume, purchased and refunded
/api/item/{id}/sales/storeOne point per UTC day of first-party store activity for an item: units purchased and units refunded. Only items that have appeared in the item store have any points at all, and a day with no activity is absent rather than zero.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| id | path | yes | Item guid, or the item’s nameHash — the field v1 called marketHashName. |
| maxDays | query | no | Lookback window in days. 0 means all time. Defaults to 30. |
Request
curl "https://api.scmm.app/api/item/<id>/sales/store?maxDays=30"Response
- date*
string - purchased*
number - refunded*
number
Steam Community Market sell-order book
/api/item/{id}/sellOrdersOpen sell orders on the Steam Community Market for one item, cheapest first, as an offset page (start, count). Prices are in the resolved currency’s hundredths, and the response carries the total number of orders so a caller can page without guessing.
A book is only as fresh as the last capture; the response says when it was read.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| id | path | yes | Item guid, or the item’s nameHash — the field v1 called marketHashName. |
| start | query | no | Order index to start at. Defaults to 0. |
| count | query | no | Number of orders to return. Max 100. Defaults to 10. |
| currency | query | no | 3-letter currency code. |
Request
curl "https://api.scmm.app/api/item/<id>/sellOrders?start=1"Response
array<object>- start*
number - count*
number - total*
number
Top holders of an item, ranked by quantity
/api/item/{id}/topHoldersThe profiles holding the most units of one item, largest holding first. Ranked over the inventories this site has imported, so it describes the tracked population rather than every owner on Steam, and a profile that has opted out of item analytics is excluded.
Ties are broken on profile name so a page cannot repeat or drop a holder.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| id | path | yes | Item guid, or the item’s nameHash — the field v1 called marketHashName. |
| max | query | no | Max holders. Capped at 300. Defaults to 30. |
Request
curl "https://api.scmm.app/api/item/<id>/topHolders?max=20"Response
- steamId*
string | null - name*
string | null - avatarUrl*
string | null - items*
number
Get a collection by name
/api/item/collection/{name}One collection with its items, their prices and what completing the set would cost. Accepts the collection name as listed by GET /api/item/collections.
Pass creatorId to narrow the set to one creator’s items — several collections carry contributions from more than one author. A non-numeric creatorId is ignored rather than rejected, so a bad filter returns the whole collection instead of nothing.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| name | path | yes | Collection slug. |
| creatorId | query | no | Filter to items by a specific Steam creator id. |
| currency | query | no | 3-letter currency code. |
Request
curl "https://api.scmm.app/api/item/collection/<name>?creatorId=<creatorId>"Response
array<object>array<object>- name*
string | null - creatorName*
string | null - creatorAvatarUrl*
string | null - buyNowPrice*
number | null
List distinct item collections
/api/item/collectionsEvery collection name in the catalogue, alphabetically. A collection is a themed set a creator published together; the names here are what GET /api/item/collection/{name} takes.
Request
curl "https://api.scmm.app/api/item/collections"Response
- name*
string
List item accent colors
/api/item/colorsRequest
curl "https://api.scmm.app/api/item/colors"Response
- id*
string - name*
string
Get a Steam creator's items, newest acceptance first
/api/item/creator/{steamId}Powers the workshop creator popup Accepted tab. The FE groups the result by acceptance year (timeAccepted).
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| steamId | path | yes | Creator's SteamID64. |
| currency | query | no | 3-letter currency code. |
Request
curl "https://api.scmm.app/api/item/creator/<steamId>?currency=USD"Response
- iconAccentColour*
string | nullAccent colour as a bare
#rrggbbhex. - iconAccentColourName*
string | nullThe colour bucket
iconAccentColourresolves to — the same vocabularyGET /api/item/colorslists and thecolor=filter accepts.nullwhen no palette has been derived for this item yet, or when its icon could not be read. It always agrees with what thecolor=filter matches on. - notes*
array<string> | null - changes*
map<string, string> | null array<object> | null- iconDominantColours*
array<string> | nullDominant icon colours as bare
#rrggbbhexes. - iconDominantColourNames*
array<string> | nullThe colour bucket each
iconDominantColoursentry resolves to, positionally aligned with it — indexinames hexi. It uses the same bucketing asiconAccentColourName, so the vocabulary matchesGET /api/item/colors. An entry isnullwhen its hex could not be parsed. array<object> | null- workshopLinks
array<string> | null - marketMarketType*
enum | null - buyNowFrom*
enum | null array<object>array<object>array<object>- craftingComponents
map<string, number> | null - breaksIntoComponents
map<string, number> | null object | null- actions*
array - guid*
string - assetDescriptionId*
number | null - classId
number | null - itemDefinitionId*
number | null - workshopFileId*
number | null - workshopFileUrl*
string | null - workshopFileIsUnavailable
boolean - creatorProfileId
string | null - creatorId*
string | null - creatorName*
string | null - creatorAvatarUrl*
string | null - itemShortName
string | null - nameHash*
string | null - nameWorkshop*
string | null - nameId*
number | null - descriptionWorkshop*
string | null - priceFormat
string | null - iconLargeUrl*
string | null - previewUrl*
string | null - timeUpdated
string | null - timeRefreshed
string | null - sellStart
string | null - sellEnd
string | null - lastCheckedSupplyTotalsOn
string | null - supplyTotal
number | null - supplyTotalKnown
number | null - supplyTotalEstimated
number | null - supplyTotalMarketsKnown
number | null - supplyTotalInvestorsKnown
number | null - supplyTotalInvestorsEstimated
number | null - supplyTotalOwnersKnown
number | null - supplyTotalOwnersEstimated
number | null - subscriptionsCurrent
number | null - subscriptionsLifetime
number | null - subscriptions
number | null - favouritedCurrent
number | null - favouritedLifetime
number | null - views
number | null - votesUp
number | null - votesDown
number | null - storeItemGuid
string | null - storeSteamId
number | null - storePrice
number | null - storePriceUsd
number | null - marketItemGuid
string | null - marketId*
string | null - marketListingId
string | null - isAvailableOnStore*
boolean - hasReturnedToStoreBefore*
boolean - isAvailableOnMarket*
boolean - marketBuyOrderCount*
number | null - marketBuyOrderHighestPrice*
number | null - marketSellOrderCount*
number | null - marketSellOrderLowestPrice*
number | null - market1hrSales*
number | null - market1hrValue*
number | null - market24hrSales*
number | null - market24hrValue*
number | null - market168hrValue*
number | null - premiumVs7dAvgPercent*
number | null - marketLastSaleValue*
number | null - marketLastSaleOn*
string | null - marketHighestValue*
number | null - marketLowestValue*
number | null - marketRankIndex*
number | null - marketRankTotal*
number | null - marketLiquidityScore*
number | null - marketLast30dSales*
number | null - change7dPercent*
number | null - change30dPercent*
number | null - change90dPercent*
number | null - athPercent*
number | null - change7dDays*
number | null - change30dDays*
number | null - change90dDays*
number | null - changeAsOf*
string | null - timeMarketHighestValue*
string | null - timeMarketLowestValue*
string | null - timeMarketFirstSold*
string | null - isBeingManipulated*
boolean - manipulationReason*
string | null - buyNowPrice*
number | null - buyNowFee
number | null - buyNowUrl*
string | null - isCommodity
boolean - isMarketable
boolean - marketableRestrictionDays
number | null - isTradable
boolean - tradableRestrictionDays
number | null - isPublisherDrop
boolean - isTwitchDrop
boolean - isLootCrateDrop
boolean - isCraftingComponent
boolean - isCraftable
boolean - isBreakable
boolean - isBanned
boolean - banReason
string | null - isAccepted
boolean - id*
number - appId*
number - name*
string - itemType*
string - hasGlow*
boolean | null - backgroundColour*
string | null - foregroundColour*
string | null - iconUrl*
string | null - timeCreated*
string | null - timeAccepted*
string | null - itemCollection*
string | null - description*
string | null - isPermanent*
boolean - hasGlowSights*
boolean | null - glowRatio*
number | null - hasCutout*
boolean | null - cutoutRatio*
number | null - isDraft*
boolean
Contents of one item-definition archive
/api/item/definitionArchive/{digest}The archive itself, as the JSON Steam published. Take the digest from GET /api/item/definitionArchives.
Pass download=true to receive it as a file attachment instead of an inline body; the filename carries the app id and the digest. These payloads are large — the largest single response on this API — so prefer the diff endpoint when all you need is what changed.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| digest | path | yes | Digest of the archive to fetch. |
| download | query | no | If true, respond as a JSON file attachment. |
Request
curl "https://api.scmm.app/api/item/definitionArchive/<digest>?download=<download>"Response
- *
string
Text diff between two item-definition archives
/api/item/definitionArchive/{oldDigest}/compareTo/{newDigest}A unified text diff between two archives, oldest as the left side. Take both digests from GET /api/item/definitionArchives; the response is the diff as text plus the two digests it was computed from, so it can be rendered without re-fetching either side.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| oldDigest | path | yes | Digest of the older archive. |
| newDigest | path | yes | Digest of the newer archive. |
Request
curl "https://api.scmm.app/api/item/definitionArchive/<oldDigest>/compareTo/<newDigest>"Response
array<object>
Every known item-definition archive, newest first
/api/item/definitionArchivesItem definitions are the raw catalogue Steam publishes for the game, and every change to them is archived here. Each entry carries the digest that identifies it, when it was captured and how many definitions it held — enough to pick two and diff them.
Newest first, and the list is not paginated: there is one archive per observed change, not per day.
Request
curl "https://api.scmm.app/api/item/definitionArchives"Response
- id*
string - digest*
string - size*
number - itemCount*
number - timestamp*
string
Every item’s cheapest buy price, in one response
/api/item/pricesRestores v1’s GET /api/item/prices. The paginated GET /api/item caps at pageSize=100, so pulling the catalogue’s prices took around 62 requests against a 100/minute limit; this returns every tracked item in a single call. Not cached — v1 left it uncached on purpose because callers poll it when new deals are posted, and that is still the workload.
The offer returned is the genuinely cheapest by price + fee across the considered markets, and marketType names where it came from. price is that market’s listed price rather than the total: fee is a modelled adjustment and is often negative, because a market whose cheapest payment arm is a bonus-balance one sells below face value, so add the two. The result can also differ from the buyNowPrice on GET /api/item/{id}, which prefers Steam’s own storefront and market over a cheaper third party — that field answers “what does Steam charge”, this one answers “where is it cheapest”.
Join on nameHash (v1’s marketHashName): v1 item ids do not exist in v2.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| markets | query | no | Comma-separated MarketType values (e.g. Skinport,DMarket). Omit to consider every market and receive the cheapest offer only. When supplied, both the cheapest offer and an added prices breakdown are restricted to those markets. Unknown values are ignored rather than rejected; a filter naming only unknown values yields a null price on every item. |
| currency | query | no | 3-letter currency code (e.g. USD). Defaults to USD. |
Request
curl "https://api.scmm.app/api/item/prices?markets=<markets>"Response
- id*
stringThe v2 item guid.
- appId*
stringSteam app id.
- classId*
string | nullSteam class id — the integer the v1 API returned as this item’s
id. - name*
string - nameHash*
string | nullMarket hash name — the join key for a v1 consumer (v1 called it
marketHashName). - price*
number | nullThe winning market’s listed price, in the response currency’s hundredths. The offer is chosen by lowest
price + fee, so the cheapest total isprice + feeand this field alone can exceed a rival’s.nullwhen no market offers the item — the v1 API returned0here, which could not be told apart from free. - fee*
number | nullModelled buy-side adjustment on
price. It is zero on most offers and negative on the rest, never positive: a market whose cheapest payment arm is a bonus-balance one sells below face value. - supply*
number | nullUnits on offer at
price.nullwhen the market reports no count. - marketType*
enum | nullWhich market
pricecame from. - currency*
stringISO 4217 code every monetary field on this row uses.
- liquidityScore*
number | nullA 0–100 measure of how easily this item trades, on the same scale Pricempire publishes. Three independently-capped components: open sell orders (max 33), the buy/sell spread (max 33) and 30-day sales volume (max 34).
null— never0— when the item has no market data at all, so "illiquid" and "unknown" stay distinguishable. A buy price more than 5 % above the sell price scores the spread component0: that is manipulation or distress, not liquidity.Warning: this is a Steam Community Market measure and it does not respond to
markets=. All four inputs are Steam order-book and Steam sales quantities, so on a row whosemarketTypereadsWaxpeerthe score still describes Steam’s book. It describes the item rather than the winning offer. array<object>Per-market breakdown, cheapest first. Present only when the request supplied
markets=.
Demand and supply stats for one item type
/api/item/type/{type}/demandPowers the "cheaper on the market" popup header tiles (median price, median store-price movement, market supply, market demand). Mirrors the legacy GetItemDemandByItemType.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| type | path | yes | Exact item type, e.g. Bear Skin Rug. |
| currency | query | no | 3-letter currency code. |
Request
curl "https://api.scmm.app/api/item/type/<type>/demand?currency=USD"Response
- itemType*
string - totalItems*
number - last24hrMedianPrice*
number - last168hrMedianPrice*
number - last168hrMedianPriceDelta*
number - last24hrMedianMovementFromStorePrice*
number - last168hrMedianMovementFromStorePrice*
number - last168hrMedianMovementFromStorePriceDelta*
number - totalMarketSupply*
number - medianMarketSupply*
number - totalMarketDemand*
number - medianMarketDemand*
number
List item types grouped by category
/api/item/typesEvery item type in the catalogue, grouped under the category a reader would look for it in (Armour, Weapons, Construction, and so on). The type ids are the values GET /api/item’s itemType filter and GET /api/item/type/{type}/demand accept, so this is the vocabulary behind both.
Request
curl "https://api.scmm.app/api/item/types"Response
array<object>- name*
string