smartcut-dev · Schema

ModelAnalysisResponse

The result of analysing a 3D model. `parts` is submittable to `/v3/calculate` unchanged.

CompanyDeveloper ToolsAutomationCI/CDAPIs

Properties

Name Type Description
version string
model object What was read, and in what units.
parts array Parts, in `/v3/calculate`'s own vocabulary. Post this array back as that endpoint's `parts`.
advice array Everything the analysis knows that a calculation does not. Points at `parts` by index.
warnings array Notes from the file reader itself, e.g. that an STL carries no part names.
View JSON Schema on GitHub

JSON Schema

smartcut-dev-model-analysis-response-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/smartcut-dev/json-schema/smartcut-dev-model-analysis-response-schema.json",
  "title": "ModelAnalysisResponse",
  "description": "The result of analysing a 3D model. `parts` is submittable to `/v3/calculate` unchanged.",
  "x-generated": "2026-10-31",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/_original/smartcut-dev-openapi-openapi.json#/components/schemas/ModelAnalysisResponse",
  "type": "object",
  "properties": {
    "version": {
      "type": "string",
      "enum": [
        "3"
      ]
    },
    "model": {
      "type": "object",
      "description": "What was read, and in what units.",
      "properties": {
        "format": {
          "type": [
            "string",
            "null"
          ],
          "description": "Detected format: `step`, `stl`, `obj`, `ply` or `gltf`."
        },
        "units": {
          "type": "string",
          "description": "The unit every number in this response is in."
        },
        "sourceUnits": {
          "type": "string",
          "description": "The unit the geometry was read as — your `sourceUnits`, else the file's own declaration, else `units`."
        },
        "declaredUnits": {
          "type": [
            "string",
            "null"
          ],
          "description": "The unit the FILE declared, where the format carries one (STEP, 3MF, Collada). Null otherwise."
        },
        "suggestedUnits": {
          "type": "string",
          "description": "A different `sourceUnits` that would make the model plausible against the `bladeWidth` you supplied. Only present when you supplied one and the current reading looks wrong."
        },
        "stats": {
          "type": "object",
          "properties": {
            "parts": {
              "type": "integer",
              "description": "Rows in `parts`."
            },
            "rectangular": {
              "type": "integer"
            },
            "irregular": {
              "type": "integer"
            },
            "unrecognised": {
              "type": "integer"
            },
            "fixtures": {
              "type": "integer",
              "description": "Parts judged to be fittings rather than sheet goods."
            },
            "merged": {
              "type": "integer",
              "description": "Identical parts collapsed into a quantity."
            },
            "triangles": {
              "type": "integer"
            },
            "components": {
              "type": "integer",
              "description": "Separate solids found in the file."
            },
            "debris": {
              "type": "integer",
              "description": "Fragments too small to be parts, ignored."
            },
            "modelDiagonal": {
              "type": "number",
              "description": "Bounding-box diagonal of the whole model, in `units`."
            },
            "modelSize": {
              "type": "object",
              "properties": {
                "x": {
                  "type": "number"
                },
                "y": {
                  "type": "number"
                },
                "z": {
                  "type": "number"
                }
              }
            }
          }
        }
      },
      "required": [
        "format",
        "units",
        "sourceUnits",
        "declaredUnits",
        "stats"
      ]
    },
    "parts": {
      "type": "array",
      "description": "Parts, in `/v3/calculate`'s own vocabulary. Post this array back as that endpoint's `parts`.",
      "items": {
        "$ref": "#/$defs/ModelPart"
      }
    },
    "advice": {
      "type": "array",
      "description": "Everything the analysis knows that a calculation does not. Points at `parts` by index.",
      "items": {
        "$ref": "#/$defs/ModelAdvice"
      }
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Notes from the file reader itself, e.g. that an STL carries no part names."
    }
  },
  "required": [
    "version",
    "model",
    "parts",
    "advice",
    "warnings"
  ],
  "$defs": {
    "ModelAdvice": {
      "type": "object",
      "description": "One thing worth knowing about the model or a part in it.",
      "properties": {
        "code": {
          "type": "string",
          "description": "Stable machine-readable code, e.g. `open-mesh`, `fixture-detected`, `parts-overlap`, `squared-off-waste`, `dimensions-approximate`."
        },
        "severity": {
          "type": "string",
          "enum": [
            "info",
            "warning",
            "error"
          ],
          "description": "`error` means the part cannot be cut as measured."
        },
        "message": {
          "type": "string"
        },
        "partIndex": {
          "type": "integer",
          "description": "Index into `parts`. Absent for advice about the file as a whole."
        },
        "otherPartIndex": {
          "type": "integer",
          "description": "The second part, for advice about a PAIR (overlaps)."
        },
        "penetrationFraction": {
          "type": "number",
          "description": "How deeply two parts overlap, as a fraction of the smaller part's smallest dimension."
        },
        "wastePct": {
          "type": "number",
          "description": "Fraction of the bounding rectangle that is waste, 0..1 — what nesting this part would save."
        },
        "confidence": {
          "type": "number",
          "description": "How sure the role verdict was, 0..1."
        }
      },
      "required": [
        "code",
        "severity",
        "message"
      ]
    },
    "ModelPart": {
      "type": "object",
      "description": "A part as the analyser found it. Every field except `role` is a `/v3/calculate` part field; `role` is ignored there, so the object can be submitted as-is.",
      "properties": {
        "name": {
          "type": "string",
          "description": "Part name, from the model where it had one."
        },
        "l": {
          "type": "number",
          "description": "Length — the long side."
        },
        "w": {
          "type": "number",
          "description": "Width — the short side."
        },
        "t": {
          "type": "number",
          "description": "Thickness."
        },
        "q": {
          "type": "integer",
          "description": "Quantity. Above 1 when identical copies were merged into one row."
        },
        "material": {
          "type": "string",
          "description": "Material name read from the model, or empty when the file carried none."
        },
        "outline": {
          "type": "array",
          "description": "Closed polygon outline. Present for shaped parts — send it to a nesting model to keep the shape.",
          "items": {
            "type": "object",
            "properties": {
              "x": {
                "type": "number"
              },
              "y": {
                "type": "number"
              }
            }
          }
        },
        "holes": {
          "type": "array",
          "description": "Inner rings that are SHAPE — slots, cut-outs — in the outline's own frame. A ROUND ring is drilling rather than shape and comes back in `machining.holes` instead; nothing appears in both, so a part is never drilled and cut for the same hole.",
          "items": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "x": {
                  "type": "number"
                },
                "y": {
                  "type": "number"
                }
              }
            }
          }
        },
        "machining": {
          "type": "object",
          "description": "Machining read off the model, in `/v3/calculate`'s own `machining` shape — post it back untouched.",
          "properties": {
            "holes": {
              "type": "array",
              "description": "Round holes found in the part. Through holes, so `depth` is absent; measurements are in the response's `units`.",
              "items": {
                "type": "object",
                "properties": {
                  "x": {
                    "type": "number",
                    "description": "X of the hole centre, from the left edge."
                  },
                  "y": {
                    "type": "number",
                    "description": "Y of the hole centre, from the bottom edge."
                  },
                  "diameter": {
                    "type": "number",
                    "description": "Hole diameter."
                  },
                  "depth": {
                    "type": "number",
                    "description": "Hole depth. Absent for a through hole, which is what the analysis always finds."
                  },
                  "face": {
                    "type": "number",
                    "enum": [
                      0,
                      1
                    ],
                    "description": "Face index (0=front, 1=back)."
                  },
                  "type": {
                    "type": "string",
                    "enum": [
                      "regular",
                      "hinge",
                      "shelf"
                    ],
                    "description": "Hole type."
                  }
                },
                "required": [
                  "x",
                  "y",
                  "diameter"
                ]
              }
            }
          }
        },
        "role": {
          "type": "string",
          "enum": [
            "rect",
            "nesting",
            "fixture"
          ],
          "description": "What the part is FOR: a plain rectangle, a shape worth nesting, or a fitting that was never cut from sheet. Drop `fixture` rows before cutting. Ignored by `/v3/calculate`."
        }
      },
      "required": [
        "name",
        "l",
        "w",
        "t",
        "q",
        "material",
        "role"
      ]
    }
  }
}

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/smartcut-dev-model-analysis-response"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.