POST /v1/sell/orders: Sell Items from a Steam Inventory
Sell quoted CS2, Dota 2 or Rust items. CSBoard bots send the seller Steam trade offers and your balance is credited once each offer settles.
curl --request POST \
--url https://csboard.com/v1/sell/orders \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"trade_url": "https://steamcommunity.com/tradeoffer/new/?partner=123456789&token=AbCdEfGh",
"asset_ids": [
"41165110534",
"41165110599"
],
"min_total_usd": 60,
"external_id": "my-shop-order-1017",
"app_id": 730,
"split": true
}
'import requests
url = "https://csboard.com/v1/sell/orders"
payload = {
"trade_url": "https://steamcommunity.com/tradeoffer/new/?partner=123456789&token=AbCdEfGh",
"asset_ids": ["41165110534", "41165110599"],
"min_total_usd": 60,
"external_id": "my-shop-order-1017",
"app_id": 730,
"split": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
trade_url: 'https://steamcommunity.com/tradeoffer/new/?partner=123456789&token=AbCdEfGh',
asset_ids: ['41165110534', '41165110599'],
min_total_usd: 60,
external_id: 'my-shop-order-1017',
app_id: 730,
split: true
})
};
fetch('https://csboard.com/v1/sell/orders', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://csboard.com/v1/sell/orders",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'trade_url' => 'https://steamcommunity.com/tradeoffer/new/?partner=123456789&token=AbCdEfGh',
'asset_ids' => [
'41165110534',
'41165110599'
],
'min_total_usd' => 60,
'external_id' => 'my-shop-order-1017',
'app_id' => 730,
'split' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://csboard.com/v1/sell/orders"
payload := strings.NewReader("{\n \"trade_url\": \"https://steamcommunity.com/tradeoffer/new/?partner=123456789&token=AbCdEfGh\",\n \"asset_ids\": [\n \"41165110534\",\n \"41165110599\"\n ],\n \"min_total_usd\": 60,\n \"external_id\": \"my-shop-order-1017\",\n \"app_id\": 730,\n \"split\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://csboard.com/v1/sell/orders")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"trade_url\": \"https://steamcommunity.com/tradeoffer/new/?partner=123456789&token=AbCdEfGh\",\n \"asset_ids\": [\n \"41165110534\",\n \"41165110599\"\n ],\n \"min_total_usd\": 60,\n \"external_id\": \"my-shop-order-1017\",\n \"app_id\": 730,\n \"split\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://csboard.com/v1/sell/orders")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"trade_url\": \"https://steamcommunity.com/tradeoffer/new/?partner=123456789&token=AbCdEfGh\",\n \"asset_ids\": [\n \"41165110534\",\n \"41165110599\"\n ],\n \"min_total_usd\": 60,\n \"external_id\": \"my-shop-order-1017\",\n \"app_id\": 730,\n \"split\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"app_id": 123,
"status": "pending",
"currency": "USD",
"total_usd": 123,
"credited_usd": 123,
"created_at": "2023-11-07T05:31:56Z",
"trade_offer_ids": [
"<string>"
],
"offers": [
{
"offer_group": "<string>",
"trade_offer_id": "<string>",
"status": "pending",
"amount_usd": 123,
"expires_at": "2023-11-07T05:31:56Z",
"items": [
{
"asset_id": "<string>",
"market_hash_name": "<string>",
"price_usd": 123,
"status": "pending"
}
],
"bot": {
"name": "<string>",
"avatar": "<string>",
"steam_id": "<string>",
"profile_url": "<string>",
"level": 123
}
}
],
"external_id": "<string>",
"unhold_at": "2023-11-07T05:31:56Z",
"fail_reason": "<string>"
}{
"id": "cmgk2x9a10001qs01sell0001",
"external_id": "my-shop-order-1017",
"app_id": 730,
"status": "offer_sent",
"currency": "USD",
"total_usd": 61.42,
"credited_usd": 0,
"created_at": "2026-10-06T14:02:11Z",
"unhold_at": null,
"trade_offer_ids": [
"7654321098",
"7654321111"
],
"offers": [
{
"offer_group": "a",
"trade_offer_id": "7654321098",
"status": "offer_sent",
"amount_usd": 48.3,
"expires_at": "2026-10-06T14:17:11Z",
"items": [
{
"asset_id": "41165110534",
"market_hash_name": "AK-47 | Redline (Field-Tested)",
"price_usd": 48.3,
"status": "offer_sent"
}
],
"bot": {
"name": "CSBoard Bot #4",
"avatar": "https://avatars.steamstatic.com/abc_full.jpg",
"steam_id": "76561199000000004",
"profile_url": "https://steamcommunity.com/profiles/76561199000000004",
"level": 30
}
},
{
"offer_group": "b",
"trade_offer_id": "7654321111",
"status": "offer_sent",
"amount_usd": 13.12,
"expires_at": "2026-10-06T14:17:40Z",
"items": [
{
"asset_id": "41165110599",
"market_hash_name": "Glock-18 | Water Elemental (Minimal Wear)",
"price_usd": 13.12,
"status": "offer_sent"
}
],
"bot": {
"name": "CSBoard Bot #9",
"avatar": "https://avatars.steamstatic.com/def_full.jpg",
"steam_id": "76561199000000009",
"profile_url": "https://steamcommunity.com/profiles/76561199000000009",
"level": 24
}
}
],
"fail_reason": null
}{
"code": "invalid_request",
"detail": "asset_ids: Duplicate asset ids are not allowed"
}{
"code": "missing_api_key",
"detail": "Provide your API key via `Authorization: Bearer csb_pub_…`. Generate one at https://csboard.com/profile?tab=api"
}{
"code": "selling_not_enabled",
"detail": "Instant Sell API is granted per-account. Contact support@csboard.com to request access."
}{
"code": "price_drift",
"detail": "The live total dropped below your min_total_usd. Re-quote and retry.",
"current_total_usd": 57.9,
"min_total_usd": 60
}{
"code": "unsupported_game",
"detail": "app_id 570 is not open for instant sell on this key. Supported: 730, 252490.",
"supported_app_ids": [
730,
252490
]
}{
"code": "rate_limit_exceeded",
"detail": "Rate limit of 100 requests/min exceeded."
}{
"code": "sell_disabled",
"detail": "Instant Sell API is temporarily disabled."
}POST /v1/sell/quotes. A bot from the CSBoard network sends the seller a Steam trade offer, or several when split is true. Your balance is credited per offer, once that offer settles. See when the money arrives.
Authentication required. Send your key as Authorization: Bearer csb_pub_....
Selling capability required. Until Instant Sell is enabled for your key this answers 403 selling_not_enabled.
Idempotent. Send an Idempotency-Key header, or an external_id. A retry with the same value returns the original order with Idempotent-Replayed: true instead of selling twice.
Request body
730 CS2, 570 Dota 2, 252490 Rust. Must match the quote. Leave it out for CS2.true lets the sale ship as several trade offers, one per market.409 price_drift and nothing happens. Strongly recommended.GET /v1/sell/orders?external_id=.Response fields
201 with the sell order. The same object is returned by GET /v1/sell/orders/{id}, by the list endpoint and in the sell.updated webhook.
pending, offer_sent, received, completed, cancelled or failed. On a sale with several offers, read each offer’s own status too."USD".Show SellOffer object
Show SellOffer object
a, b and so on, in the order the offers were created. When you sell the whole quoted inventory it matches the quote’s offer_group.asset_id, market_hash_name, price_usd and status for each item. An item’s status is the status of its offer.name, avatar, steam_id, profile_url, level. Show it to the seller so they can check the incoming offer.cancelled_by_merchant, offer_declined, offer_expired, invalid_trade_url, item_not_tradable, reversed, price_drift or failed.Example request
curl -X POST https://csboard.com/v1/sell/orders \
-H "Authorization: Bearer csb_pub_..." \
-H "Content-Type: application/json" \
-H "Idempotency-Key: my-shop-order-1017" \
-d '{
"trade_url": "https://steamcommunity.com/tradeoffer/new/?partner=123456789&token=AbCdEfGh",
"asset_ids": ["41165110534", "41165110599"],
"app_id": 730,
"split": true,
"min_total_usd": 60.00,
"external_id": "my-shop-order-1017"
}'
Example response
{
"id": "cmgk2x9a10001qs01sell0001",
"external_id": "my-shop-order-1017",
"app_id": 730,
"status": "offer_sent",
"currency": "USD",
"total_usd": 61.42,
"credited_usd": 0,
"created_at": "2026-10-06T14:02:11Z",
"unhold_at": null,
"trade_offer_ids": ["7654321098", "7654321111"],
"offers": [
{
"offer_group": "a",
"trade_offer_id": "7654321098",
"status": "offer_sent",
"amount_usd": 48.3,
"expires_at": "2026-10-06T14:17:11Z",
"items": [
{ "asset_id": "41165110534", "market_hash_name": "AK-47 | Redline (Field-Tested)", "price_usd": 48.3, "status": "offer_sent" }
],
"bot": { "name": "CSBoard Bot #4", "avatar": "https://avatars.steamstatic.com/abc_full.jpg", "steam_id": "76561199000000004", "profile_url": "https://steamcommunity.com/profiles/76561199000000004", "level": 30 }
},
{
"offer_group": "b",
"trade_offer_id": "7654321111",
"status": "offer_sent",
"amount_usd": 13.12,
"expires_at": "2026-10-06T14:17:40Z",
"items": [
{ "asset_id": "41165110599", "market_hash_name": "Glock-18 | Water Elemental (Minimal Wear)", "price_usd": 13.12, "status": "offer_sent" }
],
"bot": { "name": "CSBoard Bot #9", "avatar": "https://avatars.steamstatic.com/def_full.jpg", "steam_id": "76561199000000009", "profile_url": "https://steamcommunity.com/profiles/76561199000000009", "level": 24 }
}
],
"fail_reason": null
}
Error codes
| HTTP status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | Malformed body: no asset_ids, duplicates, more than 250, or an app_id outside 730, 570, 252490. |
| 400 | invalid_trade_url | The trade URL does not resolve to a Steam account. |
| 400 | below_min_total | The order would book less than $1. |
| 403 | selling_not_enabled | Instant Sell is not enabled for this key. |
| 409 | price_drift | The total the order would book is below your min_total_usd. Includes current_total_usd and min_total_usd. Re-quote and retry. |
| 409 | item_not_in_inventory | An asset id has no live quote. Re-quote and retry. |
| 409 | no_eligible_items | None of the items can be sold right now. |
| 409 | item_not_tradable | The seller’s account has a Steam trade hold. |
| 409 | active_order_exists | This seller already has an open offer. Wait for it to finish or cancel it. |
| 409 | too_many_active_orders | Too many open sell orders on this key. |
| 409 | idempotency_in_progress | A request with this key is still processing. Retry after Retry-After. |
| 422 | unsupported_game | The game is not open for instant sell on this key. Includes supported_app_ids. |
| 429 | rate_limited | More than 5 orders per minute on this key. |
| 429 | daily_cap_exceeded | The daily sell volume cap for this key is reached. |
| 503 | sell_disabled | Instant Sell is switched off right now. |
Authorizations
Send your key as a Bearer token on every request: Authorization: Bearer csb_pub_.... Generate keys in your CSBoard profile.
Headers
Request-level replay protection. Falls back to external_id when absent.
Body
20 - 300Items to sell, from a quote of the same trade_url, app_id and split.
1 - 250 elementsYour floor for the total this order books. If the total the order would book is lower, it is refused with 409 price_drift and nothing happens.
Your id for the sale, unique per key. Sending it again returns the original order instead of creating a second one.
1 - 128Must match the quote. Leave it out for CS2.
730, 570, 252490 Must match the quote. true lets the sale ship as several trade offers.
Response
Replay of an order already created with this Idempotency-Key or external_id (Idempotent-Replayed: true).
Steam app of the sale: 730, 570 or 252490.
pending, offer_sent, received, completed, cancelled, failed USD What the whole order books, in USD.
What has already reached your balance. Grows offer by offer.
Every Steam trade offer the seller should expect. Offers that never went out are not listed.
Show child attributes
Show child attributes
Latest expected credit time across the offers, once known.
cancelled_by_merchant, offer_declined, offer_expired, invalid_trade_url, item_not_tradable, reversed, price_drift or failed.
curl --request POST \
--url https://csboard.com/v1/sell/orders \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"trade_url": "https://steamcommunity.com/tradeoffer/new/?partner=123456789&token=AbCdEfGh",
"asset_ids": [
"41165110534",
"41165110599"
],
"min_total_usd": 60,
"external_id": "my-shop-order-1017",
"app_id": 730,
"split": true
}
'import requests
url = "https://csboard.com/v1/sell/orders"
payload = {
"trade_url": "https://steamcommunity.com/tradeoffer/new/?partner=123456789&token=AbCdEfGh",
"asset_ids": ["41165110534", "41165110599"],
"min_total_usd": 60,
"external_id": "my-shop-order-1017",
"app_id": 730,
"split": True
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
trade_url: 'https://steamcommunity.com/tradeoffer/new/?partner=123456789&token=AbCdEfGh',
asset_ids: ['41165110534', '41165110599'],
min_total_usd: 60,
external_id: 'my-shop-order-1017',
app_id: 730,
split: true
})
};
fetch('https://csboard.com/v1/sell/orders', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://csboard.com/v1/sell/orders",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'trade_url' => 'https://steamcommunity.com/tradeoffer/new/?partner=123456789&token=AbCdEfGh',
'asset_ids' => [
'41165110534',
'41165110599'
],
'min_total_usd' => 60,
'external_id' => 'my-shop-order-1017',
'app_id' => 730,
'split' => true
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://csboard.com/v1/sell/orders"
payload := strings.NewReader("{\n \"trade_url\": \"https://steamcommunity.com/tradeoffer/new/?partner=123456789&token=AbCdEfGh\",\n \"asset_ids\": [\n \"41165110534\",\n \"41165110599\"\n ],\n \"min_total_usd\": 60,\n \"external_id\": \"my-shop-order-1017\",\n \"app_id\": 730,\n \"split\": true\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://csboard.com/v1/sell/orders")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"trade_url\": \"https://steamcommunity.com/tradeoffer/new/?partner=123456789&token=AbCdEfGh\",\n \"asset_ids\": [\n \"41165110534\",\n \"41165110599\"\n ],\n \"min_total_usd\": 60,\n \"external_id\": \"my-shop-order-1017\",\n \"app_id\": 730,\n \"split\": true\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://csboard.com/v1/sell/orders")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"trade_url\": \"https://steamcommunity.com/tradeoffer/new/?partner=123456789&token=AbCdEfGh\",\n \"asset_ids\": [\n \"41165110534\",\n \"41165110599\"\n ],\n \"min_total_usd\": 60,\n \"external_id\": \"my-shop-order-1017\",\n \"app_id\": 730,\n \"split\": true\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"app_id": 123,
"status": "pending",
"currency": "USD",
"total_usd": 123,
"credited_usd": 123,
"created_at": "2023-11-07T05:31:56Z",
"trade_offer_ids": [
"<string>"
],
"offers": [
{
"offer_group": "<string>",
"trade_offer_id": "<string>",
"status": "pending",
"amount_usd": 123,
"expires_at": "2023-11-07T05:31:56Z",
"items": [
{
"asset_id": "<string>",
"market_hash_name": "<string>",
"price_usd": 123,
"status": "pending"
}
],
"bot": {
"name": "<string>",
"avatar": "<string>",
"steam_id": "<string>",
"profile_url": "<string>",
"level": 123
}
}
],
"external_id": "<string>",
"unhold_at": "2023-11-07T05:31:56Z",
"fail_reason": "<string>"
}{
"id": "cmgk2x9a10001qs01sell0001",
"external_id": "my-shop-order-1017",
"app_id": 730,
"status": "offer_sent",
"currency": "USD",
"total_usd": 61.42,
"credited_usd": 0,
"created_at": "2026-10-06T14:02:11Z",
"unhold_at": null,
"trade_offer_ids": [
"7654321098",
"7654321111"
],
"offers": [
{
"offer_group": "a",
"trade_offer_id": "7654321098",
"status": "offer_sent",
"amount_usd": 48.3,
"expires_at": "2026-10-06T14:17:11Z",
"items": [
{
"asset_id": "41165110534",
"market_hash_name": "AK-47 | Redline (Field-Tested)",
"price_usd": 48.3,
"status": "offer_sent"
}
],
"bot": {
"name": "CSBoard Bot #4",
"avatar": "https://avatars.steamstatic.com/abc_full.jpg",
"steam_id": "76561199000000004",
"profile_url": "https://steamcommunity.com/profiles/76561199000000004",
"level": 30
}
},
{
"offer_group": "b",
"trade_offer_id": "7654321111",
"status": "offer_sent",
"amount_usd": 13.12,
"expires_at": "2026-10-06T14:17:40Z",
"items": [
{
"asset_id": "41165110599",
"market_hash_name": "Glock-18 | Water Elemental (Minimal Wear)",
"price_usd": 13.12,
"status": "offer_sent"
}
],
"bot": {
"name": "CSBoard Bot #9",
"avatar": "https://avatars.steamstatic.com/def_full.jpg",
"steam_id": "76561199000000009",
"profile_url": "https://steamcommunity.com/profiles/76561199000000009",
"level": 24
}
}
],
"fail_reason": null
}{
"code": "invalid_request",
"detail": "asset_ids: Duplicate asset ids are not allowed"
}{
"code": "missing_api_key",
"detail": "Provide your API key via `Authorization: Bearer csb_pub_…`. Generate one at https://csboard.com/profile?tab=api"
}{
"code": "selling_not_enabled",
"detail": "Instant Sell API is granted per-account. Contact support@csboard.com to request access."
}{
"code": "price_drift",
"detail": "The live total dropped below your min_total_usd. Re-quote and retry.",
"current_total_usd": 57.9,
"min_total_usd": 60
}{
"code": "unsupported_game",
"detail": "app_id 570 is not open for instant sell on this key. Supported: 730, 252490.",
"supported_app_ids": [
730,
252490
]
}{
"code": "rate_limit_exceeded",
"detail": "Rate limit of 100 requests/min exceeded."
}{
"code": "sell_disabled",
"detail": "Instant Sell API is temporarily disabled."
}