Skip to main content
POST /inventory/price/bulk lists or reprices multiple item types in one request. It is the bulk counterpart of POST /inventory/price, which handles one type per call. Base URL: https://api.mannco.store. Prices are always integer cents ($1.50 → 150).
Never send dollars or floats. 1.50 is not a valid price; 150 is.

Endpoint

Permission: Connected + API + 2FA. CSRF is not required on this route, because it carries the api filter. A missing or invalid 2FA code returns HTTP 403 with an envelope that differs from the usual { err, success, content } shape:

Request body

items may also be a JSON string for form-encoded posts, but a JSON body is preferred.
array
required
1–50 groups. More than 50 fails the whole request.
string | string[]
required
Steam assetIds, digits only. Accepts a comma-separated string or an array.
integer
required
Price in cents, 1 to 5000000.
This endpoint both lists inventory (backpack.state = 0) and reprices existing listings (state = 1). See Item states.

Hard limits

Apply these client-side, before sending:
  • 50 item types per request (INVENTORY_SELL_MAX_TYPES)
  • 1000 assetIds across all groups (INVENTORY_SELL_MAX_ASSETS)
  • An assetId may appear in only one group, otherwise Duplicate assetId
  • Every assetId in a group must share the same item_id
The ids field returned by GET /inventory/onInventory and GET /inventory/onSale is already a GROUP_CONCAT of assetIds — reuse it as-is.

Mapping from POST /inventory/price

Single type (old):
Bulk (new):
Build one group per item_id, and per price when variants are priced differently:
toBulkPayload.js
Above 50 types or 1000 assets, split the work into sequential requests.

Example call (website session)

sellInventoryBulk.js

Response

The endpoint returns HTTP 200 even when some groups fail. Read content, not err, to know what happened.
A group can have status: "error" and listed / sold greater than 0. Processing stops at the first failing assetId, but earlier items in that group stay written.
In the UI, show a success toast when errors === 0. Otherwise list results[i].message per group and refresh the inventory and on-sale views.

Errors

Whole request

err: true, HTTP 300. Nothing is processed.

Per group

status: "error" in results[]. Other groups still run. Always send one group per item_id.

Suggested UI flow

1

Select stacks

The user picks stacks from onInventory / onSale and a price per stack.
2

Prefill prices

Optionally call GET /item/pricing/bulk with the item_ids to prefill lowest sale, buy order, and suggested price. Block a price below the highest buy order to avoid the buy-order error.
3

Prompt 2FA once

Ask for the TOTP code once for the whole batch.
4

Send the request

POST /inventory/price/bulk with the mapped payload.
5

Report the result

Show listed, sold, and sold_buyorder, for example “12 listed, 3 sold to a buy order, 2 other listings matched”.
6

Refresh

Reload onInventory, onSale, and the balance.
The seller fee is unchanged: 95% to the seller (ceil, minimum platform fee 1¢ except on a 1¢ item). An item matched by a buy order leaves the seller’s inventory and is transferred to the buyer.

Pitfalls

  • Do not send dollars (1.50) — integer cents only.
  • Do not treat err: false as “everything succeeded”. Check content.errors and results.
  • sold_buyorder can sell listings outside the current selection (same item_id, already state = 1). Warn the user when that matters: other listings of this type may fill a buy order.
  • A second click on the same assetIds: the first call lists or sells them, the second may return Item not found or not owned (already sold) or reprice them (still owned). Disable the button while the request is in flight.
  • Variants (spell, sheen, paint, gifted) of the same item_id may share a group if they share a price. Split groups when prices differ.
  • Over 50 types or 1000 assets, chunk into sequential requests. Do not rely on partial success for the 50-type cap — that one fails the whole call.