API Skins
JSONCS2 sales API

What CS2 skins actually sold for

Every item's sales on DMarket and Market.CSGO: how many, the median and average price over 7, 15, 30 and 90 days, and how much it typically sells in 15 days. Real sales, not asking prices.

Paid plans from $14.99 / 30 days · sign in with Steam

Live answer

Sales, not listings.

This is what the API answers right now, from the sales we record on both marketplaces. A listing says what a seller hopes for; a sale says what a buyer paid.

0

periods: 7, 15, 30 and 90 days

0

marketplaces, side by side

0

days of history per item

0 d

typical volume, in items and dollars

Routes

One item, many, or all of them

Asked and answered like the price API, with the same key, and providers to keep only DMarket or Market.CSGO.

One item

An item's sales on each marketplace over the four periods, with its 15-day volume.

GET /v1/sales/summary/{market_hash_name}

A batch

Repeat market_hash_name for several items, to check a whole inventory's liquidity at once.

GET /v1/sales/summary?market_hash_name=…

Every item at once

Every item sold in the last 90 days, streamed and gzipped.

GET /v1/sales/summary

Five minutes to the first answer

Plain HTTP. No SDK to learn.

  1. 1Sign in with Steam and pick a paid plan.
  2. 2Copy your key from the API docs page.
  3. 3Send it in the X-API-KEY header and read the JSON.
type SalesPeriod = { sales: number; median: number | null; avg: number | null };

type SalesSummary = {
    market_hash_name: string;
    sales: {
        provider: string;
        last_7d: SalesPeriod;
        last_15d: SalesPeriod;
        last_30d: SalesPeriod;
        last_90d: SalesPeriod;
        index_volume_units: number;
        index_volume_dollars: number;
        updated_at: string;
    }[];
};

const API_KEY = process.env.APISKINS_API_KEY!;
const market_hash_name = "AK-47 | Redline (Field-Tested)";

const response = await fetch(`https://api.apiskins.com/v1/sales/summary/${encodeURIComponent(market_hash_name)}`, {
    headers: { "X-API-KEY": API_KEY },
});

if (!response.ok) {
    throw new Error(`API Skins answered ${response.status}: ${(await response.json()).error}`);
}

const sales: SalesSummary = await response.json();

Built with it

What people build on sales data

Liquidity filters

Trade only what sells: keep items that typically sell dozens of times in 15 days, and skip the ones that sit.

Fair value

Price an item from what it sold for, the median of the last 30 or 90 days, not from one lucky listing.

Trends

Compare the 7-day median with the 90-day one to see which items are rising or falling.

Market research

See how much money moves through each item and marketplace, and where the volume is.

Limits

Included in every paid plan

Compare plans

Free

Free

  • 100 requests / 30 days
  • 60 requests / minute
  • Not included

Trader

$14.99 / 30 days

  • 5,000 requests / 30 days
  • 120 requests / minute
  • Included

Pro

$49.99 / 30 days

  • 25,000 requests / 30 days
  • 300 requests / minute
  • Included

Business

$119.99 / 30 days

  • 100,000 requests / 30 days
  • 300 requests / minute
  • Included

Questions

What people ask about the sales API

From DMarket and Market.CSGO, the marketplaces whose sales we record, item by item, pass after pass. Each sale is counted once.
How much an item typically sells in 15 days: the last 90 days cut into six stretches of 15, and the median of their sales and dollars, so one busy week does not count for much. The arbitrage tool puts the most sold items first by it.
It is the summary of it: count, median and average for each period, per marketplace, which is what most tools need. For listings, use the price API; for what you can sell for now, the buy order API.
Yes: price, buy order, sales and item requests share the plan's 30-day limit and per-minute rate. The sales API is on every paid plan.

Trade what really sells.

Every item's sales and volume, one key. The same key runs the price, buy order and item APIs too.