product

CS2 price API

Skintick is a REST API for Counter-Strike 2 skin prices. One endpoint returns the live price of any CS2 or CS:GO item across 16 marketplaces — P2P markets, aggregate feeds and instant-trade sites — normalized onto a single schema, in USD, keyed by Steam's canonical market_hash_name.

Every row carries explicit freshness, outlier and confidence metadata, so your code can tell a real ask from a sticker-inflated listing before it reaches your pricing logic. A free key takes seconds and needs no card.

example responseAK-47 | Redline (FT)
marketpriceconf
Waxpeerp2p$28.18high
Skinportp2p$28.94high
Buff163p2p$27.61high
Steamofficial$37.95mediumwallet funds
Tradeit.gginstant_bot$50.25lowconvenience premium
same item · 78% spread across 5 venues · the flags are why you can tell which number is real

Your first call

Sign up, copy your key, and ask for any item by name. No SDK required — it is plain HTTP and JSON in whatever language you already use.

curl
curl "https://api.skintick.io/v1/items/AK-47%20%7C%20Redline%20(Field-Tested)" \
  -H "Authorization: Bearer skt_your_key"
JavaScript
const res = await fetch(
  "https://api.skintick.io/v1/prices/latest",
  {
    method: "POST",
    headers: {
      Authorization: "Bearer skt_your_key",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      items: ["AK-47 | Redline (Field-Tested)", "Glove Case"],
    }),
  },
);
const { data } = await res.json();
Python
import requests

r = requests.post(
    "https://api.skintick.io/v1/prices/latest",
    headers={"Authorization": "Bearer skt_your_key"},
    json={"items": ["AK-47 | Redline (Field-Tested)", "Glove Case"]},
    timeout=15,
)
for item in r.json()["data"]:
    cheapest = min(item["prices"], key=lambda p: float(p["price"]))
    print(item["market_hash_name"], cheapest["market"], cheapest["price"])
Go
req, _ := http.NewRequest(
    http.MethodGet,
    "https://api.skintick.io/v1/items/"+url.PathEscape(name),
    nil,
)
req.Header.Set("Authorization", "Bearer skt_your_key")
resp, err := http.DefaultClient.Do(req)

What comes back

One row per marketplace. Prices are decimal strings so they never round-trip through a float, and the metadata is on the row itself rather than buried in a separate call.

{
  "market_hash_name": "AK-47 | Redline (Field-Tested)",
  "prices": [
    {
      "market": "waxpeer",
      "market_type": "p2p",
      "price_basis": "lowest_ask",
      "price": "28.18",
      "currency": "USD",
      "listings_count": 1426,
      "collected_at": "2026-08-24T09:41:22Z",
      "staleness_seconds": 137,
      "is_stale": false,
      "is_outlier": false,
      "confidence": "high"
    },
    {
      "market": "tradeit",
      "market_type": "instant_bot",
      "price_basis": "lowest_ask",
      "price": "50.25",
      "currency": "USD",
      "listings_count": 1,
      "is_outlier": false,
      "confidence": "low"
    }
  ]
}

One pricing contract

Every source returns the same row shape, keyed by Steam's canonical market_hash_name. Integrate once and every marketplace — 16 live today — arrives through the same JSON schema, prices as decimal strings in USD.

Freshness you can enforce

Every price row carries collected_at, source_updated_at, staleness seconds, and an is_stale flag. Your code decides what "fresh enough" means — the API never hides data age.

Outlier + confidence flags

Cross-market median consensus flags rows that deviate 3× from the pack (sticker-inflated listings, variant aliasing), and listing depth drives a per-row confidence tier — so bad prices never silently poison your spread math.

Honest market typing

Instant-trade bot inventories price convenience into their asks. Skintick labels every row with market_type and price_basis so bot premiums, aggregate minimums, and true lowest asks are never confused.

Endpoints

POST/v1/prices/latestbatch latest prices across markets
GET/v1/items/{name}one item, every market's current price
GET/v1/items/{name}/historydaily per-market history
GET/v1/spreadscross-market spread routes with fees + lock risk
GET/v1/marketsmarketplace metadata, fees, trade locks
GET/v1/statuspublic data freshness per market

Common questions

Is there a free CS2 price API?

Yes. Skintick's free tier gives you a key with no card: 100 requests a day, every marketplace we track, live prices plus the last 7 days of history. It is meant for building and evaluating an integration, and it does not expire.

How do I get CS2 skin prices in JSON?

Request an item by its Steam market_hash_name and you get one JSON row per marketplace: GET /v1/items/AK-47%20%7C%20Redline%20(Field-Tested). For many items at once, POST up to 100 names to /v1/prices/latest and get them all back in a single response.

Which marketplaces does the API cover?

16 live marketplaces including Skinport, DMarket, Bitskins, Waxpeer, TM Market (market.csgo.com), Lis-Skins, White.market, Tradeit, Loot.farm, Skinout, Skins.com and Skinswap — P2P markets, aggregate feeds and instant-trade sites, all normalized to the same schema and currency.

Does it work for CS:GO item prices too?

Yes — CS:GO and CS2 are the same Steam app and the same items, so every price is keyed by the canonical Steam market_hash_name. Anything you looked up as a CS:GO skin resolves identically.

How current are the prices?

Fast sources refresh roughly every 5 minutes and the slowest on the hour. You never have to guess: every row carries collected_at, source_updated_at, a staleness figure in seconds, and an is_stale flag, so your own code decides what counts as fresh enough.

Can I get historical CS2 price data?

Yes. GET /v1/items/{name}/history returns daily closes per marketplace. Free keys can query the last 7 days; paid keys get the full depth we hold.

How is this different from checking prices on the marketplaces myself?

One integration instead of a dozen, one schema instead of a dozen shapes, one currency, and one set of flags telling you which prices to trust. Mispriced and sticker-inflated listings arrive already marked as outliers, and instant-trade sites are labelled so their convenience premium is never mistaken for spot price.

Ready to go live?

Free API key, no card. Full docs. First call in minutes.

Get a free API key