Loading…

Items

The catalogue: search, details, prices, order books, sales history and definition archives.

Search and paginate items

GET/api/item

Returns a paginated list of items, with rich filtering for tags, flags, price, and currency.

Parameters

NameInRequiredDescription
filterquerynoFree-text filter applied to item name and description.
typequerynoItem 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.
rarityquerynoFree-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.
collectionquerynoCollection 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.
itemTypequerynoAlias for type.
itemCollectionquerynoAlias for collection.
categoryquerynoTop-level category (e.g. weapon, clothing).
colorquerynoAccent color id from GET /item/colors (e.g. color_red).
minPricequerynoInclusive minimum price (in selected currency).
maxPricequerynoInclusive maximum price (in selected currency).
sortquerynoSort 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: name_asc, name_desc, price_asc, price_desc, supply_asc, supply_desc, demand_asc, demand_desc, subscribers_asc, subscribers_desc, ath_asc, ath_desc … +5 more

atl_asc, atl_desc, newest, oldest, popularity

pagequeryno1-based page index. Defaults to 1.
pageSizequerynoItems per page. Defaults to 24, max 500. Values above the cap are clamped, never rejected.
glowquerynoFilter by glow flag (true/false; 1/0 also accepted). false includes items never analysed for it.

One of: true, false

glowsightquerynoFilter by glow-sights flag (true/false; 1/0 also accepted). false includes items never analysed for it.

One of: true, false

cutoutquerynoFilter by cutout flag (true/false; 1/0 also accepted). false includes items never analysed for it.

One of: true, false

commodityquerynoFilter by commodity flag (true/false; 1/0 also accepted).

One of: true, false

marketablequerynoFilter by marketable flag (true/false; 1/0 also accepted).

One of: true, false

tradablequerynoFilter by tradable flag (true/false; 1/0 also accepted).

One of: true, false

returningquerynoFilter by has-returned-to-store flag (true/false; 1/0 also accepted). false includes items that were never sold in the store.

One of: true, false

bannedquerynoFilter by banned flag (true/false; 1/0 also accepted).

One of: true, false

publisherDropquerynoFilter by publisher-drop flag (true/false; 1/0 also accepted).

One of: true, false

twitchDropquerynoFilter by twitch-drop flag (true/false; 1/0 also accepted).

One of: true, false

lootCrateDropquerynoFilter by loot-crate-drop flag (true/false; 1/0 also accepted).

One of: true, false

craftablequerynoFilter by craftable flag (true/false; 1/0 also accepted).

One of: true, false

manipulatedquerynoFilter by manipulated-market flag (true/false; 1/0 also accepted).

One of: true, false

ownedquerynoFilter 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: true, false

currencyqueryno3-letter currency code (e.g. USD). Defaults to USD.

Request

curl "https://api.scmm.app/api/item?filter=<filter>"

Response 200 · application/json · object

  • array<object>
  • total*number
  • page*number
  • pageSize*number

One item with prices, store and market metadata

GET/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

NameInRequiredDescription
idpathyesItem guid, or the item’s nameHash — the field v1 called marketHashName.
currencyqueryno3-letter currency code.

Request

curl "https://api.scmm.app/api/item/<id>?currency=USD"

Response 200 · application/json · object

  • iconAccentColour*string | null

    Accent colour as a bare #rrggbb hex.

  • iconAccentColourName*string | null

    The colour bucket iconAccentColour resolves to — the same vocabulary GET /api/item/colors lists and the color= filter accepts. null when no palette has been derived for this item yet, or when its icon could not be read. It always agrees with what the color= filter matches on.

  • notes*array<string> | null
  • changes*map<string, string> | null
  • array<object> | null
  • iconDominantColours*array<string> | null

    Dominant icon colours as bare #rrggbb hexes.

  • iconDominantColourNames*array<string> | null

    The colour bucket each iconDominantColours entry resolves to, positionally aligned with it — index i names hex i. It uses the same bucketing as iconAccentColourName, so the vocabulary matches GET /api/item/colors. An entry is null when its hex could not be parsed.

  • array<object> | nulloptional
  • workshopLinksarray<string> | nulloptional
  • marketMarketType*enum | null
    One of: Unknown, SteamStore, SteamCommunityMarket, Skinport, LootFarm, SwapGGTrade, TradeitGG, CSDeals, SkinBaron, RustSkins, RustTM, CSTrade … +17 more

    iTradegg, SkinsMonkey, SkinSwap, DMarket, Waxpeer, ShadowPay, ManncoStore, RapidSkins, SkinSerpent, SnipeSkins, LISSkins, PirateSwap, AvanMarket, MarketCSGO, CSFloat, WhiteMarket, SkinPlace

  • buyNowFrom*enum | null
    One of: Unknown, SteamStore, SteamCommunityMarket, Skinport, LootFarm, SwapGGTrade, TradeitGG, CSDeals, SkinBaron, RustSkins, RustTM, CSTrade … +17 more

    iTradegg, SkinsMonkey, SkinSwap, DMarket, Waxpeer, ShadowPay, ManncoStore, RapidSkins, SkinSerpent, SnipeSkins, LISSkins, PirateSwap, AvanMarket, MarketCSGO, CSFloat, WhiteMarket, SkinPlace

  • array<object>optional
  • array<object>
  • array<object>
  • array<object> | null

    The 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 to null.

  • craftingComponentsmap<string, number> | nulloptional
  • breaksIntoComponentsmap<string, number> | nulloptional
  • object | nulloptional
  • actions*array
  • guid*string
  • assetDescriptionId*number | null
  • classIdnumber | nulloptional
  • itemDefinitionId*number | null
  • workshopFileId*number | null
  • workshopFileUrl*string | null
  • workshopFileIsUnavailablebooleanoptional
  • creatorProfileIdstring | nulloptional
  • creatorId*string | null
  • creatorName*string | null
  • creatorAvatarUrl*string | null
  • itemShortNamestring | nulloptional
  • nameHash*string | null
  • nameWorkshop*string | null
  • nameId*number | null
  • descriptionWorkshop*string | null
  • priceFormatstring | nulloptional
  • iconLargeUrl*string | null
  • previewUrl*string | null
  • timeUpdatedstring | nulloptional
  • timeRefreshedstring | nulloptional
  • sellStartstring | nulloptional
  • sellEndstring | nulloptional
  • lastCheckedSupplyTotalsOnstring | nulloptional
  • supplyTotalnumber | nulloptional
  • supplyTotalKnownnumber | nulloptional
  • supplyTotalEstimatednumber | nulloptional
  • supplyTotalMarketsKnownnumber | nulloptional
  • supplyTotalInvestorsKnownnumber | nulloptional
  • supplyTotalInvestorsEstimatednumber | nulloptional
  • supplyTotalOwnersKnownnumber | nulloptional
  • supplyTotalOwnersEstimatednumber | nulloptional
  • subscriptionsCurrentnumber | nulloptional
  • subscriptionsLifetimenumber | nulloptional
  • subscriptionsnumber | nulloptional
  • favouritedCurrentnumber | nulloptional
  • favouritedLifetimenumber | nulloptional
  • viewsnumber | nulloptional
  • votesUpnumber | nulloptional
  • votesDownnumber | nulloptional
  • storeItemGuidstring | nulloptional
  • storeSteamIdnumber | nulloptional
  • storePricenumber | nulloptional
  • storePriceUsdnumber | nulloptional
  • marketItemGuidstring | nulloptional
  • marketId*string | null
  • marketListingIdstring | nulloptional
  • 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
  • buyNowFeenumber | nulloptional
  • buyNowUrl*string | null
  • isCommoditybooleanoptional
  • isMarketablebooleanoptional
  • marketableRestrictionDaysnumber | nulloptional
  • isTradablebooleanoptional
  • tradableRestrictionDaysnumber | nulloptional
  • isPublisherDropbooleanoptional
  • isTwitchDropbooleanoptional
  • isLootCrateDropbooleanoptional
  • isCraftingComponentbooleanoptional
  • isCraftablebooleanoptional
  • isBreakablebooleanoptional
  • isBannedbooleanoptional
  • banReasonstring | nulloptional
  • isAcceptedbooleanoptional
  • id*number
  • appId*number
  • name*string
  • itemType*string
  • hasGlow*boolean | null

    Whether the artwork glows. null when 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 | null

    Whether the artwork has glowing sights. null when the item has never been analysed.

  • glowRatio*number | null
  • hasCutout*boolean | null

    Whether the artwork has a cutout. null when the item has never been analysed.

  • cutoutRatio*number | null
  • isDraft*boolean

Steam Community Market buy-order book

GET/api/item/{id}/buyOrders

Standing 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

NameInRequiredDescription
idpathyesItem guid, or the item’s nameHash — the field v1 called marketHashName.
startquerynoOrder index to start at. Defaults to 0. A negative value is read as 0.
countquerynoNumber of orders to return. Max 100. Defaults to 10. A negative value is read as 0.
currencyqueryno3-letter currency code.

Request

curl "https://api.scmm.app/api/item/<id>/buyOrders?start=1"

Response 200 · application/json · object

  • array<object>
  • start*number
  • count*number
  • total*number

One market’s order book for an item

GET/api/item/{id}/orderBook

The 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

NameInRequiredDescription
idpathyesItem guid, or the item’s nameHash — the field v1 called marketHashName.
marketqueryyesThe 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: Unknown, SteamStore, SteamCommunityMarket, Skinport, LootFarm, SwapGGTrade, TradeitGG, CSDeals, SkinBaron, RustSkins, RustTM, CSTrade … +17 more

iTradegg, SkinsMonkey, SkinSwap, DMarket, Waxpeer, ShadowPay, ManncoStore, RapidSkins, SkinSerpent, SnipeSkins, LISSkins, PirateSwap, AvanMarket, MarketCSGO, CSFloat, WhiteMarket, SkinPlace

sidequerynosell for what sellers ask, buy for what buyers offer. Defaults to sell.

One of: sell, buy

startquerynoLevel index to start at. Defaults to 0. A negative value is read as 0.
countquerynoNumber of levels to return. Max 100. Defaults to 10. A negative value is read as 0.
currencyqueryno3-letter currency code.

Request

curl "https://api.scmm.app/api/item/<id>/orderBook?market=Unknown"

Response 200 · application/json · object

  • market*enum

    The market this book belongs to.

    One of: Unknown, SteamStore, SteamCommunityMarket, Skinport, LootFarm, SwapGGTrade, TradeitGG, CSDeals, SkinBaron, RustSkins, RustTM, CSTrade … +17 more

    iTradegg, SkinsMonkey, SkinSwap, DMarket, Waxpeer, ShadowPay, ManncoStore, RapidSkins, SkinSerpent, SnipeSkins, LISSkins, PirateSwap, AvanMarket, MarketCSGO, CSFloat, WhiteMarket, SkinPlace

  • side*enum

    Which side of the book: sell lists what sellers ask, buy lists what buyers offer.

    One of: sell, buy

  • unit*enum | null

    What quantity counts on each row: units is items offered or wanted, orders is buy orders, each of which may want more than one item. Null when no book is captured for this market and side.

    One of: units, orders

  • capturedAt*string | null

    When 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 | null

    How 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, so items holds a single row whose quantity is that whole-side count, in unit, rather than the quantity at that price. Null when no book is captured for this market and side.

    One of: full, top

  • array<object>

    One row per price level, best first: cheapest first for sell, highest first for buy.

  • start*number

    Index of the first level returned.

  • count*number

    Number of levels returned.

  • total*number

    Number of price levels in the whole book for this item and side.

Median Steam market price over time

GET/api/item/{id}/prices

The 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

NameInRequiredDescription
idpathyesItem guid, or the item’s nameHash — the field v1 called marketHashName.
periodquerynoTime 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: 7d, 30d, 60d, 90d, 1y, all

Request

curl "https://api.scmm.app/api/item/<id>/prices?period=7d"

Response 200 · application/json · array<object>

  • timestamp*string
  • price*number
  • volume*number

Per-market price history, one series per market

GET/api/item/{id}/prices/history

One 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

NameInRequiredDescription
idpathyesItem guid, or the item’s nameHash — the field v1 called marketHashName.
periodquerynoTime 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: 7d, 30d, 60d, 90d, 1y, all

marketsquerynoComma-separated MarketType values. Omit for every market with data. Unknown values are ignored; a filter naming only unknown values returns an empty array.
priceKindquerynoWhich 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: ask, sale, all

Request

curl "https://api.scmm.app/api/item/<id>/prices/history?period=7d"

Response 200 · application/json · array<object>

  • market*enum
    One of: Unknown, SteamStore, SteamCommunityMarket, Skinport, LootFarm, SwapGGTrade, TradeitGG, CSDeals, SkinBaron, RustSkins, RustTM, CSTrade … +17 more

    iTradegg, SkinsMonkey, SkinSwap, DMarket, Waxpeer, ShadowPay, ManncoStore, RapidSkins, SkinSerpent, SnipeSkins, LISSkins, PirateSwap, AvanMarket, MarketCSGO, CSFloat, WhiteMarket, SkinPlace

  • 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

GET/api/item/{id}/sales/market

Daily 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

NameInRequiredDescription
idpathyesItem guid, or the item’s nameHash — the field v1 called marketHashName.
maxDaysquerynoLookback window in days. 0 means all time. Defaults to 30.
ochlquerynoWhen true (or 1), populates open/high/low/close fields per point.

One of: true, false

marketquerynoWhich 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: SteamCommunityMarket, CSDeals, DMarket, RustTM, RustSkins

Request

curl "https://api.scmm.app/api/item/<id>/sales/market?maxDays=30"

Response 200 · application/json · array<object>

  • 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

GET/api/item/{id}/sales/store

One 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

NameInRequiredDescription
idpathyesItem guid, or the item’s nameHash — the field v1 called marketHashName.
maxDaysquerynoLookback window in days. 0 means all time. Defaults to 30.

Request

curl "https://api.scmm.app/api/item/<id>/sales/store?maxDays=30"

Response 200 · application/json · array<object>

  • date*string
  • purchased*number
  • refunded*number

Every recorded sale of an item, one by one

GET/api/item/{id}/sales/trades

The 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

NameInRequiredDescription
idpathyesItem guid, or the item’s nameHash — the field v1 called marketHashName.
marketsquerynoComma-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.
fromquerynoOldest 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.
toquerynoNewest sale time to include, as an ISO 8601 instant. Defaults to now. A value that does not parse is a 400.
limitquerynoSales per page, 1 to 500. Defaults to 100. A value outside that range is read as the nearest bound.
cursorquerynoThe nextCursor of the previous page. A value this endpoint did not issue is a 400.
currencyqueryno3-letter currency code.

Request

curl "https://api.scmm.app/api/item/<id>/sales/trades?markets=<markets>"

Response 200 · application/json · object

  • object
  • currency*string

    Currency 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 | null

    Send as cursor= to read the next, older page. Null on the last page.

Steam Community Market sell-order book

GET/api/item/{id}/sellOrders

Open 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

NameInRequiredDescription
idpathyesItem guid, or the item’s nameHash — the field v1 called marketHashName.
startquerynoOrder index to start at. Defaults to 0. A negative value is read as 0.
countquerynoNumber of orders to return. Max 100. Defaults to 10. A negative value is read as 0.
currencyqueryno3-letter currency code.

Request

curl "https://api.scmm.app/api/item/<id>/sellOrders?start=1"

Response 200 · application/json · object

  • array<object>
  • start*number
  • count*number
  • total*number

Top holders of an item, ranked by quantity

GET/api/item/{id}/topHolders

The 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

NameInRequiredDescription
idpathyesItem guid, or the item’s nameHash — the field v1 called marketHashName.
maxquerynoMax 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 200 · application/json · array<object>

  • steamId*string | null
  • name*string | null
  • avatarUrl*string | null
  • items*number

Get a collection by name

GET/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

NameInRequiredDescription
namepathyesCollection name, exactly as listed by GET /api/item/collections.
creatorIdquerynoFilter to items by a specific Steam creator id.
currencyqueryno3-letter currency code.

Request

curl "https://api.scmm.app/api/item/collection/<name>?creatorId=<creatorId>"

Response 200 · application/json · object

  • array<object>
  • array<object>
  • name*string | null
  • creatorName*string | null
  • creatorAvatarUrl*string | null
  • buyNowPrice*number | null

List distinct item collections

GET/api/item/collections

Every 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 200 · application/json · array<object>

  • name*string

List item accent colors

GET/api/item/colors

Request

curl "https://api.scmm.app/api/item/colors"

Response 200 · application/json · array<object>

  • id*string
  • name*string

Get a Steam creator's items, newest acceptance first

GET/api/item/creator/{steamId}

Powers the workshop creator popup Accepted tab. The FE groups the result by acceptance year (timeAccepted).

Parameters

NameInRequiredDescription
steamIdpathyesCreator's SteamID64.
currencyqueryno3-letter currency code.

Request

curl "https://api.scmm.app/api/item/creator/<steamId>?currency=USD"

Response 200 · application/json · array<object>

  • iconAccentColour*string | null

    Accent colour as a bare #rrggbb hex.

  • iconAccentColourName*string | null

    The colour bucket iconAccentColour resolves to — the same vocabulary GET /api/item/colors lists and the color= filter accepts. null when no palette has been derived for this item yet, or when its icon could not be read. It always agrees with what the color= filter matches on.

  • notes*array<string> | null
  • changes*map<string, string> | null
  • array<object> | null
  • iconDominantColours*array<string> | null

    Dominant icon colours as bare #rrggbb hexes.

  • iconDominantColourNames*array<string> | null

    The colour bucket each iconDominantColours entry resolves to, positionally aligned with it — index i names hex i. It uses the same bucketing as iconAccentColourName, so the vocabulary matches GET /api/item/colors. An entry is null when its hex could not be parsed.

  • array<object> | nulloptional
  • workshopLinksarray<string> | nulloptional
  • marketMarketType*enum | null
    One of: Unknown, SteamStore, SteamCommunityMarket, Skinport, LootFarm, SwapGGTrade, TradeitGG, CSDeals, SkinBaron, RustSkins, RustTM, CSTrade … +17 more

    iTradegg, SkinsMonkey, SkinSwap, DMarket, Waxpeer, ShadowPay, ManncoStore, RapidSkins, SkinSerpent, SnipeSkins, LISSkins, PirateSwap, AvanMarket, MarketCSGO, CSFloat, WhiteMarket, SkinPlace

  • buyNowFrom*enum | null
    One of: Unknown, SteamStore, SteamCommunityMarket, Skinport, LootFarm, SwapGGTrade, TradeitGG, CSDeals, SkinBaron, RustSkins, RustTM, CSTrade … +17 more

    iTradegg, SkinsMonkey, SkinSwap, DMarket, Waxpeer, ShadowPay, ManncoStore, RapidSkins, SkinSerpent, SnipeSkins, LISSkins, PirateSwap, AvanMarket, MarketCSGO, CSFloat, WhiteMarket, SkinPlace

  • array<object>optional
  • array<object>
  • array<object>
  • array<object> | null

    The 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 to null.

  • craftingComponentsmap<string, number> | nulloptional
  • breaksIntoComponentsmap<string, number> | nulloptional
  • object | nulloptional
  • actions*array
  • guid*string
  • assetDescriptionId*number | null
  • classIdnumber | nulloptional
  • itemDefinitionId*number | null
  • workshopFileId*number | null
  • workshopFileUrl*string | null
  • workshopFileIsUnavailablebooleanoptional
  • creatorProfileIdstring | nulloptional
  • creatorId*string | null
  • creatorName*string | null
  • creatorAvatarUrl*string | null
  • itemShortNamestring | nulloptional
  • nameHash*string | null
  • nameWorkshop*string | null
  • nameId*number | null
  • descriptionWorkshop*string | null
  • priceFormatstring | nulloptional
  • iconLargeUrl*string | null
  • previewUrl*string | null
  • timeUpdatedstring | nulloptional
  • timeRefreshedstring | nulloptional
  • sellStartstring | nulloptional
  • sellEndstring | nulloptional
  • lastCheckedSupplyTotalsOnstring | nulloptional
  • supplyTotalnumber | nulloptional
  • supplyTotalKnownnumber | nulloptional
  • supplyTotalEstimatednumber | nulloptional
  • supplyTotalMarketsKnownnumber | nulloptional
  • supplyTotalInvestorsKnownnumber | nulloptional
  • supplyTotalInvestorsEstimatednumber | nulloptional
  • supplyTotalOwnersKnownnumber | nulloptional
  • supplyTotalOwnersEstimatednumber | nulloptional
  • subscriptionsCurrentnumber | nulloptional
  • subscriptionsLifetimenumber | nulloptional
  • subscriptionsnumber | nulloptional
  • favouritedCurrentnumber | nulloptional
  • favouritedLifetimenumber | nulloptional
  • viewsnumber | nulloptional
  • votesUpnumber | nulloptional
  • votesDownnumber | nulloptional
  • storeItemGuidstring | nulloptional
  • storeSteamIdnumber | nulloptional
  • storePricenumber | nulloptional
  • storePriceUsdnumber | nulloptional
  • marketItemGuidstring | nulloptional
  • marketId*string | null
  • marketListingIdstring | nulloptional
  • 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
  • buyNowFeenumber | nulloptional
  • buyNowUrl*string | null
  • isCommoditybooleanoptional
  • isMarketablebooleanoptional
  • marketableRestrictionDaysnumber | nulloptional
  • isTradablebooleanoptional
  • tradableRestrictionDaysnumber | nulloptional
  • isPublisherDropbooleanoptional
  • isTwitchDropbooleanoptional
  • isLootCrateDropbooleanoptional
  • isCraftingComponentbooleanoptional
  • isCraftablebooleanoptional
  • isBreakablebooleanoptional
  • isBannedbooleanoptional
  • banReasonstring | nulloptional
  • isAcceptedbooleanoptional
  • id*number
  • appId*number
  • name*string
  • itemType*string
  • hasGlow*boolean | null

    Whether the artwork glows. null when 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 | null

    Whether the artwork has glowing sights. null when the item has never been analysed.

  • glowRatio*number | null
  • hasCutout*boolean | null

    Whether the artwork has a cutout. null when the item has never been analysed.

  • cutoutRatio*number | null
  • isDraft*boolean

Contents of one item-definition archive

GET/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

NameInRequiredDescription
digestpathyesDigest of the archive to fetch.
downloadquerynoIf true, respond as a JSON file attachment.

Request

curl "https://api.scmm.app/api/item/definitionArchive/<digest>?download=<download>"

Response 200 · application/json · string

  • *string

Text diff between two item-definition archives

GET/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

NameInRequiredDescription
oldDigestpathyesDigest of the older archive.
newDigestpathyesDigest of the newer archive.

Request

curl "https://api.scmm.app/api/item/definitionArchive/<oldDigest>/compareTo/<newDigest>"

Response 200 · application/json · object

  • array<object>

Every known item-definition archive, newest first

GET/api/item/definitionArchives

Item 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 200 · application/json · array<object>

  • id*string
  • digest*string
  • size*number
  • itemCount*number
  • timestamp*string

Every item’s cheapest buy price, in one response

GET/api/item/prices

Restores 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

NameInRequiredDescription
marketsquerynoComma-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.
currencyqueryno3-letter currency code (e.g. USD). Defaults to USD.

Request

curl "https://api.scmm.app/api/item/prices?markets=<markets>"

Response 200 · application/json · array<object>

  • id*string

    The v2 item guid.

  • appId*string

    Steam app id.

  • classId*string | null

    Steam class id — the integer the v1 API returned as this item’s id.

  • name*string
  • nameHash*string | null

    Market hash name — the join key for a v1 consumer (v1 called it marketHashName).

  • price*number | null

    The winning market’s listed price, in the response currency’s hundredths. The offer is chosen by lowest price + fee, so the cheapest total is price + fee and this field alone can exceed a rival’s. null when no market offers the item — the v1 API returned 0 here, which could not be told apart from free.

  • fee*number | null

    Modelled 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 | null

    Units on offer at price. null when the market reports no count.

  • marketType*enum | null

    Which market price came from.

    One of: Unknown, SteamStore, SteamCommunityMarket, Skinport, LootFarm, SwapGGTrade, TradeitGG, CSDeals, SkinBaron, RustSkins, RustTM, CSTrade … +17 more

    iTradegg, SkinsMonkey, SkinSwap, DMarket, Waxpeer, ShadowPay, ManncoStore, RapidSkins, SkinSerpent, SnipeSkins, LISSkins, PirateSwap, AvanMarket, MarketCSGO, CSFloat, WhiteMarket, SkinPlace

  • currency*string

    ISO 4217 code every monetary field on this row uses.

  • liquidityScore*number | null

    A 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 — never 0 — 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 component 0: 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 whose marketType reads Waxpeer the score still describes Steam’s book. It describes the item rather than the winning offer.

  • array<object>optional

    Per-market breakdown, cheapest first. Present only when the request supplied markets=.

Demand and supply stats for one item type

GET/api/item/type/{type}/demand

Powers the "cheaper on the market" popup header tiles (median price, median store-price movement, market supply, market demand). Mirrors the legacy GetItemDemandByItemType.

Parameters

NameInRequiredDescription
typepathyesExact item type, e.g. Bear Skin Rug.
currencyqueryno3-letter currency code.

Request

curl "https://api.scmm.app/api/item/type/<type>/demand?currency=USD"

Response 200 · application/json · object

  • 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

GET/api/item/types

Every 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 200 · application/json · array<object>

  • array<object>
  • name*string