---
title: "Classify an inventory for the card exchange"
method: POST
path: "/v1/exchange.classifyInventory"
tags: ["exchange"]
---

# Classify an inventory for the card exchange

`POST /v1/exchange.classifyInventory`

Buckets every tradable card an account holds into dead, surplus, or keep based on the account's remaining badge crafts. Service-only.

## Query parameters

- `accountId` integer, required — Account to classify. This endpoint is service-only; the caller asserts the account

## Response `200`

OK

- ExchangeClassifyInventoryResponseBody
  - `$schema` string, uri — A URL to the JSON Schema for this object.
  - `accountId` integer, required — The classified account
  - `apps` ExchangeClassifiedApp[], nullable, required — Every app the account holds tradable cards for, with per-card verdicts
    - `appId` integer, required — The app id
    - `cards` ExchangeClassifiedCard[], nullable, required — The account's cards for this app
      - `averagePriceCents` integer, required — Average Steam market price in cents; 0 means no data
      - `bucket` 'dead' | 'surplus' | 'keep', required — dead: no remaining craft can use it. surplus: owned exceeds remaining. keep: still needed
      - `classId` integer, required — Steam class id, the stable identity of the card
      - `gemsGoo` integer, required — Gems Steam grinds this card into; 0 means unknown
      - `highestBuyOrderCents` integer, required — Highest standing buy order in cents; real money committed for this card
      - `icon` string, required — Steam economy image hash
      - `isFoil` boolean, required — Foil side of the set
      - `listed` integer, required — Active sell listings; a price backed by a handful of listings is one someone can move
      - `marketable` boolean, required — Steam marketable flag; the exchange rejects non-marketable deposits
      - `medianSaleCents` integer, required — Median price this card actually sold at over the last 30 days, in cents; 0 means nothing sold
      - `name` string, required — Card name
      - `owned` integer, required — Copies held. 0 for a card of a held app that the account lacks — the withdraw side's rows
      - `priceCents` integer, required — Current lowest Steam market ask in cents; 0 means no data, not free
      - `priceMax4d` integer, required — Highest sale price over the last 4 days, in cents; 0 means nothing sold
      - `priceMin4d` integer, required — Lowest sale price over the last 4 days, in cents; 0 means nothing sold
      - `remaining` integer, required — Copies the account's remaining crafts can still consume. Equals owned when the badge levels without a cap
      - `saleDays30d` integer, required — Distinct days in the last 30 that saw at least one sale
      - `saleVolume30d` integer, required — Copies sold over the last 30 days
      - `sellOrders` integer, required — Sell orders on the item's order book
      - `surplus` integer, required — Copies safe to give away (owned minus remaining, zero unless bucket is surplus or dead)
    - `cardsFirstSeenAt` integer, required — Unix ms when the first of this app's cards was catalogued — the release-date proxy for a new-card quote lockout. 0 means unknown
    - `foilCrafted` boolean, required — The account already crafted the foil badge
    - `hasFoilBadge` boolean, required — A foil badge exists for this app
    - `image` string, required — App capsule image
    - `missingBadgeData` boolean, required — No badge rows are known for this app; every card is kept rather than guessed dead
    - `name` string, required — App name
    - `normalRemaining` integer, required — Normal badge crafts left (level cap minus current level)
    - `normalUncapped` boolean, required — The normal badge levels without a cap; its cards are never dead

## Other responses

- `400` — Bad Request
- `401` — Unauthorized
- `422` — Unprocessable Entity
- `500` — Internal Server Error

## Changes

> 24 revisions in range; 1 not diffed.

- **2026-09-05** `ac012ebc1fdf` — 9 info
  - added the required property `apps/items/cards/items/highestBuyOrderCents` to the response with the `200` status
  - added the required property `apps/items/cards/items/listed` to the response with the `200` status
  - added the required property `apps/items/cards/items/medianSaleCents` to the response with the `200` status
  - added the required property `apps/items/cards/items/priceMax4d` to the response with the `200` status
  - …5 more
- **2026-09-03** `4129c6e2fed8` — 1 info
  - endpoint added

[Change history](https://skmtc.dev/steamsets/apis/steamsets-api/changes/v1/exchange.classifyInventory/post.md)

---

[API](https://skmtc.dev/steamsets/apis/steamsets-api.md) · [All operations](https://skmtc.dev/steamsets/apis/steamsets-api/llms.txt) · [OpenAPI document](https://skmtc.dev/steamsets/apis/steamsets-api/revisions/cc0e4f2c3cfb?raw)
