The UGC validation system is Roblox's technical mechanism that checks if avatar assets meet platform specifications before you can upload and publish them to the Marketplace. This process ensures that avatar bodies, cosmetics, clothing, and accessories behave consistently across the platform.
The UGC validation system runs each time you:
- Try to upload an avatar asset to the Marketplace through Studio.
- Call AvatarCreationService APIs for in-experience avatar asset creation.
During this process, the UGC validation system looks at your asset to see if it meets the requirements in validation categories that are specific to its asset type. For a comprehensive list of these requirements, see Body specifications, Dynamic head specifications, Makeup specifications, Rigid accessory specifications, and Layered accessory specifications.
When an avatar asset passes validation, you can proceed with the Studio upload process by paying the upload fee, submitting the asset for moderation, and selling it on the Marketplace, or the player can proceed to purchase the avatar asset they created within an experience.

When an avatar asset fails validation, you or the player receive error messages with information on why the avatar asset didn't pass validation. For troubleshooting assistance, the UGC validation has visualization tools with checks that provide asset-specific visual guides on how to fix or improve your asset so that it can pass validation.

Validation categories
The UGC validation system organizes validation into several high-level categories. For information on these categories and some areas that they validate, review the following table.
| Category | What it validates |
|---|---|
| Schema |
|
| Mesh geometry |
|
| Texture / materials |
|
| Rigging / skinning |
|
| Inner and outer cages |
|
| Attachments |
|
| Dynamic head |
|
| Security / moderation |
|
Visualization checks
The UGC validation system includes optional visualization tools with checks to help you identify, understand, diagnose, and fix avatar assets that aren't yet ready to be on the Marketplace. When active, the visualization checks provide information on validation errors for non-compliant assets, and quality assessments for compliant assets that could use improvement.


To access the UGC validation system's visualization tools, you must first enable the beta feature. To enable and use the optional visualization checks:
In Studio, navigate to File > Beta Features.
Enable Visualizing UGC Validation.
Restart Studio, then in the mezzanine, click the plus icon to add a custom tab. A new tab displays.

In your custom tab, click the Add tools button. The Add Tools pop-up window displays.

Enable UGC Validation to add it to your toolbar, then close the window.
Navigate back to your custom tab and select the UGC Validation button to run the plugin. A UGC Validation window displays.
In the Explorer window, select a character body, dynamic head, rigid accessory, or layered accessory, then navigate back to the UGC Validation window and click the Run validation button. A pop-up window displays.
In the pop-up window:
Confirm the asset type of the avatar asset that you selected. For example, if you selected a Enum.AccessoryType.Pants layered accessory, use the drop-down menu to select PantsAccessory.

Click the Run validation button.
The validation service will run in the background and report back results in the UGC Validation window as a combination of errors and/or warnings depending on the state of your asset. For information on each visual validation check, review the following subsections.
Measure_Cage_Distance_Head
Measure_Cage_Distance_Head is a validation check that scores how closely the avatar head's outer cage hugs the head mesh, checking that the cage neither floats too far from the mesh nor sinks inside it.
| Error code | Severity |
|---|---|
| Quality score cannot be properly computed due to the input data being incorrect or incomplete. Please check your model or file a bug report. | Blocks validation |
| Head cage intersects wit the head mesh. {negativeSDFPercent}% of head cage vertices are inside the head mesh. | Blocks validation |
| Head cage is too far from the head mesh. Maximum distance between head cage and mesh is {max_sdf}, which is above allowed threshold {max_sdf_threshold} | Blocks validation |
| Asset quality warning: Head cage distance score is {score}. Max distance between head cage and mesh is {max_distance}, {negative_sdf_percent}% of head cage vertices are inside the head mesh. | Warning |
Measure_Cage_Mesh_Distance
Measure_Cage_Mesh_Distance is a validation check that scores how closely the layered clothing's outer cage tracks the rendered mesh, flagging when a cage drifts too far away or pushes inside the mesh.
| Error code | Severity |
|---|---|
| Quality score cannot be properly computed due to the input data being incorrect or incomplete. Please check your model or file a bug report. | Blocks validation |
| Outer cage intersects with the render mesh. {negativeSDFPercent}% of outer cage vertices are inside render mesh. | Blocks validation |
| Outer cage is too far from the render mesh. Maximum distance between outer cage and mesh is {max_sdf}, which is above allowed threshold {max_sdf_threshold}. | Blocks validation |
| Asset quality warning: Cage-to-mesh distance score is {score}. Max distance between outer cage and mesh is {max_distance}, {negative_sdf_percent}% of outer cage vertices are inside the render mesh. | Warning |
Measure_Cage_Mesh_Distance_Avatar
Measure_Cage_Mesh_Distance_Avatar is a validation check that scores how closely the full body outer cage follows the body mesh, flagging when a cage floats too far off the surface or intersects it.
| Error code | Severity |
|---|---|
| Quality score cannot be properly computed due to the input data being incorrect or incomplete. Please check your model or file a bug report. | Blocks validation |
| Body cage intersects with the body mesh. {negativeSDFPercent}% of body cage vertices are inside the body mesh. | Blocks validation |
| Body cage is too far from the body mesh. Maximum distance between body cage and mesh is {max_sdf}, which is above allowed threshold {max_sdf_threshold}. | Blocks validation |
| Asset quality warning: Body cage distance score is {score}. Max distance between body cage and mesh is {max_distance}, {negative_sdf_percent}% of body cage vertices are inside the body mesh. | Warning |
Measure_Cage_Relevancy
Measure_Cage_Relevancy is a validation check that scores how much of the outer cage you moved actually sits over the accessory, so cage edits stay where the garment needs them.
| Error code | Severity |
|---|---|
| Quality score cannot be properly computed due to the input data being incorrect or incomplete. Please check your model or file a bug report. | Blocks validation |
| {outer_cage_face_irrelevant_percent}% of the modified outer cage vertices do not cover the accessory. Make sure you are moving the outer cage only where needed. | Blocks validation |
| Asset quality warning: Cage relevancy score is {score}. {irrelevant_percent}% of the modified outer cage vertices do not cover the accessory. | Warning |
Measure_Cage_UV
Measure_Cage_UV is a validation check that checks if the inner and outer cage UVs match the layered clothing template; UVs that don't match the layered clothing template break how the asset wraps over the body.
| Error code | Severity |
|---|---|
| Quality score cannot be properly computed due to the input data being incorrect or incomplete. Please check your model or file a bug report. | Blocks validation |
| There are {incorrect_uv_count} UV values in cage {cage_name} that are incorrect or do not belong to the template. Please correct the cage UV. | Blocks validation |
| Asset quality warning: Cage UV score is {score} for {cage_name}. Incorrect UV count: {incorrect_uv_count}. | Warning |
Measure_Cage_UV_Avatar
Measure_Cage_UV_Avatar is a validation check that checks that each body part has a cage that keeps its UVs on the standard template; wrong cage UVs distort how layered clothing wraps over the body.
| Error code | Severity |
|---|---|
| Quality score cannot be properly computed due to the input data being incorrect or incomplete. Please check your model or file a bug report. | Blocks validation |
| There are {incorrect_uv_count} UV values in cage {cage_name} that are incorrect or do not belong to the template. Please correct the cage UV. | Blocks validation |
| Asset quality warning: Cage UV score is {score} for {cage_name}. Incorrect UV count: {incorrect_uv_count}. | Warning |
Measure_Degen_Triangles
Measure_Degen_Triangles is a validation check that scores each mesh part for degenerate triangles (faces with zero or near-zero area); degenerate triangles add no surface and can break rendering.
| Error code | Severity |
|---|---|
| Asset quality: {partName} has {degenerate_triangle_percent}% degenerate triangles (score: {score}). | Warning |
| Asset quality score for {measureName} could not be computed because the input data was incomplete or invalid. This does not block your upload. | Warning |
Measure_Dynamic_Head
Measure_Dynamic_Head is a validation check that verifies if a dynamic head is animatable. Dynamic heads that are animatable have a head cage, FACS data, aligned landmarks, and can close their eyes, open their mouth, and express emotions.
| Error code | Severity |
|---|---|
| Quality score cannot be properly computed due to the input data being incorrect or incomplete. Please check your model or file a bug report. | Blocks validation |
| Dynamic heads on the Marketplace must be properly caged so that the eyes and mouth vertices on the cage line up with the mesh vertices. Please improve your caging and its alignment with the mesh. | Blocks validation |
| Cannot detect smile expression for the Dynamic head. Please adjust cage landmarks for the mouth to match where the mouth is on the head and make sure it can show a smile expression. | Blocks validation |
| Cannot detect left eye close expression for the dynamic head. Please adjust cage landmarks for the left eye to match where the left eye is on the head and make sure it can be closed. | Blocks validation |
| Dynamic heads on the Marketplace have no head cages. Please create a head cage for the dynamic head. | Blocks validation |
| Cannot detect mouth open expression for the dynamic head. Please adjust cage landmarks for mouth to match where the mouth is on the head and make sure it can open. | Blocks validation |
| Dynamic heads on the Marketplace must be animated, but this head has no FACS data. | Blocks validation |
| Cannot detect right eye close expression for the dynamic head. Please adjust cage landmarks for the right eye to match where the right eye is on the head and make sure it can be closed. | Blocks validation |
| Cannot detect frown expression for the dynamic head. Please adjust cage landmarks for the mouth to match where the mouth is on the head and make sure it can show a frown expression. | Blocks validation |
| Asset quality warning: dynamic head expression score is {score}. | Warning |
Measure_Joint_Number
Measure_Joint_Number is a validation check that scores the body rig's joint setup against the expected configuration. The body rig's joint setup includes the joint counts in the left and right hands for higher-fidelity rigs.
| Error code | Severity |
|---|---|
| Asset quality: joint configuration scored {score} (joints: {joint_number}, left hand: {left_hand_joint_number}, right hand: {right_hand_joint_number}). | Warning |
| Asset quality score for {measureName} could not be computed because the input data was incomplete or invalid. This does not block your upload. | Warning |
Measure_Mesh_Manifold
Measure_Mesh_Manifold is a validation check that scores each mesh part for manifold integrity, catching holes, non-manifold edges, and similar topology problems in the geometry.
| Error code | Severity |
|---|---|
| Asset quality: {partName} has mesh manifold issues (score: {score}). | Warning |
| Asset quality score for {measureName} could not be computed because the input data was incomplete or invalid. This does not block your upload. | Warning |
Measure_Mesh_Outside_OuterCage
Measure_Mesh_Outside_OuterCage is a validation check that scores how much of an accessory's render mesh stays between its cages; a mesh that pokes outside the outer cage deforms badly when worn.
| Error code | Severity |
|---|---|
| Quality score cannot be properly computed due to the input data being incorrect or incomplete. Please check your model or file a bug report. | Blocks validation |
| {mesh_outside_outer_cage_percent}% of mesh vertices for the accessory are outside its outer cage. Make adjustments to have more of the accessory placed between the cages. | Blocks validation |
| Asset quality warning: Mesh containment score is {score}. {mesh_outside_outer_cage_percent}% of mesh vertices are outside the outer cage. | Warning |
Measure_Texture_Complexity
Measure_Texture_Complexity is a validation check that scores each texture for visual complexity, flagging flat or near-empty textures that add little detail to the asset.
| Error code | Severity |
|---|---|
| Asset quality score for {measureName} could not be computed because the input data was incomplete or invalid. This does not block your upload. | Warning |
| Asset quality: texture {textureName} has low complexity (score: {score}). | Warning |
Measure_Texture_Resolution
Measure_Texture_Resolution is a validation check that scores each texture by its pixel dimensions, rewarding resolution high enough to keep the asset sharp on the body.
| Error code | Severity |
|---|---|
| Asset quality score for {measureName} could not be computed because the input data was incomplete or invalid. This does not block your upload. | Warning |
| Asset quality: texture {textureName} has resolution {texture_width}x{texture_height} (score: {score}). | Warning |
Measure_Triangle_Intersection
Measure_Triangle_Intersection is a validation check that scores each mesh part for self-intersecting triangles in which faces pass through one another and create messy, overlapping geometry.
| Error code | Severity |
|---|---|
| Asset quality score for {measureName} could not be computed because the input data was incomplete or invalid. This does not block your upload. | Warning |
| Asset quality: {partName} has {intersecting_tri_face_percent}% intersecting triangle faces (score: {score}). | Warning |
Measure_UV_Bound
Measure_UV_Bound is a validation check that measures how many of a mesh's UV vertices fall outside the 0-1 texture space; it reports a score but never blocks upload.
| Error code | Severity |
|---|---|
| Asset quality score for {measureName} could not be computed because the input data was incomplete or invalid. This does not block your upload. | Warning |
| Asset quality: {partName} has {uv_outside_bound_vert_percent}% UV vertices outside bounds (score: {score}). | Warning |
Measure_Vertex_Similarity
Measure_Vertex_Similarity is a validation check that measures the share of near-duplicate vertices in a mesh; it reports a score but never blocks upload.
| Error code | Severity |
|---|---|
| Asset quality score for {measureName} could not be computed because the input data was incomplete or invalid. This does not block your upload. | Warning |
| Asset quality: {partName} has {similar_vertex_percent}% similar vertices (score: {score}). | Warning |