How do I find the real seller of UGCs?

Is there a way to find who actually put up a UGC for sale? I ask this since there isn’t any way to check who put up a group published UGC for sale.

With AvatarEditorService I can only see if a User or a Group published a UGC. There isn’t really a way to see if the group owner or whatever rank that is lower published a UGC with AvatarEditorService. I did find something that might help me with this and that is ExpectedSellerId, which I found after using AvatarEditorService:GetItemDetails(). With some kind of logic, I tried to go to https://www.roblox.com/users/[ExpectedSellerId]/profile hoping that that is the actual ID of the person who put up the UGC for sale, but I got an error.
On the DevForum I did see posts that mention ExpectedSellerId, but they mention topics which I don’t understand for now. Like, is it really worth setting up a server for this? How do I even do that?

Anyways, is there any way to check who within a group put up a UGC for sale?

Did some quick research. The answer here is no.

The only ID returned by the argument AvatarEditorService:GetItemDetails() is either the GroupId or the UserId. Setting up your own server is pretty useless considering the only related API call you can use would be: https://catalog.roblox.com/v1/catalog/items/details and that still only returns the same information as AvatarEditorService:GetItemDetails(). The only real way to see who uploaded the UGC would to be in the group that uploaded it, and to have access to the audit logs to see who did it.

If you feel like this should be added, feel free to make a feature request.

1 Like

But the thing that confuses me is why is there an ExpectedSellerId which coincidentally sounds like the ID of the seller. Funnily enough, if the UGC is uploaded by a User, the ExpectedSellerId is exactly the same as the UserId, but if a Group publishes a UGC then the ExpectedSellerId is completely different.

The thing im talking about

User


Group

Wish there is more explenation behind ExpectedSellerId, but at least I couldn’t find anything.

Also thanks for summing up the things I’ve tried to read. What you’ve said sounds 1000x more understandable.

And honestly I forgot that people can just request features, but either way I most likely won’t request this since it’s not that useful. (at least I think it isn’t that useful. Maybe I’ll do it later)

1 Like

That is quite bizarre. I’m not actually quite sure what ExpectedSellerId is though I can look into it. It’s possible that the user was terminated and that’s why you got a 404 error. Other than that, I have no explanation for the behavior that you’re experiencing.

For more details on the actual catalog endpoint, you can view it here: Swagger UI

The endpoint returns the following information which does not include an ExpectedSellerId.

{
  "data": [
    {
      "id": 0,
      "itemType": 1,
      "assetType": 1,
      "bundleType": 1,
      "name": "string",
      "description": "string",
      "productId": 0,
      "genres": [
        0
      ],
      "bundledItems": [
        {
          "owned": true,
          "id": 0,
          "name": "string",
          "type": "string"
        }
      ],
      "itemStatus": [
        1
      ],
      "itemRestrictions": [
        1
      ],
      "creatorHasVerifiedBadge": true,
      "creatorType": 1,
      "creatorTargetId": 0,
      "creatorName": "string",
      "price": 0,
      "premiumPricing": {
        "premiumDiscountPercentage": 0,
        "premiumPriceInRobux": 0
      },
      "lowestPrice": 0,
      "lowestResalePrice": 0,
      "priceStatus": "string",
      "unitsAvailableForConsumption": 0,
      "purchaseCount": 0,
      "favoriteCount": 0,
      "offSaleDeadline": "2024-04-10T16:36:36.805Z",
      "collectibleItemId": "string",
      "totalQuantity": 0,
      "saleLocationType": 0,
      "hasResellers": true,
      "isOffSale": true,
      "quantityLimitPerUser": 0
    }
  ]
}

Instead of making an Engine request, you can instead make a Documentation Feature or Issue requests depending on the magnitude of your request. If you just want them to add documentation on the actual returned info, you can probably fit it into a Documentation Issue though there is a little bit of a gray zone.

I’m as confused as you, so don’t worry too much. If this behavior is core to your game’s functionality, then definitely consider making an Engine bug report or feature request.

1 Like

Checking ROBLOX’s documentation page, they show that when calling :GetItemDetails() it returns this format:

Format
{
  "IsForRent": true,
  "ExpectedSellerId": 0,
  "Owned": true,
  "IsPurchasable": true,
  "Id": 0,
  "ItemType": "Asset",
  "AssetType": "Image",
  "BundleType": "BodyParts",
  "Name": "string",
  "Description": "string",
  "ProductId": 0,
  "Genres": [
    "All"
  ],
  "BundledItems": [
    {
      "Owned": true,
      "Id": 0,
      "Name": "string",
      "Type": "string"
    }
  ],
  "ItemStatus": [
    "New"
  ],
  "ItemRestrictions": [
    "ThirteenPlus"
  ],
  "CreatorType": "User",
  "CreatorTargetId": 0,
  "CreatorName": "string",
  "Price": 0,
  "PremiumPricing": {
    "PremiumDiscountPercentage": 0,
    "PremiumPriceInRobux": 0
  },
  "LowestPrice": 0,
  "PriceStatus": "string",
  "UnitsAvailableForConsumption": 0,
  "PurchaseCount": 0,
  "FavoriteCount": 0
}

So now im double confused, and you might be too.

Either way, in my situation, I don’t need to know the real seller of a group-published UGC that urgently. Now I’m gonna have to stick to plan B (if I need to do it at all), which is to just cheap out and basically do something like this

-- Check if player is the group owner. If so then assume that owner owns group UGCs
if player:GetRankInGroup(accessoryInfo.CreatorTargetId) == 255 then
  -- magic code
end

The only problem with this bandaid is that a friend told me that even lower ranks can upload UGCs to the group with permissions. But my logic is, the group owner most likely hired a UGC uploader to upload their assets or an asset they paid for, which means the group owner has ownership over that UGC. Ofc there might be like 1% of groups that don’t follow this logic, but I’ve convinced myself that what I’ve philosophised is 99% correct.

But thank you very much for the help. If it becomes a problem for me in the future, then I’ll definitely send a request on the DevForum. Other than that I guess that’s it.

(extra)

(if you want a solution then feel free to basically just rewrite this idea of mine (if its any good) or I could give a solution to your first comment)