How to get the bundle value off a players avatar

I want to detect a bundle on a player’s avatar and have it respond back with the sale price. The only problem is, despite AvatarEditorService being able to get the sale price of a bundle, there seems to be no way of seeing which specific bundles a player is wearing. If anyone could help me with this that would be amazing thanks!

Hi, there is no direct way to get a bundle from a player. Because if you change one part of the bundle, it still counts as a bundle. What exactly are you trying to accomplish so that I can think more about how to accomplish this?

I am trying to get the total value of a players avatar some limitations to that were I couldn’t find a way to get bundles and I did assume there was no way but i wanted to see if anyone had a work around or not.

Yeah there isn’t really a definitive way of getting a players bundle because of the fact that you can mix-and-match body parts or items included in the bundle.

The best you can do is make an estimate from the body part IDs.

Hey, if you just want to see how much the outfit is worth and exactly what the player is wearing, you can use this server script that analyzes the player’s outfit and calculates the price. At the same time you get a table with all the details of the asset. If you want to process this further. Furthermore all clothes in the table with 0 R$ will be ignored.

local Players = game:GetService("Players")

-- Get a SharedTable from the HumanoidDescription from a Player Instance
local function getHumanoidTable(player : Player) : SharedTable
	
	local humanoidDescription = player.Character.Humanoid:GetAppliedDescription()
	
	local HumanTabel = {}
	
	if humanoidDescription then
		
		local Face = table.insert(HumanTabel,humanoidDescription.Face) or 0
		local GShirt = table.insert(HumanTabel,humanoidDescription.GraphicTShirt) or 0
		local Shirt = table.insert(HumanTabel,humanoidDescription.Shirt) or 0
		local Pants = table.insert(HumanTabel,humanoidDescription.Pants) or 0
		local Head = table.insert(HumanTabel,humanoidDescription.Head) or 0

		local BackAccessory = table.insert(HumanTabel,humanoidDescription.BackAccessory) or 0
		local FaceAccessory = table.insert(HumanTabel,humanoidDescription.FaceAccessory) or 0
		local FrontAccessory = table.insert(HumanTabel,humanoidDescription.FrontAccessory) or 0
		local HairAccessory = table.insert(HumanTabel,humanoidDescription.HairAccessory) or 0
		local HatAccessory = table.insert(HumanTabel,humanoidDescription.HatAccessory) or 0
		local NeckAccessory = table.insert(HumanTabel,humanoidDescription.NeckAccessory) or 0
		local ShouldersAccessory = table.insert(HumanTabel,humanoidDescription.ShouldersAccessory) or 0
		local WaistAccessory = table.insert(HumanTabel,humanoidDescription.WaistAccessory) or 0
		
		local humanoid = player.Character and player.Character:FindFirstChild("Humanoid")

		if humanoid then
			humanoid:ApplyDescription(humanoidDescription)
		end
		
		return HumanTabel
		
	end
	
end

-- Get the OutfitValue and a SharedTable with all Items and Prices
local function calculateOutfitValue(player : Player)
	
	local userId = player.UserId

	local Numbers = {} -- storage for the numbers from a string.
	local HumanTabel = getHumanoidTable(player)
	local AssetTabel = {}
	local TotalPrice = 0
	
	if HumanTabel then
		
		for _, cloth in pairs(HumanTabel) do

			if string.find(cloth, ",") then -- If we have more then one Item

				Numbers = string.split(cloth, ",")

				for i, number in ipairs(Numbers) do

					local MS = game:GetService("MarketplaceService")
					local AssetId = number 
					local Asset = MS:GetProductInfo(AssetId)

					if Asset.PriceInRobux == 0 then continue end

					TotalPrice += Asset.PriceInRobux
					AssetTabel[Asset.Name] = Asset
					
				end

				Numbers = nil

			else

				if tonumber(cloth) == 0 or tonumber(cloth) == nil then continue end
				
				local MS = game:GetService("MarketplaceService")
				local AssetId = cloth 
				local Asset = MS:GetProductInfo(AssetId)
				
				if Asset.PriceInRobux == 0 then continue end
				
				TotalPrice += Asset.PriceInRobux
				AssetTabel[Asset.Name] = Asset

			end

		end

		return TotalPrice, AssetTabel
		
	else
		
		warn("We dont found a Humanoid Description")
		
	end

end

Players.PlayerAdded:Connect(function(Plr : Player)

	Plr.CharacterAdded:Connect(function()
		
		local Price, AllItems = calculateOutfitValue(Plr)
		
		warn("Price : ", Price)
		warn("AllItems : ", AllItems)
		
	end)

end)

**Output : **

 Price :  175

AllItems :   {
                    ["SCHWARZER GOTISCHER SCHÄDEL-DOMINUS"] =  ▼  {
                       ["AssetId"] = 134922871567882,
                       ["AssetTypeId"] = 8,
                       ["CanBeSoldInThisGame"] = true,
                       ["CollectibleItemId"] = "f5758ac1-bed9-49f6-8923-ded9f28fccdf",
                       ["CollectibleProductId"] = "b6788aee-603f-4adf-bc84-1cbc0c34db7e",
                       ["CollectiblesItemDetails"] =  ▶ {...},
                       ["ContentRatingTypeId"] = 0,
                       ["Created"] = "2025-02-06T22:27:24.187Z",
                       ["Creator"] =  ▶ {...},
                       ["Description"] = "Für mehr tolle Hüte wie diese, tritt unserer Gruppe bei!
https://www.roblox.com/catalog?Category=1&CreatorName=Bestselling+UGC&CreatorType=Group&salesTypeFilter=1

Metall, Chromherzen, y2k, Mode, Kreuz, Grunge, Emo, Ringe, Zubehör, dunkel, feurig, gefroren, Korblox, Dominus, Hörner, Vampir",
                       ["IconImageAssetId"] = 0,
                       ["IsForSale"] = true,
                       ["IsLimited"] = false,
                       ["IsLimitedUnique"] = true,
                       ["IsNew"] = false,
                       ["IsPublicDomain"] = false,
                       ["MinimumMembershipLevel"] = 0,
                       ["Name"] = "SCHWARZER GOTISCHER SCHÄDEL-DOMINUS",
                       ["PriceInRobux"] = 175,
                       ["ProductId"] = 2838160033,
                       ["ProductType"] = "Collectible Item",
                       ["Remaining"] = 0,
                       ["SaleLocation"] =  ▶ {...},
                       ["Sales"] = 0,
                       ["TargetId"] = 134922871567882,
                       ["Updated"] = "2025-02-08T00:22:16.53Z"
                    }
                 }

Forgive me if I misunderstood but I know how to get avatar item sale prices its when it comes to UGC bundles if they are wearing one limb of it will just be offsale and not actually count as the bundle. We have manually added value for things like headless and korblox but for ugc bundles we need an automatic method.