API Skins

API

Documentation API

Les prix de chaque skin CS2 sur 22 marketplaces et vos robots de trading, depuis votre propre code. Une seule clé pour les deux.

Premiers pas

Chaque requête va à https://api.apiskins.com et nécessite votre clé dans l'en-tête X-API-KEY. Les réponses sont en JSON ; les prix en USD.

Une requête qui échoue répond avec un statut HTTP et un message d'erreur en JSON. Limites et erreurs

Toute l'API est aussi un document OpenAPI, pour les générateurs de code et les agents IA.

Marketplaces

Les noms de fournisseurs à indiquer dans providers et à attendre dans les réponses. Chaque marketplace a des offres ; seules celles marquées ont aussi des ordres d'achat.

cs_floatCSFloat
buff_163Buff.163
youpinYouPin898
dmarketOrdres d'achatDMarket
skinportSkinport
cs_moneycs.money
market_csgoOrdres d'achatMarket.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
steamOrdres d'achatSteam
sihSIH Market

Offres

L'offre la moins chère (prix le plus bas) de chaque article sur chaque marketplace suivie. Les réponses sont compressées en gzip pour les clients qui l'acceptent : chaque article de chaque marketplace tient donc en une seule requête.

Nous suivons les skins d'armes (normaux et StatTrak™), couteaux, gants, caisses et capsules, agents, kits de musique, écussons, porte-bonheur, pin's et passes. Les articles souvenirs, stickers et graffitis ne sont pas suivis.

Offres de plusieurs articles

GET/v1/offers

L'offre la moins chère (prix le plus bas) des articles sur chaque marketplace. Indiquez jusqu'à 100 articles avec market_hash_name pour un lot, ou omettez-le pour tous les articles proposés en une réponse. Un article proposé nulle part est absent de la réponse.

Paramètres

market_hash_namequery, facultatif

stringLe nom d'un article. Répétez-le pour un lot de 100 maximum. Tous les articles proposés si omis

providersquery, facultatif

stringMarketplaces séparées par des virgules (voir Marketplaces). Toutes si omis

Requête

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

Réponse 200

[
  {
    "market_hash_name": "AK-47 | Redline (Field-Tested)",
    "offers": [
      {
        "provider": "buff_163",
        "price": 31.42
      },
      {
        "provider": "cs_float",
        "price": 33.1
      }
    ]
  }
]
  • Avec l'abonnement gratuit, seul Steam est renvoyé : sans providers, la réponse ne contient que Steam, et demander une autre marketplace renvoie 403. Les abonnements payants reçoivent toutes les marketplaces.
  • Une marketplace qui ne propose pas un article est absente de ses offres.
  • Les réponses sont compressées en gzip pour les clients qui l'acceptent (toute bibliothèque HTTP ; avec curl, ajoutez --compressed) : chaque article de chaque marketplace représente environ 28 MB de JSON, moins de 2 MB en gzip.

Offres d'un article

GET/v1/offers/{market_hash_name}

L'offre la moins chère d'un article sur chaque marketplace. 404 si aucune ne le propose.

Paramètres

market_hash_namepath

stringLe nom de l'article, encodé pour l'URL

providersquery, facultatif

stringMarketplaces séparées par des virgules (voir Marketplaces). Toutes si omis

Requête

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

Réponse 200

{
  "market_hash_name": "AK-47 | Redline (Field-Tested)",
  "offers": [
    {
      "provider": "buff_163",
      "price": 31.42
    },
    {
      "provider": "cs_float",
      "price": 33.1
    }
  ]
}
  • Avec l'abonnement gratuit, seul Steam est renvoyé : sans providers, la réponse ne contient que Steam, et demander une autre marketplace renvoie 403. Les abonnements payants reçoivent toutes les marketplaces.

Ordres d'achat

L'ordre d'achat le plus élevé de chaque article sur DMarket, Market.CSGO et Steam : ce que vous pouvez obtenir d'un article maintenant. La même clé, la même limite de 30 jours et les mêmes réponses compressées que les offres.

Ordres d'achat de plusieurs articles

GET/v1/orders

L'ordre d'achat le plus élevé des articles sur chaque marketplace qui en a : DMarket (actualisé toutes les quelques secondes), Market.CSGO (toutes les 15 minutes) et Steam (toutes les heures). Indiquez jusqu'à 100 articles avec market_hash_name pour un lot, ou omettez-le pour tous les articles ayant un ordre en une réponse. Un article sans ordre nulle part est absent.

Paramètres

market_hash_namequery, facultatif

stringLe nom d'un article. Répétez-le pour un lot de 100 maximum. Tous les articles ayant un ordre si omis

providersquery, facultatif

stringMarketplaces séparées par des virgules : dmarket, market_csgo, steam. Toutes si omis

Requête

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

Réponse 200

[
  {
    "market_hash_name": "AK-47 | Redline (Field-Tested)",
    "orders": [
      {
        "provider": "dmarket",
        "price": 24.51
      },
      {
        "provider": "market_csgo",
        "price": 23.822
      }
    ]
  }
]
  • Avec l'abonnement gratuit, seul Steam est renvoyé : sans providers, la réponse ne contient que Steam, et demander une autre marketplace renvoie 403. Les abonnements payants reçoivent toutes les marketplaces.
  • Une marketplace sans ordre pour un article est absente de ses ordres.
  • Souvenirs, stickers et graffitis sont inclus. Comme pour les offres, chaque requête traitée compte dans la limite de 30 jours, et les réponses sont compressées de la même façon.

Ordres d'achat d'un article

GET/v1/orders/{market_hash_name}

L'ordre d'achat le plus élevé d'un article sur chaque marketplace. 404 si aucune n'en a.

Paramètres

market_hash_namepath

stringLe nom de l'article, encodé pour l'URL

providersquery, facultatif

stringMarketplaces séparées par des virgules : dmarket, market_csgo, steam. Toutes si omis

Requête

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

Réponse 200

{
  "market_hash_name": "AK-47 | Redline (Field-Tested)",
  "orders": [
    {
      "provider": "dmarket",
      "price": 24.51
    },
    {
      "provider": "market_csgo",
      "price": 23.822
    }
  ]
}
  • Avec l'abonnement gratuit, seul Steam est renvoyé : sans providers, la réponse ne contient que Steam, et demander une autre marketplace renvoie 403. Les abonnements payants reçoivent toutes les marketplaces.

Historique des ventes

Un résumé des ventes de chaque article sur DMarket et Market.CSGO : combien ont été vendus, le prix médian et le prix moyen sur les 7, 15, 30 et 90 derniers jours, et ce que rapportent 15 jours typiques. La même clé, la même limite de 30 jours et les mêmes réponses gzip que pour les offres.

Résumé des ventes de plusieurs articles

GET/v1/sales/summary

Un résumé des ventes des articles sur chaque marketplace : DMarket (actualisé toutes les quelques heures) et Market.CSGO (environ toutes les heures). Indiquez jusqu'à 100 articles avec market_hash_name pour un lot, ou omettez-le pour tous les articles vendus ces 90 derniers jours en une réponse. Un article sans vente ces 90 derniers jours est absent.

Paramètres

market_hash_namequery, facultatif

stringLe nom d'un article. Répétez-le pour un lot de 100 maximum. Tous les articles vendus ces 90 derniers jours si omis

providersquery, facultatif

stringMarketplaces séparées par des virgules : dmarket, market_csgo. Les deux si omis

Requête

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

Réponse 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"
      }
    ]
  }
]
  • Nécessite un abonnement payant : avec l'abonnement gratuit, chaque requête renvoie 403.
  • Dans chaque période, sales indique combien d'articles ont été vendus, median et avg leur prix médian et moyen en USD. median et avg valent null pour une période sans vente.
  • index_volume_units (indice de volume en unités) et index_volume_dollars (indice de volume en dollars) indiquent ce que rapportent 15 jours typiques : les 90 derniers jours sont divisés en six périodes de 15 jours, une période sans vente comptant pour 0. index_volume_units est la médiane des nombres d'articles vendus par période, index_volume_dollars la médiane de leurs totaux en USD : une seule période très active ou morte ne les change donc pas.
  • Un résumé est calculé après chaque passage sur les ventes d'une marketplace ; updated_at indique quand.
  • Market.CSGO nous montre au plus les 6,000 dernières ventes d'un article : ses articles les plus vendus peuvent donc afficher des last_90d, index_volume_units et index_volume_dollars bas tant que nous n'avons pas enregistré 90 jours complets.
  • Les phases Doppler et Gamma Doppler partagent leurs noms de marché : un seul enregistrement couvre donc toutes les phases.
  • Souvenirs, stickers et graffitis sont inclus. Comme pour les offres, chaque requête traitée compte dans la limite de 30 jours, et les réponses sont compressées de la même façon.

Résumé des ventes d'un article

GET/v1/sales/summary/{market_hash_name}

Un résumé des ventes d'un article sur chaque marketplace. 404 si aucune ne l'a vendu ces 90 derniers jours.

Paramètres

market_hash_namepath

stringLe nom de l'article, encodé pour l'URL

providersquery, facultatif

stringMarketplaces séparées par des virgules : dmarket, market_csgo. Les deux si omis

Requête

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

Réponse 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"
    }
  ]
}
  • Nécessite un abonnement payant : avec l'abonnement gratuit, chaque requête renvoie 403.

Articles

Ce qu'est chaque article CS2 : son type, son arme, son usure et sa plage de float, sa qualité, sa rareté, ses collections et ses caisses. Pour filtrer les articles sur une marketplace, avec le même market_hash_name que les offres et ordres. Chaque skin, sticker, agent, porte-bonheur, caisse et le reste, souvenirs compris. Comme pour les offres, chaque requête qui reçoit une réponse compte dans la limite sur 30 jours.

Plusieurs articles

GET/v1/items

Ce qu'est chaque article CS2 : type, arme, usure et plage de float, qualité, rareté, collections et caisses, un enregistrement par market_hash_name, pour filtrer les articles sur une marketplace. Tous les articles en une seule réponse (environ 2 Mo en gzip), une page avec limit et offset, ou jusqu'à 100 indiqués avec market_hash_name. Les filtres réduisent les deux cas.

Paramètres

market_hash_namequery, facultatif

stringLe nom d'un article. Répétez-le pour un lot de 100 maximum. Tous les articles si omis

typequery, facultatif

stringskin, sticker, agent, charm, patch, music_kit, graffiti, collectible, container. Séparés par des virgules, n'importe lequel

weaponquery, facultatif

stringIds d'armes : awp, ak-47, karambit, sport-gloves.... Séparés par des virgules, n'importe lequel

collectionquery, facultatif

stringIds de collections : the-dust-2-collection.... Séparés par des virgules, n'importe lequel

containerquery, facultatif

stringIds des caisses et paquets d'où il provient : dreams-nightmares-case.... Séparés par des virgules, n'importe lequel

rarityquery, facultatif

stringIds de rareté : consumer, industrial, mil-spec, restricted, classified, covert, contraband, et ceux des stickers et agents (high, remarkable, exotic, extraordinary, distinguished, exceptional, superior, master). Séparés par des virgules, n'importe lequel

qualityquery, facultatif

stringNormal, StatTrak™, Souvenir, ★ ou ★ StatTrak™. Séparés par des virgules, n'importe lequel

limitquery, facultatif

numberLe nombre maximal d'objets dans la réponse, 1 ou plus. Tous les objets s'il est omis, et le limit de la réponse est alors le nombre qu'elle contient

offsetquery, facultatif

numberArticles à ignorer, pour la page suivante

Requête

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

Réponse 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"
    }
  ]
}
  • Nécessite un abonnement payant : avec l'abonnement gratuit, chaque requête renvoie 403.
  • type vaut skin pour chaque skin d'arme, couteau et gant (category les distingue : knives, gloves, rifles, pistols, smgs, heavy, equipment), container pour les caisses, capsules et paquets (category est leur genre : case, sticker_capsule, souvenir_package...).
  • min_float et max_float sont les floats possibles de l'article : la plage propre du skin dans son usure. null pour les articles sans float.
  • details contient le reste : Tournament, Team, Player et Effect d'un sticker, Side d'un agent, date Released d'un conteneur.
  • Les phases Doppler et Gamma Doppler partagent leurs noms de marché : un seul enregistrement couvre donc toutes les phases.
  • Comme les requêtes d'offres, chaque requête qui reçoit une réponse compte dans la limite sur 30 jours, quel que soit le nombre d'objets, et les réponses sont compressées en gzip de la même façon.

Un article

GET/v1/items/{market_hash_name}

Ce qu'est un article. 404 si aucun article ne porte ce nom.

Paramètres

market_hash_namepath

stringLe nom de l'article, encodé pour l'URL

Requête

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

Réponse 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"
}
  • Nécessite un abonnement payant : avec l'abonnement gratuit, chaque requête renvoie 403.

Robot pour DMarket

Gérez vos offres et ordres DMarket avec la même clé. Les comptes et leurs clés API DMarket s'ajoutent uniquement sur la page du robot, jamais via l'API. Les routes de robot nécessitent un abonnement payant et comptent uniquement dans la limite par minute, jamais dans la limite de 30 jours.

  • Offres : nombre illimité par compte. Ordres (« targets » DMarket) : jusqu'à 100 par compte, limite propre à DMarket.
  • DMarket ne permet pas de modifier le prix d'un ordre : le robot le remplace par un nouveau au nouveau prix.

Comptes et limites

GET/v1/robots/dmarket

Vos comptes DMarket sur le robot (connectés avec leurs clés API DMarket sur la page du robot) et les limites de votre abonnement pour celui-ci.

Requête

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

Réponse 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"
    }
  ]
}
  • Une limite null signifie aucune limite de notre part.
  • paused : le compte dépasse les comptes de votre abonnement ; ses offres et ordres attendent.
  • enabled: false signifie désactivé sur la page du robot : le robot ne le déplace plus, il reste sur la place de marché à son dernier prix et compte toujours dans les limites.

Inventaire d'un compte

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

Les articles de l'inventaire DMarket du compte, avec l'asset_id pour vendre chacun. sellable vaut false pour les articles que DMarket ne permet pas de mettre en vente.

Paramètres

account_idpath

stringL'id du compte, depuis GET /v1/robots/dmarket

Requête

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

Réponse 200

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

Lister les offres

GET/v1/robots/dmarket/offers

Vos offres sur DMarket, sur tous vos comptes, les plus anciennes d'abord.

Requête

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

Réponse 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"
  }
]

Mettre en vente ou mettre à jour une offre

POST/v1/robots/dmarket/offers

Met un article en vente ou remplace les prix de son offre existante, retrouvée par asset_id. Le robot met l'article en vente sur DMarket et le garde l'offre la moins chère, jamais sous min_price. Sans concurrence, il vend à max_price. Les nouveaux prix s'appliquent en quelques secondes ou au déverrouillage du prix : un prix modifié par le robot reste 15 minutes.

Paramètres

asset_idbody

stringL'id DMarket de l'article, depuis l'inventaire du compte

min_pricebody

numberUSD, deux décimales au plus

max_pricebody

numberUSD, deux décimales au plus

account_idbody, facultatif

stringLe compte propriétaire de l'article. Requis pour le mettre en vente

market_hash_namebody, facultatif

stringLe nom de l'article. Requis pour le mettre en vente

Requête

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

Réponse 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"
}

Retirer une offre

DELETE/v1/robots/dmarket/offers

Oublie l'offre : le robot ne la déplace plus et l'objet reste en vente sur DMarket à son dernier prix.

Paramètres

asset_idquery

stringL'id DMarket de l'article, depuis l'inventaire du compte

Requête

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

Réponse 200

{
  "removed": true
}
  • removed vaut false si le robot n'avait pas cette offre.

Lister les ordres

GET/v1/robots/dmarket/orders

Vos ordres d'achat sur DMarket, sur tous vos comptes, les plus anciens d'abord.

Requête

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

Réponse 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"
  }
]

Placer ou mettre à jour un ordre

POST/v1/robots/dmarket/orders

Place votre ordre pour un article sur un compte, ou remplace les prix de l'ordre existant. Le robot place un ordre d'achat DMarket (un « target ») et le garde le plus élevé, jamais au-dessus de max_price. Sans concurrence, il propose min_price. DMarket autorise jusqu'à 100 ordres par compte. DMarket ne peut pas modifier le prix d'un ordre : chaque nouveau prix est un nouveau target à la place de l'ancien. Il achète 1 objet à la fois jusqu'à atteindre la quantité, et un ordre n'est placé que si son prix ne dépasse pas le solde du compte.

Paramètres

market_hash_namebody

stringLe nom de l'article

min_pricebody

numberUSD, deux décimales au plus

max_pricebody

numberUSD, deux décimales au plus

account_idbody, facultatif

stringLe compte qui achète. Peut être omis si vous avez un seul compte

amountbody, facultatif

numberQuantité à acheter, de 1 à 100. Requise pour placer un ordre ; modifiable uniquement avant son placement

Requête

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

Réponse 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"
}
  • La quantité d'un ordre placé ne fait que diminuer à son exécution : retirez-le et ajoutez-le à nouveau pour acheter plus.

Retirer un ordre

DELETE/v1/robots/dmarket/orders

Oublie l'ordre : le robot ne le déplace plus et il reste sur DMarket à son dernier prix.

Paramètres

market_hash_namequery

stringLe nom de l'article

account_idquery, facultatif

stringLe compte de l'ordre. Peut être omis si vous avez un seul compte

Requête

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

Réponse 200

{
  "removed": true
}
  • removed vaut false si le robot n'avait pas cet ordre.

Moniteur

GET/v1/robots/dmarket/monitor

Chaque article sur DMarket avec le profit à devenir son meilleur ordre d'achat (buy_price, 1 centime au-dessus du meilleur ordre) puis son offre la moins chère (sell_price, 1 centime sous la moins chère), après les frais DMarket de cet article. Les meilleurs ordres et offres de DMarket sont actualisés toutes les quelques secondes, les prix des autres marketplaces aussi souvent que chacune se met à jour, de toutes les 5 minutes à toutes les heures. Seuls les filtres envoyés s'appliquent : sans filtre, chaque article ayant un ordre, les plus rentables d'abord. Un article sans offre sur DMarket apparaît aussi, avec best_offer, sell_price, profit et margin_percent à null : les filtres de profit, marge et écart le laissent passer. dollar_volume et units_volume indiquent ce qui se vend habituellement sur DMarket en 15 jours : la médiane des 90 derniers jours en six tranches de 15 jours.

Paramètres

qquery, facultatif

stringMots qui doivent tous figurer dans le nom

min_pricequery, facultatif

numberPrix d'achat le plus bas, USD

max_pricequery, facultatif

numberPrix d'achat le plus haut, USD

min_profitquery, facultatif

numberProfit le plus bas après frais, USD

min_marginquery, facultatif

numberMarge la plus basse, en pourcentage du prix d'achat

min_gapquery, facultatif

numberÉcart le plus bas entre le meilleur ordre et l'offre la moins chère, USD

min_liquidityquery, facultatif

numberLiquidité la plus basse, de 0 à 100

max_feequery, facultatif

numberFrais les plus élevés, en pourcentage

min_units_volumequery, facultatif

numberMinimum d'articles vendus sur 15 jours typiques sur DMarket (units_volume)

min_dollar_volumequery, facultatif

numberMinimum d'USD vendus sur 15 jours typiques sur DMarket (dollar_volume)

hidequery, facultatif

stringSéparés par des virgules : stickers, graffiti, souvenir, stattrak

comparequery, facultatif

stringAutres marketplaces et pourcentage minimal de leur prix le plus bas au-dessus du prix d'achat : buff_163:5,cs_float:3. Une marketplace qui ne propose pas l'article est ignorée. Leurs prix reviennent dans compare

compare_ordersquery, facultatif

stringIdem avec les ordres d'achat les plus élevés d'autres marketplaces : market_csgo:5 (Market.CSGO ou Steam). Leurs ordres reviennent dans compare_orders

sortquery, facultatif

stringprofit (si omis), margin, liquidity, price ou volume (dollar_volume)

limitquery, facultatif

numberArticles dans la réponse, de 1 à 100 (100 si omis)

offsetquery, facultatif

numberArticles à ignorer, pour la page suivante

Requête

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

Réponse 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": {}
    }
  ]
}
  • Nécessite un abonnement payant, comme toutes les routes de robot. Contrairement à elles, chaque requête qui reçoit une réponse compte aussi dans la limite sur 30 jours, comme les requêtes d'offres, avec les mêmes en-têtes X-Usage-Limit et X-Usage-Remaining.

Statuts des offres et ordres

pending
Pas encore mise en vente ni placée
active
Sur la marketplace, gardée en tête dans vos limites. Un prix modifié par le robot reste 15 minutes ; ensuite, il surveille le marché chaque seconde
paused
Au-delà des offres, ordres ou comptes de votre abonnement : attend que vous changiez de formule ou en retiriez d'autres
sold
Offres : vendue
closed
Offres : retirée de la vente ou article sorti de l'inventaire. Ordres : acheté en totalité ou retiré. error indique la raison s'il y en a une

Robot pour market.csgo.com

Gérez vos offres et ordres Market.CSGO avec la même clé. Les comptes et leurs clés API Market.CSGO s'ajoutent uniquement sur la page du robot, jamais via l'API. Les routes de robot nécessitent un abonnement payant et comptent uniquement dans la limite par minute, jamais dans la limite de 30 jours.

  • Offres : nombre illimité par compte. Ordres : jusqu'à 100 par compte, un par article, modifiés sur place.
  • La devise du compte sur Market.CSGO doit être l'USD. Les offres ne s'affichent que lorsque vous êtes en ligne dans l'application ou l'extension de Market.CSGO.

Comptes et limites

GET/v1/robots/market-csgo

Vos comptes Market.CSGO sur le robot (connectés avec leurs clés API Market.CSGO sur la page du robot) et les limites de votre abonnement pour celui-ci. Le champ note d'un compte indique ce qui empêche la vente, par exemple être hors ligne.

Requête

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

Réponse 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"
    }
  ]
}
  • Une limite null signifie aucune limite de notre part.
  • paused : le compte dépasse les comptes de votre abonnement ; ses offres et ordres attendent.
  • enabled: false signifie désactivé sur la page du robot : le robot ne le déplace plus, il reste sur la place de marché à son dernier prix et compte toujours dans les limites.

Inventaire d'un compte

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

Les articles Steam que Market.CSGO peut vendre depuis le compte, avec l'asset_id pour vendre chacun.

Paramètres

account_idpath

stringL'id du compte, depuis GET /v1/robots/market-csgo

Requête

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

Réponse 200

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

Lister les offres

GET/v1/robots/market-csgo/offers

Vos offres sur Market.CSGO, sur tous vos comptes, les plus anciennes d'abord.

Requête

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

Réponse 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"
  }
]

Mettre en vente ou mettre à jour une offre

POST/v1/robots/market-csgo/offers

Met un article en vente ou remplace les prix de son offre existante, retrouvée par asset_id. Le robot met l'article en vente sur Market.CSGO et le garde l'offre la moins chère, jamais sous min_price. Sans concurrence, il vend à max_price. Les offres n'apparaissent que lorsque le compte est en ligne dans l'application ou l'extension de Market.CSGO. Les nouveaux prix s'appliquent en quelques secondes ou au déverrouillage du prix : un prix modifié par le robot reste 15 minutes.

Paramètres

asset_idbody

stringL'asset id Steam de l'article, depuis l'inventaire du compte

min_pricebody

numberUSD, deux décimales au plus

max_pricebody

numberUSD, deux décimales au plus

account_idbody, facultatif

stringLe compte propriétaire de l'article. Requis pour le mettre en vente

market_hash_namebody, facultatif

stringLe nom de l'article. Requis pour le mettre en vente

Requête

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

Réponse 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"
}

Retirer une offre

DELETE/v1/robots/market-csgo/offers

Oublie l'offre : le robot ne la déplace plus et l'objet reste en vente sur Market.CSGO à son dernier prix.

Paramètres

asset_idquery

stringL'asset id Steam de l'article, depuis l'inventaire du compte

Requête

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

Réponse 200

{
  "removed": true
}
  • removed vaut false si le robot n'avait pas cette offre.

Lister les ordres

GET/v1/robots/market-csgo/orders

Vos ordres d'achat sur Market.CSGO, sur tous vos comptes, les plus anciens d'abord.

Requête

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

Réponse 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"
  }
]

Placer ou mettre à jour un ordre

POST/v1/robots/market-csgo/orders

Place votre ordre pour un article sur un compte, ou remplace les prix de l'ordre existant. Le robot place un ordre d'achat Market.CSGO et le garde le plus élevé, jamais au-dessus de max_price. Sans concurrence, il propose min_price. Market.CSGO autorise un ordre par article et jusqu'à 100 par compte, et modifie le prix sur place.

Paramètres

market_hash_namebody

stringLe nom de l'article

min_pricebody

numberUSD, deux décimales au plus

max_pricebody

numberUSD, deux décimales au plus

account_idbody, facultatif

stringLe compte qui achète. Peut être omis si vous avez un seul compte

amountbody, facultatif

numberQuantité à acheter, de 1 à 100. Requise pour placer un ordre ; modifiable uniquement avant son placement

Requête

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

Réponse 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"
}
  • La quantité d'un ordre placé ne fait que diminuer à son exécution : retirez-le et ajoutez-le à nouveau pour acheter plus.

Retirer un ordre

DELETE/v1/robots/market-csgo/orders

Oublie l'ordre : le robot ne le déplace plus et il reste sur Market.CSGO à son dernier prix.

Paramètres

market_hash_namequery

stringLe nom de l'article

account_idquery, facultatif

stringLe compte de l'ordre. Peut être omis si vous avez un seul compte

Requête

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

Réponse 200

{
  "removed": true
}
  • removed vaut false si le robot n'avait pas cet ordre.

Statuts des offres et ordres

pending
Pas encore mise en vente ni placée
active
Sur la marketplace, gardée en tête dans vos limites. Un prix modifié par le robot reste 15 minutes ; ensuite, il surveille le marché chaque seconde
paused
Au-delà des offres, ordres ou comptes de votre abonnement : attend que vous changiez de formule ou en retiriez d'autres
sold
Offres : vendue
closed
Offres : retirée de la vente ou article sorti de l'inventaire. Ordres : acheté en totalité ou retiré. error indique la raison s'il y en a une

Limites et erreurs

Deux limites, toutes deux par abonnement. Chaque requête compte dans la limite par minute ; une requête au-delà reçoit 429 avec un en-tête Retry-After en secondes. Chaque requête d'offres, d'ordres d'achat, de ventes, d'objets ou du moniteur qui reçoit une réponse compte aussi dans la limite sur 30 jours, quel que soit le nombre d'objets demandés ; le compte repart à zéro tous les 30 jours depuis le début de votre abonnement, et les en-têtes X-Usage-Limit et X-Usage-Remaining indiquent où vous en êtes.

AbonnementRequêtes / minuteRequêtes d'offres et d'ordres / 30 jours
Gratuit60100
Trader1205,000
Pro30025,000
Business300100,000
400
Un élément de la requête est incorrect : fournisseur ou type d'article inconnu, corps invalide, plus de 100 articles, limite hors plage
401
La clé est manquante ou incorrecte
403
Un abonnement payant est nécessaire : pour toute marketplace autre que Steam, les routes de résumé des ventes et d'objets, et celles de robot et de moniteur
404
Article, robot ou compte inexistant
409
Impossible pour l'instant : au-delà des offres, ordres ou comptes de l'abonnement, ou modification de la quantité d'un ordre placé
429
La limite par minute (attendez Retry-After secondes) ou la limite sur 30 jours est atteinte
502
La marketplace n'a pas répondu au robot ; réessayez