Get CS2 skin prices in Python
The Skinstrack API is plain REST and JSON, so Python only needs the requests library. This example fetches one skin, finds the cheapest marketplace and prints every market side by side.
- Stack
- Python 3.9+, requests
- Plan
- Paid (Standard and up)
- Data
- 34+ marketplaces, refreshed ~15 min
- 1
Get a free Skinstrack API key
Sign in with Steam on skinstrack.com and create a key in the dashboard. The free plan gives 50 requests a month on Steam prices with no card. Paid plans from $24.99 a month unlock all 34+ marketplaces. Keep the key in an environment variable, never in source code.
terminalbashexport SKINSTRACK_API_KEY=your-api-key - 2
Install requests
That is the only dependency.
terminalbashpip install requests - 3
Fetch a skin and compare markets
The item endpoint returns one price entry per marketplace. min() picks the cheapest, and the loop prints the rest for comparison.
prices.pypythonimport os from urllib.parse import quote import requests API = "https://api.skinstrack.com/v2" HEADERS = {"X-API-KEY": os.environ["SKINSTRACK_API_KEY"]} def get_item(name: str, currency: str = "USD") -> dict: url = f"{API}/paid/item/{quote(name, safe='')}" response = requests.get(url, headers=HEADERS, params={"currency": currency}, timeout=30) response.raise_for_status() return response.json() item = get_item("AK-47 | Redline (Field-Tested)") cheapest = min(item["prices"], key=lambda p: p["price"]) print(f"{item['market_hash_name']}: {cheapest['price']} {item['currency']} on {cheapest['provider']}") for entry in sorted(item["prices"], key=lambda p: p["price"]): print(f" {entry['provider']:<12} {entry['price']:>10.2f} updated {entry['updated_at']}") - 4
Fetch the whole catalog in one call
Quotas are monthly, not per second, so you can pull every item from the markets you need in a single request and cache it locally.
catalog.pypythonresponse = requests.get( f"{API}/paid/items", headers=HEADERS, params={"providers": "csfloat,buff163,skinport", "changes": "true"}, timeout=60, ) response.raise_for_status() items = response.json() print(f"{len(items)} items")
Example response
Shortened response from /v2/paid/item/{itemName}. Field names are snake_case and every marketplace price has its own updated_at. Full schemas are in the Skinstrack API docs.
{
"market_hash_name": "AK-47 | Redline (Field-Tested)",
"slug": "ak-47-redline-field-tested",
"wear_name": "Field-Tested",
"rarity_name": "Classified",
"skinstrack_url": "https://skinstrack.com/item/ak-47-redline?variant=field-tested",
"liquidity": 85,
"currency": "USD",
"price_changes": { "1d": 0.5, "7d": 2.3, "30d": 5.4 },
"prices": [
{
"price": 12.5,
"count": 150,
"volume": 0,
"meta": {},
"provider": "csfloat",
"updated_at": "2026-10-02T10:30:00Z"
},
{
"price": 11.9,
"count": 420,
"volume": 0,
"meta": {},
"provider": "buff163",
"updated_at": "2026-10-02T10:24:00Z"
}
]
}Ready to run it?
Get a Skinstrack API key in a minute. Free tier: 50 requests per month on Steam prices, no card required.