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 slug, e.g. rifle, helmet. Repeatable as comma-separated list.
rarityquerynoRarity tag (e.g. common, rare).
collectionquerynoItem collection slug.
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).
glowsightquerynoFilter by glow-sights flag.
cutoutquerynoFilter by cutout flag.
commodityquerynoFilter by commodity flag.
marketablequerynoFilter by marketable flag.
tradablequerynoFilter by tradable flag.
returningquerynoFilter by has-returned-to-store flag.
bannedquerynoFilter by banned flag.
publisherDropquerynoFilter by publisher-drop flag.
twitchDropquerynoFilter by twitch-drop flag.
lootCrateDropquerynoFilter by loot-crate-drop flag.
craftablequerynoFilter by craftable flag.
manipulatedquerynoFilter by manipulated-market flag.
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.
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, RustyTrade … +15 more

    CSTrade, iTradegg, SkinsMonkey, SkinSwap, DMarket, Waxpeer, ShadowPay, ManncoStore, RapidSkins, SkinSerpent, Rustyloot, SnipeSkins, LISSkins, PirateSwap, AvanMarket

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

    CSTrade, iTradegg, SkinsMonkey, SkinSwap, DMarket, Waxpeer, ShadowPay, ManncoStore, RapidSkins, SkinSerpent, Rustyloot, SnipeSkins, LISSkins, PirateSwap, AvanMarket

  • array<object>optional
  • array<object>
  • array<object>
  • 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
  • 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

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.
countquerynoNumber of orders to return. Max 100. Defaults to 10.
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

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.

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

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, RustyTrade … +15 more

    CSTrade, iTradegg, SkinsMonkey, SkinSwap, DMarket, Waxpeer, ShadowPay, ManncoStore, RapidSkins, SkinSerpent, Rustyloot, SnipeSkins, LISSkins, PirateSwap, AvanMarket

  • 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: 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

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.

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

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.
countquerynoNumber of orders to return. Max 100. Defaults to 10.
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.

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 slug.
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 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 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, RustyTrade … +15 more

    CSTrade, iTradegg, SkinsMonkey, SkinSwap, DMarket, Waxpeer, ShadowPay, ManncoStore, RapidSkins, SkinSerpent, Rustyloot, SnipeSkins, LISSkins, PirateSwap, AvanMarket

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

    CSTrade, iTradegg, SkinsMonkey, SkinSwap, DMarket, Waxpeer, ShadowPay, ManncoStore, RapidSkins, SkinSerpent, Rustyloot, SnipeSkins, LISSkins, PirateSwap, AvanMarket

  • array<object>optional
  • array<object>
  • array<object>
  • 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
  • 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

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 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.
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, RustyTrade … +15 more

    CSTrade, iTradegg, SkinsMonkey, SkinSwap, DMarket, Waxpeer, ShadowPay, ManncoStore, RapidSkins, SkinSerpent, Rustyloot, SnipeSkins, LISSkins, PirateSwap, AvanMarket

  • 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