{"openapi":"3.1.0","info":{"title":"RotoSpider Layout WebAPI","version":"1.2.0","description":"Public JSON API for rotomolding mold-on-arm layout feasibility, computed by the deterministic RotoSpider geometric layout engine (rotation envelope, dead height, mold-to-mold clearance, riser selection, ring arrangements). Same engine and limits as the MCP tool check_mold_layout. Machine presets are a representative public-sample set, not a certified factory configuration."},"servers":[{"url":"https://www.rotospider.com/roto"}],"paths":{"/api/capabilities":{"get":{"summary":"Read the stable WebAPI, MCP, and executor contract","responses":{"200":{"description":"Versioned RotoSpider server capabilities","content":{"application/json":{"schema":{"type":"object","required":["schema","serviceVersion","execution","webApi","mcp"],"properties":{"schema":{"const":"rotospider.server-capabilities.v1"},"serviceVersion":{"type":"string"},"execution":{"type":"object"},"webApi":{"type":"object"},"mcp":{"type":"object"}},"additionalProperties":false}}}}}}},"/api/layout/check":{"post":{"summary":"Check whether molds fit together on a machine arm","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"molds":{"type":"array","items":{"type":"object","description":"Box mold: length_mm+width_mm+height_mm. Cylinder mold: diameter_mm+height_mm. Decimal-inch aliases use the same stems with _in. Do not give both aliases for one value.","properties":{"name":{"type":"string"},"length_mm":{"type":"number"},"width_mm":{"type":"number"},"height_mm":{"type":"number"},"diameter_mm":{"type":"number"},"length_in":{"type":"number"},"width_in":{"type":"number"},"height_in":{"type":"number"},"diameter_in":{"type":"number"},"geometry_asset_id":{"type":"string","pattern":"^sha256:[0-9a-f]{64}$"},"geometry_asset_revision":{"type":"string","minLength":1},"weight_kg":{"type":"number"},"quantity":{"type":"integer","minimum":0,"maximum":60,"default":1}},"additionalProperties":false},"maxItems":12},"machine":{"type":"string","description":"Public-sample straight-arm preset (VI-3-1500 (sample geometry), VI-3-2500 (sample geometry), Duroline (sample geometry), CS-10000 (sample geometry), CS-25000 (sample geometry)); empty with no explicit geometry scans all presets."},"arm_type":{"type":"string","enum":["","straight","offset"]},"spider_diameter_mm":{"type":"number","description":"Custom machine: spider diameter (with envelope_diameter_mm switches to custom-machine mode)."},"envelope_diameter_mm":{"type":"number"},"dead_height_mm":{"type":"number"},"offset_spider_y_mm":{"type":"number"},"offset_horz_diameter_mm":{"type":"number"},"riser_heights_mm":{"type":"array","items":{"type":"number"}},"spider_diameter_in":{"type":"number"},"envelope_diameter_in":{"type":"number"},"dead_height_in":{"type":"number"},"offset_spider_y_in":{"type":"number"},"offset_horz_diameter_in":{"type":"number"},"riser_heights_in":{"type":"array","items":{"type":"number"}},"max_load_weight_kg":{"type":"number"},"clearance_target_mm":{"type":"number","default":300},"clearance_min_mm":{"type":"number","default":150},"allow_overhang_within_envelope":{"type":"boolean","default":false,"description":"Allow every mold shape to cross the spider edge while remaining inside the rotation envelope."},"clearance_target_in":{"type":"number"},"clearance_min_in":{"type":"number"},"display_unit":{"type":"string","enum":["mm","in"],"default":"mm","description":"Presentation only. Canonical result fields remain millimetres; in adds display.unit=in."},"response_api":{"type":"string","enum":["rotospider.layout-check.v1","rotospider.layout-check.v2","rotospider.layout-check.v3"],"default":"rotospider.layout-check.v1","description":"Select v1 rotated90 booleans, v2 exact four-heading keys, or v3 milli-degree angles."}},"required":["molds"]}}}},"responses":{"200":{"description":"Summary plus per-arm feasibility, metrics, stable arm geometry, and request-relative 2D placements.","content":{"application/json":{"schema":{"type":"object","required":["ok","api","unit","summary","results"],"properties":{"ok":{"const":true},"api":{"type":"string","enum":["rotospider.layout-check.v1","rotospider.layout-check.v2","rotospider.layout-check.v3"]},"unit":{"const":"mm"},"summary":{"type":"string"},"results":{"type":"array","items":{"type":"object","properties":{"machine":{"type":"string"},"arm":{"type":"string","enum":["straight","offset"]},"feasible":{"type":"boolean"},"requested":{"type":"integer"},"placed":{"type":"integer"},"riserMm":{"type":"number"},"layoutRadiusMm":{"type":"number"},"spiderUtilization":{"type":"number"},"centerOfGravityOffsetMm":{"type":"number"},"armGeometry":{"type":"object","description":"Stable selected-arm geometry in mm."},"layout":{"type":"object","required":["coordinateSystem","placements"],"properties":{"coordinateSystem":{"const":"center-origin-x-right-z-up"},"placements":{"type":"array","items":{"oneOf":[{"type":"object","required":["inputIndex","copyIndex","name","side","shape","centerXMm","centerZMm","footprintXMm","footprintZMm","heightMm","rotated90"],"properties":{"inputIndex":{"type":"integer","minimum":0,"description":"Zero-based index in request molds[]."},"copyIndex":{"type":"integer","minimum":1,"description":"One-based copy within that input mold."},"name":{"type":"string"},"side":{"type":"string","enum":["upper","lower","single"]},"shape":{"type":"string","enum":["rectangle","circle"]},"centerXMm":{"type":"number"},"centerZMm":{"type":"number"},"footprintXMm":{"type":"number","minimum":0.001},"footprintZMm":{"type":"number","minimum":0.001},"heightMm":{"type":"number","minimum":0.001},"rotated90":{"type":"boolean"}},"additionalProperties":false},{"type":"object","required":["inputIndex","copyIndex","name","side","shape","centerXMm","centerZMm","footprintXMm","footprintZMm","heightMm","orient"],"properties":{"inputIndex":{"type":"integer","minimum":0,"description":"Zero-based index in request molds[]."},"copyIndex":{"type":"integer","minimum":1,"description":"One-based copy within that input mold."},"name":{"type":"string"},"side":{"type":"string","enum":["upper","lower","single"]},"shape":{"type":"string","enum":["rectangle","circle"]},"centerXMm":{"type":"number"},"centerZMm":{"type":"number"},"footprintXMm":{"type":"number","minimum":0.001},"footprintZMm":{"type":"number","minimum":0.001},"heightMm":{"type":"number","minimum":0.001},"orient":{"type":"string","enum":["LWH","WLH","LWH180","WLH270"]}},"additionalProperties":false},{"type":"object","required":["inputIndex","copyIndex","name","side","shape","centerXMm","centerZMm","footprintXMm","footprintZMm","heightMm","angleMilliDeg"],"properties":{"inputIndex":{"type":"integer","minimum":0,"description":"Zero-based index in request molds[]."},"copyIndex":{"type":"integer","minimum":1,"description":"One-based copy within that input mold."},"name":{"type":"string"},"side":{"type":"string","enum":["upper","lower","single"]},"shape":{"type":"string","enum":["rectangle","circle"]},"centerXMm":{"type":"number"},"centerZMm":{"type":"number"},"footprintXMm":{"type":"number","minimum":0.001},"footprintZMm":{"type":"number","minimum":0.001},"heightMm":{"type":"number","minimum":0.001},"angleMilliDeg":{"type":"integer","minimum":0,"maximum":359999}},"additionalProperties":false}]}}}}}}},"display":{"type":"object","description":"Optional inch presentation projection. Canonical results remain physical mm."}}}}}}}}},"/api/geometry/generate":{"post":{"summary":"Build a verified generated mold shape","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["generatorProfile","schema","shape","units"],"properties":{"generatorProfile":{"const":"roto.shape.generator.v1"},"schema":{"const":"roto.shape.definition.v1"},"shape":{"oneOf":[{"type":"object","required":["kind","heightUm","xSpanUm","zSpanUm"],"properties":{"kind":{"const":"box"},"heightUm":{"type":"integer","minimum":1,"maximum":100000000},"xSpanUm":{"type":"integer","minimum":1,"maximum":100000000},"zSpanUm":{"type":"integer","minimum":1,"maximum":100000000}},"additionalProperties":false},{"type":"object","required":["kind","axisLengthUm","diameterUm","mount"],"properties":{"kind":{"const":"cylinder"},"axisLengthUm":{"type":"integer","minimum":1,"maximum":100000000},"diameterUm":{"type":"integer","minimum":1,"maximum":100000000},"mount":{"type":"string","enum":["upright","laidDown"]}},"additionalProperties":false},{"type":"object","required":["kind","heightUm","notchQuadrant","notchXSpanUm","notchZSpanUm","outsideXSpanUm","outsideZSpanUm"],"properties":{"kind":{"const":"lPrism"},"heightUm":{"type":"integer","minimum":1,"maximum":100000000},"notchQuadrant":{"type":"string","enum":["negativeXNegativeZ","negativeXPositiveZ","positiveXNegativeZ","positiveXPositiveZ"]},"notchXSpanUm":{"type":"integer","minimum":1,"maximum":100000000},"notchZSpanUm":{"type":"integer","minimum":1,"maximum":100000000},"outsideXSpanUm":{"type":"integer","minimum":1,"maximum":100000000},"outsideZSpanUm":{"type":"integer","minimum":1,"maximum":100000000}},"additionalProperties":false},{"type":"object","required":["kind","baseZSpanUm","heightUm","pointXDepthUm","pointZOffsetUm"],"properties":{"kind":{"const":"triangularPrism"},"baseZSpanUm":{"type":"integer","minimum":1,"maximum":100000000},"heightUm":{"type":"integer","minimum":1,"maximum":100000000},"pointXDepthUm":{"type":"integer","minimum":1,"maximum":100000000},"pointZOffsetUm":{"type":"integer"}},"additionalProperties":false},{"type":"object","required":["kind","highHeightUm","lowHeightUm","xSpanUm","zSpanUm"],"properties":{"kind":{"const":"wedge"},"highHeightUm":{"type":"integer","minimum":1,"maximum":100000000},"lowHeightUm":{"type":"integer","minimum":1,"maximum":100000000},"xSpanUm":{"type":"integer","minimum":1,"maximum":100000000},"zSpanUm":{"type":"integer","minimum":1,"maximum":100000000}},"additionalProperties":false},{"type":"object","required":["kind","axisLengthUm","largeDiameterUm","mount","smallDiameterUm"],"properties":{"kind":{"const":"frustum"},"axisLengthUm":{"type":"integer","minimum":1,"maximum":100000000},"largeDiameterUm":{"type":"integer","minimum":1,"maximum":100000000},"mount":{"type":"string","enum":["upright","laidDown"]},"smallDiameterUm":{"type":"integer","minimum":1,"maximum":100000000}},"additionalProperties":false},{"type":"object","required":["kind","heightUm","vertices"],"properties":{"kind":{"const":"polygonPrism"},"heightUm":{"type":"integer","minimum":1,"maximum":100000000},"vertices":{"type":"array","minItems":3,"maxItems":256,"items":{"type":"object","required":["xUm","zUm"],"properties":{"xUm":{"type":"integer"},"zUm":{"type":"integer"}},"additionalProperties":false}}},"additionalProperties":false},{"type":"object","required":["kind","levels"],"properties":{"kind":{"const":"apexShape"},"levels":{"type":"array","minItems":2,"maxItems":8,"items":{"type":"object","required":["vertices","yUm"],"properties":{"vertices":{"type":"array","minItems":3,"maxItems":256,"items":{"type":"object","required":["xUm","zUm"],"properties":{"xUm":{"type":"integer"},"zUm":{"type":"integer"}},"additionalProperties":false}},"yUm":{"type":"integer","minimum":0,"maximum":100000000}},"additionalProperties":false}}},"additionalProperties":false},{"type":"object","required":["kind","diameterUm"],"properties":{"kind":{"const":"sphere"},"diameterUm":{"type":"integer","minimum":1,"maximum":100000000}},"additionalProperties":false}]},"units":{"const":"um"}},"additionalProperties":false,"description":"Canonical roto.shape.definition.v1"}}}},"responses":{"200":{"description":"Installed exact identity and measured bounds","content":{"application/json":{"schema":{"type":"object","required":["ok","api","assetId","revision","alreadyPresent","sourceKind","boundsMm","envelopeMm","maxSurfaceDeviationMm","orientationsMilliDeg"],"properties":{"ok":{"const":true},"api":{"const":"rotospider.geometry.v1"},"assetId":{"type":"string","pattern":"^sha256:[0-9a-f]{64}$"},"revision":{"type":"string","minLength":1},"alreadyPresent":{"type":"boolean"},"sourceKind":{"type":"string","enum":["generatedDefinition","publishedAsset"]},"boundsMm":{"type":"object","required":["minXMm","minYMm","minZMm","maxXMm","maxYMm","maxZMm"],"properties":{"minXMm":{"type":"number"},"minYMm":{"type":"number"},"minZMm":{"type":"number"},"maxXMm":{"type":"number"},"maxYMm":{"type":"number"},"maxZMm":{"type":"number"}},"additionalProperties":false},"envelopeMm":{"type":"object","required":["lengthMm","widthMm","heightMm"],"properties":{"lengthMm":{"type":"number","exclusiveMinimum":0},"widthMm":{"type":"number","exclusiveMinimum":0},"heightMm":{"type":"number","exclusiveMinimum":0}},"additionalProperties":false},"maxSurfaceDeviationMm":{"type":"number","minimum":0},"orientationsMilliDeg":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"integer","minimum":0,"maximum":359999}},"definitionId":{"type":"string","pattern":"^sha256:[0-9a-f]{64}$"}},"additionalProperties":false}}}},"400":{"description":"Invalid or noncanonical shape definition","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}}}},"/api/geometry/import":{"post":{"summary":"Install a prepared complex mold shape","parameters":[{"name":"X-RotoSpider-Filename","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/octet-stream":{"schema":{"type":"string","format":"binary","maxLength":100663296}}}},"responses":{"200":{"description":"Installed exact identity and measured bounds","content":{"application/json":{"schema":{"type":"object","required":["ok","api","assetId","revision","alreadyPresent","sourceKind","boundsMm","envelopeMm","maxSurfaceDeviationMm","orientationsMilliDeg"],"properties":{"ok":{"const":true},"api":{"const":"rotospider.geometry.v1"},"assetId":{"type":"string","pattern":"^sha256:[0-9a-f]{64}$"},"revision":{"type":"string","minLength":1},"alreadyPresent":{"type":"boolean"},"sourceKind":{"type":"string","enum":["generatedDefinition","publishedAsset"]},"boundsMm":{"type":"object","required":["minXMm","minYMm","minZMm","maxXMm","maxYMm","maxZMm"],"properties":{"minXMm":{"type":"number"},"minYMm":{"type":"number"},"minZMm":{"type":"number"},"maxXMm":{"type":"number"},"maxYMm":{"type":"number"},"maxZMm":{"type":"number"}},"additionalProperties":false},"envelopeMm":{"type":"object","required":["lengthMm","widthMm","heightMm"],"properties":{"lengthMm":{"type":"number","exclusiveMinimum":0},"widthMm":{"type":"number","exclusiveMinimum":0},"heightMm":{"type":"number","exclusiveMinimum":0}},"additionalProperties":false},"maxSurfaceDeviationMm":{"type":"number","minimum":0},"orientationsMilliDeg":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"integer","minimum":0,"maximum":359999}},"definitionId":{"type":"string","pattern":"^sha256:[0-9a-f]{64}$"}},"additionalProperties":false}}}},"400":{"description":"Invalid prepared shape","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}},"413":{"description":"Prepared shape exceeds the public size limit","content":{"application/json":{"schema":{"type":"object","required":["ok","error"],"properties":{"ok":{"const":false},"error":{"type":"string"},"message":{"type":"string"}},"additionalProperties":false}}}}}}},"/api/geometry/{assetId}/preview.glb":{"get":{"summary":"Read the exact asset preview","parameters":[{"name":"assetId","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{64}$"}},{"name":"revision","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Binary GLB preview"}}}},"/api/geometry/{assetId}/asset.rotogeom":{"get":{"summary":"Read the exact generated asset for local solving","description":"Content-addressed binary package consumed by the browser solver. The same server-native solve remains available.","parameters":[{"name":"assetId","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{64}$"}},{"name":"revision","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Immutable .rotogeom package","content":{"application/vnd.rotospider.geometry+zip":{"schema":{"type":"string","format":"binary"}}}}}}}}}