Рыночные данные
GET /v1/public/prices — фид минимальных цен без ключа для CS2, Dota 2 и Rust
Одна минимальная цена на каждое название предмета в CS2, Dota 2 или Rust. Без API-ключа и без требований к балансу — один запрос в минуту с одного IP.
GET
/
public
/
prices
Keyless min-ask feed
curl --request GET \
--url https://csboard.com/v1/public/pricesimport requests
url = "https://csboard.com/v1/public/prices"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://csboard.com/v1/public/prices', 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/public/prices",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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/public/prices"
req, _ := http.NewRequest("GET", url, nil)
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/public/prices")
.asString();require 'uri'
require 'net/http'
url = URI("https://csboard.com/v1/public/prices")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"appId": 730,
"currency": "USD",
"updatedAt": "2026-10-02T12:00:41.512Z",
"items": {
"AK-47 | Redline (Field-Tested)": 11.92,
"AWP | Asiimov (Field-Tested)": 96.4,
"Karambit | Doppler (Factory New)": 812.5
}
}{
"code": "invalid_param",
"detail": "appId \"440\" is not available. Use one of: 730, 570, 252490."
}{
"error": "Rate limit exceeded, retry in 37 seconds",
"statusCode": 429
}Публичный фид цен отвечает на один вопрос: какая сейчас самая дешёвая цена на CSBoard для каждого предмета? В ответе — один объект, где каждому
market_hash_name, выставленному на продажу в выбранной игре, сопоставлена его минимальная цена в USD. Ни глубины стакана, ни количества листингов, ни разбивки по износу, ни пагинации.
API-ключ не нужен. Не отправляйте заголовок Authorization, баланс тоже не требуется. Это эндпоинт для сайтов сравнения цен, таблиц и парсеров, которым нужно одно число на название.
Что вы получаете
- Одна игра на запрос.
appId=730— CS2 (по умолчанию),570— Dota 2,252490— Rust. - Названия как в Steam. Фазы CS2 Doppler и Gamma Doppler объединены под базовым названием, которое использует Steam, поэтому
Karambit | Doppler (Factory New)получает цену самой дешёвой фазы. Каждый ключ совпадает с реальнымmarket_hash_nameв Steam. - Ключи отсортированы, цены округлены до цента. В фид попадают только названия, у которых есть хотя бы один листинг в продаже.
updatedAt— момент, когда ответ был собран.
Лимиты и свежесть
Фид пересобирается не чаще раза в минуту и отдаётся сCache-Control: public, max-age=60. Лимит — 1 запрос в минуту с одного IP-адреса. Более частый опрос не даст свежих данных — только 429 с заголовком Retry-After.
429 здесь выдаёт лимитер по IP, а не по ключу, поэтому тело ответа — { "error": "...", "statusCode": 429 }, без поля code. Ориентируйтесь на HTTP-статус и ждите Retry-After секунд.Пример запроса
curl "https://csboard.com/v1/public/prices?appId=730"
Пример ответа
{
"appId": 730,
"currency": "USD",
"updatedAt": "2026-10-02T12:00:41.512Z",
"items": {
"AK-47 | Redline (Field-Tested)": 11.92,
"AWP | Asiimov (Field-Tested)": 96.4,
"Karambit | Doppler (Factory New)": 812.5
}
}
Коды ошибок
| HTTP-статус | Код | Значение |
|---|---|---|
| 400 | invalid_param | appId не входит в число игр, которые мы обслуживаем. В detail перечислены доступные. |
| 429 | — | Больше одного запроса за минуту с вашего IP. Подождите время, указанное в заголовке Retry-After. |
Нужны разбивка по износу и фазам, количество листингов, фильтры или пагинация? Используйте
GET /v1/prices с ключом. Нужен конкретный листинг для покупки? Используйте GET /v1/listings — этот фид индикативный и может отставать до минуты.Параметры запроса
Game to price: 730 = CS2 (the default), 570 = Dota 2, 252490 = Rust. A game that is not available answers 400 invalid_param.
Доступные опции:
730, 570, 252490 Ответ
Name → min-ask map for the game.
The game these prices are for.
Пример:
730
Доступные опции:
USD When this payload was built. It is rebuilt at most once a minute.
market_hash_name → the cheapest current ask in USD, rounded to the cent. Keys are sorted. Only names with at least one listing on sale appear. CS2 Doppler and Gamma Doppler phases are merged into Steam's base name and carry the cheapest phase.
Show child attributes
Show child attributes
⌘I
Keyless min-ask feed
curl --request GET \
--url https://csboard.com/v1/public/pricesimport requests
url = "https://csboard.com/v1/public/prices"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://csboard.com/v1/public/prices', 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/public/prices",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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/public/prices"
req, _ := http.NewRequest("GET", url, nil)
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/public/prices")
.asString();require 'uri'
require 'net/http'
url = URI("https://csboard.com/v1/public/prices")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"appId": 730,
"currency": "USD",
"updatedAt": "2026-10-02T12:00:41.512Z",
"items": {
"AK-47 | Redline (Field-Tested)": 11.92,
"AWP | Asiimov (Field-Tested)": 96.4,
"Karambit | Doppler (Factory New)": 812.5
}
}{
"code": "invalid_param",
"detail": "appId \"440\" is not available. Use one of: 730, 570, 252490."
}{
"error": "Rate limit exceeded, retry in 37 seconds",
"statusCode": 429
}