NAV
shell javascript

Introduction

Welcome to SkinThunder Public API documentation! You can use our API to access various functionality on our site.

We have language bindings in Shell and JavaScript! You can view code examples in the dark area to the right, and you can switch the programming language of the examples with the tabs in the top right.

Authentication

Our API uses API keys to allow access to the API. You can register a new API key on your Profile page.

We expect the API key to be included in all API requests to the server in a header that looks like the following:

x-auth-skinthunder: YOUR_API_KEY

Test Authentication

curl -X GET "https://skinthunder.com/api/public/ping" \
  -H "x-auth-skinthunder: YOUR_API_KEY"
const apiKey = "YOUR_API_KEY";

fetch("https://skinthunder.com/api/public/ping", {
  method: "GET",
  headers: {
    "x-auth-skinthunder": apiKey,
  },
})
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error(error));

The above command returns JSON structured like this (success):

{
  "ack": "success",
  "message": "Authentication success for user ID USER_ID"
}

The above command returns JSON structured like this (error):

{
  "ack": "error",
  "message": "Authentication failed"
}

This endpoint tests if the authentication works.

HTTP Request

GET https://skinthunder.com/api/public/ping

Inventory

Reload Inventory

curl -X POST "https://skinthunder.com/api/public/reLoadInventory" \
  -H "x-auth-skinthunder: YOUR_API_KEY" \
  -H "Content-Type: application/json"
const apiKey = "YOUR_API_KEY";

fetch("https://skinthunder.com/api/public/reLoadInventory", {
  method: "POST",
  headers: {
    "x-auth-skinthunder": apiKey,
    "Content-Type": "application/json",
  },
})
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error(error));

The above command returns JSON structured like this (success):

{
  "ack": "success",
  "message": "Inventory load initiated"
}

The above command returns JSON structured like this (error):

{
  "ack": "error",
  "message": "Unknown error: ERROR_MESSAGE"
}

This endpoint initiates an inventory reload.

HTTP Request

POST https://skinthunder.com/api/public/reLoadInventory

Load Inventory

curl -X POST "https://skinthunder.com/api/public/inventory" \
  -H "x-auth-skinthunder: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "page": 1,
    "perPage": 1000,
    "query": "",
    "sort": "marketPriceDESC",
    "userItemStatus": "depositable"
  }'
const apiKey = "YOUR_API_KEY";
const requestBody = {
  page: 1,
  perPage: 1000,
  query: "",
  sort: "marketPriceDESC",
  userItemStatus: "depositable",
};

fetch("https://skinthunder.com/api/public/inventory", {
  method: "POST",
  headers: {
    "x-auth-skinthunder": apiKey,
    "Content-Type": "application/json",
  },
  body: JSON.stringify(requestBody),
})
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error(error));

The above command returns JSON structured like this (status: ok):

{
  "status": "ok",
  "list": {
    "count": 1,
    "pages": 1,
    "page": 1,
    "items": [
      {
        "appid": "730",
        "contextid": "2",
        "assetid": "20182474900",
        "classid": "4236900232",
        "instanceid": "480149972",
        "amount": "1",
        "id": "20182474900",
        "currency": 0,
        "background_color": "",
        "icon_url": "-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KU0Zwwo4NUX4oFJZEHLbXH5ApeO4YmlhxYQknCRvCo04DEVlxkKgpou-jxcjhhwszFI2kb092sgIWIqPv9NLPF2DMAuZIiibzDo933jQzk_UNvajz1IIXEclU8ZluF_gXtlO3s18K56cjXiSw0Ji5XUV8",
        "icon_url_large": "-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KU0Zwwo4NUX4oFJZEHLbXH5ApeO4YmlhxYQknCRvCo04DEVlxkKgpou-jxcjhhwszFI2kb092sgIWIqPv9NLPFqWdQ-sJ0xLGQpNumiwG2_UI-NmHzIoaWe1M4ZVuB-gK8xu26gcLv6Z7KmyZm73U8pSGKNCKmBkk",
        "descriptions": [
          {
            "type": "html",
            "value": "Exterior: Minimal Wear"
          },
          {
            "type": "html",
            "value": " "
          },
          {
            "type": "html",
            "value": "This item features StatTrak™ technology, which tracks certain statistics when equipped by its owner.",
            "color": "99ccff"
          },
          {
            "type": "html",
            "value": " "
          },
          {
            "type": "html",
            "value": "StatTrak™ Confirmed Kills: 1997",
            "color": "CF6A32"
          },
          {
            "type": "html",
            "value": "*Stats for this item will reset when used in Steam Trading or Community Market",
            "color": "ff4040"
          },
          {
            "type": "html",
            "value": " "
          },
          {
            "type": "html",
            "value": "A strong open-area LMG, the M249 is the perfect choice for players willing to trade a slow fire rate for increased accuracy and a high ammo capacity. Excavated from Aztec ruins, parts of this M249 have rusted and been covered in moss.\n\n<i>Never trust a rope bridge</i>"
          },
          {
            "type": "html",
            "value": " "
          },
          {
            "type": "html",
            "value": "The CS20 Collection",
            "color": "9da1a9"
          },
          {
            "type": "html",
            "value": " "
          },
          {
            "type": "html",
            "value": "<br><div id=\"sticker_info\" name=\"sticker_info\" title=\"Sticker\" style=\"border: 2px solid rgb(102, 102, 102); border-radius: 6px; width=100; margin:4px; padding:8px;\"><center><img width=64 height=48 src=\"https://steamcdn-a.akamaihd.net/apps/730/icons/econ/stickers/broken_fang/ancient_marauder.49d998ead3b818169682db8ea07c2ae5dc0ddcf7.png\"><br>Sticker: Ancient Marauder</center></div>"
          }
        ],
        "tradable": 1,
        "actions": [
          {
            "link": "steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20S%owner_steamid%A%assetid%D16198368983913894896",
            "name": "Inspect in Game..."
          }
        ],
        "name": "StatTrak™ M249 | Aztec",
        "name_color": "CF6A32",
        "type": "StatTrak™ Restricted Machinegun",
        "market_name": "StatTrak™ M249 | Aztec (Minimal Wear)",
        "market_hash_name": "StatTrak™ M249 | Aztec (Minimal Wear)",
        "market_actions": [
          {
            "link": "steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20M%listingid%A%assetid%D16198368983913894896",
            "name": "Inspect in Game..."
          }
        ],
        "commodity": 0,
        "market_tradable_restriction": 7,
        "marketable": 1,
        "tags": [
          {
            "category": "Type",
            "internal_name": "CSGO_Type_Machinegun",
            "localized_category_name": "Type",
            "localized_tag_name": "Machinegun",
            "category_name": "Type",
            "name": "Machinegun"
          },
          {
            "category": "Weapon",
            "internal_name": "weapon_m249",
            "localized_category_name": "Weapon",
            "localized_tag_name": "M249",
            "category_name": "Weapon",
            "name": "M249"
          },
          {
            "category": "ItemSet",
            "internal_name": "set_community_24",
            "localized_category_name": "Collection",
            "localized_tag_name": "The CS20 Collection",
            "category_name": "Collection",
            "name": "The CS20 Collection"
          },
          {
            "category": "Quality",
            "internal_name": "strange",
            "localized_category_name": "Category",
            "localized_tag_name": "StatTrak™",
            "color": "CF6A32",
            "category_name": "Category",
            "name": "StatTrak™"
          },
          {
            "category": "Rarity",
            "internal_name": "Rarity_Mythical_Weapon",
            "localized_category_name": "Quality",
            "localized_tag_name": "Restricted",
            "color": "8847ff",
            "category_name": "Quality",
            "name": "Restricted"
          },
          {
            "category": "Exterior",
            "internal_name": "WearCategory1",
            "localized_category_name": "Exterior",
            "localized_tag_name": "Minimal Wear",
            "category_name": "Exterior",
            "name": "Minimal Wear"
          }
        ],
        "botInfo": {
          "wear": "Minimal Wear",
          "vanilla": false,
          "shortWear": "MW",
          "rarity": "StatTrak™ Restricted Machinegun",
          "inspectInSteam": "https://steamcommunity.com/profiles/765611989710277777/inventory/#730_2_20182474900",
          "inspectInGame": "steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20S765611989710277777A20182474900D16198368983913894896",
          "tradeBan": null,
          "stickers": [
            {
              "market_hash_name": "Ancient Marauder",
              "icon_url": "https://steamcdn-a.akamaihd.net/apps/730/icons/econ/stickers/broken_fang/ancient_marauder.49d998ead3b818169682db8ea07c2ae5dc0ddcf7.png"
            }
          ],
          "steamid": "765611989710277777",
          "names": {
            "name1": "StatTrak™ M249",
            "name2": "Aztec",
            "name3": ["Minimal Wear", "Restricted", "Machinegun"]
          }
        },
        "webApiInfo": {
          "retail_price": 2.07,
          "market_price": 2.64,
          "market_difference": -21.59,
          "category_id": 45,
          "is_featured": false,
          "is_private": false,
          "is_auction": false,
          "is_exchangable": false,
          "screenshot": "",
          "phase": "",
          "phase_id": 0,
          "in_trade": false,
          "in_cart": false,
          "deposited_item": false,
          "owned_by_skinthunder": false,
          "owned_by_user": true,
          "is_listed": false,
          "is_p2p_able": true,
          "private_hash": "",
          "in_p2p_trade": {
            "status": false
          },
          "seller": {
            "steam_id": "765611989710277777",
            "level": 5,
            "details": {
              "SteamId": "765611989710277777",
              "CommunityVisibilityState": 3,
              "ProfileState": 1,
              "PersonaName": "UserName",
              "LastLogoff": 0,
              "CommentPermission": 0,
              "ProfileUrl": "https://steamcommunity.com/profiles/765611989710277777/",
              "Avatar": "https://avatars.akamai.steamstatic.com/7dec9af3c5d71f20de43923311c3b8c6eb9f5.jpg",
              "AvatarMedium": "https://avatars.akamai.steamstatic.com/7dec9af3c5d71f20de43923311c3b8c6eb9f5_medium.jpg",
              "AvatarFull": "https://avatars.akamai.steamstatic.com/7dec9af3c5d71f20de43923311c3b8c6eb9f5_full.jpg",
              "PersonaState": 0,
              "RealName": null,
              "PrimaryClanId": "1035827914704777777",
              "TimeCreated": 1561012567,
              "PersonaStateFlags": 0
            },
            "average_trade_time": 0,
            "percentage_of_successful_trades": 0,
            "last_active": "2023-05-10T08:35:41.69"
          }
        },
        "detailInfo": {
          "stickers": [
            {
              "slot": 2,
              "sticker_id": 4682,
              "wear": null,
              "scale": null,
              "rotation": null,
              "tint_id": null
            }
          ],
          "accountid": null,
          "itemid": "20182474900",
          "defindex": 14,
          "paintindex": 902,
          "rarity": 4,
          "quality": 9,
          "paintwear": 0.1266733556985855,
          "paintseed": 88,
          "killeaterscoretype": 0,
          "killeatervalue": 1997,
          "customname": null,
          "inventory": 257,
          "origin": 8,
          "questid": null,
          "dropreason": null,
          "musicindex": null,
          "entindex": null,
          "floatvalue": 0.1266733556985855,
          "differentFromLastUpdate": true
        }
      }
    ],
    "filters": {
      "perPage": 1000,
      "page": 1,
      "query": "",
      "sort": "marketPriceDESC",
      "userItemStatus": "depositable"
    }
  }
}

The above command returns JSON structured like this (status: pending):

{
  "status": "pending"
}

The above command returns JSON structured like this (status: error):

{
  "status": "error",
  "statusCode": int,
  "message": string
}

This endpoint loads your inventory.

HTTP Request

POST https://skinthunder.com/api/public/inventory

Query Parameters

Parameter Default Description
page 1 The page number.
perPage 20 The number of items to be displayed per page.
query "" The search query.
sort "" The sort order. Can be one of:
  • featured
  • discount
  • ageDESC
  • priceASC
  • priceDESC
  • marketPriceASC
  • marketPriceDESC
  • floatASC
  • floatDESC
userItemStatus "" The status of the user item. Can be one of:
  • depositable
  • withdrawable
  • listable
  • listed
  • editable

DetailInfo Parameter

Parameter Default Description
detailInfo null An object that contains detailed information about the skin. This parameter can have three possible values:
1. null - detailed information has not been loaded. In this case, it is recommended to make a repeated request.
2. {} - an empty object. This means that this skin does not have detailed information.
3. An object with detailed information. It contains various parameters of the skin, for example, information about stickers, float value, rarity, quality, etc.

List Items

curl -X POST https://skinthunder.com/api/public/list \
  -H 'x-auth-skinthunder:: <YOUR_API_KEY>' \
  -H 'Content-Type: application/json' \
  -d '[
    {
        "itemId": "30584687063",
        "price": 324.99,
        "isScreenshotEnabled": false,
        "isPrivateEnabled": false,
        "isFeaturedEnabled": false,
        "isExchangable": true
    }
  ]'
const data = [
  {
    itemId: "30584687063",
    price: 324.99,
    isScreenshotEnabled: false,
    isPrivateEnabled: false,
    isFeaturedEnabled: false,
    isExchangable: true,
  },
];

fetch("https://skinthunder.com/api/public/list", {
  method: "POST",
  headers: {
    "x-auth-skinthunder": "<YOUR_API_KEY>",
    "Content-Type": "application/json",
  },
  body: JSON.stringify(data),
})
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => {
    console.error("Error:", error);
  });

The above command returns JSON structured like this (status: ok):

{
  "status": "ok",
  "message": "success"
}

This endpoint allows you to list multiple items.

HTTP Request

POST /api/public/list

Query Parameters

Parameter Description
itemId The item ID.
price The price of the item in US dollars.
isScreenshotEnabled Boolean indicating if screenshot is enabled.
isPrivateEnabled Boolean indicating if the item is private.
isFeaturedEnabled Boolean indicating if the item is featured.
isExchangable Boolean indicating if the item is exchangable.

Update Items

curl -X POST https://skinthunder.com/api/public/list \
  -H 'x-auth-skinthunder:: <YOUR_API_KEY>' \
  -H 'Content-Type: application/json' \
  -d '[
    {
        "itemId": "30584687063",
        "price": 324.99,
        "isListed": true,
        "isPrivateEnabled": false,
        "isFeaturedEnabled": false,
        "isExchangable": true
    }
  ]'
const data = [
  {
    itemId: "30584687063",
    price: 324.99,
    isListed: true,
    isPrivateEnabled: false,
    isFeaturedEnabled: false,
    isExchangable: true,
  },
];

fetch("https://skinthunder.com/api/public/list", {
  method: "POST",
  headers: {
    "x-auth-skinthunder": "<YOUR_API_KEY>",
    "Content-Type": "application/json",
  },
  body: JSON.stringify(data),
})
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => {
    console.error("Error:", error);
  });

The above command returns JSON structured like this (status: ok):

{
  "status": "ok",
  "message": "success"
}

This endpoint allows you to update multiple items.

HTTP Request

POST /api/public/list

Query Parameters

Parameter Description
itemId The item ID.
price The price of the item in US dollars.
isListed Boolean indicating whether the item is listed for sale or not listed for sale. Must be true if you want to update item data.
isPrivateEnabled Boolean indicating if the item is private.
isFeaturedEnabled Boolean indicating if the item is featured.
isExchangable Boolean indicating if the item is exchangable.

Remove Items

curl -X POST https://skinthunder.com/api/public/list \
  -H 'x-auth-skinthunder:: <YOUR_API_KEY>' \
  -H 'Content-Type: application/json' \
  -d '[
    {
        "itemId": "30584687063",
        "price": 324.99,
        "isListed": false,
    }
  ]'
const data = [
  {
    itemId: "30584687063",
    price: 324.99,
    isListed: false,
  },
];

fetch("https://skinthunder.com/api/public/list", {
  method: "POST",
  headers: {
    "x-auth-skinthunder": "<YOUR_API_KEY>",
    "Content-Type": "application/json",
  },
  body: JSON.stringify(data),
})
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => {
    console.error("Error:", error);
  });

The above command returns JSON structured like this (status: ok):

{
  "status": "ok",
  "message": "success"
}

This endpoint allows you to remove multiple items.

HTTP Request

POST /api/public/list

Query Parameters

Parameter Description
itemId The item ID.
price The price of the item in US dollars.
isListed Boolean indicating whether the item is listed for sale or not listed for sale. Must be false if you want to remove item from sale.

Account Details

curl -X GET \
  https://skinthunder.com/api/public/accountDetails \
  -H 'Content-Type: application/json' \
  -H 'x-auth-skinthunder: <YOUR_API_KEY>'
fetch("https://skinthunder.com/api/public/accountDetails", {
  method: "GET",
  headers: {
    "Content-Type": "application/json",
    "x-auth-skinthunder:": "<YOUR_API_KEY>",
  },
})
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error("Error:", error));

On a successful request, the server responds with a JSON object containing various account details. Here's an example of a successful response::

{
  "totalBalance": 3386.27,
  "withdrawableBalance": 1961.27,
  "withdrawableItems": 0,
  "sellingItems": 29,
  "playerSummary": {
    "steamId": "765611989710277777",
    "communityVisibilityState": 3,
    "profileState": 1,
    "personaName": "UserName",
    "lastLogoff": 0,
    "commentPermission": 0,
    "profileUrl": "https://steamcommunity.com/profiles/765611989710277777/",
    "avatar": "https://avatars.akamai.steamstatic.com/7dec9af3c5d71f20de43923311c3b8c6eb9f5.jpg",
    "avatarMedium": "https://avatars.akamai.steamstatic.com/7dec9af3c5d71f20de43923311c3b8c6eb9f5_medium.jpg",
    "avatarFull": "https://avatars.akamai.steamstatic.com/7dec9af3c5d71f20de43923311c3b8c6eb9f5_full.jpg",
    "personaState": 0,
    "realName": null,
    "primaryClanId": "1035827914704777777",
    "timeCreated": 1561012567,
    "personaStateFlags": 0
  },
  "preferences": {
    "tradeUrl": "https://steamcommunity.com/tradeoffer/new/?partner=1010777777&token=dsfdfsf",
    "cookieConsentAccepted": true,
    "apiTermsAccepted": false
  },
  "lastInventoryUpdate": "2023-06-28T14:10:31.023",
  "type": "PREMIUM",
  "typeAutoPayType": null,
  "typeNextAutoPay": null,
  "typePaidTill": null,
  "email": "user@email.com",
  "emailVerified": true,
  "userLevel": 5,
  "commissionKey": "PREMIUM",
  "commissions": {
    "basePercent": 0.0,
    "privateListingMinPercent": 0.0,
    "privateListingMaxAbsolute": 0.0,
    "featuredListingMinPercent": 0.0,
    "featuredListingMinAbsolute": 0.0
  },
  "notifications": 31,
  "lastActive": "2023-06-28T14:35:41.797"
}

This API endpoint is used to retrieve detailed information about your account.

HTTP Request

GET /api/public/accountDetails

Errors

Error Code Meaning
400 Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
405 Method Not Allowed
406 Not Acceptable
410 Gone
429 Too Many Requests
500 Internal Server Error
503 Service Unavailable