
DEVELOPER ACCESS · BETA
SkinSnipe API
Pricing and price-alert endpoints for CS2, Dota 2, Team Fortress 2 and Rust.
- Counter-Strike 2
- Dota 2
- Team Fortress 2
- Rust
ONE API, MULTIPLE MARKETS
Pricing + price alertsExplore endpoints, rate limits and response schemas.
Get started with the APIYour plan
Choose an API plan, then compare endpoint access and rate limits in the guide below. Business-only features are labeled in each endpoint section.
Checking your API subscription
Standard Plan
19.99€per month
Essential pricing endpoints to get started with the API.
Limited API access
Limited pricing endpoints
Restricted rate limits
Price history requires Business
Business Plan
49.99€per month
Full endpoint access, price history and Discord price alerts.
PRO lifetime SkinSnipe membership
Full API access
Pricing endpoints
Notification endpoints
Increased rate limits
Max. 90d price history
Live support at Discord
For commercial use
Getting started
Welcome to the SkinSnipe API. Access pricing data across more than 20 digital markets for Counter-Strike 2, Rust, Dota 2 and Team Fortress 2.
- Market pricingLowest prices across supported markets.
- Price historyUp to 90 days on Business.
- Price alertsCreate and manage Discord notifications.
The base URL is available to users with an API plan.
To get started, generate an API key below, then use it to authenticate your requests.
API Key
Generate an API key
Create a key to authenticate your API requests. Store it securely when it is displayed.
Checking your API access…
Authentication & Headers
All endpoints require authentication. Include the API key you generated in the Authorization header using the Key scheme:
Authorization: Key <your-api-key>Required request headers
Acceptapplication/jsonAccept-Encodingbr
Use the API responsibly. Any kind of misuse may result in a permanent account ban.
Status & Rate-Limiting
Use these HTTP status codes to understand the result of an API request. Error responses also include a message with additional details.
200OKStandard response for successful requests.400Bad RequestQuery parameters are invalid or missing.401UnauthorizedThe API key is missing or has an invalid format. See Authentication.403ForbiddenYou do not have access to this endpoint.404Not FoundThe endpoint does not exist.406Not AcceptableTheAcceptorAccept-Encodingheader is missing.429Too Many RequestsThe request limit per minute was exceeded.500Internal Server ErrorThe server may be unavailable or under maintenance. Contact us if the error persists.
Rate-limit response headers
Each endpoint has a requests-per-minute (RPM) limit determined by its type and your API plan. When a limit is reached, use these response headers to decide when to retry:
X-RateLimit-LimitMaximum RPM for this request.X-RateLimit-RemainingRequests left before the limit is reached.X-RateLimit-ResetWhen the request counter resets (epoch format).Retry-AfterSeconds until you can retry the request.Avoid uncontrolled or excessive requests; your account may be banned.
Base URL
The base URL used by the endpoints below is:
Checking your API access…
Endpoints
1GETLowest prices
Returns the lowest price list of all skins for all markets we work with in SkinSnipe, along with the item quantity in stock (only for supported markets).
Will only return items that are listed in at least 1 marketplace.
Parameters
| Name | Type | Required | Example | Standard Plan | Business Plan | Description |
|---|---|---|---|---|---|---|
game | integer | Yes | game=730 | Yes | Yes | The target game to get the skins from.
|
markets | string array[] | Yes | markets=dmarket,skinport | Max. 1 per request | Unlimited | The markets from which to retrieve prices. |
currency | string | No | currency=EUR | Yes | Yes | The currency in which prices should be displayed (default: "USD"). |
Response
Example response for this request:GET https://pricing.tradeupspy.com/public/lowest-prices?game=730&markets=skinport,dmarket¤cy=EUR
{
"i": 5087,
"c": "EUR",
"d": [
{
"n": "AWP | Asiimov (Field-Tested)",
"l": [
{
"m": "skinport",
"p": 133.93,
"q": 116
},
{
"m": "dmarket",
"p": 134.39,
"q": 58
},
...
]
},
{
"n": "★ Karambit | Tiger Tooth (Factory New)",
"l": [
{
"m": "skinport",
"p": 1259.02,
"q": 2
},
...
]
},
...
]
}{
"i": number, // item count
"c": string, // currency
"d": array [ // data
{
"n": string, // market hash name
"l": array [ // listings
{
"m": string, // market key
"p": number, // price
"q": number | null // quantity
},
...
]
},
...
]
}2GETSteam average prices
Returns the average Steam price over the last 30 days, together with approximate 30-day volume and a stability indicator.
If the data is unstable, a suggested price may also be included when at least five markets have pricing data.
Steam items can be highly volatile, and low-volume or high-tier listings may make estimates unreliable. Check the volume and stability indicator before using a price.
Parameters
| Name | Type | Required | Example | Standard Plan | Business Plan | Description |
|---|---|---|---|---|---|---|
game | integer | Yes | game=730 | Yes | Yes | The target game to get the skins from.
|
currency | string | No | currency=EUR | Yes | Yes | The currency in which prices should be displayed (default: "USD"). |
Response
Example response for this request:GET https://pricing.tradeupspy.com/public/steam-prices
{
"i": 23542,
"c": "USD",
"d": [
{
"n": "USP-S | Cortex (Factory New)",
"p": 15.10,
"v": 20,
"s": true
},
{
"n": "AWP | Dragon Lore (Minimal Wear)",
"p": 1724.06,
"v": 0,
"s": false,
"r": 10363.75
},
...
]
}{
"i": number, // item count
"c": string, // currency
"d": array [ // data
{
"n": string, // market hash name
"p": number, // average price
"v": number, // last 30d volume
"s": boolean // stable indicator (if false, price is probably wrong due to low volume/high tier item)
"r": number | undefined, // recommended price if unstable and if >= 5 markets have pricing data
},
...
]
}3GETItem IDsBusiness only
Returns the list of IDs of all the items stored in our database, plus the corresponding name, extra and exterior.
This information can be used to obtain the list of all the items that exist in the selected game, and/or to manage the price history and price alerts endpoints.
Parameters
| Name | Type | Required | Example | Standard Plan | Business Plan | Description |
|---|---|---|---|---|---|---|
game | integer | Yes | game=730 | No | Yes | The target game to get the skins from.
|
Response
Example response for this request:GET https://pricing.tradeupspy.com/public/items-ids?game=730
{
"i": 10502,
"d": [
{
"n": "AK-47 | Asiimov (Factory New)",
"id": 1,
"e1": 1,
"e2": 1
},
{
"n": "AK-47 | Asiimov (Minimal Wear)",
"id": 1,
"e1": 1,
"e2": 2
},
...
]
}{
"i": number, // item count
"d": array [ // data
{
"n": string, // name
"id": number, // id
"e1": number, // extra id
"e2": number // exterior id
},
...
]
}4GETItem price historyBusiness only
Returns an item's average price history, with one entry per day for the selected 7-, 30- or 90-day period.
Parameters
| Name | Type | Required | Example | Standard Plan | Business Plan | Description |
|---|---|---|---|---|---|---|
id | integer | Yes | id=1 | No | Yes | Item ID. Refer to "Item IDs" endpoint for more information. |
range | integer | Yes | range=30 | No | Yes | The desired period of time in days.
|
currency | string | No | currency=EUR | No | Yes | The currency in which prices should be displayed (default: "USD"). |
Response
Example response for this request:GET https://pricing.tradeupspy.com/public/price-history?id=1&range=30
{
"id": 1,
"range": 30,
"currency": "USD",
"data": [
{
"item_hash_name": "AK-47 | Asiimov (Factory New)",
"historics_by_market": [
{
"market_name": "steam",
"historic": [
{
"date": "2025-04-28",
"price": 240.26
},
...
]
},
...
]
},
...
]
}{
"id": number, // item id
"range": number, // range in days
"currency": string, // currency
"data": array [ // data
{
"item_hash_name": string, // item hash name
"historics_by_market": array [ // historic array
{
"market_name": string, // market name
"historic": array [ // date-price pair array
{
"date": string, // date in YYYY-MM-DD format
"price": number, // price
},
...
]
},
...
]
},
...
]
}Price alerts & Discord
Manage price alerts that are delivered to your connected Discord account.
When an alert matches its conditions, SkinSnipe sends a message with the details and a direct link to the listing.
You can create up to 200 alerts. Each becomes inactive after its notification limit is reached; inactive alerts can be refreshed manually.
5GETPrice alertsBusiness only
Returns the user's entire list of notifications.
Parameters
No parameters required.Response
Example response for this request:GET https://pricing.tradeupspy.com/public/price-alerts
{
"count": 17,
"alerts": [
{
"id_item": 1341,
"name_item": "★ Broken Fang Gloves | Jade",
"market_hash_name": "★ Broken Fang Gloves | Jade (Factory New)",
"id_extra": 1,
"name_extra": "Standard",
"id_exterior": 1,
"name_exterior": "Factory New",
"id_frequency": 1,
"name_frequency": "1-Time",
"id_interval": null,
"name_interval": null,
"id_operator": 1,
"name_operator": "<=",
"paused": false,
"created": "2024-10-10T15:56:24.000Z",
"notifications_left": 0,
"notifications_last": "2024-10-10T17:57:20.000Z",
"trigger_prices": [
{
"market": "skinport",
"price": 600
},
{
"market": "skinbid",
"price": 580
},
...
]
},
...
]
}{
"count": number, // price alert count
"alerts": array [ // price alert list
{
"id_item": number, // item id
"name_item": string, // item name (short)
"market_hash_name": string, // item name (market hash)
"id_extra": number, // extra id
"name_extra": string, // extra name
"id_exterior": number, // exterior id
"name_exterior": string, // exterior name
"id_frequency": number, // frequency id
"name_frequency": string, // frequency name
"id_interval": number | null, // interval id (null if 1-Time)
"name_interval": string | null, // interval name (null if 1-Time)
"id_operator": number, // operator id
"name_operator": string, // operator name
"paused": boolean, // is paused
"created": string, // date of creation (ISO)
"notifications_left": number, // notifications left count
"notifications_last": string | null, // date of last trigger (ISO)
"trigger_prices": array [ // trigger prices array
{
"market": string, // market name
"price": number // market alert price
},
...
]
},
...
]
}6POSTCreate price alertBusiness only
Adds a new notification (max. 200).
Parameters
No parameters required.Body
| Name | Type | Required | Example | Standard Plan | Business Plan | Description |
|---|---|---|---|---|---|---|
id | integer | Yes | id: 1 | No | Yes | Item ID. Refer to "Item IDs" endpoint for more information. |
extra | integer | Yes | extra: 1 | No | Yes | Item extra ID. |
exterior | integer | Yes | exterior: 1 | No | Yes | Item exterior ID. |
frequency | integer | Yes | frequency: 1 | No | Yes | Notification trigger frequency.
|
interval | integer | Yes | interval: 1 | No | Yes | Notification cooldown between triggers. For repeating notifications only.
|
operator | integer | Yes | operator: 1 | No | Yes | Notification operator that triggers the alert.
|
trigger_prices | array | Yes | | No | Yes | Market-price condition pairs that will trigger the price alert once met. |
Request example
Example request body:POST https://pricing.tradeupspy.com/public/price-alerts
{
"id": 1,
"extra": 1,
"exterior": 2,
"frequency": 1,
"interval": 1,
"operator": 1,
"trigger_prices": [
{
"market": "skinport",
"price": 50.25
},
{
"market": "csgofloat",
"price": 45
}
]
}{
"id": number, // item id
"extra": number, // item extra
"exterior": number, // item exterior
"frequency": number, // notification frequency
"interval": number, // notification interval
"operator": number, // notification operator
"trigger_prices": array [ // notification trigger prices
{
"market": string, // market name
"price": number // trigger price
},
...
]
}7DELETEDelete price alertBusiness only
Removes a user's price alert from the database.
Parameters
| Name | Type | Required | Example | Standard Plan | Business Plan | Description |
|---|---|---|---|---|---|---|
id | integer | Yes | id=1 | No | Yes | Item ID. Refer to "Item IDs" endpoint for more information. |
extra | integer | Yes | extra=1 | No | Yes | Item extra ID. |
exterior | integer | Yes | exterior=1 | No | Yes | Item exterior ID. |
Response
Example response for this request:DELETE https://pricing.tradeupspy.com/public/price-alerts?id=1&extra=1&exterior=1
{
"msg": "Price alert successfully deleted."
}8GETRefresh alertBusiness only
Refreshes a price alert that had become inactive because it had already been notified, allowing it to re-notify you again. This only applies for One-Time notifications.
Parameters
| Name | Type | Required | Example | Standard Plan | Business Plan | Description |
|---|---|---|---|---|---|---|
id | integer | Yes | id=1 | No | Yes | Item ID. Refer to "Item IDs" endpoint for more information. |
extra | integer | Yes | extra=1 | No | Yes | Item extra ID. |
exterior | integer | Yes | exterior=1 | No | Yes | Item exterior ID. |
Response
Example response for this request:GET https://pricing.tradeupspy.com/public/refresh-alerts-one?id=1&extra=1&exterior=1
{
"msg": "Price alert successfully refreshed."
}9GETRefresh all alertsBusiness only
Refreshes all price alerts that had become inactive because they had already been notified, allowing them to re-notify you again. This only applies for One-Time notifications.
Parameters
No parameters required.Response
Example response for this request:GET https://pricing.tradeupspy.com/public/refresh-alerts-all
{
"msg": "All price alerts successfully refreshed."
}10GETPause alertBusiness only
Enables/disables a notification.
Parameters
| Name | Type | Required | Example | Standard Plan | Business Plan | Description |
|---|---|---|---|---|---|---|
pause | boolean | Yes | pause=true | No | Yes | Indicates if the alert will be paused or enabled.
|
id | integer | Yes | id=1 | No | Yes | Item ID. Refer to "Item IDs" endpoint for more information. |
extra | integer | Yes | extra=1 | No | Yes | Item extra ID. |
exterior | integer | Yes | exterior=1 | No | Yes | Item exterior ID. |
Response
Example response for this request:GET https://pricing.tradeupspy.com/public/pause-alert?pause=true&id=1&extra=1&exterior=1
{
"msg": "Price alert successfully paused."
}