Discover/Skinport API
live

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.

Endpoint health
verified 1h ago
list_listings
list_skin_families
2/2 passing latest checkself-healing
Endpoints
2
Updated
2h ago

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.

This call costs2 credits / call— charged only on success
Try it
Zero-based page index, 0-20. Values above 20 are rejected because the site does not serve deeper pages.
Exact skin family name within the weapon, e.g. Redline, as returned by list_skin_families.families[*].skin (case-sensitive).
Free-text search over item names, e.g. 'ak-47 redline'.
Weapon within the category, e.g. AK-47, AWP, M4A1-S (case-insensitive). Matches the weapon values list_skin_families returns.
Item category as shown in the site's top navigation, e.g. Rifle, Pistol, SMG, Heavy, Knife, Gloves (case-insensitive). Omitted = all CS2 items.
Comma-separated list of exteriors to include, from: factory_new, minimal_wear, field_tested, well_worn, battle_scarred. Omitted = all exteriors.
true = only Souvenir items.
true = only StatTrak items.
Maximum sale price in USD (inclusive).
Minimum sale price in USD (inclusive).
→ api.parse.bot/scraper/2c8324bd-779c-401d-a680-9e32f966af3f/<endpoint>
Ready to send
Fill in the parameters and hit sign in to send to see live response data here.
Call it over HTTPgrab a free API key at signup
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'
Python SDK · recommended

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)")
All endpoints · 2 totalmissing one? ·

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.

Input
ParamTypeDescription
pageintegerZero-based page index, 0-20. Values above 20 are rejected because the site does not serve deeper pages.
skinstringExact skin family name within the weapon, e.g. Redline, as returned by list_skin_families.families[*].skin (case-sensitive).
searchstringFree-text search over item names, e.g. 'ak-47 redline'.
weaponstringWeapon within the category, e.g. AK-47, AWP, M4A1-S (case-insensitive). Matches the weapon values list_skin_families returns.
categorystringItem category as shown in the site's top navigation, e.g. Rifle, Pistol, SMG, Heavy, Knife, Gloves (case-insensitive). Omitted = all CS2 items.
exteriorstringComma-separated list of exteriors to include, from: factory_new, minimal_wear, field_tested, well_worn, battle_scarred. Omitted = all exteriors.
souvenirbooleantrue = only Souvenir items.
stattrakbooleantrue = only StatTrak items.
max_pricenumberMaximum sale price in USD (inclusive).
min_pricenumberMinimum sale price in USD (inclusive).
Response
{
  "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.

Reliability & maintenanceVerified

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.

Last verified
1h ago
Latest check
2/2 endpoints passing
Maintenance
Monitored & self-healing
Will this API break when the source site changes?+
It's built not to. Every endpoint is health-checked on a schedule with automated test probes. When the source site changes and a check fails, the API is automatically queued for repair and re-verified — that's the self-healing layer. Each API page shows when its endpoints were last verified. And because marketplace APIs are shared, any fix reaches everyone using it.
Is this an official API from the source site?+
No — Parse APIs are independent, managed REST wrappers over publicly available data. That is the point: where a site has no official API (or only a limited one), Parse gives you a maintained, monitored endpoint for that data and keeps it working as the site changes — so you get a stable contract over a source that never promised one.
Can I fix or extend this API myself if I need a new endpoint or field?+
Yes — and you don't have to wait on us. This API was generated by the Parse agent, which stays attached. Describe the change in plain English ("add an endpoint that returns reviews", "fix the price field") in the revise box on the API page or via the revise_api MCP tool, and the agent rebuilds it against the live site in minutes. Contributing the change back to the public API is free.
What happens if I call an endpoint that has an issue?+
Errors are machine-readable: a bad call returns a clean status with the list of available endpoints and a repair hint, so an agent (or you) can recover or trigger a fix instead of failing silently. Confirmed failures feed the automatic repair queue.
Common use cases
  • Track the lowest float (wear) value available for a specific skin family using the float field in list_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_price and listing_count for all skin families via list_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_listings on page 0 to estimate catalog size before deciding whether to paginate across all 21 available pages.
  • Cross-reference listing_id values over time to detect when specific listings are removed from the market.
Pricing & limitsSee full pricing →
TierPriceCredits/monthRate limit
Free$0/mo2005 req/min
Hobby$30/mo1,00020 req/min
Developer$100/mo5,000100 req/min
Team$300/mo20,000300 req/min
Company$1,000/mo100,000500 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.

Frequently asked questions
Does Skinport have an official public developer API?+
Yes. Skinport publishes an official public API at https://docs.skinport.com. It exposes item sales history and market prices aggregated at the item level, but does not provide per-listing float values or the per-family enumeration that this Parse API covers.
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?+
Not currently. Both endpoints cover active listings only — items currently for sale on Skinport. Historical sales, completed transactions, and price trend data are not returned. You can fork this API on Parse and revise it to add an endpoint covering sales history.
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?+
Not currently. The 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.
Page content last updated . Spec covers 2 endpoints from api.skinport.com.
Related APIs in MarketplaceSee all →