API
Documentation API
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_floatCSFloatbuff_163Buff.163youpinYouPin898dmarketOrdres d'achatDMarketskinportSkinportcs_moneycs.moneymarket_csgoOrdres d'achatMarket.CSGObuff_marketBuff.MarketwaxpeerWaxpeerlis_skinsLis-skinsskin_baronSkinBaronhalo_skinsHaloSkinswhite_marketWhite.Marketshadow_payShadowPayskinsSKINSskin_swapSkinSwapcs_dealsCS.Dealsloot_farmLoot.farmcs_tradeCS.TRADEtradeitTradeit.ggsteamOrdres d'achatSteamsihSIH MarketOffres
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
/v1/offersL'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, facultatifstringLe nom d'un article. Répétez-le pour un lot de 100 maximum. Tous les articles proposés si omis
providersquery, facultatifstringMarketplaces 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
/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_namepathstringLe nom de l'article, encodé pour l'URL
providersquery, facultatifstringMarketplaces 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
/v1/ordersL'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, facultatifstringLe nom d'un article. Répétez-le pour un lot de 100 maximum. Tous les articles ayant un ordre si omis
providersquery, facultatifstringMarketplaces 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
/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_namepathstringLe nom de l'article, encodé pour l'URL
providersquery, facultatifstringMarketplaces 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
/v1/sales/summaryUn 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, facultatifstringLe 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, facultatifstringMarketplaces 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
/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_namepathstringLe nom de l'article, encodé pour l'URL
providersquery, facultatifstringMarketplaces 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
/v1/itemsCe 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, facultatifstringLe nom d'un article. Répétez-le pour un lot de 100 maximum. Tous les articles si omis
typequery, facultatifstringskin, sticker, agent, charm, patch, music_kit, graffiti, collectible, container. Séparés par des virgules, n'importe lequel
weaponquery, facultatifstringIds d'armes : awp, ak-47, karambit, sport-gloves.... Séparés par des virgules, n'importe lequel
collectionquery, facultatifstringIds de collections : the-dust-2-collection.... Séparés par des virgules, n'importe lequel
containerquery, facultatifstringIds des caisses et paquets d'où il provient : dreams-nightmares-case.... Séparés par des virgules, n'importe lequel
rarityquery, facultatifstringIds 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, facultatifstringNormal, StatTrak™, Souvenir, ★ ou ★ StatTrak™. Séparés par des virgules, n'importe lequel
limitquery, facultatifnumberLe 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, facultatifnumberArticles à 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
/v1/items/{market_hash_name}Ce qu'est un article. 404 si aucun article ne porte ce nom.
Paramètres
market_hash_namepathstringLe 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
/v1/robots/dmarketVos 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
/v1/robots/dmarket/accounts/{account_id}/inventoryLes 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_idpathstringL'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
/v1/robots/dmarket/offersVos 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
/v1/robots/dmarket/offersMet 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_idbodystringL'id DMarket de l'article, depuis l'inventaire du compte
min_pricebodynumberUSD, deux décimales au plus
max_pricebodynumberUSD, deux décimales au plus
account_idbody, facultatifstringLe compte propriétaire de l'article. Requis pour le mettre en vente
market_hash_namebody, facultatifstringLe 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
/v1/robots/dmarket/offersOublie l'offre : le robot ne la déplace plus et l'objet reste en vente sur DMarket à son dernier prix.
Paramètres
asset_idquerystringL'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
/v1/robots/dmarket/ordersVos 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
/v1/robots/dmarket/ordersPlace 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_namebodystringLe nom de l'article
min_pricebodynumberUSD, deux décimales au plus
max_pricebodynumberUSD, deux décimales au plus
account_idbody, facultatifstringLe compte qui achète. Peut être omis si vous avez un seul compte
amountbody, facultatifnumberQuantité à 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
/v1/robots/dmarket/ordersOublie l'ordre : le robot ne le déplace plus et il reste sur DMarket à son dernier prix.
Paramètres
market_hash_namequerystringLe nom de l'article
account_idquery, facultatifstringLe 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
/v1/robots/dmarket/monitorChaque 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, facultatifstringMots qui doivent tous figurer dans le nom
min_pricequery, facultatifnumberPrix d'achat le plus bas, USD
max_pricequery, facultatifnumberPrix d'achat le plus haut, USD
min_profitquery, facultatifnumberProfit le plus bas après frais, USD
min_marginquery, facultatifnumberMarge la plus basse, en pourcentage du prix d'achat
min_gapquery, facultatifnumberÉcart le plus bas entre le meilleur ordre et l'offre la moins chère, USD
min_liquidityquery, facultatifnumberLiquidité la plus basse, de 0 à 100
max_feequery, facultatifnumberFrais les plus élevés, en pourcentage
min_units_volumequery, facultatifnumberMinimum d'articles vendus sur 15 jours typiques sur DMarket (units_volume)
min_dollar_volumequery, facultatifnumberMinimum d'USD vendus sur 15 jours typiques sur DMarket (dollar_volume)
hidequery, facultatifstringSéparés par des virgules : stickers, graffiti, souvenir, stattrak
comparequery, facultatifstringAutres 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, facultatifstringIdem 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, facultatifstringprofit (si omis), margin, liquidity, price ou volume (dollar_volume)
limitquery, facultatifnumberArticles dans la réponse, de 1 à 100 (100 si omis)
offsetquery, facultatifnumberArticles à 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
/v1/robots/market-csgoVos 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
/v1/robots/market-csgo/accounts/{account_id}/inventoryLes articles Steam que Market.CSGO peut vendre depuis le compte, avec l'asset_id pour vendre chacun.
Paramètres
account_idpathstringL'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
/v1/robots/market-csgo/offersVos 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
/v1/robots/market-csgo/offersMet 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_idbodystringL'asset id Steam de l'article, depuis l'inventaire du compte
min_pricebodynumberUSD, deux décimales au plus
max_pricebodynumberUSD, deux décimales au plus
account_idbody, facultatifstringLe compte propriétaire de l'article. Requis pour le mettre en vente
market_hash_namebody, facultatifstringLe 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
/v1/robots/market-csgo/offersOublie l'offre : le robot ne la déplace plus et l'objet reste en vente sur Market.CSGO à son dernier prix.
Paramètres
asset_idquerystringL'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
/v1/robots/market-csgo/ordersVos 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
/v1/robots/market-csgo/ordersPlace 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_namebodystringLe nom de l'article
min_pricebodynumberUSD, deux décimales au plus
max_pricebodynumberUSD, deux décimales au plus
account_idbody, facultatifstringLe compte qui achète. Peut être omis si vous avez un seul compte
amountbody, facultatifnumberQuantité à 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
/v1/robots/market-csgo/ordersOublie l'ordre : le robot ne le déplace plus et il reste sur Market.CSGO à son dernier prix.
Paramètres
market_hash_namequerystringLe nom de l'article
account_idquery, facultatifstringLe 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.
| Abonnement | Requêtes / minute | Requêtes d'offres et d'ordres / 30 jours |
|---|---|---|
| Gratuit | 60 | 100 |
| Trader | 120 | 5,000 |
| Pro | 300 | 25,000 |
| Business | 300 | 100,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