Printability checks
How every model you generate at /in/design or upload at /in/print is measured for watertight geometry, thin features, overhangs and build volume fit before you request a print in India.
Every model that comes out of /in/design and every file you upload at /in/print is measured before a print of it can be requested. The check is pure geometry: holes in the surface, edges where surfaces branch, zero area triangles, the smallest and largest overall dimension, the steepest downward facing face, and the bounding box against the plate. Not every surface runs the whole list: the table below says which check runs where, and an uploaded STL is measured for size and volume only. This page lists what it measures, the exact verdicts it can return, what each one means for your print, and what to do about each failure. One thing none of them does is measure a wall, so read the callout below before you rely on the feature size number.
Where the check runs#
- On every generation. The finished mesh is validated after repair, and the verdict comes back with the model as printStatus, printabilityScore, issues and recommendations.
- On every upload. A file sent to /in/print is parsed for its bounding box, volume and triangle count before you are quoted. An uploaded STL is not inspected for holes, winding or overhangs. A mesh larger than the plate is rejected here.
- On its own. POST /api/printability measures any STL, GLB or OBJ. No account, no credits, no request.
/api/printabilityNo authMeasure any STL, GLB or OBJ and return a printability report. Free, no key.
What it measures#
| Check | How it is measured | Threshold |
|---|---|---|
| Watertight surface | Vertices are welded, then every edge is counted. An edge used by exactly one face is a boundary edge; rings of them are counted as holes and the widest rim is measured. | Any boundary edge fails. Zero boundary edges plus at least one triangle is watertight. |
| Manifold edges | Edges used by three or more faces, where surfaces branch instead of forming one skin. | More than zero is a warning. |
| Face winding | The same directed edge appearing twice: neighbouring faces disagree about which way is out. | Any disagreement is a warning. |
| Degenerate faces | Triangles with a repeated vertex index, or an area at or below 1e-9. | More than zero is a warning. |
| Feature size | The smallest of the three bounding box dimensions, in millimetres. An upper bound, not a measured wall. | Below 1mm is a warning. |
| Build volume fit | The free file check compares the single longest side against 340mm. Upload is stricter and fairer: it sorts the three dimensions largest first and compares them against the plate sorted the same way, so a long part that fits when rotated is not rejected on one axis. | 340 x 320 x 340mm. Over the plate is a warning on the file check and a hard rejection on upload. On /in/print a size scaled past the plate cannot be requested. |
| Suspiciously small | Longest side under 5mm. Usually a units problem rather than a tiny part. | Warning. STL is millimetres, glTF is read as metres, OBJ as millimetres, but neither glTF nor OBJ declares a unit, so both are flagged unitsAssumed in the report. |
| Overhangs | On a generation only. Each face normal is measured against the downward print direction and the steepest value is reported in degrees as maxOverhangDeg. Neither the standalone file check nor an upload reports an overhang angle. | Reported only. Never holds a print back: supports are applied at slice time. |
Verdicts#
There are two verdict vocabularies because there are two checks. A generation or an upload gets a print status, which decides whether the model can be printed. The standalone file check returns a report verdict, which decides nothing because no print is attached to it.
On a generation: printStatus#
| Value | Badge shown | Score | What it means for your print |
|---|---|---|---|
| ready | Print Ready | 95 | Closed surface, nothing flagged. Can be requested. |
| supports | Print Ready with Supports | written by the reviewer | Prints, with supports applied automatically. Can be requested. Only a reviewed generation returns this: the rule based reviewer used on text drafts never does. |
| repaired | Auto-Repaired | 85 | Holes closed, faces flipped or vertices welded before the model was stored. Can be requested. |
| needs-redesign | Needs Redesign | 0, 40 or 45 | Not printable as it is. The model is not marked printable, and the page says it did not pass its review and cannot be ordered. |
The rule based reviewer runs on every fast draft generation from a text prompt, and as the fallback everywhere else. It decides in this order: validation unavailable scores 0, not watertight and not repaired scores 40, a smallest dimension under 0.8mm scores 45, repair applied scores 85, anything else scores 95. Hi fi, image and multiview generations get a written review instead, which can also return supports and writes its own score.
On the standalone file check: verdict#
| Value | When | What to do |
|---|---|---|
| ready | No issues at all. | Nothing. Upload it at /in/print and request a print. |
| warning | At least one issue, none of them fatal. | Read the issues array. A warning on its own does not stop an upload. |
| error | At least one issue with severity error. | Fix it before you upload. Exactly one issue is an error today: a surface that is not closed. |
What holds a print request back#
Two geometry results stop a model being printed as it is. A generated model scored needs-redesign is not marked printable, and the page says it cannot be ordered. A mesh larger than the plate is refused at upload, and on /in/print a size you scale past the plate is not priced: the page says the size is too large, and Request this print stays off until you pick a smaller one. Warnings on the standalone file check decide nothing by themselves: a non manifold, badly wound or thin file still uploads. The exception is thinness on a generation: a generated model whose smallest dimension is under 0.8mm is scored needs-redesign by the rule based reviewer.
A few things that are not geometry verdicts also hold a request back, because a print is priced by the weight a slice measures:
- The model is still being weighed: Request this print reads Calculating and waits until the slice lands, usually 10 to 60 seconds.
- The slicer could not process the model at all. The page says The slicer could not process this model, which almost always means a damaged mesh: repair it in Blender's 3D Print toolbox, Meshmixer or Netfabb and upload it again.
- More than 30 new sizes have been weighed for your account in the last hour. A size already weighed is answered at once; a new one is refused until the hour rolls over.
- A print in colour, or a Bambu Studio or OrcaSlicer project, set to anything other than 100% scale.
Problems, why they matter, and fixes#
| Problem | Why it matters | Fix |
|---|---|---|
| Holes in the surface (not watertight) | A slicer cannot tell inside from outside through a hole, so the file either fails to slice or prints hollow where it should be solid. | On a generated model, closed automatically before it is stored, up to a rim of 256 vertices. In your own file: export a closed solid rather than a surface model, or repair the mesh before uploading. |
| Faces pointing inwards (inconsistent winding) | Parts of the surface are wound the wrong way round. It renders see through, and hollowing can cut in the wrong direction. | On a generated model, corrected automatically before it is stored. In your modeller: recalculate normals outward. |
| Three or more faces on one edge (non manifold) | Surfaces branch rather than forming a single skin. Most slicers cope, but the result around those edges is whatever they guess. | Boolean union the overlapping shells, or separate them into distinct parts. Not repaired automatically. |
| Zero area triangles (degenerate) | Harmless in themselves, but they inflate the triangle count and confuse some repair tools. | Nothing. A generated model has them dropped before it is stored. |
| Smallest dimension under 1mm | Thinner than a couple of extrusion widths. The part may not survive being taken off the plate. | Scale up, thicken the feature in CAD, or accept that it will be fragile. On the file check and on an upload this never holds a print back; on a generation, a smallest dimension under 0.8mm is scored needs-redesign. |
| Longest side over 340mm | Larger than the build volume. The free check calls it a warning; a mesh over the plate is rejected outright at upload, and a size scaled past it on /in/print cannot be requested. | Scale it down, or split it into parts and request them as separate prints. Upload compares the three dimensions sorted against 340 x 340 x 320, so rotating the part in your modeller will not change the answer. |
| Longest side under 5mm | Detail smaller than the nozzle width is lost. More often it means the file's units are not what we assumed. | Export again in millimetres, or scale the model up. Neither glTF nor OBJ declares a unit, so the file cannot settle it for us. |
| Steep overhangs | Downward facing faces need something under them to print onto. | Nothing. Supports are applied at slice time and overhangs never hold a print back. Reorienting the part reduces support scarring if the finish matters. |
| Validation unavailable | The mesh could not be fetched or parsed, so nothing about it has been verified. | Generate or upload again. A model we could not read is never called print ready: it scores 0. |
What we repair automatically#
Repair runs on generated models before they are stored, in this order:
- Bake node transforms into the vertices, so a model arriving scaled or rotated by its scene graph is measured at its real size.
- Weld duplicate vertices within 0.01mm, then drop degenerate faces.
- Flood fill the winding so neighbouring faces agree, then flip any shell whose signed volume came out negative.
- Fill open boundaries with a triangle fan, up to 8 passes, skipping any rim over 256 vertices.
- Optionally smooth, then orient and scale the whole model once.
Running the check yourself#
curl -X POST https://x3dstudios.com/api/printability \
-F "model=@bracket.stl"It reads STL (binary and ASCII), GLB/GLTF and OBJ, detected by the glTF magic bytes first, then the file extension, then by sniffing the contents, so a file without an extension still works. Anonymous callers get 12 checks an hour and a 25MB limit; a signed in browser session raises that to 60 an hour and 50MB. The endpoint only ever reads a session cookie, so an API key does not raise the ceiling and a curl like the one above always counts against the anonymous limit. A mesh estimated over 1,500,000 triangles is refused before parsing rather than after. Nothing is stored and no credits are spent.
Questions
Is the printability check free?
Yes. POST an STL, GLB or OBJ to https://x3dstudios.com/api/printability. It is free, costs no credits, and needs no key or account. Anonymous callers get 12 checks an hour and a 25MB file limit; a signed in browser gets 60 an hour and 50MB.
Does the check measure wall thickness?
Not really. The number reported as minimum feature size is the smallest of the three bounding box dimensions, which is an upper bound on how thick anything in the model can be. It is not a distance field measurement, so a tall part with 0.3mm walls reports its overall width and passes. Check true wall thickness in your slicer.
Will steep overhangs stop my print request?
No. Overhang angle is measured and reported but never holds a print back. Supports are applied at slice time.
My model has holes. Do I have to fix it myself?
For a model generated at /in/design, usually not: small open boundaries are closed automatically with a triangle fan before the model is stored, and the result is reported as auto repaired. Rims wider than 256 vertices are left alone and reported instead of patched badly, because a fan across a large concave hole can self intersect. For your own file, close it in your modeller or slicer before you upload it.
Related guides
- Multi-Color 3D Printing Service: What to Check FirstBefore you order from a multi-color 3D printing service, check whether your file carries the colors, how they are laid out, and what each quote line means.
- G-code Checker: What We Validate Before Every PrintOur G-code checker reads each sliced file before it prints: G-code validation rules, rejected commands, two temperature ceilings, why normal slices pass.
- What Is a 3MF File? Why It Beats STLWhat is a 3MF file? The 3MF file format zips your mesh with millimetre units, colour, materials and print settings. See what is inside and why it beats STL.