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, matched exactly and case-insensitively against the whole value: Revolver does not match Python Revolver. Accepts a comma-separated list and matches any of its entries. Values are the itemTypes[].id entries of GET /item/types. |
| rarity | query | no | Free-text match against the values of the item’s tags, case-insensitive, where part of a value matches: weap matches an item tagged Weapon. Every tag value is searched, not only a rarity. |
| collection | query | no | Collection name, matched exactly and case-insensitively against the whole name: part of a name matches nothing. Values are the name entries of GET /item/collections. |
| 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; 1/0 also accepted). false includes items never analysed for it.One of: |
| glowsight | query | no | Filter by glow-sights flag (true/false; 1/0 also accepted). false includes items never analysed for it.One of: |
| cutout | query | no | Filter by cutout flag (true/false; 1/0 also accepted). false includes items never analysed for it.One of: |
| commodity | query | no | Filter by commodity flag (true/false; 1/0 also accepted).One of: |
| marketable | query | no | Filter by marketable flag (true/false; 1/0 also accepted).One of: |
| tradable | query | no | Filter by tradable flag (true/false; 1/0 also accepted).One of: |
| returning | query | no | Filter by has-returned-to-store flag (true/false; 1/0 also accepted). false includes items that were never sold in the store.One of: |
| banned | query | no | Filter by banned flag (true/false; 1/0 also accepted).One of: |
| publisherDrop | query | no | Filter by publisher-drop flag (true/false; 1/0 also accepted).One of: |
| twitchDrop | query | no | Filter by twitch-drop flag (true/false; 1/0 also accepted).One of: |
| lootCrateDrop | query | no | Filter by loot-crate-drop flag (true/false; 1/0 also accepted).One of: |
| craftable | query | no | Filter by craftable flag (true/false; 1/0 also accepted).One of: |
| manipulated | query | no | Filter by manipulated-market flag (true/false; 1/0 also accepted).One of: |
| 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.One of: |
| 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>array<object> | nullThe packs sold in the Steam item store that include this item and are on sale now, cheapest first. Empty when no pack is known to include the item.
Note: Steam publishes no machine-readable list of what a pack contains. This covers packs whose store description names the item, so it is not exhaustive.
Note: only
GET /api/item/{id}fills this field; every other response that returns items sets it tonull.- 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 | nullWhether the artwork glows.
nullwhen the item has never been analysed. - 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 | nullWhether the artwork has glowing sights.
nullwhen the item has never been analysed. - glowRatio*
number | null - hasCutout*
boolean | nullWhether the artwork has a cutout.
nullwhen the item has never been analysed. - 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. A negative value is read as 0. |
| count | query | no | Number of orders to return. Max 100. Defaults to 10. A negative value is read as 0. |
| 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
One market’s order book for an item
/api/item/{id}/orderBookThe order book a third-party market publishes for one item, as price levels with the quantity at each, best first, as an offset page (start, count). Prices are in the resolved currency’s hundredths. For the Steam Community Market use GET /api/item/{id}/sellOrders and GET /api/item/{id}/buyOrders.
capturedAt says when the book was last brought up to date. Most books are read in full and not updated between reads; a market whose listings arrive live is updated continuously, and its capturedAt advances about every minute while the feed is healthy, so an old capturedAt means the book has stopped updating. Note: most markets publish no book. A market whose book is not captured answers with capturedAt: null and no levels, rather than an error, and so does a side the market does not publish.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| id | path | yes | Item guid, or the item’s nameHash — the field v1 called marketHashName. |
| market | query | yes | The market whose book to read. Responses always name a market by its published name. CSDealsMarketplace is also accepted here as a permanent alias for CSDeals, so an integration written against the older name keeps working and does not need changing.One of: |
| side | query | no | sell for what sellers ask, buy for what buyers offer. Defaults to sell.One of: |
| start | query | no | Level index to start at. Defaults to 0. A negative value is read as 0. |
| count | query | no | Number of levels to return. Max 100. Defaults to 10. A negative value is read as 0. |
| currency | query | no | 3-letter currency code. |
Request
curl "https://api.scmm.app/api/item/<id>/orderBook?market=Unknown"Response
- market*
enumThe market this book belongs to.
- side*
enumWhich side of the book:
selllists what sellers ask,buylists what buyers offer. - unit*
enum | nullWhat
quantitycounts on each row:unitsis items offered or wanted,ordersis buy orders, each of which may want more than one item. Null when no book is captured for this market and side. - capturedAt*
string | nullWhen this market’s book was last brought up to date: the time of its last full read, or, for a book that updates live, of its latest update. Null when no book is captured for this market and side, which is different from a book that was read and had nothing listed for this item: that one carries a time and an empty
items. - depth*
enum | nullHow much of the market’s book was captured.
full: every price level the market publishes, each with the quantity at that price.top: the market publishes only its best price and one count for its whole side, soitemsholds a single row whosequantityis that whole-side count, inunit, rather than the quantity at that price. Null when no book is captured for this market and side. array<object>One row per price level, best first: cheapest first for
sell, highest first forbuy.- start*
numberIndex of the first level returned.
- count*
numberNumber of levels returned.
- total*
numberNumber of price levels in the whole book for this item and side.
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.
Six of the eighteen 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: eleven because the vendor publishes no sold count at all, which is a permanent limitation rather than an outage, and one that publishes 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. 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: by default this is Steam alone, and it is a sale volume rather than a count of open listings. Pass market= to read the same daily points for a third-party market that reports each sale, built from those individual sales; that series starts on the first day the market’s sales are all recorded, so it is far shorter than Steam’s, and maxDays=0 returns every day held. For third-party asks and daily sale counts 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.One of: |
| market | query | no | Which market's sales to read. Defaults to the Steam Community Market. Any other market listed builds the same daily points from the individual sales it reports: open and close are the day's first and last sale, high and low its highest and lowest, median the median price per unit, and volume the units sold. A market that reports no individual sales answers 404, like an unknown one; a market whose sales are not recorded for the resolved game answers 503. Responses always name a market by its published name. CSDealsMarketplace is also accepted here as a permanent alias for CSDeals, so an integration written against the older name keeps working and does not need changing.One of: |
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
Every recorded sale of an item, one by one
/api/item/{id}/sales/tradesThe individual sales of one item on the markets that report each sale, newest first: when it sold, on which market, for how much and how many units. soldAt is the market’s own sale time in UTC, to the second or the millisecond depending on the market. Prices are in the resolved currency’s hundredths.
Pages are read with a cursor: pass the nextCursor of one response as cursor= to get the next, older page; it is null on the last page. Two sales can share the same instant, and the cursor never skips or repeats either.
Note: each market’s record starts at a different time, given per market in coverage. A market with no sales in the list before its archivedSince may simply not have been recorded yet, so read an empty list against it before reading it as "did not sell". For daily totals and statistics use GET /api/marketplace/{market}/sales-summary.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| id | path | yes | Item guid, or the item’s nameHash — the field v1 called marketHashName. |
| markets | query | no | Comma-separated market names to read. Omit for every market that reports individual sales. Unknown names are ignored, and a list naming only unknown ones returns no sales. A market whose sales are not recorded for this game is left out of the response, coverage included. Responses always name a market by its published name. CSDealsMarketplace is also accepted here as a permanent alias for CSDeals, so an integration written against the older name keeps working and does not need changing. |
| from | query | no | Oldest sale time to include, as an ISO 8601 instant. Defaults to 7 days before to, which is 7 days ago when to is not given. Reads at most 90 days back from now: an earlier value is read as 90 days ago. A value that does not parse is a 400. |
| to | query | no | Newest sale time to include, as an ISO 8601 instant. Defaults to now. A value that does not parse is a 400. |
| limit | query | no | Sales per page, 1 to 500. Defaults to 100. A value outside that range is read as the nearest bound. |
| cursor | query | no | The nextCursor of the previous page. A value this endpoint did not issue is a 400. |
| currency | query | no | 3-letter currency code. |
Request
curl "https://api.scmm.app/api/item/<id>/sales/trades?markets=<markets>"Response
object- currency*
stringCurrency of every
price. array<object>One entry per market asked about whose sales are recorded for this game, saying where its record starts. A market that does not record this game is left out, here and in
trades.array<object>Sales, newest first.
- nextCursor*
string | nullSend as
cursor=to read the next, older page. Null on the last page.
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. A negative value is read as 0. |
| count | query | no | Number of orders to return. Max 100. Defaults to 10. A negative value is read as 0. |
| 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. A negative value is read as 0. |
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 name, exactly as listed by GET /api/item/collections. |
| 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 with two or more items in the catalogue, alphabetically. A collection is a named set of items that belong 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>array<object> | nullThe packs sold in the Steam item store that include this item and are on sale now, cheapest first. Empty when no pack is known to include the item.
Note: Steam publishes no machine-readable list of what a pack contains. This covers packs whose store description names the item, so it is not exhaustive.
Note: only
GET /api/item/{id}fills this field; every other response that returns items sets it tonull.- 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 | nullWhether the artwork glows.
nullwhen the item has never been analysed. - 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 | nullWhether the artwork has glowing sights.
nullwhen the item has never been analysed. - glowRatio*
number | null - hasCutout*
boolean | nullWhether the artwork has a cutout.
nullwhen the item has never been analysed. - 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 market names (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.
Responses always name a market by its published name. CSDealsMarketplace is also accepted here as a permanent alias for CSDeals, so an integration written against the older name keeps working and does not need changing. |
| 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