API
Dokumentacja API
Pierwsze kroki
Każde żądanie idzie na https://api.apiskins.com i wymaga Twojego klucza w nagłówku X-API-KEY. Odpowiedzi są w JSON; ceny w USD.
Nieudane żądanie zwraca status HTTP i komunikat błędu w JSON. Limity i błędy
Całe API jest też dokumentem OpenAPI dla generatorów kodu i agentów AI.
Marketplace'y
Nazwy dostawców do parametru providers i w odpowiedziach. Każdy marketplace ma oferty; tylko oznaczone mają też zlecenia kupna.
cs_floatCSFloatbuff_163Buff.163youpinYouPin898dmarketZlecenia kupnaDMarketskinportSkinportcs_moneycs.moneymarket_csgoZlecenia kupnaMarket.CSGObuff_marketBuff.MarketwaxpeerWaxpeerlis_skinsLis-skinsskin_baronSkinBaronhalo_skinsHaloSkinswhite_marketWhite.Marketshadow_payShadowPayskinsSKINSskin_swapSkinSwapcs_dealsCS.Dealsloot_farmLoot.farmcs_tradeCS.TRADEtradeitTradeit.ggsteamZlecenia kupnaSteamsihSIH MarketOferty
Najtańsza oferta (najniższa cena) każdego przedmiotu na każdym śledzonym marketplace. Odpowiedzi są kompresowane gzip dla klientów, którzy to obsługują, więc wszystkie przedmioty ze wszystkich marketplace'ów przychodzą w jednym żądaniu.
Śledzimy skiny broni (zwykłe i StatTrak™), noże, rękawice, skrzynki i kapsuły, agentów, zestawy muzyczne, naszywki, zawieszki, odznaki i przepustki. Przedmioty pamiątkowe, naklejki i graffiti nie są śledzone.
Oferty wielu przedmiotów
/v1/offersNajtańsza oferta (najniższa cena) przedmiotów na każdym marketplace. Podaj do 100 przedmiotów przez market_hash_name jako paczkę lub pomiń, by dostać wszystkie wystawione przedmioty w jednej odpowiedzi. Przedmiot, którego nie ma na żadnym marketplace, jest pomijany.
Parametry
market_hash_namequery, opcjonalniestringNazwa przedmiotu. Powtórz dla paczki do 100. Jeśli pominięte, wszystkie wystawione przedmioty
providersquery, opcjonalniestringMarketplace'y po przecinku (zob. Marketplace'y). Jeśli pominięte, wszystkie
Żądanie
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();Odpowiedź 200
[
{
"market_hash_name": "AK-47 | Redline (Field-Tested)",
"offers": [
{
"provider": "buff_163",
"price": 31.42
},
{
"provider": "cs_float",
"price": 33.1
}
]
}
]- W darmowej subskrypcji odpowiedź obejmuje tylko Steam: bez providers zawiera sam Steam, a prośba o inny marketplace dostaje 403. Płatne subskrypcje dostają wszystkie marketplace'y.
- Marketplace, który nie ma przedmiotu, jest pomijany w jego ofertach.
- Odpowiedzi są kompresowane gzip dla klientów, którzy to obsługują (każda biblioteka HTTP; w curl dodaj --compressed): wszystkie przedmioty na wszystkich marketplace'ach to około 28 MB JSON i poniżej 2 MB w gzip.
Oferty jednego przedmiotu
/v1/offers/{market_hash_name}Najtańsza oferta jednego przedmiotu na każdym marketplace. 404, gdy nie ma go nigdzie.
Parametry
market_hash_namepathstringNazwa przedmiotu zakodowana w URL
providersquery, opcjonalniestringMarketplace'y po przecinku (zob. Marketplace'y). Jeśli pominięte, wszystkie
Żądanie
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();Odpowiedź 200
{
"market_hash_name": "AK-47 | Redline (Field-Tested)",
"offers": [
{
"provider": "buff_163",
"price": 31.42
},
{
"provider": "cs_float",
"price": 33.1
}
]
}- W darmowej subskrypcji odpowiedź obejmuje tylko Steam: bez providers zawiera sam Steam, a prośba o inny marketplace dostaje 403. Płatne subskrypcje dostają wszystkie marketplace'y.
Zlecenia kupna
Najwyższe zlecenie kupna każdego przedmiotu na DMarket, Market.CSGO i Steam: za ile możesz sprzedać przedmiot teraz. Ten sam klucz, ten sam limit 30-dniowy i te same skompresowane odpowiedzi co przy ofertach.
Zlecenia kupna wielu przedmiotów
/v1/ordersNajwyższe zlecenie kupna przedmiotów na marketplace'ach, które je mają: DMarket (odświeżany co kilka sekund), Market.CSGO (co 15 minut) i Steam (co godzinę). Podaj do 100 przedmiotów przez market_hash_name jako paczkę lub pomiń, by dostać wszystkie przedmioty ze zleceniem w jednej odpowiedzi. Przedmiot bez zlecenia jest pomijany.
Parametry
market_hash_namequery, opcjonalniestringNazwa przedmiotu. Powtórz dla paczki do 100. Jeśli pominięte, wszystkie przedmioty ze zleceniem
providersquery, opcjonalniestringMarketplace'y po przecinku: dmarket, market_csgo, steam. Jeśli pominięte, wszystkie
Żądanie
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();Odpowiedź 200
[
{
"market_hash_name": "AK-47 | Redline (Field-Tested)",
"orders": [
{
"provider": "dmarket",
"price": 24.51
},
{
"provider": "market_csgo",
"price": 23.822
}
]
}
]- W darmowej subskrypcji odpowiedź obejmuje tylko Steam: bez providers zawiera sam Steam, a prośba o inny marketplace dostaje 403. Płatne subskrypcje dostają wszystkie marketplace'y.
- Marketplace bez zlecenia na przedmiot jest pomijany w jego zleceniach.
- Przedmioty pamiątkowe, naklejki i graffiti są uwzględnione. Jak przy ofertach, każde obsłużone żądanie liczy się do limitu 30-dniowego, a odpowiedzi są tak samo kompresowane.
Zlecenia kupna jednego przedmiotu
/v1/orders/{market_hash_name}Najwyższe zlecenie kupna jednego przedmiotu na każdym marketplace. 404, gdy nigdzie go nie ma.
Parametry
market_hash_namepathstringNazwa przedmiotu zakodowana w URL
providersquery, opcjonalniestringMarketplace'y po przecinku: dmarket, market_csgo, steam. Jeśli pominięte, wszystkie
Żądanie
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();Odpowiedź 200
{
"market_hash_name": "AK-47 | Redline (Field-Tested)",
"orders": [
{
"provider": "dmarket",
"price": 24.51
},
{
"provider": "market_csgo",
"price": 23.822
}
]
}- W darmowej subskrypcji odpowiedź obejmuje tylko Steam: bez providers zawiera sam Steam, a prośba o inny marketplace dostaje 403. Płatne subskrypcje dostają wszystkie marketplace'y.
Historia sprzedaży
Podsumowanie sprzedaży każdego przedmiotu na DMarket i Market.CSGO: ile sprzedano, mediana i średnia cena z ostatnich 7, 15, 30 i 90 dni oraz ile zwykle sprzedaje się w 15 dni. Ten sam klucz, ten sam limit 30-dniowy i te same odpowiedzi gzip co przy ofertach.
Podsumowanie sprzedaży wielu przedmiotów
/v1/sales/summaryPodsumowanie sprzedaży przedmiotów na każdym marketplace: DMarket (odświeżane co kilka godzin) i Market.CSGO (mniej więcej co godzinę). Podaj do 100 przedmiotów przez market_hash_name, aby wysłać partię, lub pomiń parametr, aby w jednej odpowiedzi dostać wszystkie przedmioty sprzedane w ostatnich 90 dniach. Przedmiot bez sprzedaży w ostatnich 90 dniach jest pomijany.
Parametry
market_hash_namequery, opcjonalniestringNazwa przedmiotu. Powtórz dla partii do 100. Po pominięciu wszystkie przedmioty sprzedane w ostatnich 90 dniach
providersquery, opcjonalniestringMarketplace'y po przecinku: dmarket, market_csgo. Jeśli pominięte, oba
Żądanie
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();Odpowiedź 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"
}
]
}
]- Wymaga płatnej subskrypcji: w darmowej każde zapytanie dostaje 403.
- W każdym okresie sales to liczba sprzedanych przedmiotów, a median i avg to ich mediana i średnia cena w USD. Dla okresu bez sprzedaży median i avg mają wartość null.
- index_volume_units (indeks wolumenu w sztukach) i index_volume_dollars (indeks wolumenu w dolarach) mówią, ile zwykle sprzedaje się w 15 dni: ostatnie 90 dni dzieli się na sześć okresów po 15 dni, a okres bez sprzedaży liczy się jako 0. index_volume_units to mediana liczby sprzedanych przedmiotów w okresach, index_volume_dollars to mediana ich sum w USD, więc jeden bardzo aktywny lub martwy okres ich nie zmienia.
- Podsumowanie jest obliczane po każdym przejściu przez sprzedaż na marketplace; kiedy, pokazuje updated_at.
- Market.CSGO pokazuje nam najwyżej 6,000 ostatnich sprzedaży przedmiotu, więc przy najczęściej sprzedawanych przedmiotach last_90d, index_volume_units i index_volume_dollars mogą być zaniżone, dopóki nie zapiszemy pełnych 90 dni.
- Fazy Doppler i Gamma Doppler dzielą nazwy rynkowe, więc jeden rekord obejmuje każdą fazę.
- Przedmioty pamiątkowe, naklejki i graffiti są uwzględnione. Jak przy ofertach, każde obsłużone żądanie liczy się do limitu 30-dniowego, a odpowiedzi są tak samo kompresowane.
Podsumowanie sprzedaży jednego przedmiotu
/v1/sales/summary/{market_hash_name}Podsumowanie sprzedaży jednego przedmiotu na każdym marketplace. 404, gdy żaden nie sprzedał go w ostatnich 90 dniach.
Parametry
market_hash_namepathstringNazwa przedmiotu zakodowana w URL
providersquery, opcjonalniestringMarketplace'y po przecinku: dmarket, market_csgo. Jeśli pominięte, oba
Żądanie
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();Odpowiedź 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"
}
]
}- Wymaga płatnej subskrypcji: w darmowej każde zapytanie dostaje 403.
Przedmioty
Czym jest każdy przedmiot CS2: typ, broń, zużycie i zakres float, jakość, rzadkość, kolekcje i skrzynki. Do filtrowania przedmiotów na marketplace, po tym samym market_hash_name co oferty i zlecenia. Każdy skin, naklejka, agent, zawieszka, skrzynka i reszta, w tym pamiątkowe. Jak przy ofertach, każde obsłużone zapytanie liczy się do limitu 30-dniowego.
Wiele przedmiotów
/v1/itemsCzym jest każdy przedmiot CS2: typ, broń, zużycie i zakres float, jakość, rzadkość, kolekcje i skrzynki, jeden rekord na market_hash_name, do filtrowania przedmiotów na marketplace. Wszystkie przedmioty w jednej odpowiedzi (około 2 MB po gzip), strona przez limit i offset albo do 100 podanych przez market_hash_name. Filtry zawężają oba warianty.
Parametry
market_hash_namequery, opcjonalniestringNazwa przedmiotu. Powtórz dla paczki do 100. Jeśli pominięte, wszystkie przedmioty
typequery, opcjonalniestringskin, sticker, agent, charm, patch, music_kit, graffiti, collectible, container. Po przecinku, dowolny z nich
weaponquery, opcjonalniestringId broni: awp, ak-47, karambit, sport-gloves.... Po przecinku, dowolny z nich
collectionquery, opcjonalniestringId kolekcji: the-dust-2-collection.... Po przecinku, dowolny z nich
containerquery, opcjonalniestringId skrzynek i pakietów, z których wypada: dreams-nightmares-case.... Po przecinku, dowolny z nich
rarityquery, opcjonalniestringId rzadkości: consumer, industrial, mil-spec, restricted, classified, covert, contraband oraz dla naklejek i agentów (high, remarkable, exotic, extraordinary, distinguished, exceptional, superior, master). Po przecinku, dowolny z nich
qualityquery, opcjonalniestringNormal, StatTrak™, Souvenir, ★ lub ★ StatTrak™. Po przecinku, dowolny z nich
limitquery, opcjonalnienumberNajwięcej przedmiotów w odpowiedzi, od 1. Bez niego wszystkie przedmioty, a limit w odpowiedzi to ich liczba
offsetquery, opcjonalnienumberPrzedmioty do pominięcia, dla następnej strony
Żądanie
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();Odpowiedź 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"
}
]
}- Wymaga płatnej subskrypcji: w darmowej każde zapytanie dostaje 403.
- type to skin dla każdego skina broni, noża i rękawic (category je rozróżnia: knives, gloves, rifles, pistols, smgs, heavy, equipment), container dla skrzynek, kapsuł i pakietów (category to ich rodzaj: case, sticker_capsule, souvenir_package...).
- min_float i max_float to możliwe floaty przedmiotu: własny zakres skina w ramach zużycia. null dla przedmiotów bez float.
- details zawiera pozostałe dane: Tournament, Team, Player i Effect naklejki, Side agenta, datę Released pojemnika.
- Fazy Doppler i Gamma Doppler dzielą nazwy rynkowe, więc jeden rekord obejmuje każdą fazę.
- Jak zapytania o oferty, każde obsłużone zapytanie liczy się do limitu 30-dniowego, niezależnie od liczby przedmiotów, a odpowiedzi są tak samo kompresowane gzipem.
Jeden przedmiot
/v1/items/{market_hash_name}Czym jest jeden przedmiot. 404, gdy nie ma przedmiotu o tej nazwie.
Parametry
market_hash_namepathstringNazwa przedmiotu zakodowana w URL
Żądanie
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();Odpowiedź 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"
}- Wymaga płatnej subskrypcji: w darmowej każde zapytanie dostaje 403.
Robot dla DMarket
Zarządzaj ofertami i zleceniami DMarket tym samym kluczem. Konta i ich klucze API DMarket dodaje się tylko na stronie robota, nigdy przez API. Trasy robota wymagają płatnej subskrypcji i liczą się tylko do limitu minutowego, nigdy do 30-dniowego.
- Oferty: dowolna liczba na konto. Zlecenia („targety” DMarket): do 100 na konto, własny limit DMarket.
- DMarket nie pozwala zmienić ceny zlecenia: robot zastępuje je nowym po nowej cenie.
Konta i limity
/v1/robots/dmarketTwoje konta DMarket w robocie (połączone kluczami API DMarket na stronie robota) i limity Twojej subskrypcji dla niego.
Żądanie
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();Odpowiedź 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"
}
]
}- Limit null oznacza brak naszego limitu.
- paused: konto przekracza limit kont subskrypcji; jego oferty i zlecenia czekają.
- enabled: false oznacza wyłączenie na stronie robota: robot nie zmienia już ceny, pozycja zostaje na marketplace'ie po ostatniej cenie i nadal liczy się do limitów.
Ekwipunek konta
/v1/robots/dmarket/accounts/{account_id}/inventoryPrzedmioty w ekwipunku DMarket konta z asset_id do sprzedaży każdego. sellable to false dla przedmiotów, których DMarket nie pozwala wystawić.
Parametry
account_idpathstringId konta z GET /v1/robots/dmarket
Żądanie
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();Odpowiedź 200
[
{
"asset_id": "4c1d8e2f-0b6a-4a51-9f3e-2d7c8b1a6e05",
"market_hash_name": "AK-47 | Redline (Field-Tested)",
"sellable": true,
"suggested_price": 33.1
}
]Lista ofert
/v1/robots/dmarket/offersTwoje oferty na DMarket na wszystkich kontach, najstarsze najpierw.
Żądanie
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();Odpowiedź 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"
}
]Wystaw ofertę lub ją zaktualizuj
/v1/robots/dmarket/offersWystawia przedmiot lub nadpisuje ceny jego istniejącej oferty, znalezionej po asset_id. Robot wystawia przedmiot na DMarket i utrzymuje go jako najtańszą ofertę, nigdy poniżej min_price. Bez konkurencji sprzedaje po max_price. Nowe ceny działają w kilka sekund lub po odblokowaniu ceny: cena zmieniona przez robota zostaje na 15 minut.
Parametry
asset_idbodystringId przedmiotu na DMarket z ekwipunku konta
min_pricebodynumberUSD, maksymalnie dwa miejsca po przecinku
max_pricebodynumberUSD, maksymalnie dwa miejsca po przecinku
account_idbody, opcjonalniestringKonto będące właścicielem przedmiotu. Wymagane przy wystawianiu
market_hash_namebody, opcjonalniestringNazwa przedmiotu. Wymagana przy wystawianiu
Żądanie
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();Odpowiedź 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"
}Usuń ofertę
/v1/robots/dmarket/offersZapomina ofertę: robot przestaje ją zmieniać, a przedmiot zostaje w sprzedaży na DMarket po ostatniej cenie.
Parametry
asset_idquerystringId przedmiotu na DMarket z ekwipunku konta
Żądanie
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();Odpowiedź 200
{
"removed": true
}- removed to false, gdy robot nie miał takiej oferty.
Lista zleceń
/v1/robots/dmarket/ordersTwoje zlecenia kupna na DMarket na wszystkich kontach, najstarsze najpierw.
Żądanie
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();Odpowiedź 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"
}
]Złóż zlecenie lub je zaktualizuj
/v1/robots/dmarket/ordersSkłada zlecenie na przedmiot na koncie lub nadpisuje ceny istniejącego. Robot składa zlecenie DMarket („target”) i utrzymuje je jako najwyższe, nigdy powyżej max_price. Bez konkurencji oferuje min_price. DMarket pozwala na 100 zleceń na konto. DMarket nie może zmienić ceny zlecenia: każda nowa cena to nowy target zamiast starego. Kupuje po 1 przedmiocie, aż kupi całą ilość, a zlecenie jest składane tylko wtedy, gdy jego cena mieści się w saldzie konta.
Parametry
market_hash_namebodystringNazwa przedmiotu
min_pricebodynumberUSD, maksymalnie dwa miejsca po przecinku
max_pricebodynumberUSD, maksymalnie dwa miejsca po przecinku
account_idbody, opcjonalniestringKonto do kupowania. Można pominąć, jeśli masz jedno konto
amountbody, opcjonalnienumberIle kupić, od 1 do 100. Wymagane przy składaniu; zmienia się tylko przed złożeniem
Żądanie
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();Odpowiedź 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"
}- Ilość złożonego zlecenia tylko maleje wraz z realizacją: usuń je i dodaj ponownie, by kupić więcej.
Usuń zlecenie
/v1/robots/dmarket/ordersZapomina zlecenie: robot przestaje je zmieniać, a ono zostaje na DMarket po ostatniej cenie.
Parametry
market_hash_namequerystringNazwa przedmiotu
account_idquery, opcjonalniestringKonto, na którym jest zlecenie. Można pominąć, jeśli masz jedno konto
Żądanie
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();Odpowiedź 200
{
"removed": true
}- removed to false, gdy robot nie miał takiego zlecenia.
Monitor
/v1/robots/dmarket/monitorKażdy przedmiot na DMarket z zyskiem z bycia najlepszym zleceniem (buy_price, 1 cent powyżej najlepszego zlecenia), a potem najtańszą ofertą (sell_price, 1 cent poniżej najtańszej), po prowizji DMarket dla tego przedmiotu. Najlepsze zlecenia i oferty DMarket są odświeżane co kilka sekund, ceny innych marketplace'ów tak często, jak każdy z nich się aktualizuje, od co 5 minut do co godzinę. Działają tylko wysłane filtry: bez nich każdy przedmiot ze zleceniem, najbardziej zyskowne najpierw. Przedmiot bez oferty na DMarket też się pojawia, z best_offer, sell_price, profit i margin_percent równymi null: filtry zysku, marży i różnicy go przepuszczają. dollar_volume i units_volume to typowa sprzedaż na DMarket w 15 dni: mediana z ostatnich 90 dni w sześciu odcinkach po 15 dni.
Parametry
qquery, opcjonalniestringSłowa, które wszystkie muszą być w nazwie
min_pricequery, opcjonalnienumberNajniższa cena kupna, USD
max_pricequery, opcjonalnienumberNajwyższa cena kupna, USD
min_profitquery, opcjonalnienumberNajniższy zysk po prowizji, USD
min_marginquery, opcjonalnienumberNajniższa marża, procent ceny kupna
min_gapquery, opcjonalnienumberNajmniejsza różnica między najlepszym zleceniem a najtańszą ofertą, USD
min_liquidityquery, opcjonalnienumberNajniższa płynność, od 0 do 100
max_feequery, opcjonalnienumberNajwyższa prowizja, procent
min_units_volumequery, opcjonalnienumberNajmniej przedmiotów sprzedanych w typowe 15 dni na DMarket (units_volume)
min_dollar_volumequery, opcjonalnienumberNajmniej USD sprzedaży w typowe 15 dni na DMarket (dollar_volume)
hidequery, opcjonalniestringPo przecinku: stickers, graffiti, souvenir, stattrak
comparequery, opcjonalniestringInne marketplace'y i o ile procent powyżej ceny kupna musi być ich najniższa cena: buff_163:5,cs_float:3. Marketplace bez przedmiotu jest pomijany. Ich ceny wracają w compare
compare_ordersquery, opcjonalniestringTo samo z najwyższymi zleceniami innych marketplace'ów: market_csgo:5 (Market.CSGO lub Steam). Ich zlecenia wracają w compare_orders
sortquery, opcjonalniestringprofit (domyślnie), margin, liquidity, price lub volume (dollar_volume)
limitquery, opcjonalnienumberPrzedmioty w odpowiedzi, od 1 do 100 (100, jeśli pominięte)
offsetquery, opcjonalnienumberPrzedmioty do pominięcia, dla następnej strony
Żądanie
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();Odpowiedź 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": {}
}
]
}- Wymaga płatnej subskrypcji, jak każda trasa robota. W przeciwieństwie do nich każde obsłużone zapytanie liczy się też do limitu 30-dniowego, jak zapytania o oferty, z tymi samymi nagłówkami X-Usage-Limit i X-Usage-Remaining.
Statusy ofert i zleceń
pending- Jeszcze nie wystawione ani złożone
active- Na marketplace, utrzymywane na czele w Twoich limitach. Cena zmieniona przez robota zostaje na 15 minut; potem obserwuje rynek co sekundę
paused- Ponad oferty, zlecenia lub konta subskrypcji: czeka, aż ulepszysz plan lub usuniesz inne
sold- Oferty: sprzedano
closed- Oferty: zdjęte ze sprzedaży lub przedmiot opuścił ekwipunek. Zlecenia: kupione w całości lub usunięte. Pole error podaje przyczynę, jeśli jest
Robot dla market.csgo.com
Zarządzaj ofertami i zleceniami Market.CSGO tym samym kluczem. Konta i ich klucze API Market.CSGO dodaje się tylko na stronie robota, nigdy przez API. Trasy robota wymagają płatnej subskrypcji i liczą się tylko do limitu minutowego, nigdy do 30-dniowego.
- Oferty: dowolna liczba na konto. Zlecenia: do 100 na konto, po jednym na przedmiot, zmieniane na miejscu.
- Walutą konta na Market.CSGO musi być USD. Oferty są widoczne tylko wtedy, gdy jesteś online w aplikacji lub rozszerzeniu Market.CSGO.
Konta i limity
/v1/robots/market-csgoTwoje konta Market.CSGO w robocie (połączone kluczami API Market.CSGO na stronie robota) i limity Twojej subskrypcji dla niego. Pole note konta mówi, co przeszkadza w sprzedaży, np. brak połączenia.
Żądanie
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();Odpowiedź 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"
}
]
}- Limit null oznacza brak naszego limitu.
- paused: konto przekracza limit kont subskrypcji; jego oferty i zlecenia czekają.
- enabled: false oznacza wyłączenie na stronie robota: robot nie zmienia już ceny, pozycja zostaje na marketplace'ie po ostatniej cenie i nadal liczy się do limitów.
Ekwipunek konta
/v1/robots/market-csgo/accounts/{account_id}/inventoryPrzedmioty Steam, które Market.CSGO może sprzedać z konta, z asset_id do sprzedaży każdego.
Parametry
account_idpathstringId konta z GET /v1/robots/market-csgo
Żądanie
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();Odpowiedź 200
[
{
"asset_id": "38215462179",
"market_hash_name": "AK-47 | Redline (Field-Tested)",
"sellable": true,
"suggested_price": 33.1
}
]Lista ofert
/v1/robots/market-csgo/offersTwoje oferty na Market.CSGO na wszystkich kontach, najstarsze najpierw.
Żądanie
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();Odpowiedź 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"
}
]Wystaw ofertę lub ją zaktualizuj
/v1/robots/market-csgo/offersWystawia przedmiot lub nadpisuje ceny jego istniejącej oferty, znalezionej po asset_id. Robot wystawia przedmiot na Market.CSGO i utrzymuje go jako najtańszą ofertę, nigdy poniżej min_price. Bez konkurencji sprzedaje po max_price. Oferty są widoczne tylko wtedy, gdy konto jest online w aplikacji lub rozszerzeniu Market.CSGO. Nowe ceny działają w kilka sekund lub po odblokowaniu ceny: cena zmieniona przez robota zostaje na 15 minut.
Parametry
asset_idbodystringSteam asset id przedmiotu z ekwipunku konta
min_pricebodynumberUSD, maksymalnie dwa miejsca po przecinku
max_pricebodynumberUSD, maksymalnie dwa miejsca po przecinku
account_idbody, opcjonalniestringKonto będące właścicielem przedmiotu. Wymagane przy wystawianiu
market_hash_namebody, opcjonalniestringNazwa przedmiotu. Wymagana przy wystawianiu
Żądanie
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();Odpowiedź 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"
}Usuń ofertę
/v1/robots/market-csgo/offersZapomina ofertę: robot przestaje ją zmieniać, a przedmiot zostaje w sprzedaży na Market.CSGO po ostatniej cenie.
Parametry
asset_idquerystringSteam asset id przedmiotu z ekwipunku konta
Żądanie
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();Odpowiedź 200
{
"removed": true
}- removed to false, gdy robot nie miał takiej oferty.
Lista zleceń
/v1/robots/market-csgo/ordersTwoje zlecenia kupna na Market.CSGO na wszystkich kontach, najstarsze najpierw.
Żądanie
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();Odpowiedź 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"
}
]Złóż zlecenie lub je zaktualizuj
/v1/robots/market-csgo/ordersSkłada zlecenie na przedmiot na koncie lub nadpisuje ceny istniejącego. Robot składa zlecenie Market.CSGO i utrzymuje je jako najwyższe, nigdy powyżej max_price. Bez konkurencji oferuje min_price. Market.CSGO pozwala na jedno zlecenie na przedmiot i do 100 zleceń na konto oraz zmienia cenę zlecenia na miejscu.
Parametry
market_hash_namebodystringNazwa przedmiotu
min_pricebodynumberUSD, maksymalnie dwa miejsca po przecinku
max_pricebodynumberUSD, maksymalnie dwa miejsca po przecinku
account_idbody, opcjonalniestringKonto do kupowania. Można pominąć, jeśli masz jedno konto
amountbody, opcjonalnienumberIle kupić, od 1 do 100. Wymagane przy składaniu; zmienia się tylko przed złożeniem
Żądanie
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();Odpowiedź 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"
}- Ilość złożonego zlecenia tylko maleje wraz z realizacją: usuń je i dodaj ponownie, by kupić więcej.
Usuń zlecenie
/v1/robots/market-csgo/ordersZapomina zlecenie: robot przestaje je zmieniać, a ono zostaje na Market.CSGO po ostatniej cenie.
Parametry
market_hash_namequerystringNazwa przedmiotu
account_idquery, opcjonalniestringKonto, na którym jest zlecenie. Można pominąć, jeśli masz jedno konto
Żądanie
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();Odpowiedź 200
{
"removed": true
}- removed to false, gdy robot nie miał takiego zlecenia.
Statusy ofert i zleceń
pending- Jeszcze nie wystawione ani złożone
active- Na marketplace, utrzymywane na czele w Twoich limitach. Cena zmieniona przez robota zostaje na 15 minut; potem obserwuje rynek co sekundę
paused- Ponad oferty, zlecenia lub konta subskrypcji: czeka, aż ulepszysz plan lub usuniesz inne
sold- Oferty: sprzedano
closed- Oferty: zdjęte ze sprzedaży lub przedmiot opuścił ekwipunek. Zlecenia: kupione w całości lub usunięte. Pole error podaje przyczynę, jeśli jest
Limity i błędy
Dwa limity, oba na subskrypcję. Każde zapytanie liczy się do limitu na minutę; zapytanie ponad niego dostaje 429 z nagłówkiem Retry-After w sekundach. Każde obsłużone zapytanie o oferty, zlecenia kupna, sprzedaże, przedmioty lub monitor liczy się też do limitu 30-dniowego, niezależnie od liczby przedmiotów; licznik zaczyna się od nowa co 30 dni od początku subskrypcji, a nagłówki X-Usage-Limit i X-Usage-Remaining pokazują, ile zostało.
| Subskrypcja | Żądania / minuta | Żądania ofert i zleceń / 30 dni |
|---|---|---|
| Darmowy | 60 | 100 |
| Trader | 120 | 5,000 |
| Pro | 300 | 25,000 |
| Business | 300 | 100,000 |
400- Coś jest nie tak z żądaniem: nieznany dostawca lub typ przedmiotu, błędna treść, ponad 100 przedmiotów, limit poza zakresem
401- Brak klucza lub klucz błędny
403- Wymagana płatna subskrypcja: dla każdego marketplace'u poza Steam, tras podsumowania sprzedaży i przedmiotów oraz robota i monitora
404- Nie ma takiego przedmiotu, robota ani konta
409- Teraz niemożliwe: ponad oferty, zlecenia lub konta subskrypcji albo zmiana ilości złożonego zlecenia
429- Osiągnięto limit na minutę (odczekaj Retry-After sekund) albo limit 30-dniowy
502- Marketplace nie odpowiedział robotowi; spróbuj ponownie