API
API docs
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
/v1/pricesThe 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, optionalstringAn item's name. Repeat it for a batch of up to 100. Every listed item when left out
providersquery, optionalstringComma 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
/v1/prices/{market_hash_name}The lowest listing of one item on each marketplace. 404 when no marketplace lists it.
Parameters
market_hash_namepathstringThe item's name, URL-encoded
providersquery, optionalstringComma 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_floatCSFloatbuff_163Buff.163youpinYouPin898dmarketDMarketskinportSkinportcs_moneycs.moneymarket_csgoMarket.CSGObuff_marketBuff.MarketwaxpeerWaxpeerlis_skinsLis-skinsskin_baronSkinBaronhalo_skinsHaloSkinswhite_marketWhite.Marketshadow_payShadowPaygamer_payGamerPaycs_dealsCS.Dealsavan_marketavan.marketskin_flowSKINFLOWskin_outSkinOutskinsSKINSDMarket 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
/v1/robots/dmarketYour 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
/v1/robots/dmarket/accounts/{account_id}/inventoryThe 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_idpathstringThe 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
/v1/robots/dmarket/offersYour 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
/v1/robots/dmarket/offersThe 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_idbodystringThe account that owns the item
asset_idbodystringThe item's DMarket id, from the account's inventory
market_hash_namebodystringThe item's name
min_pricebodynumberUSD, at most two decimals
max_pricebodynumberUSD, 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
/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_idpathstringThe offer's id
min_pricebody, optionalnumberUSD
max_pricebody, optionalnumberUSD
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
/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_idpathstringThe 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
/v1/robots/dmarket/ordersYour 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
/v1/robots/dmarket/ordersThe 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_idbodystringThe account to buy with
market_hash_namebodystringThe item's name
amountbodynumberHow many to buy, 1 to 100
min_pricebodynumberUSD, at most two decimals
max_pricebodynumberUSD, 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
/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_idpathstringThe order's id
min_pricebody, optionalnumberUSD
max_pricebody, optionalnumberUSD
amountbody, optionalnumberOnly 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
/v1/robots/dmarket/orders/{order_id}Removes the order from DMarket and forgets it. One already gone there is simply forgotten.
Parameters
order_idpathstringThe 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
/v1/robots/market-csgoYour 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
/v1/robots/market-csgo/accounts/{account_id}/inventoryThe Steam items Market.CSGO can sell from the account, with the asset_id to sell each by.
Parameters
account_idpathstringThe 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
/v1/robots/market-csgo/offersYour 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
/v1/robots/market-csgo/offersThe 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_idbodystringThe account that owns the item
asset_idbodystringThe item's Steam asset id, from the account's inventory
market_hash_namebodystringThe item's name
min_pricebodynumberUSD, at most two decimals
max_pricebodynumberUSD, 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
/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_idpathstringThe offer's id
min_pricebody, optionalnumberUSD
max_pricebody, optionalnumberUSD
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
/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_idpathstringThe 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
/v1/robots/market-csgo/ordersYour 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
/v1/robots/market-csgo/ordersThe 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_idbodystringThe account to buy with
market_hash_namebodystringThe item's name
amountbodynumberHow many to buy, 1 to 100
min_pricebodynumberUSD, at most two decimals
max_pricebodynumberUSD, 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
/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_idpathstringThe order's id
min_pricebody, optionalnumberUSD
max_pricebody, optionalnumberUSD
amountbody, optionalnumberOnly 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
/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_idpathstringThe 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.
| Subscription | Requests / minute | Price requests / month |
|---|---|---|
| Free | 60 | 100 |
| Trader | 120 | 5,000 |
| Pro | 300 | 25,000 |
| Business | 300 | 100,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