Finding asset IDs of accessories and clothing of players

I know this is possible since Catalog Heaven can do it (Has a “Wearing” section which lists everything you’re wearing), but how?
Accessories are especially a pain since two accessories can share the same name and MeshID while having different textures.

You’ll want to use Documentation - Roblox Creator Hub in this case.

Here’s an example using it:

local info = game:GetService("Players"):GetCharacterAppearanceInfoAsync(5778382) -- get a table with information about the user's worn assets. takes an user id.

local function printTable(t, indent) -- recursively scans the table and prints it
	indent = indent or ""
	for k, v in next, t do
		print(indent .. k, "=", v)
		if type(v) == "table" then
			printTable(v, indent .. ">")
		end
	end
end

printTable(info)
Output from code
bodyColors = table: 36C3863C
>leftArmColorId = 125
>torsoColorId = 125
>rightArmColorId = 125
>headColorId = 125
>leftLegColorId = 125
>rightLegColorId = 125
assets = table: 36C35BDC
>1 = table: 36C35E1C
>>id = 1235488
>>assetType = table: 36C3593C
>>>name = Hat
>>>id = 8
>>name = Clockwork's Headphones
>2 = table: 36C3626C
>>id = 7074893
>>assetType = table: 36C3611C
>>>name = Face
>>>id = 18
>>name = Drool
>3 = table: 36C366EC
>>id = 13745548
>>assetType = table: 36C367DC
>>>name = Hair Accessory
>>>id = 41
>>name = Cinnamon Hair
>4 = table: 36C3650C
>>id = 17877340
>>assetType = table: 36C36F2C
>>>name = Hair Accessory
>>>id = 41
>>name = Beautiful Brown Hair for Beautiful People
>5 = table: 36C36CEC
>>id = 27112025
>>assetType = table: 36C36EFC
>>>name = Torso
>>>id = 27
>>name = Roblox 2.0 Torso
>6 = table: 36C36E9C
>>id = 27112039
>>assetType = table: 36C36F8C
>>>name = Right Arm
>>>id = 28
>>name = Roblox 2.0 Right Arm
>7 = table: 36C3701C
>>id = 27112052
>>assetType = table: 36C3758C
>>>name = Left Arm
>>>id = 29
>>name = Roblox 2.0 Left Arm
>8 = table: 36C3764C
>>id = 27112056
>>assetType = table: 36C376DC
>>>name = Left Leg
>>>id = 30
>>name = Roblox 2.0 Left Leg
>9 = table: 36C378BC
>>id = 27112068
>>assetType = table: 36C37A9C
>>>name = Right Leg
>>>id = 31
>>name = Roblox 2.0 Right Leg
>10 = table: 36C379AC
>>id = 47525224
>>assetType = table: 36C37E5C
>>>name = Shirt
>>>id = 11
>>name = knock knock ;)
>11 = table: 36C382AC
>>id = 57427071
>>assetType = table: 36C3821C
>>>name = Pants
>>>id = 12
>>name = UAC Girls Pants 2
>12 = table: 36C37F1C
>>id = 144294526
>>assetType = table: 36C37FAC
>>>name = Shoulder Accessory
>>>id = 44
>>name = BLOXikin #33 Snowman
>13 = table: 36C3800C
>>id = 250364732
>>assetType = table: 36C3827C
>>>name = Face Accessory
>>>id = 42
>>name = Lime Glasses
>14 = table: 36C3806C
>>id = 619527817
>>assetType = table: 36C3809C
>>>name = Fall Animation
>>>id = 50
>>name = Superhero Fall
>15 = table: 36C3815C
>>id = 619528412
>>assetType = table: 36C3854C
>>>name = Jump Animation
>>>id = 52
>>name = Superhero Jump
>16 = table: 36C3884C
>>id = 619529601
>>assetType = table: 36C3857C
>>>name = Walk Animation
>>>id = 55
>>name = Superhero Walk
defaultPantsApplied = false
defaultShirtApplied = false
playerAvatarType = R15
scales = table: 36C3833C
>bodyType = 0
>head = 1
>height = 1
>proportion = 0
>depth = 1
>width = 1
7 Likes

Followup question: How do I tell what is and isn’t an asset?
As it turns out, it’s not all assets, and while I could just wait for the marketplace to give a fail as a response it’d improve performance a lot to identify non-assets clientside.

Edit: Nevermind, I forgot the data format was a dictionary, so all the tables were conveniently named.
Inside the appearance info, there is an “assets” table, which contains an array of tables representing assets, and finally those tables have an “id” item.