Access on request. Instant Sell is enabled per account. Your API key can read
GET /v1/sell/status out of the box, but quoting and selling return selling_not_enabled until access is granted. Contact support to request access.How it works
- Quote.
POST /v1/sell/quoteswith a Steam trade URL returns every item in that inventory we are ready to buy, with the exact USD amount you will be credited per item. Pick the game withapp_idand the number of trade offers withsplit. - Create an order.
POST /v1/sell/orderswith the chosenasset_idsand the sameapp_idandsplit. A bot from the CSBoard network sends a Steam trade offer to the seller’s trade URL, or several offers whensplitistrue. The order’soffers[]array tracks each one. - Seller accepts. The offer moves to
received. The amount in flight is visible inGET /v1/balanceunderincoming_hold. - Settlement. Each offer is credited to your CSBoard balance on its own, at the time described in when the money arrives. There is no other payout destination: funds always settle to the balance of the API key that created the order.
Choose the game
Sendapp_id on both the quote and the order:
One order sells one game. Every quote item and every order carries
app_id, so you can tell them apart in one list. A game that is not open for instant sell on your key answers 422 unsupported_game, with the games you can use in supported_app_ids:
One offer or several
Several markets buy through the CSBoard network, and they do not all pay the same for the same item.split decides how a sale is shared between them.
split: false (default): one trade offer. The whole sale goes to the single market that leaves the seller with the most value. We count what that market pays for the items it takes, plus what the items it does not take are worth elsewhere, because those stay with the seller and can be sold later. Items that market does not take are left out of the quote, so everything you can order ships in one offer. Every quote item has offer_group: "a".
split: true: the best price for every item. Each item goes to the market that pays the most for it. That gives the widest coverage and the highest total, and the seller may get several trade offers from different bots. To keep a sale from breaking into offers nobody accepts:
- an extra offer worth less than $1 is dropped, and its items stay with the seller (the largest offer is always kept);
- a sale is spread over a limited number of offers; items that do not fit are moved to the best-paying market already in the sale, or left out.
offer_group is a, b and so on per item, biggest offer first, so the number of distinct letters is the number of offers the seller should expect. The quote groups the whole inventory. If you order only some of the items they are grouped again for that basket, and the order’s offers[] is the final word. Each offer there carries the same offer_group letter, its own trade_offer_id and status, and a status on each of its items. trade_offer_ids lists every offer that went out.
When the money arrives
Each offer is credited on its own, socredited_usd grows offer by offer.
While an offer waits, it shows
received and unhold_at carries the expected credit time.
Verify offers to your users
Every offer exposes the sending bot’s profile and the Steam trade offer id:trade_offer_id and bot steam_id before accepting. That check defeats impersonation scams regardless of which bot ships the offer. On a split sale, show every entry of offers[].
Endpoints
All endpoints live under/v1/sell and use the same csb_pub_ Bearer key as the rest of the API.
Rather than polling, subscribe to the
sell.updated webhook. Its data is the same order object.
Order lifecycle
On a sale with several offers each offer has its own status. If one offer is declined and the others go through, the order itself keeps a non-final status while each offer and
credited_usd show exactly what was sold. Read offers[].
Errors
Errors follow the standard{ "code", "detail" } envelope. Sell-specific codes: invalid_trade_url, private_inventory, inventory_unavailable, item_not_in_inventory, item_not_tradable, no_eligible_items, price_drift (409, with current_total_usd and min_total_usd), below_min_total, too_many_items, active_order_exists, too_many_active_orders, daily_cap_exceeded, unsupported_game (422, with supported_app_ids), offer_declined, offer_expired, sell_disabled, selling_not_enabled, rate_limited, not_cancellable, order_not_found.
Limits
- Quotes: 10 requests/min per key (inventory scans are expensive).
- Orders: 5 creations/min per key and a daily volume cap, $2,000 by default. The basket and active-order limits for your key are in
GET /v1/sell/status. Caps are raised per account, ask support.