POST /v1/market/buy — Buy and Deliver to a Steam Trade URL
Buy up to 100 items and deliver them straight to any Steam trade URL you supply, paid from your settled balance. Built for wholesale and automated delivery.
curl --request POST \
--url https://csboard.com/v1/market/buy \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"item_ids": [
"itm_8841201",
"itm_8841340"
],
"partner": "447383001",
"token": "Ab3xZ9Qp",
"max_price_usd": 30,
"custom_id": "batch-2026-06-29-01",
"skip_unavailable": false
}
'import requests
url = "https://csboard.com/v1/market/buy"
payload = {
"item_ids": ["itm_8841201", "itm_8841340"],
"partner": "447383001",
"token": "Ab3xZ9Qp",
"max_price_usd": 30,
"custom_id": "batch-2026-06-29-01",
"skip_unavailable": False
}
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({
item_ids: ['itm_8841201', 'itm_8841340'],
partner: '447383001',
token: 'Ab3xZ9Qp',
max_price_usd: 30,
custom_id: 'batch-2026-06-29-01',
skip_unavailable: false
})
};
fetch('https://csboard.com/v1/market/buy', 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/market/buy",
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([
'item_ids' => [
'itm_8841201',
'itm_8841340'
],
'partner' => '447383001',
'token' => 'Ab3xZ9Qp',
'max_price_usd' => 30,
'custom_id' => 'batch-2026-06-29-01',
'skip_unavailable' => false
]),
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/market/buy"
payload := strings.NewReader("{\n \"item_ids\": [\n \"itm_8841201\",\n \"itm_8841340\"\n ],\n \"partner\": \"447383001\",\n \"token\": \"Ab3xZ9Qp\",\n \"max_price_usd\": 30,\n \"custom_id\": \"batch-2026-06-29-01\",\n \"skip_unavailable\": false\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/market/buy")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"item_ids\": [\n \"itm_8841201\",\n \"itm_8841340\"\n ],\n \"partner\": \"447383001\",\n \"token\": \"Ab3xZ9Qp\",\n \"max_price_usd\": 30,\n \"custom_id\": \"batch-2026-06-29-01\",\n \"skip_unavailable\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://csboard.com/v1/market/buy")
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 \"item_ids\": [\n \"itm_8841201\",\n \"itm_8841340\"\n ],\n \"partner\": \"447383001\",\n \"token\": \"Ab3xZ9Qp\",\n \"max_price_usd\": 30,\n \"custom_id\": \"batch-2026-06-29-01\",\n \"skip_unavailable\": false\n}"
response = http.request(request)
puts response.read_body{
"data": {
"purchase_id": "pur_01J9Z3K8Q2",
"steam_id": "76561198000000000",
"created_at": "2026-06-29T17:12:04Z",
"custom_id": "batch-2026-06-29-01",
"skins": [
{
"name": "AK-47 | Redline (Minimal Wear)",
"price": 14.37,
"status": "delivering",
"return_reason": null,
"steam_trade_offer_id": "5512345678"
}
]
}
}partner and token fields. Purchases are funded only from your settled (reversal-safe) balance, making it suitable for wholesale volume and automated delivery workflows.
The endpoint is idempotent via the custom_id body field: retrying with the same custom_id replays the original purchase rather than buying twice, and the replayed response carries the header Idempotent-Replayed: true.
403 external_buy_disabled.Authorization: Bearer csb_pub_....
Trading capability required. Buying must be enabled for the key, and the account must be reversal-clean.
Request body
partner value (1–32 chars). Together with token, forms the destination trade URL items are delivered to.token value (1–32 chars). Together with partner, forms the destination trade URL.price_moved and nothing is charged. Strongly recommended.custom_id replays the original purchase; the replay response carries Idempotent-Replayed: true.true, skip items that are no longer available instead of failing the whole request.item_ids belong to: 730 CS2 (the default), 570 Dota 2, 252490 Rust. Send the same appId you read the ids with from GET /v1/listings. Dota 2 and Rust take up to 10 ids per order and are queued, so every skin answers pending first.Response fields
Example request
curl -X POST https://csboard.com/v1/market/buy \
-H "Authorization: Bearer csb_pub_..." \
-H "Content-Type: application/json" \
-d '{
"item_ids": ["itm_8841201", "itm_8841340"],
"partner": "447383001",
"token": "Ab3xZ9Qp",
"max_price_usd": 30.00,
"custom_id": "batch-2026-06-29-01",
"skip_unavailable": false
}'
Example response
{
"data": {
"purchase_id": "pur_01J9Z3K8Q2",
"steam_id": "76561198000000000",
"created_at": "2026-06-29T17:12:04Z",
"custom_id": "batch-2026-06-29-01",
"skins": [
{
"name": "AK-47 | Redline (Minimal Wear)",
"price": 14.37,
"status": "delivering",
"return_reason": null,
"steam_trade_offer_id": "5512345678"
}
]
}
}
Error codes
| HTTP status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | Malformed body (e.g. item_ids empty or over 100). |
| 400 | unsupported_item | One or more items cannot be delivered via this endpoint (e.g. ss_live_* ids). |
| 400 | invalid_trade_url | partner + token do not form a valid Steam trade URL. |
| 400 | unsupported_game | The appId is not available to this key. Includes supported_app_ids. |
| 400 | too_many_items | More than 10 Dota 2 or Rust ids in one order. Includes max_items. |
| 401 | invalid_api_key | Missing or invalid API key. |
| 402 | insufficient_settled_balance | Settled balance below the order total. Includes required_usd and settled_usd. |
| 402 | insufficient_balance | Balance below the order total. |
| 403 | external_buy_disabled | Kill-switch is off; the endpoint is currently disabled. |
| 403 | trading_not_enabled | Buying is not enabled for this key. |
| 403 | account_restricted | The endpoint requires a reversal-clean account. |
| 409 | item_unavailable | One or more items are no longer available. Includes unavailable_ids[]. |
| 409 | price_moved | Live total exceeded the ceiling. Includes quoted_max_usd, current_total_usd, and items[]. |
| 409 | idempotency_in_progress | A request with this custom_id is still being processed. |
| 409 | price_updating | Prices are refreshing; retry shortly. |
| 429 | rate_limit_exceeded | Too many requests. Back off for the Retry-After header value. |
| 500 | order_failed | The purchase could not be completed. |
settled_balance_usd on GET /v1/balance before a large batch, and always send max_price_usd as overcharge protection.Authorizations
Send your key as a Bearer token on every request: Authorization: Bearer csb_pub_.... Generate keys in your CSBoard profile.
Body
1–100 unique listing ids to buy.
1 - 100 elementsSteam trade URL partner value. With token, forms the destination trade URL.
1 - 32Steam trade URL token value. With partner, forms the destination trade URL.
1 - 32Total ceiling in USD. Order is rejected with price_moved if the live total exceeds it.
Idempotency key. A retry with the same value replays the original purchase.
1 - 128If true, skip items that are no longer available instead of failing the whole request.
Sticky per-account setting (not per-order). Send true once to switch your key into auto-claim mode: every held order is then auto-released the moment its hold clears (your bot must auto-accept the Steam trade offer within ~15 minutes). Send false to switch back to manual claiming via POST /orders/{id}/claim. Omit to leave the setting unchanged.
Game the item_ids belong to: 730 = CS2 (the default), 570 = Dota 2, 252490 = Rust. Send the same appId you read the ids with from GET /listings. Dota 2 and Rust take up to 10 ids per order. A game this key may not buy in answers 400 unsupported_game — tradable in GET /games tells you in advance.
730, 570, 252490 Response
Purchase accepted and debited from settled balance.
Show child attributes
Show child attributes
curl --request POST \
--url https://csboard.com/v1/market/buy \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"item_ids": [
"itm_8841201",
"itm_8841340"
],
"partner": "447383001",
"token": "Ab3xZ9Qp",
"max_price_usd": 30,
"custom_id": "batch-2026-06-29-01",
"skip_unavailable": false
}
'import requests
url = "https://csboard.com/v1/market/buy"
payload = {
"item_ids": ["itm_8841201", "itm_8841340"],
"partner": "447383001",
"token": "Ab3xZ9Qp",
"max_price_usd": 30,
"custom_id": "batch-2026-06-29-01",
"skip_unavailable": False
}
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({
item_ids: ['itm_8841201', 'itm_8841340'],
partner: '447383001',
token: 'Ab3xZ9Qp',
max_price_usd: 30,
custom_id: 'batch-2026-06-29-01',
skip_unavailable: false
})
};
fetch('https://csboard.com/v1/market/buy', 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/market/buy",
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([
'item_ids' => [
'itm_8841201',
'itm_8841340'
],
'partner' => '447383001',
'token' => 'Ab3xZ9Qp',
'max_price_usd' => 30,
'custom_id' => 'batch-2026-06-29-01',
'skip_unavailable' => false
]),
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/market/buy"
payload := strings.NewReader("{\n \"item_ids\": [\n \"itm_8841201\",\n \"itm_8841340\"\n ],\n \"partner\": \"447383001\",\n \"token\": \"Ab3xZ9Qp\",\n \"max_price_usd\": 30,\n \"custom_id\": \"batch-2026-06-29-01\",\n \"skip_unavailable\": false\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/market/buy")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"item_ids\": [\n \"itm_8841201\",\n \"itm_8841340\"\n ],\n \"partner\": \"447383001\",\n \"token\": \"Ab3xZ9Qp\",\n \"max_price_usd\": 30,\n \"custom_id\": \"batch-2026-06-29-01\",\n \"skip_unavailable\": false\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://csboard.com/v1/market/buy")
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 \"item_ids\": [\n \"itm_8841201\",\n \"itm_8841340\"\n ],\n \"partner\": \"447383001\",\n \"token\": \"Ab3xZ9Qp\",\n \"max_price_usd\": 30,\n \"custom_id\": \"batch-2026-06-29-01\",\n \"skip_unavailable\": false\n}"
response = http.request(request)
puts response.read_body{
"data": {
"purchase_id": "pur_01J9Z3K8Q2",
"steam_id": "76561198000000000",
"created_at": "2026-06-29T17:12:04Z",
"custom_id": "batch-2026-06-29-01",
"skins": [
{
"name": "AK-47 | Redline (Minimal Wear)",
"price": 14.37,
"status": "delivering",
"return_reason": null,
"steam_trade_offer_id": "5512345678"
}
]
}
}