# API Skins

> CS2 (Counter-Strike 2) skin prices from 20 marketplaces in one table and one API, and trading robots that keep your DMarket and Market.CSGO offers the cheapest and buy orders the highest, within limits you set.

- Prices: the lowest listing of every CS2 item on CSFloat, Buff.163, YouPin898, DMarket, Skinport, cs.money, Market.CSGO, Buff.Market, Waxpeer, Lis-skins, SkinBaron, HaloSkins, White.Market, ShadowPay, GamerPay, CS.Deals, avan.market, SKINFLOW, SkinOut, SKINS; checked every hour, in USD.
- API: https://api.apiskins.com, key in the `X-API-KEY` header. Sign in with Steam and get a key on https://apiskins.com/api-docs.
- Subscriptions: Free $0/month (100 price requests/month, 60 requests/minute, 1 account(s) per robot); Trader $10/month (5000 price requests/month, 120 requests/minute, 5 account(s) per robot); Pro $30/month (25000 price requests/month, 300 requests/minute, 100 account(s) per robot); Business $100/month (100000 price requests/month, 300 requests/minute, 1000 account(s) per robot). Paid from the account balance, topped up in crypto.

## Docs

- [API docs](https://apiskins.com/api-docs): every route with examples in curl, TypeScript, JavaScript and Python
- [OpenAPI](https://apiskins.com/openapi.json): the API as an OpenAPI 3.1 document
- [For AI agents](https://apiskins.com/ai-agents): how to let an agent use the API
- [Full text](https://apiskins.com/llms-full.txt): the API reference and every blog post in one file

## Pages

- [Skin prices](https://apiskins.com/prices): every item on every marketplace, cheapest highlighted
- [Trading robots](https://apiskins.com/robots): DMarket and Market.CSGO undercutters
- [Subscriptions](https://apiskins.com/subscriptions): plans and limits

## Blog

- [CS2 trading bots: how they work and which ones to use on DMarket and Market.CSGO](https://apiskins.com/blog/cs2-trading-bots): What CS2 trading bots actually do, what to look for before giving one your API key, and how our DMarket and Market.CSGO bots keep your offers and buy orders first.
- [What is your CS2 inventory really worth?](https://apiskins.com/blog/cs2-inventory-value): Why inventory value trackers disagree, which price to trust, and how to find what your skins sell for on each marketplace.
- [CS2 skin price API: getting prices from every marketplace into your code](https://apiskins.com/blog/cs2-skin-price-api): How to fetch the lowest listing of any CS2 skin on 20 marketplaces with one HTTP request, with examples in curl, TypeScript and Python.
- [How a DMarket undercutting bot works (and when it should stop)](https://apiskins.com/blog/dmarket-undercutting-bot): What undercutting is, why doing it by hand loses money, and how a bot keeps your DMarket offers first in line without selling below your floor.
- [Buy orders: how to buy CS2 skins below the lowest listing](https://apiskins.com/blog/buy-skins-below-lowest-listing): Why buy orders get you skins cheaper than the lowest listing, how to pick a price, and how to keep your order on top.
- [Comparing CS2 skin prices across 20 marketplaces](https://apiskins.com/blog/compare-cs2-skin-prices): Why the same skin costs a different amount on CSFloat, Buff163, DMarket and Skinport, and how to find the cheapest place to buy and the best place to sell.

## Optional

- [Terms](https://apiskins.com/terms)
- [Privacy](https://apiskins.com/privacy)

## API reference

Base URL https://api.apiskins.com. Every request needs the `X-API-KEY` header. Errors answer `{ "error": "..." }` with 400 (bad request), 401 (bad key), 404 (not found), 409 (over limits or not possible now), 429 (rate or monthly limit, see `Retry-After`) or 502 (the marketplace did not answer).

### GET /v1/prices

Prices of many items

The lowest listing of items on each marketplace. Name up to 100 items with market_hash_name for a batch, or leave it out for every listed item. An item no marketplace lists is left out of the answer.

- `market_hash_name` (query, string): An item's name. Repeat it for a batch of up to 100. Every listed item when left out
- `providers` (query, string): Comma separated marketplaces (see Marketplaces). All of them when left out

A marketplace that does not list an item is left out of its prices.

changed_at is when the price last changed, checked_at when we last confirmed it.

Answers 200:

```json
[
  {
    "market_hash_name": "AK-47 | Redline (Field-Tested)",
    "prices": [
      {
        "provider": "buff_163",
        "price": 31.42,
        "changed_at": "2026-10-15T09:40:00.000Z",
        "checked_at": "2026-10-15T10:10:00.000Z"
      },
      {
        "provider": "cs_float",
        "price": 33.1,
        "changed_at": "2026-10-15T08:50:00.000Z",
        "checked_at": "2026-10-15T10:10:00.000Z"
      }
    ]
  }
]
```

### GET /v1/prices/{market_hash_name}

Prices of one item

The lowest listing of one item on each marketplace. 404 when no marketplace lists it.

- `market_hash_name` (path, string, required): The item's name, URL-encoded
- `providers` (query, string): Comma separated marketplaces (see Marketplaces). All of them when left out

Answers 200:

```json
{
  "market_hash_name": "AK-47 | Redline (Field-Tested)",
  "prices": [
    {
      "provider": "buff_163",
      "price": 31.42,
      "changed_at": "2026-10-15T09:40:00.000Z",
      "checked_at": "2026-10-15T10:10:00.000Z"
    },
    {
      "provider": "cs_float",
      "price": 33.1,
      "changed_at": "2026-10-15T08:50:00.000Z",
      "checked_at": "2026-10-15T10:10:00.000Z"
    }
  ]
}
```

### GET /v1/robots/dmarket

Accounts and limits

Your DMarket accounts on the robot (connected with their DMarket API keys on the robot's page), and your subscription's limits for it.

A limit of null means no limit of ours.

paused: the account is over your subscription's accounts; its offers and orders wait.

Answers 200:

```json
{
  "robot": "dmarket",
  "name": "DMarket undercutter",
  "marketplace": "DMarket",
  "limits": {
    "accounts": 5,
    "offers_per_account": null,
    "orders_per_account": 100
  },
  "accounts": [
    {
      "id": "6f1c2e0a-41d2-4a8e-9a8c-1f5b2d7e9c11",
      "name": "Main",
      "paused": false,
      "balance": 123.45,
      "note": null,
      "error": null,
      "checked_at": "2026-10-15T08:40:00.000Z"
    }
  ]
}
```

### GET /v1/robots/dmarket/accounts/{account_id}/inventory

An account's inventory

The items in the account's DMarket inventory, with the asset_id to sell each by. sellable is false for items DMarket does not let you list.

- `account_id` (path, string, required): The account's id, from GET /v1/robots/dmarket

Answers 200:

```json
[
  {
    "asset_id": "4c1d8e2f-0b6a-4a51-9f3e-2d7c8b1a6e05",
    "market_hash_name": "AK-47 | Redline (Field-Tested)",
    "sellable": true,
    "suggested_price": 33.1
  }
]
```

### GET /v1/robots/dmarket/offers

List offers

Your offers on DMarket, on all your accounts, oldest first.

Answers 200:

```json
[
  {
    "id": "b3a90c55-7e1f-4c1b-8d2e-55a1c9e04f7a",
    "account_id": "6f1c2e0a-41d2-4a8e-9a8c-1f5b2d7e9c11",
    "asset_id": "4c1d8e2f-0b6a-4a51-9f3e-2d7c8b1a6e05",
    "market_hash_name": "AK-47 | Redline (Field-Tested)",
    "min_price": 30,
    "max_price": 40,
    "price": 31.99,
    "competitor_price": 32,
    "status": "active",
    "error": null,
    "updated_at": "2026-10-15T08:40:00.000Z",
    "created_at": "2026-10-14T12:00:00.000Z"
  }
]
```

### POST /v1/robots/dmarket/offers

Sell an item

The robot lists the item on DMarket and keeps it the cheapest offer of its name, never under min_price. With no one to undercut it sells at max_price.

- `account_id` (body, string, required): The account that owns the item
- `asset_id` (body, string, required): The item's DMarket id, from the account's inventory
- `market_hash_name` (body, string, required): The item's name
- `min_price` (body, number, required): USD, at most two decimals
- `max_price` (body, number, required): USD, at most two decimals

Answers 201:

```json
{
  "id": "b3a90c55-7e1f-4c1b-8d2e-55a1c9e04f7a",
  "account_id": "6f1c2e0a-41d2-4a8e-9a8c-1f5b2d7e9c11",
  "asset_id": "4c1d8e2f-0b6a-4a51-9f3e-2d7c8b1a6e05",
  "market_hash_name": "AK-47 | Redline (Field-Tested)",
  "min_price": 30,
  "max_price": 40,
  "price": null,
  "competitor_price": null,
  "status": "pending",
  "error": null,
  "updated_at": null,
  "created_at": "2026-10-14T12:00:00.000Z"
}
```

### PATCH /v1/robots/dmarket/offers/{offer_id}

Change an offer

New limits apply within seconds, or once the price unlocks: a price the robot changed stays for 15 minutes.

- `offer_id` (path, string, required): The offer's id
- `min_price` (body, number): USD
- `max_price` (body, number): USD

Answers 200:

```json
{
  "id": "b3a90c55-7e1f-4c1b-8d2e-55a1c9e04f7a",
  "account_id": "6f1c2e0a-41d2-4a8e-9a8c-1f5b2d7e9c11",
  "asset_id": "4c1d8e2f-0b6a-4a51-9f3e-2d7c8b1a6e05",
  "market_hash_name": "AK-47 | Redline (Field-Tested)",
  "min_price": 30,
  "max_price": 39.5,
  "price": 31.99,
  "competitor_price": 32,
  "status": "active",
  "error": null,
  "updated_at": "2026-10-15T08:40:00.000Z",
  "created_at": "2026-10-14T12:00:00.000Z"
}
```

### DELETE /v1/robots/dmarket/offers/{offer_id}

Remove an offer

Takes the item off sale on DMarket and forgets the offer. One already gone there is simply forgotten.

- `offer_id` (path, string, required): The offer's id

Answers 200:

```json
{
  "removed": true
}
```

### GET /v1/robots/dmarket/orders

List orders

Your buy orders on DMarket, on all your accounts, oldest first.

Answers 200:

```json
[
  {
    "id": "0d7e4b2c-91aa-4f63-b2e8-7c35e1d8a904",
    "account_id": "6f1c2e0a-41d2-4a8e-9a8c-1f5b2d7e9c11",
    "market_hash_name": "AK-47 | Redline (Field-Tested)",
    "amount": 2,
    "min_price": 25,
    "max_price": 30,
    "price": 28.51,
    "competitor_price": 28.5,
    "status": "active",
    "placed": true,
    "error": null,
    "updated_at": "2026-10-15T08:40:00.000Z",
    "created_at": "2026-10-14T12:00:00.000Z"
  }
]
```

### POST /v1/robots/dmarket/orders

Buy an item

The robot places a DMarket buy order (a "target") and keeps it the highest, never over max_price. With no one to outbid it bids min_price. DMarket allows up to 100 orders per account.

- `account_id` (body, string, required): The account to buy with
- `market_hash_name` (body, string, required): The item's name
- `amount` (body, number, required): How many to buy, 1 to 100
- `min_price` (body, number, required): USD, at most two decimals
- `max_price` (body, number, required): USD, at most two decimals

Answers 201:

```json
{
  "id": "0d7e4b2c-91aa-4f63-b2e8-7c35e1d8a904",
  "account_id": "6f1c2e0a-41d2-4a8e-9a8c-1f5b2d7e9c11",
  "market_hash_name": "AK-47 | Redline (Field-Tested)",
  "amount": 2,
  "min_price": 25,
  "max_price": 30,
  "price": null,
  "competitor_price": null,
  "status": "pending",
  "placed": false,
  "error": null,
  "updated_at": null,
  "created_at": "2026-10-14T12:00:00.000Z"
}
```

### PATCH /v1/robots/dmarket/orders/{order_id}

Change an order

New limits, and a new amount while the order is not placed yet. DMarket cannot change an order's price: each new price is a new target, made in place of the old one. A placed order's amount only goes down as it fills: remove it and add it again to buy more.

- `order_id` (path, string, required): The order's id
- `min_price` (body, number): USD
- `max_price` (body, number): USD
- `amount` (body, number): Only before the order is placed

Answers 200:

```json
{
  "id": "0d7e4b2c-91aa-4f63-b2e8-7c35e1d8a904",
  "account_id": "6f1c2e0a-41d2-4a8e-9a8c-1f5b2d7e9c11",
  "market_hash_name": "AK-47 | Redline (Field-Tested)",
  "amount": 2,
  "min_price": 26,
  "max_price": 31,
  "price": 28.51,
  "competitor_price": 28.5,
  "status": "active",
  "placed": true,
  "error": null,
  "updated_at": "2026-10-15T08:40:00.000Z",
  "created_at": "2026-10-14T12:00:00.000Z"
}
```

### DELETE /v1/robots/dmarket/orders/{order_id}

Remove an order

Removes the order from DMarket and forgets it. One already gone there is simply forgotten.

- `order_id` (path, string, required): The order's id

Answers 200:

```json
{
  "removed": true
}
```

### GET /v1/robots/market-csgo

Accounts and limits

Your Market.CSGO accounts on the robot (connected with their Market.CSGO API keys on the robot's page), and your subscription's limits for it. An account's note says what stands in the way of selling, e.g. being offline.

A limit of null means no limit of ours.

paused: the account is over your subscription's accounts; its offers and orders wait.

Answers 200:

```json
{
  "robot": "market-csgo",
  "name": "Market.CSGO undercutter",
  "marketplace": "Market.CSGO",
  "limits": {
    "accounts": 5,
    "offers_per_account": null,
    "orders_per_account": 100
  },
  "accounts": [
    {
      "id": "6f1c2e0a-41d2-4a8e-9a8c-1f5b2d7e9c11",
      "name": "Main",
      "paused": false,
      "balance": 123.45,
      "note": null,
      "error": null,
      "checked_at": "2026-10-15T08:40:00.000Z"
    }
  ]
}
```

### GET /v1/robots/market-csgo/accounts/{account_id}/inventory

An account's inventory

The Steam items Market.CSGO can sell from the account, with the asset_id to sell each by.

- `account_id` (path, string, required): The account's id, from GET /v1/robots/market-csgo

Answers 200:

```json
[
  {
    "asset_id": "38215462179",
    "market_hash_name": "AK-47 | Redline (Field-Tested)",
    "sellable": true,
    "suggested_price": 33.1
  }
]
```

### GET /v1/robots/market-csgo/offers

List offers

Your offers on Market.CSGO, on all your accounts, oldest first.

Answers 200:

```json
[
  {
    "id": "b3a90c55-7e1f-4c1b-8d2e-55a1c9e04f7a",
    "account_id": "6f1c2e0a-41d2-4a8e-9a8c-1f5b2d7e9c11",
    "asset_id": "38215462179",
    "market_hash_name": "AK-47 | Redline (Field-Tested)",
    "min_price": 30,
    "max_price": 40,
    "price": 31.99,
    "competitor_price": 32,
    "status": "active",
    "error": null,
    "updated_at": "2026-10-15T08:40:00.000Z",
    "created_at": "2026-10-14T12:00:00.000Z"
  }
]
```

### POST /v1/robots/market-csgo/offers

Sell an item

The robot puts the item up for sale on Market.CSGO and keeps it the cheapest offer of its name, never under min_price. With no one to undercut it sells at max_price. Offers only show while the account is online in Market.CSGO's app or browser extension.

- `account_id` (body, string, required): The account that owns the item
- `asset_id` (body, string, required): The item's Steam asset id, from the account's inventory
- `market_hash_name` (body, string, required): The item's name
- `min_price` (body, number, required): USD, at most two decimals
- `max_price` (body, number, required): USD, at most two decimals

Answers 201:

```json
{
  "id": "b3a90c55-7e1f-4c1b-8d2e-55a1c9e04f7a",
  "account_id": "6f1c2e0a-41d2-4a8e-9a8c-1f5b2d7e9c11",
  "asset_id": "38215462179",
  "market_hash_name": "AK-47 | Redline (Field-Tested)",
  "min_price": 30,
  "max_price": 40,
  "price": null,
  "competitor_price": null,
  "status": "pending",
  "error": null,
  "updated_at": null,
  "created_at": "2026-10-14T12:00:00.000Z"
}
```

### PATCH /v1/robots/market-csgo/offers/{offer_id}

Change an offer

New limits apply within seconds, or once the price unlocks: a price the robot changed stays for 15 minutes.

- `offer_id` (path, string, required): The offer's id
- `min_price` (body, number): USD
- `max_price` (body, number): USD

Answers 200:

```json
{
  "id": "b3a90c55-7e1f-4c1b-8d2e-55a1c9e04f7a",
  "account_id": "6f1c2e0a-41d2-4a8e-9a8c-1f5b2d7e9c11",
  "asset_id": "38215462179",
  "market_hash_name": "AK-47 | Redline (Field-Tested)",
  "min_price": 30,
  "max_price": 39.5,
  "price": 31.99,
  "competitor_price": 32,
  "status": "active",
  "error": null,
  "updated_at": "2026-10-15T08:40:00.000Z",
  "created_at": "2026-10-14T12:00:00.000Z"
}
```

### DELETE /v1/robots/market-csgo/offers/{offer_id}

Remove an offer

Takes the item off sale on Market.CSGO and forgets the offer. One already gone there is simply forgotten.

- `offer_id` (path, string, required): The offer's id

Answers 200:

```json
{
  "removed": true
}
```

### GET /v1/robots/market-csgo/orders

List orders

Your buy orders on Market.CSGO, on all your accounts, oldest first.

Answers 200:

```json
[
  {
    "id": "0d7e4b2c-91aa-4f63-b2e8-7c35e1d8a904",
    "account_id": "6f1c2e0a-41d2-4a8e-9a8c-1f5b2d7e9c11",
    "market_hash_name": "AK-47 | Redline (Field-Tested)",
    "amount": 2,
    "min_price": 25,
    "max_price": 30,
    "price": 28.51,
    "competitor_price": 28.5,
    "status": "active",
    "placed": true,
    "error": null,
    "updated_at": "2026-10-15T08:40:00.000Z",
    "created_at": "2026-10-14T12:00:00.000Z"
  }
]
```

### POST /v1/robots/market-csgo/orders

Buy an item

The robot places a Market.CSGO buy order and keeps it the highest, never over max_price. With no one to outbid it bids min_price. Market.CSGO allows one order per item and up to 100 orders per account.

- `account_id` (body, string, required): The account to buy with
- `market_hash_name` (body, string, required): The item's name
- `amount` (body, number, required): How many to buy, 1 to 100
- `min_price` (body, number, required): USD, at most two decimals
- `max_price` (body, number, required): USD, at most two decimals

Answers 201:

```json
{
  "id": "0d7e4b2c-91aa-4f63-b2e8-7c35e1d8a904",
  "account_id": "6f1c2e0a-41d2-4a8e-9a8c-1f5b2d7e9c11",
  "market_hash_name": "AK-47 | Redline (Field-Tested)",
  "amount": 2,
  "min_price": 25,
  "max_price": 30,
  "price": null,
  "competitor_price": null,
  "status": "pending",
  "placed": false,
  "error": null,
  "updated_at": null,
  "created_at": "2026-10-14T12:00:00.000Z"
}
```

### PATCH /v1/robots/market-csgo/orders/{order_id}

Change an order

New limits, and a new amount while the order is not placed yet. Market.CSGO changes the order's price in place. A placed order's amount only goes down as it fills: remove it and add it again to buy more.

- `order_id` (path, string, required): The order's id
- `min_price` (body, number): USD
- `max_price` (body, number): USD
- `amount` (body, number): Only before the order is placed

Answers 200:

```json
{
  "id": "0d7e4b2c-91aa-4f63-b2e8-7c35e1d8a904",
  "account_id": "6f1c2e0a-41d2-4a8e-9a8c-1f5b2d7e9c11",
  "market_hash_name": "AK-47 | Redline (Field-Tested)",
  "amount": 2,
  "min_price": 26,
  "max_price": 31,
  "price": 28.51,
  "competitor_price": 28.5,
  "status": "active",
  "placed": true,
  "error": null,
  "updated_at": "2026-10-15T08:40:00.000Z",
  "created_at": "2026-10-14T12:00:00.000Z"
}
```

### DELETE /v1/robots/market-csgo/orders/{order_id}

Remove an order

Removes the order from Market.CSGO and forgets it. One already gone there is simply forgotten.

- `order_id` (path, string, required): The order's id

Answers 200:

```json
{
  "removed": true
}
```

## Blog posts

### CS2 trading bots: how they work and which ones to use on DMarket and Market.CSGO

https://apiskins.com/blog/cs2-trading-bots, 2026-10-16

Most CS2 skins are sold by whoever is cheapest at the moment a buyer looks. On big marketplaces that moment changes every few seconds, and the traders who win it are rarely sitting at a keyboard: they run trading bots. This guide explains what those bots do, the risks, and how to run one on DMarket and Market.CSGO.

#### What a CS2 trading bot does

"Trading bot" covers a few different tools. The ones worth knowing:

- Undercutting bots keep your sale offers the cheapest of their item, a step under the competition, and never under the floor price you set.
- Buy order bots keep your buy orders the highest, a step over the competition, and never over your ceiling.
- Arbitrage bots buy where an item is cheap and sell where it is priced higher. They need prices from many marketplaces at once, which is what a price API is for.
- Trade bots accept and send Steam trade offers automatically. They need your Steam login and are the riskiest kind.

Undercutting and buy order bots are the easiest place to start: they work through the marketplace's own API, never touch your Steam account, and only ever trade inside the limits you give them.

#### What to check before you trust a bot

- It uses the marketplace's official API key, never your password or Steam Guard codes.
- The key is stored encrypted and is never shown again, not even to you, so a leaked page or screenshot cannot give it away.
- Every offer and order has a hard minimum and maximum the bot cannot cross, whatever competitors do.
- It ignores your own other listings, so two of your accounts never undercut each other.
- It does not hammer the marketplace: changing a price every second gets keys rate limited or deleted.

#### DMarket bot

Our DMarket undercut bot connects with your DMarket API key. You pick items from your DMarket inventory and give each a minimum and maximum price; the bot checks the market every second and keeps your offer the cheapest of its item, or sells at your maximum when nobody competes.

For buying, it places DMarket buy orders (DMarket calls them targets) and keeps each one the highest, never over your ceiling. DMarket allows up to 100 targets per account and cannot change a target's price, so the bot replaces it with a new one at the new price.

#### Market.CSGO bot

The Market.CSGO undercut bot works the same way with your Market.CSGO API key: it lists items from your Steam inventory, keeps them the cheapest offer of their name, and keeps your buy orders on top. Market.CSGO changes an order's price in place and allows one order per item, up to 100 per account.

Two things specific to Market.CSGO: the account's currency must be USD, and your offers only show to buyers while you are online in Market.CSGO's app or browser extension. The bot shows a note on the account when something like that stands in the way.

#### How the bots price

- Prices always come live from the marketplace's API, never from a stale copy.
- When a competitor is cheaper, the offer goes one step under it; when the competitor leaves, it moves back up.
- A price the bot changed stays for 15 minutes, so neither the marketplace nor your competitors see a flood of updates. A price that is still right keeps being watched every second.
- Offers end as sold, or closed when you take an item off sale or it leaves the inventory.

#### Many accounts, and your own code

Each bot can run on several accounts at once, and items or accounts over your plan's limits simply pause until you upgrade. Everything you can do on the robot's page you can also do from your own scripts through the robots API, with the same key as the price API, or hand it to an AI agent.

#### Getting started

Sign in with Steam, open the robots page and connect a DMarket or Market.CSGO account. The free plan runs one offer and one order on one account, enough to watch it work. The Trader subscription gives each bot five accounts with as many offers and orders as the marketplace allows.

### What is your CS2 inventory really worth?

https://apiskins.com/blog/cs2-inventory-value, 2026-10-14

Ask three inventory calculators what your CS2 inventory is worth and you will get three different numbers. None of them is lying: each one prices your skins on a different marketplace, at a different moment, with a different idea of what "price" means.

#### Which price is the right one

There are three prices worth knowing for every skin:

- The lowest listing: the cheapest copy anyone is selling right now. It is what you compete with when you sell.
- The highest buy order: what someone has already promised to pay. It is what you get if you sell this minute.
- The last sale: what it actually went for, which may be hours or days old for rare items.

For valuing an inventory, the lowest listing is the most useful: it is close to what an item sells for when you list it, and it updates as fast as the market does. The Steam Community Market price is the one most people quote, but money there can only be spent on Steam, so traders who want cash look at third-party marketplaces.

#### The same skin, a different price on every marketplace

The same AK-47 can easily be 10–20% apart between marketplaces. Each one has its own buyers, fees and payout methods. Buff163 and Youpin are driven by the Chinese market, CSFloat by collectors who care about float and pattern, DMarket and Market.CSGO by fast traders. Our prices table shows the lowest listing of every skin on 20 marketplaces side by side, with the cheapest one highlighted.

#### Selling each skin where it sells best

An inventory is worth the most when every item is sold where it is priced highest, not when everything is dumped on one site. Look each item up on the prices table, which shows its lowest listing on every marketplace side by side, or pull the whole market from the price API and let a script pick the best marketplace for every item.

#### Things that lower what you can get

- Trade holds: items you just received cannot be moved for a while, so they cannot be sold on most marketplaces yet.
- Liquidity: a rare sticker combo may be "worth" a lot, but if nobody buys it this month, that number is a guess.
- Fees and withdrawal costs: each marketplace takes a cut, and getting money out costs something too.
- Outliers: one silly listing at ten times the price should not count. We leave out prices far from what the other marketplaces say.

### CS2 skin price API: getting prices from every marketplace into your code

https://apiskins.com/blog/cs2-skin-price-api, 2026-10-10

If you run a trading bot, a Discord bot, a skin shop or a spreadsheet, sooner or later you need prices from more than one marketplace. Scraping each one is slow, breaks often and gets you blocked. A price API gives you all of them in one answer.

#### One request, every marketplace

The API Skins price API returns the lowest listing of an item on each of 20 marketplaces, checked every hour. Get a key on the API docs page after signing in with Steam, then send it in the X-API-KEY header:

```
curl -H "X-API-KEY: ask_..." \
  "https://api.apiskins.com/v1/prices/AK-47%20%7C%20Redline%20(Field-Tested)"
```

The answer lists every marketplace that sells the item, with its price in USD and when that price last changed:

```
{
  "market_hash_name": "AK-47 | Redline (Field-Tested)",
  "prices": [
    { "provider": "buff_163", "price": 31.42, "changed_at": "...", "checked_at": "..." },
    { "provider": "cs_float", "price": 33.1, "changed_at": "...", "checked_at": "..." }
  ]
}
```

#### Batches and the whole market

Name up to 100 items by repeating market_hash_name, or leave it out to get every listed item at once. Add providers=cs_float,buff_163 to get only the marketplaces you care about. Each request counts once toward your monthly limit, however many items it returns, so one full download an hour is the cheapest way to keep a local copy of the market.

```
const response = await fetch("https://api.apiskins.com/v1/prices?providers=cs_float,buff_163", {
    headers: { "X-API-KEY": process.env.API_SKINS_KEY! },
});

const items: { market_hash_name: string; prices: { provider: string; price: number }[] }[] = await response.json();
```

#### Limits

The free plan includes 100 price requests a month, enough to try it out. Paid subscriptions go up to 100,000 a month. Every request also counts toward a per-minute rate limit; over it, the API answers 429 with a Retry-After header. A machine-readable description of every route is at /openapi.json.

### How a DMarket undercutting bot works (and when it should stop)

https://apiskins.com/blog/dmarket-undercutting-bot, 2026-10-06

On a busy marketplace the cheapest offer sells first. Undercutting means listing just below it, by a cent, so yours is the one buyers see. Everyone else does the same, so prices tick down all day and an offer that was first an hour ago is now tenth.

#### Why doing it by hand does not work

Checking a dozen listings every few minutes is a full-time job, and the moment you sleep someone else takes first place. Worse, people who undercut by hand tend to chase the price down, past what they meant to accept.

#### What a good bot does

- Watches the competing offers for your item every second, and ignores your own other listings so you never undercut yourself.
- Undercuts by one step when someone is cheaper, and moves back up when the cheaper offer is gone.
- Never goes below the minimum price you set, and sells at your maximum when nobody competes.
- Does not change the price every second: a price it changed stays for a while, so the marketplace and your competitors do not see a flood of updates.

#### Buy orders work the same way, upside down

For buying, the highest order fills first. The bot outbids the best competing order by a step, never above your ceiling, and bids your minimum when nobody else is buying. On DMarket these orders are called targets, and an account can hold up to 100 of them.

#### Trying it

Our DMarket undercutter does all of the above with your own DMarket API key, which is stored encrypted and never shown again. The free plan runs one offer and one order, enough to see it work. The same robot exists for Market.CSGO, and both can be driven from your own code through the API.

### Buy orders: how to buy CS2 skins below the lowest listing

https://apiskins.com/blog/buy-skins-below-lowest-listing, 2026-10-02

Buying the lowest listing is the fast way to get a skin. A buy order is the cheap way: you say what you will pay, and a seller who wants cash now sells to you instead of waiting for a buyer at the listing price.

#### Why sellers accept less

Not everyone wants to wait. Traders cashing out, people who need balance for something else, and bots clearing inventory all sell into the highest buy order. The gap between the highest order and the lowest listing is the spread, and buying at the bottom of it is how traders make their margin.

#### Picking a price

- Check the lowest listing on several marketplaces first, on the prices table. If another site sells it for less than your order, buy there.
- Look at the current highest order. Bidding one step above it puts you first.
- Set a ceiling you will not cross, and stick to it. Orders fill when the market dips, so patience is the whole point.

#### Staying first in line

Other buyers will outbid you, sometimes minutes after you place your order. A robot can watch the orders for you and move yours up a step at a time, never over your ceiling. Our robots do this on DMarket and Market.CSGO.

### Comparing CS2 skin prices across 20 marketplaces

https://apiskins.com/blog/compare-cs2-skin-prices, 2026-09-28

Skins are the same items everywhere: an AWP | Asiimov (Field-Tested) on Buff163 is the same AWP on CSFloat. Yet their prices are rarely the same, and the difference is often bigger than the fees.

#### Why prices differ

- Different buyers: some marketplaces are mostly Chinese, some Russian-speaking, some Western, and each crowd values items differently.
- Different money: balance on some sites can only be withdrawn at a discount or not at all, so prices there run higher.
- Different fees for sellers, which sellers pass on in their prices.
- Different speed: on a quiet marketplace, old listings stay up long after the price moved elsewhere.

#### How to compare quickly

The prices table shows the lowest listing of every item on 20 marketplaces, refreshed every hour. Tick the marketplaces you can use, search for an item, and the cheapest one is highlighted. Sort by most popular to see the items that sell the most.

#### Buy low, sell high, across sites

The simplest trade is buying where an item is cheapest and selling where it is priced highest. Account for both marketplaces' fees, the cost of moving money between them, and any trade hold, which keeps you from reselling right away. For anything at scale, pull the numbers from the price API instead of reading them off a page.
