v4.0 — order-book depth, sales and history on the ultimate tier

SteamAnalyst API

CS2 and Dota 2 item prices: Steam averages, our manipulation-resistant fair price, and the lowest ask on 24 markets.

2 Games supported
71k+ Items priced (41k CS2, 30k Dota 2)
24 Markets compared
30 min Catalogue refresh, 5 min for markets
20+ venues Order-book depth on /v4

Four tiers, one key

Every tier includes everything below it. Start free, move up when you need the full catalogue or the market comparison.

Free
$0
Free
  • One CS2 item per request: GET /v1/prices
  • Our cross-market fair price in USD
  • 100 requests per 24 h, 30 per minute
  • Name suggestions on a miss
  • No credit card
Enterprise
$100 / month
Markets
  • Everything in Basic
  • Lowest ask on 24 markets for every CS2 item: GET /v3/markets
  • BUFF, CSFloat, Skinport, DMarket, CS.MONEY, Tradeit, Bitskins and more
  • Refreshed every 5 minutes
  • 300 requests per minute
Ultimate
$250 / month
Depth
  • Everything in Enterprise
  • GET /v4/depth/{name}: best bid and ask with counts on 20+ venues, incl. Steam and the Chinese markets
  • Daily sales volume, price history back to 2023 (OHLC), listing counts with deep links
  • Market indices and BUFF float-range price bands
  • 600 requests per minute, priority support
EndpointWhat you getFreeBasicEnterpriseUltimate
GET /v1/prices?market_name=One item, fair price in USD✓✓✓✓
GET /v1/prices/allEvery CS2 item, 7-day Steam average (4 MB)—✓✓✓
GET /v2/{game}Full catalogue: averages, volume, Steam price, fair price (25 MB, 4 MB gzipped)—✓✓✓
GET /v2/{game}/{market_name}Extended record: identity, per-wear averages, BUFF and CSFloat asks—✓✓✓
GET /v3/marketsLowest ask on 24 markets, every CS2 item——✓✓
GET /v4/depth/{market_name}Best bid/ask + counts per venue (USD books, Steam, BUFF, Chinese venues)———✓
GET /v4/depth · /v4/listingsBulk: every item's books / listing counts, ETag + 304———✓
GET /v4/sales/{market_name}Daily sold counts and average price, CN trades and turnover———✓
GET /v4/history/{market_name}Fair price, BUFF ask/bid and CN OHLC per day, back to 2023———✓
GET /v4/listings/{market_name}Price, quantity and deep link per market———✓
GET /v4/index · /v4/float-bands/{market_name}Market indices with history; BUFF float-range ladder———✓
Rate limitper minute, per key30120300600
Daily caprolling 24 h100———

Up and running in minutes

Authentication uses a standard Bearer token passed in every request header.

1

Get your API key

Sign up at steamanalyst.com and generate a key from your account dashboard.

Get Key →
2

Add the Authorization header

Pass your key as a Bearer token on every request.

Authorization: Bearer YOUR_API_KEY
3

Call an endpoint

Query the prices endpoint with any item's market_name.

GET https://api.steamanalyst.com/v1/prices
4

Read the envelope

Every answer is success + data, or an error with a code, a message and, for a 403 or 404, what to do next. Full reference →

{ "success": false, "error": { "code": "INSUFFICIENT_TIER", "required_tier": "basic", "your_tier": "free", "upgrade_url": "https://www.steamanalyst.com/developers#upgrade" } }

Make your first request

Query AK-47 | Redline (Field-Tested) across three languages.

Request
# Query a single item by market_name curl -G https://api.steamanalyst.com/v1/prices \ -H "Authorization: Bearer YOUR_API_KEY" \ --data-urlencode "market_name=AK-47 | Redline (Field-Tested)"
Response
{ "success": true, "data": { "market_name": "AK-47 | Redline (Field-Tested)", "price": 28.93 } }
Request
import requests API_KEY = "YOUR_API_KEY" BASE_URL = "https://api.steamanalyst.com/v1" headers = { "Authorization": f"Bearer {API_KEY}" } params = { "market_name": "AK-47 | Redline (Field-Tested)" } r = requests.get( f"{BASE_URL}/prices", headers=headers, params=params ) print(r.json())
Response
{ "success": True, "data": { "market_name": "AK-47 | Redline (Field-Tested)", "price": 28.93 } }
Request
const API_KEY = "YOUR_API_KEY"; const item = "AK-47 | Redline (Field-Tested)"; const url = new URL( "https://api.steamanalyst.com/v1/prices" ); url.searchParams.set("market_name", item); const res = await fetch(url, { headers: { "Authorization": `Bearer ${API_KEY}` } }); const data = await res.json(); console.log(data);
Response
{ success: true, data: { market_name: "AK-47 | Redline (Field-Tested)", price: 28.93 } }
Request — poll the full catalogue without re-downloading it
# First pull: keep the ETag from the response headers (basic tier or above) curl -sD headers.txt --compressed \ -H "Authorization: Bearer YOUR_API_KEY" \ https://api.steamanalyst.com/v2/csgo -o csgo.json # Every later poll: send it back. Unchanged catalogue = 304, no body, no 25 MB. curl -s -o /dev/null -w "%{http_code}\n" --compressed \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "If-None-Match: $(grep -i '^etag' headers.txt | cut -d' ' -f2-)" \ https://api.steamanalyst.com/v2/csgo
Response headers on the first pull
HTTP/1.1 200 OK ETag: "39242167e55f16551b1ad8f26c7658cd" Last-Modified: Thu, 10 Sep 2026 00:16:42 GMT Cache-Control: private, max-age=600 Content-Encoding: gzip X-RateLimit-Remaining: 119 # and on every poll after that, until the 30-minute regeneration: HTTP/1.1 304 Not Modified

Supported games

Pass the game identifier as a path parameter.

🔫
Counter-Strike 2 game=csgo
🛡️
Dota 2 game=dota2