CS2 Pro Player Skins API
The skins pros actually use in matches, read from parsed pro demos: each player's knife, gloves and weapon skins per side (CT and T loadouts differ), with float, wear, pattern seed, Doppler phase, StatTrak and Souvenir, the current market price, and the date and map it was last seen. Every item, and any catalogue skin, has an inspect link to open that exact item in 3D.
2 endpoints in this section. Authenticate with the x-api-key header; every response is { success, data, meta }. Other sections: Live, Player props, Odds, Positions & heatmaps, Watch live (embeds), Matches, Maps & rounds, Rankings, Teams, Players, Events, Stats & leaderboards, Skins, Transfers, Search & reference.
View any pro skin in 3D
Every skin a pro is seen with carries inspectLink: a CS2 inspect link for that exact item, with its weapon, paint, pattern seed and wear float. It is on every row of /cs2/players/{id}/skins and of playerSkins on /cs2/matches/{matchId}/maps. For any skin in the catalogue, /cs2/skins/{skinIdOrSlug}/inspect builds one at a float and pattern seed you choose.
In game and in a browser
- In game: opening the
steam://link on a computer with Steam and CS2 installed starts CS2 and shows the item in its inspect view. No inventory or account is involved: the link describes the item itself (a generated preview link, not a link to an item in someone's inventory). - In a browser: several independent 3D skin viewers accept CS2 inspect links. Paste the link into one and it renders the same item. We do not operate those sites, and how they label or display a generated link is up to them (some call it a preview or showcase link).
- Your own renderer:
inspecthas the same fields as plain values:defIndex,paintIndex,paintSeed,paintWear(the raw 32-bit value the game stores),float,rarity,qualityandstickers.
Copy-paste example
curl -s "https://api.citoapi.com/api/v1/cs2/players/twistzz/skins" \
-H "x-api-key: $CITO_API_KEY"
# One item of the response (trimmed):
{
"slot": "knife",
"sides": ["CT"],
"marketHashName": "★ M9 Bayonet | Doppler (Factory New) - Sapphire",
"float": 0.0169670451,
"wear": "Factory New",
"patternSeed": 480,
"inspectLink": "steam://rungame/730/76561202255233023/+csgo_econ_action_preview%200018FC0320A0032806300338F9FCABE40340E00322F3057A",
"inspect": {
"defIndex": 508, "paintIndex": 416, "paintSeed": 480,
"paintWear": 1015742073, "float": 0.0169670451,
"rarity": 6, "quality": 3, "stickers": []
},
"date": "2026-10-29T11:10:00.000Z",
"matchId": "cs2-match-2399877",
"mapId": "cs2-match-2399877-map-3"
}# Any catalogue skin, at the float and pattern seed you choose (both optional)
curl -s "https://api.citoapi.com/api/v1/cs2/skins/m9-bayonet-doppler-factory-new-sapphire-bd6e4daa/inspect?float=0.012&seed=661" \
-H "x-api-key: $CITO_API_KEY"
# data.inspectLink, data.inspect, and data.floatRange: the floats this item's exterior allows ({ "min": 0, "max": 0.07 })
# A float outside floatRange, or a seed outside 0-1000, returns 400 INVALID_PARAMETER with the allowed range.<!-- An "Inspect in game" button for each item of a pro's loadout -->
<ul id="loadout"></ul>
<script type="module">
// /api/loadout is your server route that calls /cs2/players/{id}/skins with your API key.
const { data } = await fetch("/api/loadout?player=twistzz").then((r) => r.json());
for (const item of data) {
const li = document.createElement("li");
const link = document.createElement("a");
link.href = item.inspectLink; // steam:// opens CS2's inspect view where Steam is installed
link.textContent = `${item.marketHashName} (float ${item.float}, seed ${item.patternSeed})`;
li.append(link);
document.getElementById("loadout").append(li);
}
</script>What the link does not carry
- Pro items come from match demos, which record each player's knife, gloves and one featured weapon per map, but not stickers, keychains, name tags or the StatTrak counter. Those are not in the link, so the item shows without them.
- A knife's StatTrak status is not in demos either (
stattrak: null). - The float is a 32-bit value, as in the game, so
inspect.floatcan differ from the float you asked for in the 8th or 9th decimal. It is the value the item will show. - The link puts
%20betweencsgo_econ_action_previewand the data, so it works as anhref. Some tools write a plain space there; both forms describe the same item.
Skin inspect link
A CS2 inspect preview link for any weapon, knife or glove skin at a float and pattern seed you choose: `inspectLink` opens the item in CS2 (or paste it into a browser 3D viewer that accepts CS2 inspect links), and `inspect` has the same fields for your own renderer. Without `float` the link uses the middle of the float range the exterior of the item allows for this skin (`floatRange`); without `seed`, pattern 0. The link is a generated preview, not a link to an item in an inventory. A float outside `floatRange` or a seed outside 0-1000 is a 400 with the allowed range; stickers, cases and other non-weapon items are a 422.
Query parameters
| Parameter | Type | Description |
|---|---|---|
| skinIdOrSlug (path)* | string | Skin id or slug. |
| float | string | Wear float, within floatRange of the item (its exterior band clipped to the min/max wear of the skin). Default: the middle of that range. |
| seed | string | Pattern seed, an integer from 0 to 1000. Default: 0. |
Example
curl "https://api.citoapi.com/api/v1/cs2/skins/ak-47-redline-field-tested/inspect" \
-H "x-api-key: YOUR_API_KEY"Response
{
"success": true,
"data": {
"entityType": "cs2_skin_inspect",
"skinId": "cs2-skin-bd6e4daa5fd6350153c40821",
"slug": "m9-bayonet-doppler-factory-new-sapphire-bd6e4daa",
"marketHashName": "★ M9 Bayonet | Doppler (Factory New) - Sapphire",
"weapon": "M9 Bayonet",
"skinName": "Doppler",
"phase": "Sapphire",
"wear": "Factory New",
"floatRange": {
"min": 0,
"max": 0.07
},
"inspectLink": "steam://rungame/730/76561202255233023/+csgo_econ_action_preview%200018FC0320A0032806300338A6B792E20340950559137102",
"inspect": {
"defIndex": 508,
"paintIndex": 416,
"paintSeed": 661,
"paintWear": 1011129254,
"float": 0.0120000001,
"rarity": 6,
"quality": 3,
"stickers": []
}
},
"meta": {
"serializer": "@csfloat/cs2-inspect-serializer@1.1.6",
"notes": [
"inspectLink opens the item in CS2's inspect view (Steam must be installed); browser 3D viewers that accept CS2 inspec…",
"The float is stored as a 32-bit float, as in the game: `inspect.float` is the value the item will show."
]
}
}Player skins
A pro player's current skin loadout from his parsed match demos: knife, gloves and weapon skins, one item per slot and side (CS2 loadouts are per side, so `sides` is `["CT"]`, `["T"]` or both). Each item has `weapon`, `skinName`, Doppler `phase`, `float`, `wear` (Factory New ... Battle-Scarred), `patternSeed`, `stattrak`, `souvenir`, `marketHashName`, `imageUrl`, `skinId` (use it with `/cs2/skins/{skinIdOrSlug}`) and `price` (cheapest current marketplace price). Every item also has `inspectLink` (a CS2 inspect preview link for that exact item: open it in CS2, or paste it into a browser 3D viewer that accepts CS2 inspect links) and `inspect` ({defIndex, paintIndex, paintSeed, paintWear (raw 32-bit value), float, rarity, quality, stickers}) to drive your own renderer. Demos carry no stickers, keychains or StatTrak counter, so those are not in the link. A demo shows only the knife and gloves of the side the player finished each map on plus one featured weapon, so the loadout is built across his maps and every item carries `date`, `matchId` and `mapId` of the last map it was seen on. Knife StatTrak is not in demos (`stattrak: null`). A player with no skin data returns an empty list with `meta.unavailableReason`.
Query parameters
| Parameter | Type | Description |
|---|---|---|
| playerIdOrSlug (path)* | string | Player id (cs2-player-11893) or slug (zywoo). |
| history | string | true adds firstSeen, lastSeen (date, match and map) and mapsSeen to every item, and lists every item the player used before as current: false. |
Example
curl "https://api.citoapi.com/api/v1/cs2/players/donk/skins" \
-H "x-api-key: YOUR_API_KEY"Response
{
"success": true,
"data": [
{
"entityType": "cs2_player_skin",
"rarity": 6,
"itemId": 47559350915,
"quality": 3,
"defIndex": 515,
"itemName": "Butterfly Knife",
"skinName": "Doppler",
"paintSeed": 840,
"paintWear": 1024286121,
"paintIndex": 619,
"playerId": "cs2-player-11893",
"playerName": "ZywOo",
"teamId": "cs2-team-9565",
"side": null,
"weapon": "Butterfly Knife",
"category": "knife",
"phase": "Sapphire",
"float": 0.0345131494,
"wear": "Factory New",
"wearCode": "FN",
"patternSeed": 840,
"stattrak": null,
"souvenir": false,
"stock": false,
"…": "12 more fields"
},
{
"entityType": "cs2_player_skin",
"rarity": 6,
"itemId": 50414832731,
"quality": 3,
"defIndex": 5030,
"itemName": "Sport Gloves",
"skinName": "Ultra Violent",
"paintSeed": 818,
"paintWear": 1052059606,
"paintIndex": 1410,
"playerId": "cs2-player-11893",
"playerName": "ZywOo",
"teamId": "cs2-team-9565",
"side": null,
"weapon": "Sport Gloves",
"category": "gloves",
"phase": null,
"float": 0.353819549,
"wear": "Field-Tested",
"wearCode": "FT",
"patternSeed": 818,
"stattrak": false,
"souvenir": false,
"stock": false,
"…": "12 more fields"
}
],
"meta": {
"count": 25,
"dataAvailable": true,
"player": {
"id": "cs2-player-11893",
"nickname": "ZywOo"
},
"history": false,
"mapsWithSkins": 114,
"latestSkinMap": {
"matchId": "cs2-match-2399758",
"mapId": "cs2-match-2399758-map-2",
"mapName": "Inferno",
"startsAt": "2026-10-31T08:00:00.000Z"
},
"source": "demo",
"notes": [
"Items come from the end-of-match data in parsed pro demos: the knife and gloves of the side the player finished each …",
"CS2 loadouts are per side: `sides` says whether the item is the current pick on CT, T or both. An empty `sides` means…"
],
"limit": 25,
"total": 25,
"page": 1,
"totalPages": 1,
"hasNext": false,
"hasPrev": false
}
}Try the CS2 Pro Player Skins API
Run a real request with your key, then wire the same call into your app. The free plan includes 500 requests a month.
curl "https://api.citoapi.com/api/v1/cs2/players/twistzz/skins" \
-H "x-api-key: YOUR_API_KEY"