Market Data
GET /v1/public/prices — Keyless Min-Ask Feed for CS2, Dota 2 and Rust
One cheapest price per item name, for CS2, Dota 2 or Rust. No API key, no balance requirement — limited to one request per minute per 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
}The public price feed answers one question: what is the cheapest ask on CSBoard for each item, right now? You get a single object that maps every
market_hash_name on sale in one game to its minimum price in USD. There is no depth, no listing count, no wear split and no paging.
No API key required. Send no Authorization header and no balance is needed. That makes it the endpoint for price-comparison sites, spreadsheets and scrapers that only need one number per name.
What you get
- One game per request.
appId=730is CS2 (the default),570is Dota 2,252490is Rust. - Steam’s own names. CS2 Doppler and Gamma Doppler phases are merged into the base name Steam uses, so
Karambit | Doppler (Factory New)carries the price of its cheapest phase. Every key matches a real Steammarket_hash_name. - Sorted keys, prices rounded to the cent. Only names with at least one listing on sale appear.
updatedAtis when the payload was built.
Limits and freshness
The feed is rebuilt at most once a minute and served withCache-Control: public, max-age=60. Requests are limited to 1 per minute per IP address. Polling faster cannot get you newer data — it only gets you a 429 with a Retry-After header.
The
429 here comes from the per-IP limiter, not the per-key one, so its body is { "error": "...", "statusCode": 429 } and has no code field. Branch on the HTTP status and wait Retry-After seconds.Example request
curl "https://csboard.com/v1/public/prices?appId=730"
Example response
{
"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
}
}
Error codes
| HTTP status | Code | Meaning |
|---|---|---|
| 400 | invalid_param | The appId is not one of the games we serve. detail lists the ones you can use. |
| 429 | — | More than one request this minute from your IP. Wait for the Retry-After header value. |
Need wear and phase splits, listing counts, filters or paging? Use the keyed
GET /v1/prices. Need the exact listing to buy? Use GET /v1/listings — this feed is indicative and can be up to a minute old.Query Parameters
Game to price: 730 = CS2 (the default), 570 = Dota 2, 252490 = Rust. A game that is not available answers 400 invalid_param.
Available options:
730, 570, 252490 Response
Name → min-ask map for the game.
The game these prices are for.
Example:
730
Available options:
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
}