Skinport APIapi.skinport.com ↗
Fetch live CS2 item listings from Skinport with exact float values, prices, and StatTrak/Souvenir filters. Enumerate skin families with listing counts.
What is the Skinport API?
The Skinport API provides access to live Counter-Strike 2 marketplace data across 2 endpoints, returning item listings with fields including exact float (wear) values, sale prices, and full market hash names. The list_listings endpoint supports category, weapon, exterior, StatTrak, and Souvenir filters with page-by-page access to up to 1,050 results. A companion list_skin_families endpoint enumerates skin families with per-family listing counts and minimum prices, making it straightforward to partition large catalogs by weapon or category.
curl -X GET 'https://api.parse.bot/scraper/2c8324bd-779c-401d-a680-9e32f966af3f/list_listings?page=1&skin=Redline&weapon=AK-47&category=Rifle&max_price=60&min_price=30' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace api-skinport-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Skinport CS2 Market API — browse families then drill into listings."""
from parse_apis.api_skinport_com_api import Skinport, InputFormatInvalid
client = Skinport()
# Browse skin families in the Rifle category to find popular skins.
for family in client.skin_families.list(category="Rifle", limit=5):
print(f"{family.weapon} | {family.skin} — {family.listing_count} listings from ${family.min_price}")
# Pick the first family and drill into its actual marketplace listings.
top_family = client.skin_families.list(category="Rifle", limit=1).first()
if top_family is not None:
for listing in client.listings.list(
category="Rifle",
weapon=top_family.weapon,
skin=top_family.skin,
limit=3,
):
wear = f"float {listing.float_value:.4f}" if listing.float_value is not None else "no float"
print(f" ${listing.price} — {listing.name} ({wear})")
# Filter listings directly: StatTrak rifles under $50.
try:
for item in client.listings.list(category="Rifle", stattrak=True, max_price=50, limit=3):
stickers = ", ".join(item.sticker_names) if item.sticker_names else "none"
print(f" {item.name} ${item.price} — stickers: {stickers}")
except InputFormatInvalid as e:
print(f"Bad filter input: {e.message}")
print("exercised: skin_families.list / listings.list (filtered + family drill-down)")
Returns one page (50 items) of currently listed CS2 items on the Skinport market, in the site's default 'most popular' order, each with the full market name, sale price, currency and the exact float (wear) value. Filters narrow the scope: category (e.g. Rifle, Pistol, SMG, Heavy, Knife), weapon within a category (e.g. AK-47), skin family within a weapon (exact family name such as Redline), exterior, StatTrak/Souvenir-only, a USD price band and a free-text search. Pagination is via the zero-based page input; the site serves at most pages 0-20 (1,050 listings) for any given filter combination, so to reach every listing of a large scope partition it with weapon/skin/exterior/price filters (use list_skin_families to discover families and their listing counts). has_more is true when the page was full and a deeper page is still available. scope_total_listings is the site's count for the category/weapon/skin scope only (it ignores exterior, StatTrak, souvenir, price and search filters) and is only populated on page 0. An unknown category or skin yields an empty page. Listings are sorted by the site; custom sorting requires a Skinport login and is not available.
| Param | Type | Description |
|---|---|---|
| page | integer | Zero-based page index, 0-20. Values above 20 are rejected because the site does not serve deeper pages. |
| skin | string | Exact skin family name within the weapon, e.g. Redline, as returned by list_skin_families.families[*].skin (case-sensitive). |
| search | string | Free-text search over item names, e.g. 'ak-47 redline'. |
| weapon | string | Weapon within the category, e.g. AK-47, AWP, M4A1-S (case-insensitive). Matches the weapon values list_skin_families returns. |
| category | string | Item category as shown in the site's top navigation, e.g. Rifle, Pistol, SMG, Heavy, Knife, Gloves (case-insensitive). Omitted = all CS2 items. |
| exterior | string | Comma-separated list of exteriors to include, from: factory_new, minimal_wear, field_tested, well_worn, battle_scarred. Omitted = all exteriors. |
| souvenir | boolean | true = only Souvenir items. |
| stattrak | boolean | true = only StatTrak items. |
| max_price | number | Maximum sale price in USD (inclusive). |
| min_price | number | Minimum sale price in USD (inclusive). |
{
"type": "object",
"fields": {
"page": "zero-based page index that was returned",
"has_more": "true when a further page is available",
"listings": "array of listing objects: listing_id (integer, Skinport sale id), name (full market hash name), weapon, skin, price (number, sale price in `currency`), currency (ISO code as served by the site), suggested_price (site reference price in same currency, nullable), float_value (exact wear float, nullable for items without wear), exterior, pattern_seed, category, rarity, quality, stattrak (bool), souvenir (bool), sticker_names (array of applied sticker names), url (listing page)",
"max_page": "deepest page the site serves (20)",
"page_size": "items per page (50)",
"scope_total_listings": "site's listing count for the category/weapon/skin scope; only on page 0, null on other pages"
},
"sample": {
"data": {
"page": 0,
"has_more": true,
"listings": [
{
"url": "https://skinport.com/item/ak-47-redline-field-tested/61196799",
"name": "AK-47 | Redline (Field-Tested)",
"skin": "Redline",
"price": 25.81,
"rarity": "Classified",
"weapon": "AK-47",
"quality": "Normal",
"category": "Rifle",
"currency": "USD",
"exterior": "Field-Tested",
"souvenir": false,
"stattrak": false,
"listing_id": 61196799,
"float_value": 0.3669026494026184,
"pattern_seed": 348,
"sticker_names": [
"Fnatic (Holo) | 2020 RMR",
"Fnatic (Holo) | 2020 RMR",
"mousesports | Cologne 2016"
],
"suggested_price": 25.95
}
],
"max_page": 20,
"page_size": 50,
"scope_total_listings": 971
},
"status": "success"
}
}About the Skinport API
What the API returns
list_listings returns one page of 50 active CS2 listings at a time in Skinport's default popularity order. Each listing object includes a listing_id (Skinport's sale ID), the full name (market hash name), weapon, skin, price, and currency, along with the exact float wear value. On page 0, the response also includes scope_total_listings — the site's count of active listings for the current filter scope — which is null on subsequent pages. The has_more flag and max_page (always 20) tell you when continuation is possible.
Filtering listings
Filters can be combined freely. category accepts values like Rifle, Pistol, SMG, Heavy, Knife, or Gloves. weapon narrows further within a category (e.g. AK-47, AWP, M4A1-S). skin expects an exact skin family name as returned by list_skin_families (e.g. Redline, Asiimov). exterior accepts a comma-separated list from factory_new, minimal_wear, field_tested, well_worn, and battle_scarred. Boolean flags stattrak and souvenir restrict to those item types. A search parameter accepts free-text over item names (e.g. ak-47 redline).
Enumerating skin families
list_skin_families returns 50 skin families per page for a given category (required) and optional weapon. Each family entry includes the skin name, associated weapon, listing_count of active sales, and min_price in the response's currency. The response also exposes total_listings for the whole scope and total_pages so you can page through the full family catalog. Family names from this endpoint can be passed directly as the skin filter in list_listings, making the two endpoints composable for category-wide enumeration.
The Skinport API is a managed, monitored endpoint for api.skinport.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when api.skinport.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official api.skinport.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Track the lowest float (wear) value available for a specific skin family using the
floatfield inlist_listings. - Monitor price changes on StatTrak knives by combining
category=Knife,stattrak=true, and paginating through results. - Build a category-level price index by pulling
min_priceandlisting_countfor all skin families vialist_skin_families. - Identify which skin families have the most active listings within a weapon class to gauge supply depth.
- Filter Souvenir items by category and exterior to compare current asking prices across Factory New and Field-Tested conditions.
- Use
scope_total_listingson page 0 to estimate catalog size before deciding whether to paginate across all 21 available pages. - Cross-reference
listing_idvalues over time to detect when specific listings are removed from the market.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Skinport have an official public developer API?+
How deep can I paginate through listings, and what happens if I request page 21 or higher?+
list_listings uses zero-based page indexing and serves up to page 20 (21 pages total, 50 items each, 1,050 items maximum per filter scope). Requests with a page value above 20 are rejected. has_more and max_page in the response confirm whether a next page exists. For larger scopes you can narrow the filter scope — by weapon, exterior, or skin — to stay within these bounds.Does the API expose sales history or completed transaction data?+
What does `scope_total_listings` tell me, and when is it null?+
scope_total_listings is included in list_listings responses only when page=0. It reflects Skinport's total listing count for the active combination of category, weapon, skin, exterior, and other filters — useful for knowing whether the 1,050-item pagination ceiling will be hit before the full scope is covered. On any page above 0, it returns null.Can I retrieve item sticker data or inspect link details for listings?+
list_listings response covers market name, float value, price, currency, and StatTrak/Souvenir status. Sticker details, paint seed, inspect links, and pattern indices are not included in the current response shape. You can fork this API on Parse and revise it to add those fields.