Inventory
Valuation, performance and collections for any public Steam inventory.
Items in a profile inventory, with market value
/api/inventory/{profileId}One row per item held, with its quantity and current market value, paginated. Accepts a profile id or guid, a Steam vanity name, or a 64-bit Steam id.
The default page size is large (2,000) because this is the whole-inventory view, and pageSize is clamped to 5,000 rather than rejected. metric chooses what the primary sort ranks on and priceSort gives it a direction.
It answers 401 when the profile has opted out of item analytics and the caller is neither its owner nor an administrator. That applies to every per-profile inventory read.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| profileId | path | yes | Profile id, profile guid, vanity url, or 64-bit Steam id. |
| search | query | no | Filter by item name or type. |
| collection | query | no | Filter to a single collection name (all = no filter). |
| priceSort | query | no | Primary sort by per-item market price. Defaults to desc.One of: |
| nameSort | query | no | Name order (A-Z / Z-A). Defaults to az.One of: |
| sortKey | query | no | Which dropdown is the primary sort; the other only breaks ties. Defaults to price.One of: |
| metric | query | no | What the primary sort ranks on (priceSort gives it a direction). price = per-unit market price, stack = unit price × owned quantity, ath/atl = the current Steam ask as a ratio of the all-time high/low sale (ath desc / atl asc = "closest to"), demand = Steam units sold in the last 24 h, supply = Steam sell-order count. Defaults to price; an unrecognised value falls back to it rather than rejecting. ath, atl, demand and supply are Steam-only measures, so unlike price and stack they ignore the market parameter and always rank on Steam’s figures.One of: |
| page | query | no | 1-based page index. Defaults to 1. |
| pageSize | query | no | Items per page. Defaults to 2000, max 5000. |
| market | query | no | Valuation source for each item price: steam (default) or a specific market key (e.g. Skinport) present in this inventory. Also scopes visibility: unless includeUnpriced=true, only items priced by the selected view are listed. |
| includeUnpriced | query | no | true includes every owned item. Default (false) hides items the selected view cannot price — Steam view requires a resale price (store-only items are hidden), a market view requires that market's price. The inventory value endpoint keeps counting the full owned set.One of: |
| currency | query | no | 3-letter currency code. Defaults to the profile FK / USD. |
Request
curl "https://api.scmm.app/api/inventory/<profileId>?search=<search>"Response
array<object>- page*
number - pageSize*
number - total*
number - hasMore*
boolean - collections*
array<string> - markets*
array<string>
Collections represented in a profile inventory
/api/inventory/{profileId}/collectionsOne row per collection the profile owns at least one item from, with how much of the set it holds and what that is worth. It is the set-completion view of an inventory rather than a list of items.
It answers 401 when the profile has opted out of item analytics and the caller is neither its owner nor an administrator.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| profileId | path | yes | Profile id, profile guid, vanity url, or 64-bit Steam id. |
| includeUnowned | query | no | If true, returns every tracked collection regardless of ownership (development env only). |
| currency | query | no | 3-letter currency code. Defaults to the profile FK / USD. |
Request
curl "https://api.scmm.app/api/inventory/<profileId>/collections?includeUnowned=<includeUnowned>"Response
- *
array<object>
Total inventory value over a trailing window
/api/inventory/{profileId}/historyOne point per day of the profile’s total inventory value, oldest first. A day the value was never computed on is absent rather than zero — never interpolate across a gap, because a missing day means no snapshot, not a worthless inventory.
It answers 401 when the profile has opted out of item analytics and the caller is neither its owner nor an administrator.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| profileId | path | yes | Profile id, profile guid, vanity url, or 64-bit Steam id. |
| period | query | no | Window: 1d, 7d, 30d, 90d. Defaults to 30d.One of: |
| currency | query | no | 3-letter currency code. Defaults to the profile FK / USD. |
Request
curl "https://api.scmm.app/api/inventory/<profileId>/history?period=1d"Response
- timestamp*
string - totalValue*
number
Purchase price, market price and return per item
/api/inventory/{profileId}/investmentAuth requiredRequires authentication, and answers 401 for anyone but the inventory owner or an administrator. Rows are one per inventory item (never grouped by skin) because the purchase price is recorded per item. Every money field is in the resolved display currency.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| profileId | path | yes | Profile id, profile guid, vanity url, or 64-bit Steam id. |
| search | query | no | Filter by item name or type. |
| sortBy | query | no | Column to sort on. Defaults to buyPrice.One of: |
| sortDirection | query | no | Sort direction. Defaults to desc.One of: |
| page | query | no | 1-based page index. Defaults to 1. |
| pageSize | query | no | Items per page. Defaults to 25, max 100. |
| currency | query | no | 3-letter currency code. Defaults to the profile FK / USD. |
Request
curl "https://api.scmm.app/api/inventory/<profileId>/investment?search=<search>" \
-H "x-api-key: YOUR_KEY_HERE"Response
array<object>- page*
number - pageSize*
number - total*
numberMatching rows (inventory assets). Smaller than
totalUnitswhen the profile holds a stack. - totalUnits*
numberMatching units —
sum(quantity), the figure the page header calls "Inventory Items". - hasMore*
boolean - currency*
string - includeMarketFees*
boolean
Invested, gains, losses and net return, totalled
/api/inventory/{profileId}/investment/totalsAuth requiredRequires authentication, and answers 401 for anyone but the inventory owner or an administrator. Every figure is null until more than half the inventory carries purchase data — below that the numbers describe the missing data, not the portfolio.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| profileId | path | yes | Profile id, profile guid, vanity url, or 64-bit Steam id. |
| currency | query | no | 3-letter currency code. Defaults to the profile FK / USD. |
Request
curl "https://api.scmm.app/api/inventory/<profileId>/investment/totals?currency=USD" \
-H "x-api-key: YOUR_KEY_HERE"Response
- invested*
number | null - gains*
number | null - losses*
number | null - netReturn*
number | null - currency*
string - itemsWithBuyPrices*
number - itemCount*
number - hasSetupInvestment*
boolean
Performance overview for one profile inventory
/api/inventory/{profileId}/performanceThe summary numbers for one inventory over the chosen window: its current value, the change across the window, the best and worst movers and the per-collection deltas. It is the overview the more specific performance/* endpoints break down.
Every figure is computed over period, which defaults to 24h — the shortest window and the noisiest, so widen it before drawing conclusions. It answers 401 when the profile has opted out of item analytics and the caller is neither its owner nor an administrator.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| profileId | path | yes | Profile id, profile guid, vanity url, or 64-bit Steam id. |
| period | query | no | Window: 24h, 7d, 30d, 90d. Defaults to 24h.One of: |
Request
curl "https://api.scmm.app/api/inventory/<profileId>/performance?period=24h"Response
objectarray<object>array<object>- historyBackfillPending*
boolean
Per-collection performance over a window
/api/inventory/{profileId}/performance/collectionsOne row per collection the profile owns from, with its value and its value-weighted change over the window. Value-weighted rather than a simple mean, so a collection’s change reflects what the holder actually owns rather than treating one cheap item as equal to a set.
It answers 401 when the profile has opted out of item analytics and the caller is neither its owner nor an administrator.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| profileId | path | yes | Profile id, profile guid, vanity url, or 64-bit Steam id. |
| period | query | no | Window: 24h, 7d, 30d, 90d. Defaults to 24h.One of: |
Request
curl "https://api.scmm.app/api/inventory/<profileId>/performance/collections?period=24h"Response
- name*
string - iconUrl*
string | null - value*
number - changePercent*
number | null - currency*
string - ownedCount*
number - totalCount*
number
Wipe and store-release events in a window
/api/inventory/{profileId}/performance/eventsDated game events inside the same window a performance series covers: monthly force wipes and item-store releases. They are returned separately from the series so a client can annotate it without a second time axis, and they explain most of the sharp moves in one.
It answers 401 when the profile has opted out of item analytics and the caller is neither its owner nor an administrator.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| profileId | path | yes | Profile id, profile guid, vanity url, or 64-bit Steam id. |
| days | query | no | Trailing window in days. 0 returns all time. Defaults to 30. |
Request
curl "https://api.scmm.app/api/inventory/<profileId>/performance/events?days=30"Response
- kind*
object - label*
string - timestamp*
string
Inventory performance report as CSV
/api/inventory/{profileId}/performance/exportThe same figures as the performance endpoints, as a CSV file: the portfolio summary followed by one row per owned item. Responds text/csv as an attachment rather than JSON, and the figures are computed over period in the resolved currency.
It answers 401 when the profile has opted out of item analytics and the caller is neither its owner nor an administrator.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| profileId | path | yes | Profile id, profile guid, vanity url, or 64-bit Steam id. |
| period | query | no | Window the figures are computed over: 24h, 7d, 30d, 90d. Defaults to 24h.One of: |
| currency | query | no | 3-letter currency code. Defaults to the profile FK / USD. |
Request
curl "https://api.scmm.app/api/inventory/<profileId>/performance/export?period=24h"Portfolio value series over a trailing window
/api/inventory/{profileId}/performance/historyOne point per day of the profile’s portfolio value, oldest first, over a trailing window in days. days=0 returns the whole recorded history. A day with no snapshot is absent rather than zero.
It answers 401 when the profile has opted out of item analytics and the caller is neither its owner nor an administrator.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| profileId | path | yes | Profile id, profile guid, vanity url, or 64-bit Steam id. |
| days | query | no | Trailing window in days. 0 returns all time. Defaults to 30. |
Request
curl "https://api.scmm.app/api/inventory/<profileId>/performance/history?days=30"Response
- timestamp*
string - value*
number
Per-item performance for one profile inventory
/api/inventory/{profileId}/performance/itemsOne row per item held, with its price, its change over the window, its recent volume and a sparkline of its recent levels — paginated, searchable and sortable. It is the detail behind the performance overview.
It answers 401 when the profile has opted out of item analytics and the caller is neither its owner nor an administrator.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| profileId | path | yes | Profile id, profile guid, vanity url, or 64-bit Steam id. |
| period | query | no | Window: 24h, 7d, 30d, 90d. Defaults to 24h.One of: |
| search | query | no | Filter by item name or type. |
| sort | query | no | Sort order. Defaults to price_desc.One of: |
| page | query | no | 1-based page index. Defaults to 1. |
| pageSize | query | no | Items per page. Defaults to 24, max 100. |
Request
curl "https://api.scmm.app/api/inventory/<profileId>/performance/items?period=24h"Response
array<object>- total*
number - page*
number - pageSize*
number
Profile summary for an inventory
/api/inventory/{profileId}/summaryWho an inventory belongs to, in one small response: Steam id, name, avatar and when the inventory was last imported. It is the header a client needs before any of the heavier inventory reads, and it accepts the same identifier forms they do.
It answers 401 when the profile has opted out of item analytics and the caller is neither its owner nor an administrator.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| profileId | path | yes | Profile id, profile guid, vanity url, or 64-bit Steam id. |
Request
curl "https://api.scmm.app/api/inventory/<profileId>/summary"Response
- profileId*
string - steamId*
string - name*
string | null - avatarUrl*
string | null - lastUpdatedInventoryOn*
string | null - privacy*
number
Current total value of a profile inventory
/api/inventory/{profileId}/valueThe current total market value of one inventory, plus the item counts behind it. This is the cheapest inventory read and the one to poll; the item list and the performance endpoints answer the same question in far more detail and cost accordingly.
It answers 401 when the profile has opted out of item analytics and the caller is neither its owner nor an administrator.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| profileId | path | yes | Profile id, profile guid, vanity url, or 64-bit Steam id. |
| market | query | no | Valuation market. steam (default) prices via the Steam Community Market and refreshes the stored snapshot; a MarketType key returns a view-only total under that market’s listing prices. |
| currency | query | no | 3-letter currency code. Defaults to the profile FK / USD. |
Request
curl "https://api.scmm.app/api/inventory/<profileId>/value?market=<market>"Response
- totalValue*
number - itemCount*
number - currency*
string - profitLoss*
number
Resolve a Steam id and queue an inventory import
/api/inventory/calculateResolves the identifier to a 64-bit Steam id (resolving vanity names via Steam when needed), creates a lightweight profile on first sight, and enqueues an inventory import. The import runs asynchronously — poll the profile’s lastUpdatedInventoryOn for completion.
Request body
- identifier*
string
Request
curl -X POST "https://api.scmm.app/api/inventory/calculate" \
-H "Content-Type: application/json" \
-d '{"identifier":"<identifier>"}'Status of an on-demand inventory import
/api/inventory/import-status/{steamId}The poll target for an import queued by POST /api/inventory/calculate. It reports whether the import has produced a value, is still running, or finished without one — the third case is a real answer rather than a failure, and it is what a private or empty Steam inventory returns. Takes a 64-bit Steam id.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| steamId | path | yes | 64-bit Steam id. |
Request
curl "https://api.scmm.app/api/inventory/import-status/<steamId>"Trigger an inventory import from Steam
/api/inventory/import/{steamId}Auth requiredSynchronously pages the Steam inventory and reconciles items into the database. Requires authentication. Throttled to once per hour per profile; force=true bypasses the throttle but is honored only for the owner of the Steam id (or an admin) — other callers stay throttled.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| steamId | path | yes | 64-bit Steam id. |
| force | query | no | Owner/admin only: bypass the 1-hour sync throttle and fetch from Steam now. |
Request
curl -X POST "https://api.scmm.app/api/inventory/import/<steamId>?force=<force>" \
-H "x-api-key: YOUR_KEY_HERE"Response
- imported*
number - updated*
number - error
string - private
boolean - complete
boolean - skipped
boolean
Update purchase price or source for one item
/api/inventory/item/{itemId}Auth requiredRequires authentication, and answers 401 unless the item belongs to you (or you are an administrator). Absent fields are left unchanged; an explicit null clears one. Choosing a free acquisition source (gambling, gift, game drop) always clears the price.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| itemId | path | yes | Steam asset id of the inventory item, as returned in itemId. |
Request body
- buyPrice
number | null - currency
string | null - acquiredBy
number
Request
curl -X PUT "https://api.scmm.app/api/inventory/item/<itemId>" \
-H "Content-Type: application/json" \
-H "x-api-key: YOUR_KEY_HERE" \
-d '{"buyPrice":0}'Highest-valued inventories, paginated and sortable
/api/inventory/leaderboardServes the top 500 inventories for the requested sort, not every inventory tracked. total is therefore capped at 500 and totalPages with it; pages beyond the cap return no entries. For the true, uncapped count of valued inventories use inventoriesTracked on GET /api/inventory/leaderboard/stats.
Parameters
| Name | In | Required | Description |
|---|---|---|---|
| page | query | no | 1-based page index. Defaults to 1. Pages past the 500-row cap return no entries. |
| pageSize | query | no | Rows per page. Defaults to 50, max 100. |
| sort | query | no | Sort key. Defaults to value.One of: |
| dir | query | no | Sort direction. Defaults to desc.One of: |
Request
curl "https://api.scmm.app/api/inventory/leaderboard?page=1"Inventory totals across every valued profile
/api/inventory/leaderboard/statsUncapped on purpose — this is the counterpart to the leaderboard's 500-row cap, and the only place the true number of valued inventories is published.
Request
curl "https://api.scmm.app/api/inventory/leaderboard/stats"Item ids in the authenticated user’s own inventory
/api/inventory/owned/item-idsAuth requiredLightweight companion to the inventory list — hydrates the "Owned" badge across the app. Distinct ids only, no quantities and no ordering. Scoped to the resolved app, so a Rust session never reports a CS2 item.
Request
curl "https://api.scmm.app/api/inventory/owned/item-ids" \
-H "x-api-key: YOUR_KEY_HERE"Response
- *
array<string>