{"openapi":"3.1.0","info":{"title":"Zhihuo RotoSpider Layout WebAPI","version":"1.0.2","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 trial ladder, not a certified factory."},"servers":[{"url":"https://mcp.zhihuo.net/roto"}],"paths":{"/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.","properties":{"name":{"type":"string"},"length_mm":{"type":"integer"},"width_mm":{"type":"integer"},"height_mm":{"type":"integer"},"diameter_mm":{"type":"integer"},"weight_kg":{"type":"number"},"quantity":{"type":"integer","default":1}},"required":["height_mm"]},"maxItems":12},"machine":{"type":"string","description":"Preset model (2300, 2600B, 2600C, 3100, 3500B, 4600); empty with no explicit geometry scans the whole ladder."},"arm_type":{"type":"string","enum":["","straight","offset"]},"spider_diameter_mm":{"type":"integer","description":"Custom machine: spider diameter (with envelope_diameter_mm switches to custom-machine mode)."},"envelope_diameter_mm":{"type":"integer"},"dead_height_mm":{"type":"integer"},"offset_spider_y_mm":{"type":"integer"},"offset_horz_diameter_mm":{"type":"integer"},"riser_heights_mm":{"type":"array","items":{"type":"integer"}},"max_load_weight_kg":{"type":"number"},"clearance_target_mm":{"type":"integer","default":300},"clearance_min_mm":{"type":"integer","default":150}},"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":{"const":"zhihuo.roto.layout-check.v1"},"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":"integer"},"layoutRadiusMm":{"type":"integer"},"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":{"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":"integer"},"centerZMm":{"type":"integer"},"footprintXMm":{"type":"integer","minimum":1},"footprintZMm":{"type":"integer","minimum":1},"heightMm":{"type":"integer","minimum":1},"rotated90":{"type":"boolean"}}}}}}}}}}}}}}}}}}}