Base URL: https://cs2.space
Dota 2 inventory
GETx-api-key requiredPRO & DEVELOPER
A player's Dota 2 inventory, parsed: hero, slot, type, rarity, quality, tradability and USD price for every item.
HTTP ENDPOINT
Endpoint URI
Full example URL: https://cs2.space/api/dota2/inventory/76561198001497299?sort=price_desc&limit=1
PARAMETERS
Path parameters
idSTRINGREQUIREDSteamID64 (17 digits, e.g. 76561197963540638) or custom profile URL name (e.g. ChetCS).
PARAMETERS
Query parameters
heroSTRINGOnly items for this hero, e.g. Juggernaut (case-insensitive).
categorySTRINGOnly items of this type, e.g. Wearable, Courier, Ward, Bundle, Treasure (case-insensitive).
sortSTRINGSort order. Default is Steam's inventory order.Values:price_descprice_ascname_asc
limitINTEGERItems per page, 1 to 1000.Default: 100
offsetINTEGERNumber of items to skip.Default: 0
freshBOOLEANPRO and DEVELOPER keys only: skip the 30 minute cache and fetch from Steam.Default: false
BEHAVIOR
Implementation notes
- Prices are USD market prices, refreshed every 15 minutes. Items with no active market have price: null.
- Inventories are cached for 30 minutes.
USAGE
Example request
curl -H "x-api-key: YOUR_KEY" "https://cs2.space/api/dota2/inventory/76561198001497299?sort=price_desc&limit=1"PAYLOAD
Example response
RESPONSE · 200 OK · long arrays shortened to one entry
{ "steamId": "76561198001497299", "game": "dota2", "steamInventoryUrl": "https://steamcommunity.com/profiles/76561198001497299/inventory/#570", "summary": { "totalCount": 2115, "tradableCount": 1406, "categoryCounts": { "Wearable": 1665, "Cursor Pack": 9, "Loading Screen": 162, "HUD Skin": 12, "Bundle": 47, "Taunt": 43, "Announcer": 15, "Courier": 28, "Tool": 47, "Pennant": 1, "Ward": 13, "Gem / Rune": 9, "League": 3, "Player Card": 9, "Misc": 14, "Music": 8, "Terrain": 2, "Treasure": 21, "Roshan": 1, "Sticker Capsule": 4, "Emoticon Tool": 1, "Versus Screen": 1 }, "rarityCounts": { "Mythical": 323, "Common": 636, "Uncommon": 462, "Rare": 522, "Immortal": 143, "Legendary": 28, "Arcana": 1 }, "heroCounts": { "Shadow Fiend": 4, "Medusa": 8, "Other": 361, "Rubick": 21, "Dragon Knight": 45, "Axe": 26, "Doom": 25, "Batrider": 18, "Necrophos": 16, "Spectre": 15, "Sven": 28, "Alchemist": 26, "Crystal Maiden": 18, "Night Stalker": 18, "Drow Ranger": 32, "Earthshaker": 23, "Juggernaut": 56, "Mirana": 24, "Morphling": 21, "Phantom Lancer": 16, "Puck": 17, "Pudge": 33, "Razor": 13, "Sand King": 11, "Storm Spirit": 15, "Windranger": 43, "Kunkka": 41, "Lina": 7, "Shadow Shaman": 7, "Tidehunter": 33, "Witch Doctor": 22, "Riki": 14, "Sniper": 17, "Warlock": 16, "Beastmaster": 19, "Queen of Pain": 12, "Faceless Void": 6, "Wraith King": 26, "Death Prophet": 31, "Phantom Assassin": 22, "Templar Assassin": 25, "Luna": 26, "Nature's Prophet": 61, "Clinkz": 17, "Omniknight": 27, "Enchantress": 10, "Broodmother": 19, "Bounty Hunter": 41, "Weaver": 14, "Ursa": 16, "Spirit Breaker": 30, "Invoker": 26, "Silencer": 19, "Outworld Destroyer": 11, "Lycan": 6, "Brewmaster": 14, "Lone Druid": 17, "Chaos Knight": 15, "Nyx Assassin": 22, "Naga Siren": 16, "Keeper of the Light": 15, "Slark": 14, "Centaur Warrunner": 22, "Magnus": 29, "Bristleback": 7, "Tusk": 16, "Skywrath Mage": 18, "Abaddon": 11, "Lich": 13, "Venomancer": 13, "Tiny": 2, "Tinker": 2, "Pugna": 8, "Legion Commander": 23, "Timbersaw": 25, "Vengeful Spirit": 14, "Gyrocopter": 15, "Ogre Magi": 7, "Leshrac": 9, "Ember Spirit": 31, "Earth Spirit": 10, "Clockwerk": 11, "Dark Seer": 10, "Elder Titan": 3, "Techies": 2, "Dazzle": 9, "Lion": 18, "Anti-Mage": 8, "Chen": 4, "Troll Warlord": 5, "Meepo": 3, "Disruptor": 14, "Bloodseeker": 16, "Monkey King": 3, "Slardar": 4, "Lifestealer": 9, "Huskar": 11, "Zeus": 5, "Shadow Demon": 1, "Pangolier": 4, "Enigma": 5, "Bane": 2, "Void Spirit": 1, "Ancient Apparition": 2, "Undying": 5, "Mars": 1, "Grimstroke": 1, "Underlord": 1, "Phoenix": 2, "Viper": 2, "Arc Warden": 4, "Jakiro": 5, "Winter Wyvern": 1, "Treant Protector": 1 }, "totalValue": 343.07, "totalValueFormatted": "$343.07" }, "items": [ { "assetId": "25929845931", "classId": "5047971957", "instanceId": "2781217946", "amount": 1, "name": "Feast of Abscession", "marketName": "Feast of Abscession", "marketHashName": "Feast of Abscession", "type": "Arcana Wearable", "category": "Wearable", "hero": "Pudge", "slot": "Hero Base", "rarity": { "name": "Arcana", "color": "#ADE55C" }, "quality": { "name": "Standard", "color": "#D2D2D2" }, "iconUrl": "https://community.cloudflare.steamstatic.com/economy/image/i0CoZ81Ui0m-9KwlBY1L_18myuGuq1w...", "iconUrlLarge": null, "tradable": false, "marketable": false, "steamInventoryUrl": "https://steamcommunity.com/profiles/76561198001497299/inventory/#570_2_25929845931", "price": { "amount": 19.15, "formatted": "$19.15", "currency": "USD" } } ], "pagination": { "total": 2115, "limit": 1, "offset": 0, "hasMore": true }, "cached": false, "cachedAt": "2026-10-02T03:17:45.136Z", "stale": false}TROUBLESHOOTING
Status codes
401 UnauthorizedNo API key was sent.
{
"error": "API key required"
}403 ForbiddenInvalid API key, the player's inventory is private (code INVENTORY_PRIVATE), or the endpoint needs a PRO or DEVELOPER plan (code PLAN_UPGRADE_REQUIRED).
{
"error": "Inventory data requires a PRO or DEVELOPER plan.",
"code": "PLAN_UPGRADE_REQUIRED",
"upgradeUrl": "https://cs2.space/#pricing"
}404 Not FoundThe SteamID or profile name doesn't match a player.
{
"error": "Player not found",
"code": "PLAYER_NOT_FOUND"
}429 Too Many RequestsRate limit or monthly quota exceeded, or Steam is rate limiting inventory requests (code STEAM_RATE_LIMIT). Retry later.
{
"error": "Monthly API quota exceeded",
"tier": "FREE",
"limit": 500,
"usage": 500,
"message": "Please upgrade your plan or wait for next month's reset."
}502 Bad GatewaySteam failed to return the inventory. Retry shortly.
{
"error": "Failed to load inventory from Steam. Please retry shortly."
}See all error responses on the Errors reference page.