API Skins

API

Documentação da API

Preços de cada skin de CS2 em 22 marketplaces e seus robôs de trading, a partir do seu código. Uma chave para tudo.

Primeiros passos

Toda requisição vai para https://api.apiskins.com e precisa da sua chave no cabeçalho X-API-KEY. As respostas são em JSON; os preços, em USD.

Uma requisição que falha responde com um status HTTP e uma mensagem de erro em JSON. Limites e erros

Toda a API também é um documento OpenAPI, para geradores de código e agentes de IA.

Marketplaces

Os nomes dos provedores para usar em providers e esperar nas respostas. Todo marketplace tem ofertas; só os marcados também têm ordens de compra.

cs_floatCSFloat
buff_163Buff.163
youpinYouPin898
dmarketOrdens de compraDMarket
skinportSkinport
cs_moneycs.money
market_csgoOrdens de compraMarket.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
steamOrdens de compraSteam
sihSIH Market

Ofertas

A oferta mais barata (menor anúncio) de cada item em cada marketplace que acompanhamos. As respostas são compactadas com gzip para clientes que aceitam, então todos os itens de todos os marketplaces vêm em uma requisição.

Acompanhamos skins de armas (normais e StatTrak™), facas, luvas, caixas e cápsulas, agentes, kits de música, emblemas, chaveiros, broches e passes. Itens de lembrança, adesivos e grafites não são acompanhados.

Ofertas de muitos itens

GET/v1/offers

A oferta mais barata (menor anúncio) de itens em cada marketplace. Informe até 100 itens com market_hash_name para um lote, ou deixe de fora para receber todos os itens anunciados em uma resposta. Um item que nenhum marketplace anuncia fica fora da resposta.

Parâmetros

market_hash_namequery, opcional

stringNome de um item. Repita para um lote de até 100. Todos os itens anunciados se omitido

providersquery, opcional

stringMarketplaces separados por vírgula (veja Marketplaces). Todos se omitido

Requisição

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

Resposta 200

[
  {
    "market_hash_name": "AK-47 | Redline (Field-Tested)",
    "offers": [
      {
        "provider": "buff_163",
        "price": 31.42
      },
      {
        "provider": "cs_float",
        "price": 33.1
      }
    ]
  }
]
  • Na assinatura grátis só a Steam é respondida: sem providers, a resposta traz apenas a Steam, e pedir outro marketplace responde 403. As assinaturas pagas recebem todos os marketplaces.
  • Um marketplace que não anuncia um item fica fora das ofertas dele.
  • As respostas são compactadas com gzip para clientes que aceitam (toda biblioteca HTTP aceita; no curl, adicione --compressed): todos os itens de todos os marketplaces têm cerca de 28 MB de JSON, menos de 2 MB em gzip.

Ofertas de um item

GET/v1/offers/{market_hash_name}

A oferta mais barata de um item em cada marketplace. 404 quando nenhum o anuncia.

Parâmetros

market_hash_namepath

stringO nome do item, codificado para URL

providersquery, opcional

stringMarketplaces separados por vírgula (veja Marketplaces). Todos se omitido

Requisição

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

Resposta 200

{
  "market_hash_name": "AK-47 | Redline (Field-Tested)",
  "offers": [
    {
      "provider": "buff_163",
      "price": 31.42
    },
    {
      "provider": "cs_float",
      "price": 33.1
    }
  ]
}
  • Na assinatura grátis só a Steam é respondida: sem providers, a resposta traz apenas a Steam, e pedir outro marketplace responde 403. As assinaturas pagas recebem todos os marketplaces.

Ordens de compra

A maior ordem de compra de cada item na DMarket, na Market.CSGO e no Steam: por quanto você pode vender um item agora. A mesma chave, o mesmo limite de 30 dias e as mesmas respostas compactadas das ofertas.

Ordens de compra de muitos itens

GET/v1/orders

A maior ordem de compra de itens em cada marketplace que as tem: DMarket (atualizada a cada poucos segundos), Market.CSGO (a cada 15 minutos) e Steam (a cada hora). Informe até 100 itens com market_hash_name para um lote, ou deixe de fora para receber todos os itens com ordem em uma resposta. Um item sem ordem em nenhum marketplace fica de fora.

Parâmetros

market_hash_namequery, opcional

stringNome de um item. Repita para um lote de até 100. Todos os itens com ordem de compra se omitido

providersquery, opcional

stringMarketplaces separados por vírgula: dmarket, market_csgo, steam. Todos se omitido

Requisição

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

Resposta 200

[
  {
    "market_hash_name": "AK-47 | Redline (Field-Tested)",
    "orders": [
      {
        "provider": "dmarket",
        "price": 24.51
      },
      {
        "provider": "market_csgo",
        "price": 23.822
      }
    ]
  }
]
  • Na assinatura grátis só a Steam é respondida: sem providers, a resposta traz apenas a Steam, e pedir outro marketplace responde 403. As assinaturas pagas recebem todos os marketplaces.
  • Um marketplace sem ordem para um item fica fora das ordens dele.
  • Lembranças, adesivos e grafites estão incluídos. Como nas ofertas, cada requisição respondida conta para o limite de 30 dias, e as respostas são compactadas da mesma forma.

Ordens de compra de um item

GET/v1/orders/{market_hash_name}

A maior ordem de compra de um item em cada marketplace. 404 quando nenhum tem ordem para ele.

Parâmetros

market_hash_namepath

stringO nome do item, codificado para URL

providersquery, opcional

stringMarketplaces separados por vírgula: dmarket, market_csgo, steam. Todos se omitido

Requisição

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

Resposta 200

{
  "market_hash_name": "AK-47 | Redline (Field-Tested)",
  "orders": [
    {
      "provider": "dmarket",
      "price": 24.51
    },
    {
      "provider": "market_csgo",
      "price": 23.822
    }
  ]
}
  • Na assinatura grátis só a Steam é respondida: sem providers, a resposta traz apenas a Steam, e pedir outro marketplace responde 403. As assinaturas pagas recebem todos os marketplaces.

Histórico de vendas

Um resumo das vendas de cada item na DMarket e na Market.CSGO: quantos foram vendidos, o preço mediano e o preço médio nos últimos 7, 15, 30 e 90 dias e quanto costuma vender em 15 dias. A mesma chave, o mesmo limite de 30 dias e as mesmas respostas em gzip das ofertas.

Resumo de vendas de vários itens

GET/v1/sales/summary

Um resumo das vendas dos itens em cada marketplace: DMarket (atualizada a cada poucas horas) e Market.CSGO (mais ou menos a cada hora). Informe até 100 itens com market_hash_name para um lote, ou omita para receber em uma resposta todos os itens vendidos nos últimos 90 dias. Um item sem vendas nos últimos 90 dias fica de fora.

Parâmetros

market_hash_namequery, opcional

stringO nome de um item. Repita para um lote de até 100. Todos os itens vendidos nos últimos 90 dias se omitido

providersquery, opcional

stringMarketplaces separados por vírgula: dmarket, market_csgo. Ambos se omitido

Requisição

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

Resposta 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"
      }
    ]
  }
]
  • Precisa de uma assinatura paga: na grátis, toda requisição responde 403.
  • Em cada período, sales é quantos itens foram vendidos, e median e avg são o preço mediano e o preço médio em USD. median e avg são null em um período sem vendas.
  • index_volume_units (índice de volume em unidades) e index_volume_dollars (índice de volume em dólares) indicam quanto costuma vender em 15 dias: os últimos 90 dias são divididos em seis períodos de 15 dias, e um período sem vendas conta como 0. index_volume_units é a mediana das quantidades vendidas nos períodos, index_volume_dollars a mediana dos totais em USD, então um único trecho muito ativo ou parado não os altera.
  • O resumo é calculado após cada passagem pelas vendas de um marketplace; updated_at indica quando.
  • A Market.CSGO nos mostra no máximo as últimas 6,000 vendas de um item, então os itens mais vendidos podem mostrar last_90d, index_volume_units e index_volume_dollars baixos até termos registrado 90 dias completos.
  • As fases Doppler e Gamma Doppler compartilham nomes de mercado, então um registro cobre todas as fases.
  • Lembranças, adesivos e grafites estão incluídos. Como nas ofertas, cada requisição respondida conta para o limite de 30 dias, e as respostas são compactadas da mesma forma.

Resumo de vendas de um item

GET/v1/sales/summary/{market_hash_name}

Um resumo das vendas de um item em cada marketplace. 404 se nenhum o vendeu nos últimos 90 dias.

Parâmetros

market_hash_namepath

stringO nome do item, codificado para URL

providersquery, opcional

stringMarketplaces separados por vírgula: dmarket, market_csgo. Ambos se omitido

Requisição

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

Resposta 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"
    }
  ]
}
  • Precisa de uma assinatura paga: na grátis, toda requisição responde 403.

Itens

O que é cada item de CS2: tipo, arma, desgaste e faixa de float, qualidade, raridade, coleções e caixas. Para filtrar itens em um marketplace, pelo mesmo market_hash_name de ofertas e ordens. Todas as skins, adesivos, agentes, chaveiros, caixas e o resto, incluindo lembranças. Como nas ofertas, cada requisição respondida conta para o limite de 30 dias.

Muitos itens

GET/v1/items

O que é cada item de CS2: tipo, arma, desgaste e faixa de float, qualidade, raridade, coleções e caixas, um registro por market_hash_name, para filtrar itens em um marketplace. Todos os itens em uma resposta (cerca de 2 MB com gzip), uma página deles com limit e offset, ou até 100 informados com market_hash_name. Os filtros restringem os dois casos.

Parâmetros

market_hash_namequery, opcional

stringNome de um item. Repita para um lote de até 100. Todos os itens se omitido

typequery, opcional

stringskin, sticker, agent, charm, patch, music_kit, graffiti, collectible, container. Separados por vírgula, qualquer um deles

weaponquery, opcional

stringIds de armas: awp, ak-47, karambit, sport-gloves.... Separados por vírgula, qualquer um deles

collectionquery, opcional

stringIds de coleções: the-dust-2-collection.... Separados por vírgula, qualquer um deles

containerquery, opcional

stringIds das caixas e pacotes de onde cai: dreams-nightmares-case.... Separados por vírgula, qualquer um deles

rarityquery, opcional

stringIds de raridade: consumer, industrial, mil-spec, restricted, classified, covert, contraband, e os de adesivos e agentes (high, remarkable, exotic, extraordinary, distinguished, exceptional, superior, master). Separados por vírgula, qualquer um deles

qualityquery, opcional

stringNormal, StatTrak™, Souvenir, ★ ou ★ StatTrak™. Separados por vírgula, qualquer um deles

limitquery, opcional

numberO máximo de itens na resposta, 1 ou mais. Todos os itens quando omitido, e o limit da resposta passa a ser quantos ela traz

offsetquery, opcional

numberItens a pular, para a próxima página

Requisição

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

Resposta 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"
    }
  ]
}
  • Precisa de uma assinatura paga: na grátis, toda requisição responde 403.
  • type é skin para toda skin de arma, faca e luva (category as diferencia: knives, gloves, rifles, pistols, smgs, heavy, equipment), container para caixas, cápsulas e pacotes (category é o tipo: case, sticker_capsule, souvenir_package...).
  • min_float e max_float são os floats que o item pode ter: a faixa da skin dentro do desgaste. null para itens sem float.
  • details traz o que mais se sabe: Tournament, Team, Player e Effect de um adesivo, Side de um agente, data Released de um contêiner.
  • As fases Doppler e Gamma Doppler compartilham nomes de mercado, então um registro cobre todas as fases.
  • Como as requisições de ofertas, cada requisição respondida conta para o limite de 30 dias, não importa quantos itens traga, e as respostas são compactadas com gzip do mesmo jeito.

Um item

GET/v1/items/{market_hash_name}

O que é um item. 404 quando não há item com esse nome.

Parâmetros

market_hash_namepath

stringO nome do item, codificado para URL

Requisição

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

Resposta 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"
}
  • Precisa de uma assinatura paga: na grátis, toda requisição responde 403.

Robô para DMarket

Gerencie suas ofertas e ordens da DMarket com a mesma chave. As contas e suas chaves de API da DMarket são adicionadas só na página do robô, nunca pela API. Rotas de robô precisam de uma assinatura paga e contam só para o limite por minuto, nunca para o de 30 dias.

  • Ofertas: qualquer número por conta. Ordens ("targets" da DMarket): até 100 por conta, limite da própria DMarket.
  • A DMarket não permite alterar o preço de uma ordem: o robô a substitui por uma nova com o novo preço.

Contas e limites

GET/v1/robots/dmarket

Suas contas da DMarket no robô (conectadas com as chaves de API da DMarket na página do robô) e os limites da sua assinatura para ele.

Requisição

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

Resposta 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"
    }
  ]
}
  • Um limite null significa sem limite nosso.
  • paused: a conta está acima do limite de contas da assinatura; suas ofertas e ordens aguardam.
  • enabled: false significa que foi desligado na página do robô: o robô para de movê-lo, ele continua no marketplace pelo último preço e ainda conta para os limites.

Inventário de uma conta

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

Os itens no inventário da DMarket da conta, com o asset_id para vender cada um. sellable é false para itens que a DMarket não deixa anunciar.

Parâmetros

account_idpath

stringO id da conta, de GET /v1/robots/dmarket

Requisição

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

Resposta 200

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

Listar ofertas

GET/v1/robots/dmarket/offers

Suas ofertas na DMarket, em todas as contas, das mais antigas para as mais novas.

Requisição

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

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

Anunciar ou atualizar uma oferta

POST/v1/robots/dmarket/offers

Anuncia um item ou substitui os preços da oferta que ele já tem, encontrada por asset_id. O robô anuncia o item na DMarket e o mantém como a oferta mais barata, nunca abaixo de min_price. Sem concorrência, vende a max_price. Novos preços valem em segundos ou quando o preço destrava: um preço alterado pelo robô fica por 15 minutos.

Parâmetros

asset_idbody

stringO id do item na DMarket, do inventário da conta

min_pricebody

numberUSD, no máximo duas casas decimais

max_pricebody

numberUSD, no máximo duas casas decimais

account_idbody, opcional

stringA conta dona do item. Obrigatória para anunciar

market_hash_namebody, opcional

stringO nome do item. Obrigatório para anunciar

Requisição

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

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

Remover uma oferta

DELETE/v1/robots/dmarket/offers

Esquece a oferta: o robô para de movê-la e o item continua à venda em DMarket pelo último preço.

Parâmetros

asset_idquery

stringO id do item na DMarket, do inventário da conta

Requisição

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

Resposta 200

{
  "removed": true
}
  • removed é false quando o robô não tinha essa oferta.

Listar ordens

GET/v1/robots/dmarket/orders

Suas ordens de compra na DMarket, em todas as contas, das mais antigas para as mais novas.

Requisição

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

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

Criar ou atualizar uma ordem

POST/v1/robots/dmarket/orders

Cria sua ordem para um item em uma conta ou substitui os preços da que já existe. O robô cria uma ordem de compra da DMarket (um "target") e a mantém como a mais alta, nunca acima de max_price. Sem concorrência, oferece min_price. A DMarket permite até 100 ordens por conta. A DMarket não muda o preço de uma ordem: cada novo preço é um novo target no lugar do antigo. Compra 1 item por vez até completar a quantidade, e uma ordem só é criada quando o preço dela cabe no saldo da conta.

Parâmetros

market_hash_namebody

stringO nome do item

min_pricebody

numberUSD, no máximo duas casas decimais

max_pricebody

numberUSD, no máximo duas casas decimais

account_idbody, opcional

stringA conta para comprar. Pode ser omitida se você tem uma conta

amountbody, opcional

numberQuantos comprar, de 1 a 100. Obrigatório para criar; só muda antes de ser colocada

Requisição

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

Resposta 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"
}
  • A quantidade de uma ordem colocada só diminui conforme é executada: remova e adicione de novo para comprar mais.

Remover uma ordem

DELETE/v1/robots/dmarket/orders

Esquece a ordem: o robô para de movê-la e ela continua em DMarket pelo último preço.

Parâmetros

market_hash_namequery

stringO nome do item

account_idquery, opcional

stringA conta onde está a ordem. Pode ser omitida se você tem uma conta

Requisição

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

Resposta 200

{
  "removed": true
}
  • removed é false quando o robô não tinha essa ordem.

Monitor

GET/v1/robots/dmarket/monitor

Todos os itens na DMarket com o lucro de ter a melhor ordem de compra (buy_price, 1 centavo acima da melhor ordem) e depois a oferta mais barata (sell_price, 1 centavo abaixo da mais barata), após a taxa da DMarket para o item. As melhores ordens e ofertas da DMarket são atualizadas a cada poucos segundos, e os preços dos outros marketplaces com a frequência de cada um, de 5 em 5 minutos a cada hora. Só os filtros enviados valem: sem nenhum, todos os itens com ordem, os mais lucrativos primeiro. Um item sem oferta na DMarket também aparece, com best_offer, sell_price, profit e margin_percent null: os filtros de lucro, margem e diferença o deixam passar. dollar_volume e units_volume são o que o item costuma vender na DMarket em 15 dias: a mediana dos últimos 90 dias em seis períodos de 15 dias.

Parâmetros

qquery, opcional

stringPalavras que devem estar todas no nome

min_pricequery, opcional

numberMenor preço de compra, USD

max_pricequery, opcional

numberMaior preço de compra, USD

min_profitquery, opcional

numberMenor lucro após a taxa, USD

min_marginquery, opcional

numberMenor margem, percentual do preço de compra

min_gapquery, opcional

numberMenor diferença entre a melhor ordem e a oferta mais barata, USD

min_liquidityquery, opcional

numberMenor liquidez, de 0 a 100

max_feequery, opcional

numberMaior taxa, percentual

min_units_volumequery, opcional

numberMenos itens vendidos em 15 dias típicos na DMarket (units_volume)

min_dollar_volumequery, opcional

numberMenos USD vendidos em 15 dias típicos na DMarket (dollar_volume)

hidequery, opcional

stringSeparados por vírgula: stickers, graffiti, souvenir, stattrak

comparequery, opcional

stringOutros marketplaces e quantos por cento acima do preço de compra deve estar o menor anúncio deles: buff_163:5,cs_float:3. Um marketplace que não anuncia o item é ignorado. Os preços voltam em compare

compare_ordersquery, opcional

stringO mesmo com as maiores ordens de outros marketplaces: market_csgo:5 (Market.CSGO ou Steam). As ordens voltam em compare_orders

sortquery, opcional

stringprofit (se omitido), margin, liquidity, price ou volume (dollar_volume)

limitquery, opcional

numberItens na resposta, de 1 a 100 (100 se omitido)

offsetquery, opcional

numberItens a pular, para a próxima página

Requisição

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

Resposta 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": {}
    }
  ]
}
  • Precisa de uma assinatura paga, como toda rota de robô. Ao contrário delas, cada requisição respondida também conta para o limite de 30 dias, como as de ofertas, com os mesmos cabeçalhos X-Usage-Limit e X-Usage-Remaining.

Status de ofertas e ordens

pending
Ainda não anunciada nem colocada
active
No marketplace, mantida em primeiro dentro dos seus limites. Um preço alterado pelo robô fica por 15 minutos; depois disso ele acompanha o mercado a cada segundo
paused
Acima das ofertas, ordens ou contas da assinatura: espera você fazer upgrade ou remover outras
sold
Ofertas: vendida
closed
Ofertas: retirada da venda ou o item saiu do inventário. Ordens: comprada por completo ou removida. error diz o motivo, quando há

Robô para market.csgo.com

Gerencie suas ofertas e ordens da Market.CSGO com a mesma chave. As contas e suas chaves de API da Market.CSGO são adicionadas só na página do robô, nunca pela API. Rotas de robô precisam de uma assinatura paga e contam só para o limite por minuto, nunca para o de 30 dias.

  • Ofertas: qualquer número por conta. Ordens: até 100 por conta, uma por item, alteradas no local.
  • A moeda da conta na Market.CSGO deve ser USD. As ofertas só aparecem enquanto você está online no app ou na extensão da Market.CSGO.

Contas e limites

GET/v1/robots/market-csgo

Suas contas da Market.CSGO no robô (conectadas com as chaves de API da Market.CSGO na página do robô) e os limites da sua assinatura para ele. O note da conta diz o que atrapalha a venda, por exemplo estar offline.

Requisição

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

Resposta 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"
    }
  ]
}
  • Um limite null significa sem limite nosso.
  • paused: a conta está acima do limite de contas da assinatura; suas ofertas e ordens aguardam.
  • enabled: false significa que foi desligado na página do robô: o robô para de movê-lo, ele continua no marketplace pelo último preço e ainda conta para os limites.

Inventário de uma conta

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

Os itens da Steam que a Market.CSGO pode vender da conta, com o asset_id para vender cada um.

Parâmetros

account_idpath

stringO id da conta, de GET /v1/robots/market-csgo

Requisição

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

Resposta 200

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

Listar ofertas

GET/v1/robots/market-csgo/offers

Suas ofertas na Market.CSGO, em todas as contas, das mais antigas para as mais novas.

Requisição

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

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

Anunciar ou atualizar uma oferta

POST/v1/robots/market-csgo/offers

Anuncia um item ou substitui os preços da oferta que ele já tem, encontrada por asset_id. O robô coloca o item à venda na Market.CSGO e o mantém como a oferta mais barata, nunca abaixo de min_price. Sem concorrência, vende a max_price. As ofertas só aparecem enquanto a conta está online no app ou na extensão da Market.CSGO. Novos preços valem em segundos ou quando o preço destrava: um preço alterado pelo robô fica por 15 minutos.

Parâmetros

asset_idbody

stringO asset id da Steam do item, do inventário da conta

min_pricebody

numberUSD, no máximo duas casas decimais

max_pricebody

numberUSD, no máximo duas casas decimais

account_idbody, opcional

stringA conta dona do item. Obrigatória para anunciar

market_hash_namebody, opcional

stringO nome do item. Obrigatório para anunciar

Requisição

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

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

Remover uma oferta

DELETE/v1/robots/market-csgo/offers

Esquece a oferta: o robô para de movê-la e o item continua à venda em Market.CSGO pelo último preço.

Parâmetros

asset_idquery

stringO asset id da Steam do item, do inventário da conta

Requisição

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

Resposta 200

{
  "removed": true
}
  • removed é false quando o robô não tinha essa oferta.

Listar ordens

GET/v1/robots/market-csgo/orders

Suas ordens de compra na Market.CSGO, em todas as contas, das mais antigas para as mais novas.

Requisição

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

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

Criar ou atualizar uma ordem

POST/v1/robots/market-csgo/orders

Cria sua ordem para um item em uma conta ou substitui os preços da que já existe. O robô cria uma ordem de compra da Market.CSGO e a mantém como a mais alta, nunca acima de max_price. Sem concorrência, oferece min_price. A Market.CSGO permite uma ordem por item e até 100 por conta, e muda o preço da ordem no local.

Parâmetros

market_hash_namebody

stringO nome do item

min_pricebody

numberUSD, no máximo duas casas decimais

max_pricebody

numberUSD, no máximo duas casas decimais

account_idbody, opcional

stringA conta para comprar. Pode ser omitida se você tem uma conta

amountbody, opcional

numberQuantos comprar, de 1 a 100. Obrigatório para criar; só muda antes de ser colocada

Requisição

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

Resposta 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"
}
  • A quantidade de uma ordem colocada só diminui conforme é executada: remova e adicione de novo para comprar mais.

Remover uma ordem

DELETE/v1/robots/market-csgo/orders

Esquece a ordem: o robô para de movê-la e ela continua em Market.CSGO pelo último preço.

Parâmetros

market_hash_namequery

stringO nome do item

account_idquery, opcional

stringA conta onde está a ordem. Pode ser omitida se você tem uma conta

Requisição

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

Resposta 200

{
  "removed": true
}
  • removed é false quando o robô não tinha essa ordem.

Status de ofertas e ordens

pending
Ainda não anunciada nem colocada
active
No marketplace, mantida em primeiro dentro dos seus limites. Um preço alterado pelo robô fica por 15 minutos; depois disso ele acompanha o mercado a cada segundo
paused
Acima das ofertas, ordens ou contas da assinatura: espera você fazer upgrade ou remover outras
sold
Ofertas: vendida
closed
Ofertas: retirada da venda ou o item saiu do inventário. Ordens: comprada por completo ou removida. error diz o motivo, quando há

Limites e erros

Dois limites, ambos por assinatura. Cada requisição conta para o limite por minuto; uma acima dele recebe 429 com um cabeçalho Retry-After em segundos. Cada requisição respondida de ofertas, ordens de compra, vendas, itens ou do monitor também conta para o limite de 30 dias, não importa quantos itens peça; a contagem recomeça a cada 30 dias desde o início da sua assinatura, e os cabeçalhos X-Usage-Limit e X-Usage-Remaining mostram onde você está.

AssinaturaRequisições / minutoRequisições de ofertas e ordens / 30 dias
Grátis60100
Trader1205,000
Pro30025,000
Business300100,000
400
Algo está errado na requisição: provedor ou tipo de item desconhecido, corpo inválido, mais de 100 itens, limite fora do intervalo
401
A chave está ausente ou incorreta
403
É preciso uma assinatura paga: para todo marketplace exceto a Steam, as rotas de resumo de vendas e de itens, e as de robô e monitor
404
Item, robô ou conta inexistente
409
Não é possível agora: acima das ofertas, ordens ou contas da assinatura, ou alteração da quantidade de uma ordem colocada
429
O limite por minuto (espere Retry-After segundos) ou o limite de 30 dias foi atingido
502
O marketplace não respondeu ao robô; tente novamente