Market Data
GET /v1/games — Games You Can Pass as appId
List the games your key can read with appId — CS2, Dota 2 and Rust — and whether it can also buy in each one.
GET
/
games
Games you can pass as appId
curl --request GET \
--url https://csboard.com/v1/games \
--header 'Authorization: Bearer <token>'import requests
url = "https://csboard.com/v1/games"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://csboard.com/v1/games', 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/games",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://csboard.com/v1/games"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://csboard.com/v1/games")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://csboard.com/v1/games")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"games": [
{
"appId": 730,
"name": "CS2",
"tradable": true
},
{
"appId": 570,
"name": "Dota 2",
"tradable": true
},
{
"appId": 252490,
"name": "Rust",
"tradable": true
}
]
}{
"code": "missing_api_key",
"detail": "Provide your API key via `Authorization: Bearer csb_pub_…`. Generate one at https://csboard.com/profile?tab=api"
}{
"code": "rate_limit_exceeded",
"detail": "Rate limit of 100 requests/min exceeded."
}CSBoard sells CS2, Dota 2 and Rust items. You choose the game with the
A game with Where
Leave
On
appId parameter, using Steam’s own appIds: 730 for CS2, 570 for Dota 2, 252490 for Rust. This endpoint lists the games your key can use and, for each one, whether it can buy there too (tradable).
Authentication required. Send your key as Authorization: Bearer csb_pub_.... No balance is needed, so you can check this before you fund the account.
Example request
curl https://csboard.com/v1/games \
-H "Authorization: Bearer csb_pub_..."
Example response
{
"games": [
{ "appId": 730, "name": "CS2", "tradable": true },
{ "appId": 570, "name": "Dota 2", "tradable": true },
{ "appId": 252490, "name": "Rust", "tradable": true }
]
}
tradable: false can be read through the market data endpoints but not bought yet.
Where appId works
| Endpoint | How to pass it |
|---|---|
GET /v1/listings | Query parameter appId |
GET /v1/prices | Query parameter appId |
GET /v1/listings/availability | Query parameter appId |
POST /v1/orders | Body field appId |
POST /v1/market/buy | Body field appId |
GET /v1/public/prices | Query parameter appId (no key needed) |
appId out and every endpoint answers for CS2, exactly as it did before the parameter existed.
What changes for Dota 2 and Rust
- Same response shape. Dota 2 and Rust rows have the same keys as CS2 rows, so one parser reads all three. The CS2-only fields —
wear,doppler_phase,float_value,paint_seed,inspect_link,tradable_at,listed_at— arenull, andstickersis[]. - CS2-only filters are refused, not ignored. Sending
wear,min_float,max_float,stat_trak,souvenir,available_afterorsort=newestwith a Dota 2 or RustappIdanswers400 invalid_param. OnGET /v1/pricesonlywearis CS2-only. - Orders are queued. A Dota 2 or Rust order answers
delivery: "pending"andexpected_minutes: null. Follow it withGET /v1/orders/{id}. - Ids belong to their game. Buy and check ids under the same
appIdyou read them with.
appId: GET /v1/listings/stream and GET /v1/prices/snapshot.ndjson.gz.
Error codes
AnappId your key cannot use — unknown, switched off, or not open to you — answers 400 unsupported_game. The body lists what you can use:
{
"code": "unsupported_game",
"detail": "appId 440 is not available to this key. Supported: 730 (CS2), 570 (Dota 2), 252490 (Rust).",
"supported_app_ids": [730, 570, 252490]
}
POST /v1/orders, supported_app_ids lists the games you can buy in.
| HTTP status | Code | Meaning |
|---|---|---|
| 401 | missing_api_key / invalid_api_key | Missing or invalid API key. |
| 429 | rate_limit_exceeded | Over your key’s per-minute limit. Wait for the Retry-After header value. |
⌘I
Games you can pass as appId
curl --request GET \
--url https://csboard.com/v1/games \
--header 'Authorization: Bearer <token>'import requests
url = "https://csboard.com/v1/games"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://csboard.com/v1/games', 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/games",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://csboard.com/v1/games"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://csboard.com/v1/games")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://csboard.com/v1/games")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"games": [
{
"appId": 730,
"name": "CS2",
"tradable": true
},
{
"appId": 570,
"name": "Dota 2",
"tradable": true
},
{
"appId": 252490,
"name": "Rust",
"tradable": true
}
]
}{
"code": "missing_api_key",
"detail": "Provide your API key via `Authorization: Bearer csb_pub_…`. Generate one at https://csboard.com/profile?tab=api"
}{
"code": "rate_limit_exceeded",
"detail": "Rate limit of 100 requests/min exceeded."
}