Inspection results
Interpret completed checks, defects and processing failures.
Model preview images
Preview images are generated independently of inspection. Poll GetModel with backoff until preview.status is ready or failed. When ready, images contains seven transparent source PNGs: angled, front, back, left, right, top and bottom. Use thumbnails.angled for a model card. Use display for larger views.
The thumbnails map contains 384 pixel WebP images. The display map contains 1024 pixel WebP images. Both retain transparency. Each missing variant uses its source PNG URL. All maps share expires_at. Existing clients can continue to use images.
The views preserve uploaded orientation. Front/back look from +Z/−Z, left/right from −X/+X, and top/bottom from +Y/−Y. Angled looks from [1, 0.8, 1] with +Y up. These are coordinate labels, not automatic detection of the model’s front or upright direction.
Images are private. GetModel checks your account access and returns signed URLs valid for up to 15 minutes. An image URL needs no API key, so it works in an image element; anyone with that URL can use it until expiry. Keep it private. Retrieve the model again to refresh URLs without regenerating images or changing updated_at.
Expiry applies to access URLs, not stored previews. Existing URLs may still work until expiry after model deletion. A preview failure does not change inspection results. Repair cost estimation uses all seven previews or its explicit minimum-price fallback. Null means an older model has no preview job; replaying CreateModel does not start one.
Completion versus assessment
mesh_check.status tracks execution: pending, processing, completed or failed. A completed check includes result. Its passed field describes the assessment, not whether the request succeeded.
| result.passed | Meaning |
|---|---|
| true | The supported primary checks completed without detected defects. |
| false | At least one supported defect was detected. |
| null | No conclusive verdict is available. |
Check incomplete_checks for any checks that did not finish. Inspection covers primary geometry defects; it does not assess intersecting/overlapping triangles or certify printability.
print_check applies to the registered print size. policy_version=mesh-integrity-v1 assesses mesh integrity: printable requires completed checks with zero inverted normals, bad edges and planar holes. Hard defects or an inspection time budget failure require repair. Missing, incomplete or failed inspection is not a pass. This assessment does not authorize an order, and resizing a price item does not transfer it to that size.
Read the counts
| Field | Meaning |
|---|---|
| inverted_normals | Faces with detected reversed orientation. |
| bad_edges | Unpaired directed edge incidences; a distinct edge can contribute more than once. |
| planar_holes | Detected planar boundary holes. |
| shells | Shared-edge connected components. Multiple components are allowed; vertex-only contact does not connect them. |
| near_bad_edges / noise_shells | Measured inspection counts when available; null means unassessed. |
Counts refer to the model’s default print size. Null means unavailable, not a count of zero.
Inspection outcomes
{
"id": "MD-739YQ549",
"source": {
"file_id": "file_6c82bd3e319b4bb099310d54a761879e"
},
"name": "Wedding figurine",
"external_id": "design-123",
"created_at": "2026-09-18T18:00:00.000000Z",
"updated_at": "2026-09-18T18:00:00.000000Z",
"status": "processing",
"status_reasons": [
{
"code": "measurements_pending",
"message": "Model measurements are running."
}
],
"preview": {
"status": "processing"
},
"longest_dimension_mm": 100,
"mesh_check": {
"status": "completed",
"result": {
"passed": true,
"inverted_normals": 0,
"bad_edges": 0,
"planar_holes": 0,
"shells": 1,
"near_bad_edges": null,
"noise_shells": null,
"incomplete_checks": []
}
},
"print_check": {
"status": "pending"
},
"repair": {
"required": false,
"applied": false,
"reason": null,
"status": "not_applied",
"fee": 0,
"covered_by_order_id": null
},
"progress": {
"stage": "inspection_completed"
},
"volume": {
"value_mm3": 10000,
"status": "estimated"
},
"estimated_weight_g": 12
}Processing failures
mesh_check.warnings is separate from mesh_check.error. appearance_fallback is non-blocking: the original upload is preserved, but the derived model may have incomplete colors or print gray. Show this warning to customers and review the previews before ordering; upload a corrected package if the appearance is wrong. Inspection, previews and pricing can succeed despite this warning. Invalid geometry and unsafe asset paths still fail processing.
A successful GET returns HTTP 200 even when inspection failed. Read mesh_check.error.code and message.
status_reasons[].code and mesh_check.error.code use these codes. A failed model reports its processing error code.
| Code | Action |
|---|---|
inspection_pending | Mesh inspection is running. Wait for model.ready, or poll with backoff. |
measurements_pending | Measurements are running. Wait for model.ready, or poll with backoff. |
repair_estimate_pending | The repair fee is being estimated. Wait for model.ready, or poll with backoff. |
measurements_unavailable | Measurements failed. Replace the file, or contact support with the model ID. |
volume_unavailable | The model has no printable volume at its saved size. Resize it or replace the file. |
invalid_model_package | The ZIP is not a valid model package. Use a ZIP containing one OBJ and its referenced assets, preserving relative paths. |
unreadable_model | The model could not be read. Export a new OBJ package or self-contained GLB. |
missing_required_assets | A referenced material or texture is missing or unreadable. Upload a complete package. |
unsupported_format | The file format is not supported. Use OBJ geometry with PNG or JPEG textures, or a self-contained GLB. |
unsupported_model_features | The model uses features we cannot process. Export a static, uncompressed GLB with embedded assets, or an OBJ package with baked textures. |
invalid_geometry | The model has no finite surface geometry or a zero longest dimension. Fix the geometry and upload a new file. |
processing_limit_exceeded | The model exceeds a processing resource limit. Simplify it and upload a new file. |
processing_timeout | Processing exceeded the time limit. Simplify the model and upload a new file. |
inspection_unavailable | Inspection could not complete after retries. Replace the file, or contact support with the model ID. |
processing_failed | Processing could not finish after retries. Contact support with the model ID. |
storage_unavailable | Model storage could not be read after retries. Contact support with the model ID. |
To correct a source problem, upload a new file and replace the model's file, or create a separate model. A failed model can also retry at the same size with PATCH.
Replaying creation does not restart a failed inspection. Pricing is available after completed inspection with usable volume, including models with detected defects.
API v1 preview