API Skins

API

API docs

Prices of every CS2 skin on 20 marketplaces, and your trading robots, from your own code. One key for both.

Getting started

Every request goes to https://api.apiskins.com and needs your key in the X-API-KEY header. Answers are JSON; prices are USD.

A request that fails answers with an HTTP status and { "error": "..." } (see Limits and errors).

The whole API is also an OpenAPI document, for code generators and AI agents.

Prices

The lowest listing of each item on every marketplace we track, checked every hour.

Prices of many items

GET/v1/prices

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.

Parameters

market_hash_namequery, optional

stringAn item's name. Repeat it for a batch of up to 100. Every listed item when left out

providersquery, optional

stringComma separated marketplaces (see Marketplaces). All of them when left out

Request

type ItemPrices = {
    market_hash_name: string;
    prices: { provider: string; price: number; changed_at: string; checked_at: string }[];
};

const API_KEY = process.env.APISKINS_API_KEY!;

const params = new URLSearchParams([
    ["market_hash_name", "AK-47 | Redline (Field-Tested)"],
    ["market_hash_name", "AWP | Asiimov (Field-Tested)"],
    ["providers", "cs_float,buff_163"],
]);

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

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

const prices: ItemPrices[] = await response.json();

Response 200

[
  {
    "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"
      }
    ]
  }
]
  • 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.

Prices of one item

GET/v1/prices/{market_hash_name}

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

Parameters

market_hash_namepath

stringThe item's name, URL-encoded

providersquery, optional

stringComma separated marketplaces (see Marketplaces). All of them when left out

Request

type ItemPrices = {
    market_hash_name: string;
    prices: { provider: string; price: number; changed_at: string; checked_at: string }[];
};

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

const params = new URLSearchParams([
    ["providers", "cs_float,dmarket"],
]);

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

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

const prices: ItemPrices = await response.json();

Response 200

{
  "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"
    }
  ]
}

Marketplaces

The provider names to put in providers, and to expect in answers.

cs_floatCSFloat
buff_163Buff.163
youpinYouPin898
dmarketDMarket
skinportSkinport
cs_moneycs.money
market_csgoMarket.CSGO
buff_marketBuff.Market
waxpeerWaxpeer
lis_skinsLis-skins
skin_baronSkinBaron
halo_skinsHaloSkins
white_marketWhite.Market
shadow_payShadowPay
gamer_payGamerPay
cs_dealsCS.Deals
avan_marketavan.market
skin_flowSKINFLOW
skin_outSkinOut
skinsSKINS

DMarket undercutter

Manage your DMarket offers and orders with the same key. Accounts and their DMarket API keys are added on the robot's page only, never through the API. Robot requests count toward the per-minute rate limit only.

  • Offers: any number per account. Orders (DMarket "targets"): up to 100 per account, DMarket's own limit.
  • DMarket cannot change an order's price: the robot replaces the order with a new one at the new price.

Accounts and limits

GET/v1/robots/dmarket

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

Request

type Robot = {
    robot: string;
    name: string;
    marketplace: string;
    limits: { accounts: number; offers_per_account: number | null; orders_per_account: number | null };
    accounts: { id: string; name: string; paused: boolean; balance: number | null; note: string | null; error: string | null; checked_at: string | null }[];
};

const API_KEY = process.env.APISKINS_API_KEY!;

const response = await fetch("https://api.apiskins.com/v1/robots/dmarket", {
    headers: { "X-API-KEY": API_KEY },
});

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

const robot: Robot = await response.json();

Response 200

{
  "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"
    }
  ]
}
  • A limit of null means no limit of ours.
  • paused: the account is over your subscription's accounts; its offers and orders wait.

An account's inventory

GET/v1/robots/dmarket/accounts/{account_id}/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.

Parameters

account_idpath

stringThe account's id, from GET /v1/robots/dmarket

Request

type InventoryItem = {
    asset_id: string;
    market_hash_name: string;
    sellable: boolean;
    suggested_price: number | null;
};

const API_KEY = process.env.APISKINS_API_KEY!;
const account_id = "6f1c2e0a-41d2-4a8e-9a8c-1f5b2d7e9c11";

const response = await fetch(`https://api.apiskins.com/v1/robots/dmarket/accounts/${encodeURIComponent(account_id)}/inventory`, {
    headers: { "X-API-KEY": API_KEY },
});

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

const inventory: InventoryItem[] = await response.json();

Response 200

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

List offers

GET/v1/robots/dmarket/offers

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

Request

type Offer = {
    id: string;
    account_id: string;
    asset_id: string;
    market_hash_name: string;
    min_price: number;
    max_price: number;
    price: number | null;
    competitor_price: number | null;
    status: "pending" | "active" | "paused" | "sold" | "closed";
    error: string | null;
    updated_at: string | null;
    created_at: string;
};

const API_KEY = process.env.APISKINS_API_KEY!;

const response = await fetch("https://api.apiskins.com/v1/robots/dmarket/offers", {
    headers: { "X-API-KEY": API_KEY },
});

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

const offers: Offer[] = await response.json();

Response 200

[
  {
    "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"
  }
]

Sell an item

POST/v1/robots/dmarket/offers

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.

Parameters

account_idbody

stringThe account that owns the item

asset_idbody

stringThe item's DMarket id, from the account's inventory

market_hash_namebody

stringThe item's name

min_pricebody

numberUSD, at most two decimals

max_pricebody

numberUSD, at most two decimals

Request

type Offer = {
    id: string;
    account_id: string;
    asset_id: string;
    market_hash_name: string;
    min_price: number;
    max_price: number;
    price: number | null;
    competitor_price: number | null;
    status: "pending" | "active" | "paused" | "sold" | "closed";
    error: string | null;
    updated_at: string | null;
    created_at: string;
};

const API_KEY = process.env.APISKINS_API_KEY!;

const response = await fetch("https://api.apiskins.com/v1/robots/dmarket/offers", {
    method: "POST",
    headers: { "X-API-KEY": API_KEY, "Content-Type": "application/json" },
    body: JSON.stringify({
        "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
    }),
});

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

const offer: Offer = await response.json();

Response 201

{
  "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"
}

Change an offer

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

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

Parameters

offer_idpath

stringThe offer's id

min_pricebody, optional

numberUSD

max_pricebody, optional

numberUSD

Request

type Offer = {
    id: string;
    account_id: string;
    asset_id: string;
    market_hash_name: string;
    min_price: number;
    max_price: number;
    price: number | null;
    competitor_price: number | null;
    status: "pending" | "active" | "paused" | "sold" | "closed";
    error: string | null;
    updated_at: string | null;
    created_at: string;
};

const API_KEY = process.env.APISKINS_API_KEY!;
const offer_id = "b3a90c55-7e1f-4c1b-8d2e-55a1c9e04f7a";

const response = await fetch(`https://api.apiskins.com/v1/robots/dmarket/offers/${encodeURIComponent(offer_id)}`, {
    method: "PATCH",
    headers: { "X-API-KEY": API_KEY, "Content-Type": "application/json" },
    body: JSON.stringify({
        "min_price": 30,
        "max_price": 39.5
    }),
});

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

const offer: Offer = await response.json();

Response 200

{
  "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"
}

Remove an offer

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

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

Parameters

offer_idpath

stringThe offer's id

Request

type Removed = { removed: true };

const API_KEY = process.env.APISKINS_API_KEY!;
const offer_id = "b3a90c55-7e1f-4c1b-8d2e-55a1c9e04f7a";

const response = await fetch(`https://api.apiskins.com/v1/robots/dmarket/offers/${encodeURIComponent(offer_id)}`, {
    method: "DELETE",
    headers: { "X-API-KEY": API_KEY },
});

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

const result: Removed = await response.json();

Response 200

{
  "removed": true
}

List orders

GET/v1/robots/dmarket/orders

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

Request

type Order = {
    id: string;
    account_id: string;
    market_hash_name: string;
    amount: number;
    min_price: number;
    max_price: number;
    price: number | null;
    competitor_price: number | null;
    status: "pending" | "active" | "paused" | "closed";
    placed: boolean;
    error: string | null;
    updated_at: string | null;
    created_at: string;
};

const API_KEY = process.env.APISKINS_API_KEY!;

const response = await fetch("https://api.apiskins.com/v1/robots/dmarket/orders", {
    headers: { "X-API-KEY": API_KEY },
});

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

const orders: Order[] = await response.json();

Response 200

[
  {
    "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"
  }
]

Buy an item

POST/v1/robots/dmarket/orders

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.

Parameters

account_idbody

stringThe account to buy with

market_hash_namebody

stringThe item's name

amountbody

numberHow many to buy, 1 to 100

min_pricebody

numberUSD, at most two decimals

max_pricebody

numberUSD, at most two decimals

Request

type Order = {
    id: string;
    account_id: string;
    market_hash_name: string;
    amount: number;
    min_price: number;
    max_price: number;
    price: number | null;
    competitor_price: number | null;
    status: "pending" | "active" | "paused" | "closed";
    placed: boolean;
    error: string | null;
    updated_at: string | null;
    created_at: string;
};

const API_KEY = process.env.APISKINS_API_KEY!;

const response = await fetch("https://api.apiskins.com/v1/robots/dmarket/orders", {
    method: "POST",
    headers: { "X-API-KEY": API_KEY, "Content-Type": "application/json" },
    body: JSON.stringify({
        "account_id": "6f1c2e0a-41d2-4a8e-9a8c-1f5b2d7e9c11",
        "market_hash_name": "AK-47 | Redline (Field-Tested)",
        "amount": 2,
        "min_price": 25,
        "max_price": 30
    }),
});

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

const order: Order = await response.json();

Response 201

{
  "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"
}

Change an order

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

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.

Parameters

order_idpath

stringThe order's id

min_pricebody, optional

numberUSD

max_pricebody, optional

numberUSD

amountbody, optional

numberOnly before the order is placed

Request

type Order = {
    id: string;
    account_id: string;
    market_hash_name: string;
    amount: number;
    min_price: number;
    max_price: number;
    price: number | null;
    competitor_price: number | null;
    status: "pending" | "active" | "paused" | "closed";
    placed: boolean;
    error: string | null;
    updated_at: string | null;
    created_at: string;
};

const API_KEY = process.env.APISKINS_API_KEY!;
const order_id = "0d7e4b2c-91aa-4f63-b2e8-7c35e1d8a904";

const response = await fetch(`https://api.apiskins.com/v1/robots/dmarket/orders/${encodeURIComponent(order_id)}`, {
    method: "PATCH",
    headers: { "X-API-KEY": API_KEY, "Content-Type": "application/json" },
    body: JSON.stringify({
        "min_price": 26,
        "max_price": 31
    }),
});

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

const order: Order = await response.json();

Response 200

{
  "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"
}

Remove an order

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

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

Parameters

order_idpath

stringThe order's id

Request

type Removed = { removed: true };

const API_KEY = process.env.APISKINS_API_KEY!;
const order_id = "0d7e4b2c-91aa-4f63-b2e8-7c35e1d8a904";

const response = await fetch(`https://api.apiskins.com/v1/robots/dmarket/orders/${encodeURIComponent(order_id)}`, {
    method: "DELETE",
    headers: { "X-API-KEY": API_KEY },
});

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

const result: Removed = await response.json();

Response 200

{
  "removed": true
}

Offer and order statuses

pending
Not listed or placed yet
active
On the marketplace, kept first within your limits. A price the robot changed stays for 15 minutes; after that it watches the market every second
paused
Over your subscription's offers, orders or accounts: it waits until you upgrade or remove others
sold
Offers: sold
closed
Offers: taken off sale or the item left the inventory. Orders: bought in full or removed. error says why when there is a reason

Market.CSGO undercutter

Manage your Market.CSGO offers and orders with the same key. Accounts and their Market.CSGO API keys are added on the robot's page only, never through the API. Robot requests count toward the per-minute rate limit only.

  • Offers: any number per account. Orders: up to 100 per account, one per item, changed in place.
  • The account's currency on Market.CSGO must be USD. Offers only show while you are online in Market.CSGO's app or browser extension.

Accounts and limits

GET/v1/robots/market-csgo

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.

Request

type Robot = {
    robot: string;
    name: string;
    marketplace: string;
    limits: { accounts: number; offers_per_account: number | null; orders_per_account: number | null };
    accounts: { id: string; name: string; paused: boolean; balance: number | null; note: string | null; error: string | null; checked_at: string | null }[];
};

const API_KEY = process.env.APISKINS_API_KEY!;

const response = await fetch("https://api.apiskins.com/v1/robots/market-csgo", {
    headers: { "X-API-KEY": API_KEY },
});

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

const robot: Robot = await response.json();

Response 200

{
  "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"
    }
  ]
}
  • A limit of null means no limit of ours.
  • paused: the account is over your subscription's accounts; its offers and orders wait.

An account's inventory

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

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

Parameters

account_idpath

stringThe account's id, from GET /v1/robots/market-csgo

Request

type InventoryItem = {
    asset_id: string;
    market_hash_name: string;
    sellable: boolean;
    suggested_price: number | null;
};

const API_KEY = process.env.APISKINS_API_KEY!;
const account_id = "6f1c2e0a-41d2-4a8e-9a8c-1f5b2d7e9c11";

const response = await fetch(`https://api.apiskins.com/v1/robots/market-csgo/accounts/${encodeURIComponent(account_id)}/inventory`, {
    headers: { "X-API-KEY": API_KEY },
});

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

const inventory: InventoryItem[] = await response.json();

Response 200

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

List offers

GET/v1/robots/market-csgo/offers

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

Request

type Offer = {
    id: string;
    account_id: string;
    asset_id: string;
    market_hash_name: string;
    min_price: number;
    max_price: number;
    price: number | null;
    competitor_price: number | null;
    status: "pending" | "active" | "paused" | "sold" | "closed";
    error: string | null;
    updated_at: string | null;
    created_at: string;
};

const API_KEY = process.env.APISKINS_API_KEY!;

const response = await fetch("https://api.apiskins.com/v1/robots/market-csgo/offers", {
    headers: { "X-API-KEY": API_KEY },
});

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

const offers: Offer[] = await response.json();

Response 200

[
  {
    "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"
  }
]

Sell an item

POST/v1/robots/market-csgo/offers

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.

Parameters

account_idbody

stringThe account that owns the item

asset_idbody

stringThe item's Steam asset id, from the account's inventory

market_hash_namebody

stringThe item's name

min_pricebody

numberUSD, at most two decimals

max_pricebody

numberUSD, at most two decimals

Request

type Offer = {
    id: string;
    account_id: string;
    asset_id: string;
    market_hash_name: string;
    min_price: number;
    max_price: number;
    price: number | null;
    competitor_price: number | null;
    status: "pending" | "active" | "paused" | "sold" | "closed";
    error: string | null;
    updated_at: string | null;
    created_at: string;
};

const API_KEY = process.env.APISKINS_API_KEY!;

const response = await fetch("https://api.apiskins.com/v1/robots/market-csgo/offers", {
    method: "POST",
    headers: { "X-API-KEY": API_KEY, "Content-Type": "application/json" },
    body: JSON.stringify({
        "account_id": "6f1c2e0a-41d2-4a8e-9a8c-1f5b2d7e9c11",
        "asset_id": "38215462179",
        "market_hash_name": "AK-47 | Redline (Field-Tested)",
        "min_price": 30,
        "max_price": 40
    }),
});

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

const offer: Offer = await response.json();

Response 201

{
  "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"
}

Change an offer

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

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

Parameters

offer_idpath

stringThe offer's id

min_pricebody, optional

numberUSD

max_pricebody, optional

numberUSD

Request

type Offer = {
    id: string;
    account_id: string;
    asset_id: string;
    market_hash_name: string;
    min_price: number;
    max_price: number;
    price: number | null;
    competitor_price: number | null;
    status: "pending" | "active" | "paused" | "sold" | "closed";
    error: string | null;
    updated_at: string | null;
    created_at: string;
};

const API_KEY = process.env.APISKINS_API_KEY!;
const offer_id = "b3a90c55-7e1f-4c1b-8d2e-55a1c9e04f7a";

const response = await fetch(`https://api.apiskins.com/v1/robots/market-csgo/offers/${encodeURIComponent(offer_id)}`, {
    method: "PATCH",
    headers: { "X-API-KEY": API_KEY, "Content-Type": "application/json" },
    body: JSON.stringify({
        "min_price": 30,
        "max_price": 39.5
    }),
});

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

const offer: Offer = await response.json();

Response 200

{
  "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"
}

Remove an offer

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

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

Parameters

offer_idpath

stringThe offer's id

Request

type Removed = { removed: true };

const API_KEY = process.env.APISKINS_API_KEY!;
const offer_id = "b3a90c55-7e1f-4c1b-8d2e-55a1c9e04f7a";

const response = await fetch(`https://api.apiskins.com/v1/robots/market-csgo/offers/${encodeURIComponent(offer_id)}`, {
    method: "DELETE",
    headers: { "X-API-KEY": API_KEY },
});

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

const result: Removed = await response.json();

Response 200

{
  "removed": true
}

List orders

GET/v1/robots/market-csgo/orders

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

Request

type Order = {
    id: string;
    account_id: string;
    market_hash_name: string;
    amount: number;
    min_price: number;
    max_price: number;
    price: number | null;
    competitor_price: number | null;
    status: "pending" | "active" | "paused" | "closed";
    placed: boolean;
    error: string | null;
    updated_at: string | null;
    created_at: string;
};

const API_KEY = process.env.APISKINS_API_KEY!;

const response = await fetch("https://api.apiskins.com/v1/robots/market-csgo/orders", {
    headers: { "X-API-KEY": API_KEY },
});

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

const orders: Order[] = await response.json();

Response 200

[
  {
    "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"
  }
]

Buy an item

POST/v1/robots/market-csgo/orders

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.

Parameters

account_idbody

stringThe account to buy with

market_hash_namebody

stringThe item's name

amountbody

numberHow many to buy, 1 to 100

min_pricebody

numberUSD, at most two decimals

max_pricebody

numberUSD, at most two decimals

Request

type Order = {
    id: string;
    account_id: string;
    market_hash_name: string;
    amount: number;
    min_price: number;
    max_price: number;
    price: number | null;
    competitor_price: number | null;
    status: "pending" | "active" | "paused" | "closed";
    placed: boolean;
    error: string | null;
    updated_at: string | null;
    created_at: string;
};

const API_KEY = process.env.APISKINS_API_KEY!;

const response = await fetch("https://api.apiskins.com/v1/robots/market-csgo/orders", {
    method: "POST",
    headers: { "X-API-KEY": API_KEY, "Content-Type": "application/json" },
    body: JSON.stringify({
        "account_id": "6f1c2e0a-41d2-4a8e-9a8c-1f5b2d7e9c11",
        "market_hash_name": "AK-47 | Redline (Field-Tested)",
        "amount": 2,
        "min_price": 25,
        "max_price": 30
    }),
});

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

const order: Order = await response.json();

Response 201

{
  "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"
}

Change an order

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

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.

Parameters

order_idpath

stringThe order's id

min_pricebody, optional

numberUSD

max_pricebody, optional

numberUSD

amountbody, optional

numberOnly before the order is placed

Request

type Order = {
    id: string;
    account_id: string;
    market_hash_name: string;
    amount: number;
    min_price: number;
    max_price: number;
    price: number | null;
    competitor_price: number | null;
    status: "pending" | "active" | "paused" | "closed";
    placed: boolean;
    error: string | null;
    updated_at: string | null;
    created_at: string;
};

const API_KEY = process.env.APISKINS_API_KEY!;
const order_id = "0d7e4b2c-91aa-4f63-b2e8-7c35e1d8a904";

const response = await fetch(`https://api.apiskins.com/v1/robots/market-csgo/orders/${encodeURIComponent(order_id)}`, {
    method: "PATCH",
    headers: { "X-API-KEY": API_KEY, "Content-Type": "application/json" },
    body: JSON.stringify({
        "min_price": 26,
        "max_price": 31
    }),
});

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

const order: Order = await response.json();

Response 200

{
  "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"
}

Remove an order

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

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

Parameters

order_idpath

stringThe order's id

Request

type Removed = { removed: true };

const API_KEY = process.env.APISKINS_API_KEY!;
const order_id = "0d7e4b2c-91aa-4f63-b2e8-7c35e1d8a904";

const response = await fetch(`https://api.apiskins.com/v1/robots/market-csgo/orders/${encodeURIComponent(order_id)}`, {
    method: "DELETE",
    headers: { "X-API-KEY": API_KEY },
});

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

const result: Removed = await response.json();

Response 200

{
  "removed": true
}

Offer and order statuses

pending
Not listed or placed yet
active
On the marketplace, kept first within your limits. A price the robot changed stays for 15 minutes; after that it watches the market every second
paused
Over your subscription's offers, orders or accounts: it waits until you upgrade or remove others
sold
Offers: sold
closed
Offers: taken off sale or the item left the inventory. Orders: bought in full or removed. error says why when there is a reason

Limits and errors

Two limits, both per subscription. Every request counts toward the per-minute rate limit; one over it gets 429 with a Retry-After header in seconds. Every answered price request also counts toward the monthly limit, however many items it names; the count starts over on the 1st (UTC), and the X-Monthly-Limit and X-Monthly-Remaining headers tell where you are.

SubscriptionRequests / minutePrice requests / month
Free60100
Trader1205,000
Pro30025,000
Business300100,000
400
Something in the request is wrong: an unknown provider, a bad body, more than 100 items
401
The key is missing or wrong
404
No such item, robot, account, offer or order
409
Not possible now: over your subscription's offers, orders or accounts, the item already has an offer or order, or it is sold or closed
429
The per-minute rate limit (wait Retry-After seconds) or the monthly limit of price requests is reached
502
The marketplace did not answer the robot; try again