API Skins

API

Документация API

Цены всех скинов CS2 на 22 маркетплейсах и ваши торговые роботы из вашего кода. Один ключ на всё.

Начало работы

Все запросы идут на https://api.apiskins.com и требуют ваш ключ в заголовке X-API-KEY. Ответы в JSON; цены в USD.

Неудачный запрос возвращает HTTP-статус и сообщение об ошибке в JSON. Лимиты и ошибки

Весь API также доступен как документ OpenAPI для генераторов кода и ИИ-агентов.

Маркетплейсы

Названия провайдеров для параметра providers и для ответов. У каждого маркетплейса есть предложения; ордера на покупку есть только у отмеченных.

cs_floatCSFloat
buff_163Buff.163
youpinYouPin898
dmarketОрдера на покупкуDMarket
skinportSkinport
cs_moneycs.money
market_csgoОрдера на покупкуMarket.CSGO
buff_marketBuff.Market
waxpeerWaxpeer
lis_skinsLis-skins
skin_baronSkinBaron
halo_skinsHaloSkins
white_marketWhite.Market
shadow_payShadowPay
skinsSKINS
skin_swapSkinSwap
cs_dealsCS.Deals
loot_farmLoot.farm
cs_tradeCS.TRADE
tradeitTradeit.gg
steamОрдера на покупкуSteam
sihSIH Market

Предложения

Самое дешёвое предложение (самая низкая цена) каждого предмета на каждом отслеживаемом маркетплейсе. Ответы сжимаются gzip для клиентов, которые это поддерживают, поэтому все предметы всех маркетплейсов приходят одним запросом.

Мы отслеживаем скины оружия (обычные и StatTrak™), ножи, перчатки, кейсы и капсулы, агентов, музыкальные наборы, нашивки, брелоки, значки и пропуска. Сувенирные предметы, наклейки и граффити не отслеживаются.

Предложения многих предметов

GET/v1/offers

Самое дешёвое предложение (самая низкая цена) предметов на каждом маркетплейсе. Укажите до 100 предметов через market_hash_name для пакета или опустите параметр, чтобы получить все выставленные предметы одним ответом. Предмет, которого нет ни на одном маркетплейсе, в ответ не входит.

Параметры

market_hash_namequery, необязательно

stringНазвание предмета. Повторите для пакета до 100. Если не указано, все выставленные предметы

providersquery, необязательно

stringМаркетплейсы через запятую (см. Маркетплейсы). Если не указано, все

Запрос

type ItemOffers = {
    market_hash_name: string;
    offers: { provider: string; price: number }[];
};

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/offers?${params}`, {
    headers: { "X-API-KEY": API_KEY },
});

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

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

Ответ 200

[
  {
    "market_hash_name": "AK-47 | Redline (Field-Tested)",
    "offers": [
      {
        "provider": "buff_163",
        "price": 31.42
      },
      {
        "provider": "cs_float",
        "price": 33.1
      }
    ]
  }
]
  • На бесплатной подписке отвечается только Steam: без providers ответ содержит один Steam, а запрос другого маркетплейса получает 403. Платные подписки получают все маркетплейсы.
  • Маркетплейс, не продающий предмет, в его предложения не входит.
  • Ответы сжимаются gzip для клиентов, которые это поддерживают (любая HTTP-библиотека; для curl добавьте --compressed): все предметы всех маркетплейсов — это около 28 MB JSON и меньше 2 MB в gzip.

Предложения одного предмета

GET/v1/offers/{market_hash_name}

Самое дешёвое предложение одного предмета на каждом маркетплейсе. 404, если его нет ни на одном.

Параметры

market_hash_namepath

stringНазвание предмета в URL-кодировке

providersquery, необязательно

stringМаркетплейсы через запятую (см. Маркетплейсы). Если не указано, все

Запрос

type ItemOffers = {
    market_hash_name: string;
    offers: { provider: string; price: number }[];
};

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/offers/${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 offers: ItemOffers = await response.json();

Ответ 200

{
  "market_hash_name": "AK-47 | Redline (Field-Tested)",
  "offers": [
    {
      "provider": "buff_163",
      "price": 31.42
    },
    {
      "provider": "cs_float",
      "price": 33.1
    }
  ]
}
  • На бесплатной подписке отвечается только Steam: без providers ответ содержит один Steam, а запрос другого маркетплейса получает 403. Платные подписки получают все маркетплейсы.

Ордера на покупку

Самый высокий ордер на покупку каждого предмета на DMarket, Market.CSGO и Steam: за сколько можно продать предмет прямо сейчас. Тот же ключ, тот же 30-дневный лимит и те же сжатые ответы, что и у предложений.

Ордера многих предметов

GET/v1/orders

Самый высокий ордер на покупку предметов на маркетплейсах, где они есть: DMarket (обновление каждые несколько секунд), Market.CSGO (каждые 15 минут) и Steam (каждый час). Укажите до 100 предметов через market_hash_name для пакета или опустите параметр, чтобы получить все предметы с ордерами одним ответом. Предмет без ордеров в ответ не входит.

Параметры

market_hash_namequery, необязательно

stringНазвание предмета. Повторите для пакета до 100. Если не указано, все предметы с ордером

providersquery, необязательно

stringМаркетплейсы через запятую: dmarket, market_csgo, steam. Если не указано, все

Запрос

type ItemOrders = {
    market_hash_name: string;
    orders: { provider: string; price: number }[];
};

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", "dmarket,market_csgo"],
]);

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

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

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

Ответ 200

[
  {
    "market_hash_name": "AK-47 | Redline (Field-Tested)",
    "orders": [
      {
        "provider": "dmarket",
        "price": 24.51
      },
      {
        "provider": "market_csgo",
        "price": 23.822
      }
    ]
  }
]
  • На бесплатной подписке отвечается только Steam: без providers ответ содержит один Steam, а запрос другого маркетплейса получает 403. Платные подписки получают все маркетплейсы.
  • Маркетплейс без ордера на предмет в его ордера не входит.
  • Сувенирные предметы, наклейки и граффити включены. Как и запросы предложений, каждый отвеченный запрос учитывается в 30-дневном лимите, а ответы сжимаются так же.

Ордера одного предмета

GET/v1/orders/{market_hash_name}

Самый высокий ордер одного предмета на каждом маркетплейсе. 404, если ордеров нет нигде.

Параметры

market_hash_namepath

stringНазвание предмета в URL-кодировке

providersquery, необязательно

stringМаркетплейсы через запятую: dmarket, market_csgo, steam. Если не указано, все

Запрос

type ItemOrders = {
    market_hash_name: string;
    orders: { provider: string; price: number }[];
};

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

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

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

const orders: ItemOrders = await response.json();

Ответ 200

{
  "market_hash_name": "AK-47 | Redline (Field-Tested)",
  "orders": [
    {
      "provider": "dmarket",
      "price": 24.51
    },
    {
      "provider": "market_csgo",
      "price": 23.822
    }
  ]
}
  • На бесплатной подписке отвечается только Steam: без providers ответ содержит один Steam, а запрос другого маркетплейса получает 403. Платные подписки получают все маркетплейсы.

История продаж

Сводка продаж каждого предмета на DMarket и Market.CSGO: сколько продано, медианная и средняя цена за последние 7, 15, 30 и 90 дней и сколько обычно продаётся за 15 дней. Тот же ключ, тот же 30-дневный лимит и такие же сжатые gzip ответы, как у предложений.

Сводка продаж многих предметов

GET/v1/sales/summary

Сводка продаж предметов на каждой площадке: DMarket (обновляется раз в несколько часов) и Market.CSGO (примерно раз в час). Укажите до 100 предметов через market_hash_name для пакетного запроса или опустите параметр, чтобы получить одним ответом все предметы, проданные за последние 90 дней. Предмет без продаж за последние 90 дней в ответ не попадает.

Параметры

market_hash_namequery, необязательно

stringНазвание предмета. Повторите для пакета до 100. Если опустить, все предметы, проданные за последние 90 дней

providersquery, необязательно

stringМаркетплейсы через запятую: dmarket, market_csgo. Если не указано, оба

Запрос

type SalesPeriod = { sales: number; median: number | null; avg: number | null };

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

const API_KEY = process.env.APISKINS_API_KEY!;

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

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

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

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

Ответ 200

[
  {
    "market_hash_name": "AK-47 | Redline (Field-Tested)",
    "sales": [
      {
        "provider": "market_csgo",
        "last_7d": {
          "sales": 154,
          "median": 28.63,
          "avg": 28.76
        },
        "last_15d": {
          "sales": 310,
          "median": 28.7,
          "avg": 28.9
        },
        "last_30d": {
          "sales": 620,
          "median": 28.8,
          "avg": 29.12
        },
        "last_90d": {
          "sales": 1850,
          "median": 29.1,
          "avg": 29.4
        },
        "index_volume_units": 305.5,
        "index_volume_dollars": 8900.25,
        "updated_at": "2026-10-28T10:00:00.000Z"
      }
    ]
  }
]
  • Нужна платная подписка: на бесплатной каждый запрос получает 403.
  • В каждом периоде sales показывает, сколько предметов продано, а median и avg — их медианную и среднюю цену в USD. Для периода без продаж median и avg равны null.
  • index_volume_units (индекс объёма в штуках) и index_volume_dollars (индекс объёма в долларах) показывают, сколько обычно продаётся за 15 дней: последние 90 дней делятся на шесть периодов по 15 дней, период без продаж считается за 0. index_volume_units — медиана количества проданных предметов по периодам, index_volume_dollars — медиана их сумм в USD, поэтому один активный или мёртвый отрезок на них не влияет.
  • Сводка рассчитывается после каждого прохода по продажам площадки; когда именно, показывает updated_at.
  • Market.CSGO показывает нам не более 6,000 последних продаж предмета, поэтому у самых продаваемых предметов last_90d, index_volume_units и index_volume_dollars могут быть занижены, пока мы не накопим полные 90 дней.
  • Фазы Doppler и Gamma Doppler используют общие рыночные названия, поэтому одна запись охватывает все фазы.
  • Сувенирные предметы, наклейки и граффити включены. Как и запросы предложений, каждый отвеченный запрос учитывается в 30-дневном лимите, а ответы сжимаются так же.

Сводка продаж одного предмета

GET/v1/sales/summary/{market_hash_name}

Сводка продаж одного предмета на каждой площадке. 404, если ни на одной его не продавали за последние 90 дней.

Параметры

market_hash_namepath

stringНазвание предмета в URL-кодировке

providersquery, необязательно

stringМаркетплейсы через запятую: dmarket, market_csgo. Если не указано, оба

Запрос

type SalesPeriod = { sales: number; median: number | null; avg: number | null };

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

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

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

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

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

Ответ 200

{
  "market_hash_name": "AK-47 | Redline (Field-Tested)",
  "sales": [
    {
      "provider": "market_csgo",
      "last_7d": {
        "sales": 154,
        "median": 28.63,
        "avg": 28.76
      },
      "last_15d": {
        "sales": 310,
        "median": 28.7,
        "avg": 28.9
      },
      "last_30d": {
        "sales": 620,
        "median": 28.8,
        "avg": 29.12
      },
      "last_90d": {
        "sales": 1850,
        "median": 29.1,
        "avg": 29.4
      },
      "index_volume_units": 305.5,
      "index_volume_dollars": 8900.25,
      "updated_at": "2026-10-28T10:00:00.000Z"
    }
  ]
}
  • Нужна платная подписка: на бесплатной каждый запрос получает 403.

Предметы

Что представляет собой каждый предмет CS2: тип, оружие, износ и диапазон float, качество, редкость, коллекции и кейсы. Для фильтрации предметов на маркетплейсе, по тому же market_hash_name, что и у предложений и ордеров. Все скины, наклейки, агенты, брелоки, кейсы и остальное, включая сувенирные. Как и запросы предложений, каждый отвеченный запрос учитывается в 30-дневном лимите.

Много предметов

GET/v1/items

Что представляет собой каждый предмет CS2: тип, оружие, износ и диапазон float, качество, редкость, коллекции и кейсы, одна запись на market_hash_name, для фильтрации предметов на маркетплейсе. Все предметы одним ответом (около 2 МБ в gzip), страница через limit и offset или до 100 по market_hash_name. Фильтры сужают оба варианта.

Параметры

market_hash_namequery, необязательно

stringНазвание предмета. Повторите для пакета до 100. Если не указано, все предметы

typequery, необязательно

stringskin, sticker, agent, charm, patch, music_kit, graffiti, collectible, container. Через запятую, любой из них

weaponquery, необязательно

stringId оружия: awp, ak-47, karambit, sport-gloves.... Через запятую, любой из них

collectionquery, необязательно

stringId коллекций: the-dust-2-collection.... Через запятую, любой из них

containerquery, необязательно

stringId кейсов и наборов, из которых он выпадает: dreams-nightmares-case.... Через запятую, любой из них

rarityquery, необязательно

stringId редкости: consumer, industrial, mil-spec, restricted, classified, covert, contraband, а также для наклеек и агентов (high, remarkable, exotic, extraordinary, distinguished, exceptional, superior, master). Через запятую, любой из них

qualityquery, необязательно

stringNormal, StatTrak™, Souvenir, ★ или ★ StatTrak™. Через запятую, любой из них

limitquery, необязательно

numberСколько предметов вернуть максимум, от 1. Если не указано — все предметы, а limit в ответе равен их числу

offsetquery, необязательно

numberСколько предметов пропустить, для следующей страницы

Запрос

type ItemsPage = {
    total: number;
    limit: number;
    offset: number;
    items: Item[];
};

type Item = {
    market_hash_name: string;
    name: string;
    type: "skin" | "sticker" | "agent" | "charm" | "patch" | "music_kit" | "graffiti" | "collectible" | "container";
    category: string | null;
    weapon: { id: string; name: string } | null;
    pattern: string | null;
    wear: { id: "fn" | "mw" | "ft" | "ww" | "bs"; name: string } | null;
    min_float: number | null;
    max_float: number | null;
    quality: "Normal" | "StatTrak™" | "Souvenir" | "★" | "★ StatTrak™";
    stattrak: boolean;
    souvenir: boolean;
    rarity: { id: string; name: string; color: string } | null;
    label: string | null;
    team: "both" | "ct" | "t" | null;
    collections: { id: string; name: string }[];
    containers: { id: string; name: string }[];
    details: Record<string, string>;
    image: string | null;
    url: string;
};

const API_KEY = process.env.APISKINS_API_KEY!;

const params = new URLSearchParams([
    ["type", "skin"],
    ["weapon", "awp"],
    ["quality", "StatTrak™"],
    ["limit", "1"],
]);

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

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

const page: ItemsPage = await response.json();

Ответ 200

{
  "total": 120,
  "limit": 1,
  "offset": 0,
  "items": [
    {
      "market_hash_name": "StatTrak™ AWP | Asiimov (Field-Tested)",
      "name": "AWP | Asiimov",
      "type": "skin",
      "category": "rifles",
      "weapon": {
        "id": "awp",
        "name": "AWP"
      },
      "pattern": "Asiimov",
      "wear": {
        "id": "ft",
        "name": "Field-Tested"
      },
      "min_float": 0.18,
      "max_float": 0.38,
      "quality": "StatTrak™",
      "stattrak": true,
      "souvenir": false,
      "rarity": {
        "id": "covert",
        "name": "Covert",
        "color": "#eb4b4b"
      },
      "label": null,
      "team": "both",
      "collections": [
        {
          "id": "the-phoenix-collection",
          "name": "The Phoenix Collection"
        }
      ],
      "containers": [
        {
          "id": "operation-phoenix-weapon-case",
          "name": "Operation Phoenix Weapon Case"
        }
      ],
      "details": {},
      "image": "https://community.akamai.steamstatic.com/economy/image/i0CoZ81Ui0m-9KwlBY1L_18myuGuq1wfhWSaZgMttyVfPaERSR0Wqmu7LAocGIGz3UqlXOLrxM-vMGmW8VNxu5Dx60noTyLwiYbf_jdk7uW-V6V-Kf2cGFidxOp_pewnF3nhxEt0sGnSzN76dH3GOg9xC8FyEORftRe-x9PuYurq71bW3d8UnjK-0H0YSTpMGQ/512fx384f",
      "url": "https://apiskins.com/skins/awp/asiimov"
    }
  ]
}
  • Нужна платная подписка: на бесплатной каждый запрос получает 403.
  • type равен skin для всех скинов оружия, ножей и перчаток (их различает category: knives, gloves, rifles, pistols, smgs, heavy, equipment) и container для кейсов, капсул и наборов (category — их вид: case, sticker_capsule, souvenir_package...).
  • min_float и max_float — возможный float предмета: собственный диапазон скина в пределах износа. null для предметов без float.
  • details содержит остальные данные: Tournament, Team, Player и Effect наклейки, Side агента, дату Released контейнера.
  • Фазы Doppler и Gamma Doppler используют общие рыночные названия, поэтому одна запись охватывает все фазы.
  • Как и запросы предложений, каждый отвеченный запрос учитывается в 30-дневном лимите, сколько бы предметов он ни содержал, а ответы так же сжимаются gzip.

Один предмет

GET/v1/items/{market_hash_name}

Что представляет собой один предмет. 404, если предмета с таким названием нет.

Параметры

market_hash_namepath

stringНазвание предмета в URL-кодировке

Запрос

type Item = {
    market_hash_name: string;
    name: string;
    type: "skin" | "sticker" | "agent" | "charm" | "patch" | "music_kit" | "graffiti" | "collectible" | "container";
    category: string | null;
    weapon: { id: string; name: string } | null;
    pattern: string | null;
    wear: { id: "fn" | "mw" | "ft" | "ww" | "bs"; name: string } | null;
    min_float: number | null;
    max_float: number | null;
    quality: "Normal" | "StatTrak™" | "Souvenir" | "★" | "★ StatTrak™";
    stattrak: boolean;
    souvenir: boolean;
    rarity: { id: string; name: string; color: string } | null;
    label: string | null;
    team: "both" | "ct" | "t" | null;
    collections: { id: string; name: string }[];
    containers: { id: string; name: string }[];
    details: Record<string, string>;
    image: string | null;
    url: string;
};

const API_KEY = process.env.APISKINS_API_KEY!;
const market_hash_name = "StatTrak™ AWP | Asiimov (Field-Tested)";

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

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

const item: Item = await response.json();

Ответ 200

{
  "market_hash_name": "StatTrak™ AWP | Asiimov (Field-Tested)",
  "name": "AWP | Asiimov",
  "type": "skin",
  "category": "rifles",
  "weapon": {
    "id": "awp",
    "name": "AWP"
  },
  "pattern": "Asiimov",
  "wear": {
    "id": "ft",
    "name": "Field-Tested"
  },
  "min_float": 0.18,
  "max_float": 0.38,
  "quality": "StatTrak™",
  "stattrak": true,
  "souvenir": false,
  "rarity": {
    "id": "covert",
    "name": "Covert",
    "color": "#eb4b4b"
  },
  "label": null,
  "team": "both",
  "collections": [
    {
      "id": "the-phoenix-collection",
      "name": "The Phoenix Collection"
    }
  ],
  "containers": [
    {
      "id": "operation-phoenix-weapon-case",
      "name": "Operation Phoenix Weapon Case"
    }
  ],
  "details": {},
  "image": "https://community.akamai.steamstatic.com/economy/image/i0CoZ81Ui0m-9KwlBY1L_18myuGuq1wfhWSaZgMttyVfPaERSR0Wqmu7LAocGIGz3UqlXOLrxM-vMGmW8VNxu5Dx60noTyLwiYbf_jdk7uW-V6V-Kf2cGFidxOp_pewnF3nhxEt0sGnSzN76dH3GOg9xC8FyEORftRe-x9PuYurq71bW3d8UnjK-0H0YSTpMGQ/512fx384f",
  "url": "https://apiskins.com/skins/awp/asiimov"
}
  • Нужна платная подписка: на бесплатной каждый запрос получает 403.

Робот для DMarket

Управляйте предложениями и ордерами DMarket тем же ключом. Аккаунты и их API-ключи DMarket добавляются только на странице робота, а не через API. Маршрутам робота нужна платная подписка; они учитываются только в поминутном лимите, но не в 30-дневном.

  • Предложения: любое количество на аккаунт. Ордера («таргеты» DMarket): до 100 на аккаунт, собственный лимит DMarket.
  • DMarket не позволяет менять цену ордера: робот заменяет ордер новым с новой ценой.

Аккаунты и лимиты

GET/v1/robots/dmarket

Ваши аккаунты DMarket в роботе (подключённые API-ключами DMarket на странице робота) и лимиты вашей подписки для него.

Запрос

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; enabled: 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();

Ответ 200

{
  "robot": "dmarket",
  "name": "Robot for DMarket",
  "marketplace": "DMarket",
  "limits": {
    "accounts": 5,
    "offers_per_account": null,
    "orders_per_account": 100
  },
  "accounts": [
    {
      "id": "6f1c2e0a-41d2-4a8e-9a8c-1f5b2d7e9c11",
      "name": "Main",
      "paused": false,
      "enabled": true,
      "balance": 123.45,
      "note": null,
      "error": null,
      "checked_at": "2026-10-15T08:40:00.000Z"
    }
  ]
}
  • Лимит null означает отсутствие нашего лимита.
  • paused: аккаунт сверх лимита аккаунтов подписки; его предложения и ордера ждут.
  • enabled: false означает, что это выключено на странице робота: робот больше не двигает цену, позиция остаётся на маркетплейсе по последней цене и всё ещё учитывается в лимитах.

Инвентарь аккаунта

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

Предметы в инвентаре DMarket аккаунта с asset_id для продажи каждого. sellable равен false для предметов, которые DMarket не позволяет выставлять.

Параметры

account_idpath

stringId аккаунта из GET /v1/robots/dmarket

Запрос

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();

Ответ 200

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

Ваши предложения на DMarket на всех аккаунтах, сначала самые старые.

Запрос

type Offer = {
    id: string;
    account_id: string;
    asset_id: string;
    market_hash_name: string;
    min_price: number;
    max_price: number;
    enabled: boolean;
    price: number | null;
    status: "pending" | "active" | "paused" | "sold" | "closed" | "gone";
    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();

Ответ 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,
    "enabled": true,
    "price": 31.99,
    "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

Выставляет предмет или перезаписывает цены его существующего предложения, которое ищется по asset_id. Робот выставляет предмет на DMarket и держит его самым дешёвым предложением, не ниже min_price. Без конкурентов продаёт по max_price. Новые цены предложения применяются за секунды или когда цена разблокируется: изменённая роботом цена держится 15 минут.

Параметры

asset_idbody

stringId предмета на DMarket из инвентаря аккаунта

min_pricebody

numberUSD, максимум два знака после запятой

max_pricebody

numberUSD, максимум два знака после запятой

account_idbody, необязательно

stringАккаунт, которому принадлежит предмет. Обязателен при выставлении

market_hash_namebody, необязательно

stringНазвание предмета. Обязательно при выставлении

Запрос

type Offer = {
    id: string;
    account_id: string;
    asset_id: string;
    market_hash_name: string;
    min_price: number;
    max_price: number;
    enabled: boolean;
    price: number | null;
    status: "pending" | "active" | "paused" | "sold" | "closed" | "gone";
    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();

Ответ 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,
  "enabled": true,
  "price": 31.99,
  "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

Забывает предложение: робот больше его не двигает, а предмет остаётся в продаже на DMarket по последней цене.

Параметры

asset_idquery

stringId предмета на DMarket из инвентаря аккаунта

Запрос

type Removed = { removed: boolean };

const API_KEY = process.env.APISKINS_API_KEY!;

const params = new URLSearchParams([
    ["asset_id", "4c1d8e2f-0b6a-4a51-9f3e-2d7c8b1a6e05"],
]);

const response = await fetch(`https://api.apiskins.com/v1/robots/dmarket/offers?${params}`, {
    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();

Ответ 200

{
  "removed": true
}
  • removed равен false, если у робота не было такого предложения.

Список ордеров

GET/v1/robots/dmarket/orders

Ваши ордера на покупку на DMarket на всех аккаунтах, сначала самые старые.

Запрос

type Order = {
    id: string;
    account_id: string;
    market_hash_name: string;
    amount: number;
    min_price: number;
    max_price: number;
    enabled: boolean;
    price: number | null;
    status: "pending" | "active" | "paused" | "closed" | "gone";
    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();

Ответ 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,
    "enabled": true,
    "price": 28.51,
    "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

Размещает ваш ордер на предмет на аккаунте или перезаписывает цены существующего. Робот размещает ордер DMarket («таргет») и держит его самым высоким, не выше max_price. Без конкурентов ставит min_price. DMarket разрешает до 100 ордеров на аккаунт. DMarket не может менять цену ордера: каждая новая цена — новый таргет вместо старого. Робот покупает по 1 предмету, пока не наберёт нужное количество, а ордер выставляется, только если его цена не превышает баланс аккаунта.

Параметры

market_hash_namebody

stringНазвание предмета

min_pricebody

numberUSD, максимум два знака после запятой

max_pricebody

numberUSD, максимум два знака после запятой

account_idbody, необязательно

stringАккаунт для покупки. Можно опустить, если аккаунт один

amountbody, необязательно

numberСколько купить, от 1 до 100. Обязательно при размещении; меняется только до размещения

Запрос

type Order = {
    id: string;
    account_id: string;
    market_hash_name: string;
    amount: number;
    min_price: number;
    max_price: number;
    enabled: boolean;
    price: number | null;
    status: "pending" | "active" | "paused" | "closed" | "gone";
    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();

Ответ 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,
  "enabled": true,
  "price": 28.51,
  "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

Забывает ордер: робот больше его не двигает, а ордер остаётся на DMarket по последней цене.

Параметры

market_hash_namequery

stringНазвание предмета

account_idquery, необязательно

stringАккаунт, на котором находится ордер. Можно опустить, если аккаунт один

Запрос

type Removed = { removed: boolean };

const API_KEY = process.env.APISKINS_API_KEY!;

const params = new URLSearchParams([
    ["market_hash_name", "AK-47 | Redline (Field-Tested)"],
    ["account_id", "6f1c2e0a-41d2-4a8e-9a8c-1f5b2d7e9c11"],
]);

const response = await fetch(`https://api.apiskins.com/v1/robots/dmarket/orders?${params}`, {
    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();

Ответ 200

{
  "removed": true
}
  • removed равен false, если у робота не было такого ордера.

Монитор

GET/v1/robots/dmarket/monitor

Все предметы на DMarket с прибылью от того, чтобы стать лучшим ордером (buy_price, на 1 цент выше лучшего ордера), а затем самым дешёвым предложением (sell_price, на 1 цент ниже самого дешёвого), после комиссии DMarket на этот предмет. Лучшие ордера и предложения DMarket обновляются каждые несколько секунд, цены других маркетплейсов — так часто, как обновляется каждый из них, от раза в 5 минут до раза в час. Применяются только отправленные фильтры: без них — все предметы с ордером, сначала самые прибыльные. Предмет без предложения на DMarket тоже показывается, с best_offer, sell_price, profit и margin_percent равными null: фильтры прибыли, маржи и разрыва его пропускают. dollar_volume и units_volume — сколько предмет обычно продаётся на DMarket за 15 дней: медиана за последние 90 дней, разбитых на шесть отрезков по 15 дней.

Параметры

qquery, необязательно

stringСлова, которые все должны быть в названии

min_pricequery, необязательно

numberМинимальная цена покупки, USD

max_pricequery, необязательно

numberМаксимальная цена покупки, USD

min_profitquery, необязательно

numberМинимальная прибыль после комиссии, USD

min_marginquery, необязательно

numberМинимальная маржа, процент от цены покупки

min_gapquery, необязательно

numberМинимальный разрыв между лучшим ордером и самым дешёвым предложением, USD

min_liquidityquery, необязательно

numberМинимальная ликвидность, от 0 до 100

max_feequery, необязательно

numberМаксимальная комиссия, процент

min_units_volumequery, необязательно

numberМинимум предметов, проданных за типичные 15 дней на DMarket (units_volume)

min_dollar_volumequery, необязательно

numberМинимум USD продаж за типичные 15 дней на DMarket (dollar_volume)

hidequery, необязательно

stringЧерез запятую: stickers, graffiti, souvenir, stattrak

comparequery, необязательно

stringДругие маркетплейсы и на сколько процентов выше цены покупки должна быть их самая низкая цена: buff_163:5,cs_float:3. Маркетплейс, не продающий предмет, пропускается. Их цены возвращаются в compare

compare_ordersquery, необязательно

stringТо же с самыми высокими ордерами других маркетплейсов: market_csgo:5 (Market.CSGO или Steam). Их ордера возвращаются в compare_orders

sortquery, необязательно

stringprofit (по умолчанию), margin, liquidity, price или volume (dollar_volume)

limitquery, необязательно

numberПредметов в ответе, от 1 до 100 (100, если не указано)

offsetquery, необязательно

numberСколько предметов пропустить, для следующей страницы

Запрос

type Monitor = {
    total: number;
    limit: number;
    offset: number;
    items: {
        market_hash_name: string;
        buy_price: number;
        sell_price: number | null;
        best_order: number;
        best_offer: number | null;
        fee_percent: number;
        profit: number | null;
        margin_percent: number | null;
        liquidity: number | null;
        dollar_volume: number | null;
        units_volume: number | null;
        compare: Record<string, { price: number; percent_over_buy: number }>;
        compare_orders: Record<string, { price: number; percent_over_buy: number }>;
    }[];
};

const API_KEY = process.env.APISKINS_API_KEY!;

const params = new URLSearchParams([
    ["min_margin", "5"],
    ["min_liquidity", "50"],
    ["hide", "stickers,souvenir"],
    ["compare", "buff_163:5"],
    ["limit", "1"],
]);

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

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

const monitor: Monitor = await response.json();

Ответ 200

{
  "total": 412,
  "limit": 1,
  "offset": 0,
  "items": [
    {
      "market_hash_name": "AK-47 | Redline (Field-Tested)",
      "buy_price": 24.6,
      "sell_price": 27.49,
      "best_order": 24.59,
      "best_offer": 27.5,
      "fee_percent": 5,
      "profit": 1.52,
      "margin_percent": 6.16,
      "liquidity": 87,
      "dollar_volume": 1830.4,
      "units_volume": 74.5,
      "compare": {
        "buff_163": {
          "price": 26.1,
          "percent_over_buy": 6.1
        }
      },
      "compare_orders": {}
    }
  ]
}
  • Нужна платная подписка, как и для всех маршрутов робота. В отличие от них, каждый отвеченный запрос также учитывается в 30-дневном лимите, как запросы предложений, с теми же заголовками X-Usage-Limit и X-Usage-Remaining.

Статусы предложений и ордеров

pending
Ещё не выставлено и не размещено
active
На маркетплейсе, удерживается первым в пределах ваших лимитов. Изменённая роботом цена держится 15 минут; затем он следит за рынком каждую секунду
paused
Сверх предложений, ордеров или аккаунтов подписки: ждёт, пока вы повысите тариф или удалите другие
sold
Предложения: продано
closed
Предложения: снято с продажи или предмет покинул инвентарь. Ордера: куплено полностью или удалено. В error указана причина, если она есть

Робот для market.csgo.com

Управляйте предложениями и ордерами Market.CSGO тем же ключом. Аккаунты и их API-ключи Market.CSGO добавляются только на странице робота, а не через API. Маршрутам робота нужна платная подписка; они учитываются только в поминутном лимите, но не в 30-дневном.

  • Предложения: любое количество на аккаунт. Ордера: до 100 на аккаунт, по одному на предмет, изменяются на месте.
  • Валюта аккаунта на Market.CSGO должна быть USD. Предложения показываются, только пока вы онлайн в приложении или расширении браузера Market.CSGO.

Аккаунты и лимиты

GET/v1/robots/market-csgo

Ваши аккаунты Market.CSGO в роботе (подключённые API-ключами Market.CSGO на странице робота) и лимиты вашей подписки для него. Поле note аккаунта сообщает, что мешает продаже, например отсутствие онлайн.

Запрос

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; enabled: 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();

Ответ 200

{
  "robot": "market-csgo",
  "name": "Robot for market.csgo.com",
  "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,
      "enabled": true,
      "balance": 123.45,
      "note": null,
      "error": null,
      "checked_at": "2026-10-15T08:40:00.000Z"
    }
  ]
}
  • Лимит null означает отсутствие нашего лимита.
  • paused: аккаунт сверх лимита аккаунтов подписки; его предложения и ордера ждут.
  • enabled: false означает, что это выключено на странице робота: робот больше не двигает цену, позиция остаётся на маркетплейсе по последней цене и всё ещё учитывается в лимитах.

Инвентарь аккаунта

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

Предметы Steam, которые Market.CSGO может продать с аккаунта, с asset_id для продажи каждого.

Параметры

account_idpath

stringId аккаунта из GET /v1/robots/market-csgo

Запрос

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();

Ответ 200

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

Список предложений

GET/v1/robots/market-csgo/offers

Ваши предложения на Market.CSGO на всех аккаунтах, сначала самые старые.

Запрос

type Offer = {
    id: string;
    account_id: string;
    asset_id: string;
    market_hash_name: string;
    min_price: number;
    max_price: number;
    enabled: boolean;
    price: number | null;
    status: "pending" | "active" | "paused" | "sold" | "closed" | "gone";
    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();

Ответ 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,
    "enabled": true,
    "price": 31.99,
    "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

Выставляет предмет или перезаписывает цены его существующего предложения, которое ищется по asset_id. Робот выставляет предмет на Market.CSGO и держит его самым дешёвым предложением, не ниже min_price. Без конкурентов продаёт по max_price. Предложения показываются, только пока аккаунт онлайн в приложении или расширении браузера Market.CSGO. Новые цены применяются за секунды или когда цена разблокируется: изменённая роботом цена держится 15 минут.

Параметры

asset_idbody

stringSteam asset id предмета из инвентаря аккаунта

min_pricebody

numberUSD, максимум два знака после запятой

max_pricebody

numberUSD, максимум два знака после запятой

account_idbody, необязательно

stringАккаунт, которому принадлежит предмет. Обязателен при выставлении

market_hash_namebody, необязательно

stringНазвание предмета. Обязательно при выставлении

Запрос

type Offer = {
    id: string;
    account_id: string;
    asset_id: string;
    market_hash_name: string;
    min_price: number;
    max_price: number;
    enabled: boolean;
    price: number | null;
    status: "pending" | "active" | "paused" | "sold" | "closed" | "gone";
    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();

Ответ 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,
  "enabled": true,
  "price": 31.99,
  "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

Забывает предложение: робот больше его не двигает, а предмет остаётся в продаже на Market.CSGO по последней цене.

Параметры

asset_idquery

stringSteam asset id предмета из инвентаря аккаунта

Запрос

type Removed = { removed: boolean };

const API_KEY = process.env.APISKINS_API_KEY!;

const params = new URLSearchParams([
    ["asset_id", "38215462179"],
]);

const response = await fetch(`https://api.apiskins.com/v1/robots/market-csgo/offers?${params}`, {
    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();

Ответ 200

{
  "removed": true
}
  • removed равен false, если у робота не было такого предложения.

Список ордеров

GET/v1/robots/market-csgo/orders

Ваши ордера на покупку на Market.CSGO на всех аккаунтах, сначала самые старые.

Запрос

type Order = {
    id: string;
    account_id: string;
    market_hash_name: string;
    amount: number;
    min_price: number;
    max_price: number;
    enabled: boolean;
    price: number | null;
    status: "pending" | "active" | "paused" | "closed" | "gone";
    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();

Ответ 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,
    "enabled": true,
    "price": 28.51,
    "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

Размещает ваш ордер на предмет на аккаунте или перезаписывает цены существующего. Робот размещает ордер Market.CSGO и держит его самым высоким, не выше max_price. Без конкурентов ставит min_price. Market.CSGO разрешает один ордер на предмет и до 100 ордеров на аккаунт и меняет цену ордера на месте.

Параметры

market_hash_namebody

stringНазвание предмета

min_pricebody

numberUSD, максимум два знака после запятой

max_pricebody

numberUSD, максимум два знака после запятой

account_idbody, необязательно

stringАккаунт для покупки. Можно опустить, если аккаунт один

amountbody, необязательно

numberСколько купить, от 1 до 100. Обязательно при размещении; меняется только до размещения

Запрос

type Order = {
    id: string;
    account_id: string;
    market_hash_name: string;
    amount: number;
    min_price: number;
    max_price: number;
    enabled: boolean;
    price: number | null;
    status: "pending" | "active" | "paused" | "closed" | "gone";
    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();

Ответ 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,
  "enabled": true,
  "price": 28.51,
  "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

Забывает ордер: робот больше его не двигает, а ордер остаётся на Market.CSGO по последней цене.

Параметры

market_hash_namequery

stringНазвание предмета

account_idquery, необязательно

stringАккаунт, на котором находится ордер. Можно опустить, если аккаунт один

Запрос

type Removed = { removed: boolean };

const API_KEY = process.env.APISKINS_API_KEY!;

const params = new URLSearchParams([
    ["market_hash_name", "AK-47 | Redline (Field-Tested)"],
    ["account_id", "6f1c2e0a-41d2-4a8e-9a8c-1f5b2d7e9c11"],
]);

const response = await fetch(`https://api.apiskins.com/v1/robots/market-csgo/orders?${params}`, {
    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();

Ответ 200

{
  "removed": true
}
  • removed равен false, если у робота не было такого ордера.

Статусы предложений и ордеров

pending
Ещё не выставлено и не размещено
active
На маркетплейсе, удерживается первым в пределах ваших лимитов. Изменённая роботом цена держится 15 минут; затем он следит за рынком каждую секунду
paused
Сверх предложений, ордеров или аккаунтов подписки: ждёт, пока вы повысите тариф или удалите другие
sold
Предложения: продано
closed
Предложения: снято с продажи или предмет покинул инвентарь. Ордера: куплено полностью или удалено. В error указана причина, если она есть

Лимиты и ошибки

Два лимита, оба на подписку. Каждый запрос учитывается в поминутном лимите; запрос сверх него получает 429 с заголовком Retry-After в секундах. Каждый отвеченный запрос предложений, ордеров, продаж, предметов или монитора также учитывается в 30-дневном лимите, сколько бы предметов он ни содержал; счётчик обнуляется каждые 30 дней с начала подписки, а заголовки X-Usage-Limit и X-Usage-Remaining показывают текущее состояние.

ПодпискаЗапросы / минутаЗапросы предложений и ордеров / 30 дней
Бесплатно60100
Trader1205,000
Pro30025,000
Business300100,000
400
Ошибка в запросе: неизвестный провайдер или тип предмета, неверное тело, больше 100 предметов, лимит вне диапазона
401
Ключ отсутствует или неверен
403
Нужна платная подписка: для всех маркетплейсов, кроме Steam, для маршрутов сводки продаж и предметов, а также робота и монитора
404
Нет такого предмета, робота или аккаунта
409
Сейчас невозможно: сверх предложений, ордеров или аккаунтов подписки либо изменение количества размещённого ордера
429
Достигнут поминутный лимит (подождите Retry-After секунд) или 30-дневный лимит
502
Маркетплейс не ответил роботу; попробуйте ещё раз