API documentation

A read-only REST API over the Skinlooters catalog: skin search, best offers per marketplace and price history, for CS2, Rust, TF2 and Dota 2.

← Back to the API offer

Base URL

Every route is prefixed with /v1/public. The version number only changes on a breaking change: adding a field to a response isn't one, so your integration must ignore fields it doesn't know about.

https://api.skinlooters.com/v1/public

Authentication

Every request must carry your key in the X-Api-Key header. It's emailed to you once the subscription is confirmed, and stays visible (and rotatable) from your backoffice.

curl -H "X-Api-Key: YOUR_KEY" \
  "https://api.skinlooters.com/v1/public/skins?game=cs2&query=ak-47&sort=price_asc"

The key is a password: call the API from your server, never from a web front-end or a mobile app where it would be readable. If it leaks, rotate it from the backoffice — the old one is revoked immediately.

Quotas and limits

The quota is daily and resets at midnight UTC. Every response carries the current counter state:

FieldTypeDescription
X-RateLimit-LimitintegerYour plan's daily quota.
X-RateLimit-RemainingintegerCalls left for the current UTC day.

Past it, the API replies 429. Over-quota calls still count: retrying in a loop won't unblock anything before the reset.

Pagination

The list is paginated with page (1 to 1000) and limit (1 to 100, 30 by default). Out-of-range values are clamped to the nearest bound rather than rejected, and the total number of matching items comes back in total. To walk a whole catalog, iterate page until you have covered total.

Prices and currencies

All prices are integers in cents, never floats — 2439 means 24.39. best_price is in the offer's native currency (best_currency); on a skin's detail, each offer also carries price_usd_cents, converted at the current rate, so you can compare offers across currencies without redoing the conversion.

Endpoints

GET/v1/public/skins

List and search skins

The paginated, filtered and sorted catalog. Only skins with at least one active offer are returned.

curl -H "X-Api-Key: YOUR_KEY" \
  "https://api.skinlooters.com/v1/public/skins?game=cs2&category=couteaux&minPrice=100&sort=price_asc&limit=30"
Parameters
ParameterTypeDefaultDescription
querystringFull-text search on the item's market hash name.
gamestringcs2Catalog game.
categorystringItem category (CS2).
weaponstringExact weapon, as returned in weapon.
typestringItem type (TF2, Dota 2).
wearstringExact wear (CS2).
stattrakbooleantrue to keep only StatTrak™ items, false to exclude them.
minPricenumberMinimum price in USD (units, not cents) — 12.5 is valid.
maxPricenumberMaximum price in USD (units, not cents).
sortstringbest_dealSort order.
pageinteger1Page, 1 to 1000.
limitinteger30Items per page, 1 to 100.
Response fields
FieldTypeDescription
skinsarrayThe current page of skins.
skins[].best_priceintegerCheapest active offer, in cents of best_currency.
skins[].best_currencystringNative currency of the cheapest offer.
skins[].offer_countintegerNumber of active offers on that skin.
totalintegerTotal number of skins matching the filter, across all pages.
pageintegerThe page actually returned (after clamping).
limitintegerThe page size actually applied.
Example response
{
  "skins": [
    {
      "id": "b5c12128-3cdb-4a62-af3a-7826888161d0",
      "game": "cs2",
      "slug": "ak-47-redline-field-tested",
      "market_hash_name": "AK-47 | Redline (Field-Tested)",
      "weapon": "AK-47",
      "skin_name": "Redline",
      "wear": "Field-Tested",
      "stattrak": 0,
      "souvenir": 0,
      "icon_url": "/icons/a8300e12119917504.png",
      "best_price": 2439,
      "best_currency": "USD",
      "offer_count": 7
    }
  ],
  "total": 31045,
  "page": 1,
  "limit": 30
}

GET/v1/public/skins/:slug

Skin detail

One skin, all of its active offers sorted cheapest first, and its last 200 price readings. The slug is the one returned by the list endpoint.

curl -H "X-Api-Key: YOUR_KEY" \
  "https://api.skinlooters.com/v1/public/skins/ak-47-redline-field-tested"
Parameters
ParameterTypeDefaultDescription
slugstringThe skin's URL identifier (a path segment, not a query parameter).
Response fields
FieldTypeDescription
skinobjectThe skin, with its metadata and precomputed best price.
listingsarrayActive offers, cheapest first (on net price).
listings[].providerstringMarketplace the offer comes from.
listings[].price_centsintegerPrice as displayed by the marketplace, in cents of currency.
listings[].net_price_centsintegerPrice net of marketplace fees, in cents — this is what sorting and best price use.
listings[].price_usd_centsintegerThe net price in US cents, at the current rate.
listings[].float_valuenumber | nullThe item's float when the marketplace exposes it, otherwise null.
listings[].affiliate_urlstringAffiliate purchase link, to be used as-is so attribution isn't lost.
listings[].updated_atstringWhen Skinlooters last refreshed that row (ISO 8601, UTC).
historyarrayThe last 200 price readings, newest first.
Example response
{
  "skin": {
    "id": "b5c12128-3cdb-4a62-af3a-7826888161d0",
    "game": "cs2",
    "slug": "ak-47-redline-field-tested",
    "market_hash_name": "AK-47 | Redline (Field-Tested)",
    "weapon": "AK-47",
    "skin_name": "Redline",
    "wear": "Field-Tested",
    "stattrak": 0,
    "souvenir": 0,
    "icon_url": "/icons/a8300e12119917504.png",
    "item_type": null,
    "best_price_native_cents": 2439,
    "best_price_currency": "USD",
    "best_price_usd_cents": 2439,
    "offer_count": 7
  },
  "listings": [
    {
      "id": "fd9350e0-845c-4cb6-a7a7-755bed83c5ab",
      "provider": "skinport",
      "price_cents": 2439,
      "currency": "EUR",
      "net_price_cents": 2317,
      "float_value": 0.2214,
      "affiliate_url": "https://skinport.com/item/...",
      "updated_at": "2026-09-06T05:22:36.000Z",
      "price_usd_cents": 2510
    }
  ],
  "history": [
    { "provider": "skinport", "price_cents": 2439, "recorded_at": "2026-09-05T13:34:22.000Z" }
  ]
}

GET/v1/public/skins/:slug/price-history

Price history

A time series per marketplace. Points under 30 days old come back raw (one point per reading); older ones are averaged to one point per marketplace per day, so a 90-day window stays plottable instead of returning thousands of points.

curl -H "X-Api-Key: YOUR_KEY" \
  "https://api.skinlooters.com/v1/public/skins/ak-47-redline-field-tested/price-history?period=90d"
Parameters
ParameterTypeDefaultDescription
slugstringThe skin's URL identifier (a path segment, not a query parameter).
periodstring30dHistory window.
Response fields
FieldTypeDescription
periodstringThe window actually applied (30d if the requested value is unknown).
pointsarraySeries points, oldest first.
points[].providerstringMarketplace the offer comes from.
points[].price_centsintegerPrice as displayed by the marketplace, in cents of currency.
points[].recorded_atstringWhen the reading was taken (ISO 8601, UTC).
Example response
{
  "period": "7d",
  "points": [
    { "provider": "waxpeer", "price_cents": 2239, "recorded_at": "2026-09-04T10:16:41.000Z" },
    { "provider": "skinport", "price_cents": 2317, "recorded_at": "2026-09-04T10:37:22.000Z" }
  ]
}

Accepted values

Games cs2 rust tf2 dota2

Categories (CS2) armes couteaux gants stickers graffitis autres

Wears (CS2) Factory New Minimal Wear Field-Tested Well-Worn Battle-Scarred

Sorts best_deal price_asc price_desc date_asc date_desc

History periods 7d 30d 90d

category, wear and stattrak are CS2-specific notions: on the other games those filters match nothing.

Errors

CodeBodyDescription
401{"error":"missing_api_key"}The X-Api-Key header is missing.
401{"error":"invalid_api_key"}Unknown, revoked or disabled key.
404{"error":"not_found"}No skin matches that slug.
429{"error":"quota_exceeded"}Daily quota exceeded, retry after midnight UTC.

Data freshness

Offers are re-ingested continuously; updated_at on each offer says exactly when that row was last checked. There's no point polling the same skin more often than every few minutes — the response won't move and the request still counts against your quota.

Support

A question, a missing field, or volume needs beyond the Pro plan? hello@skinlooters.com