{"openapi":"3.1.0","info":{"title":"DemoAPI.org built-in examples","version":"1.0.0","description":"First-party fixture APIs for public client testing. Responses use labeled sample data.","contact":{"name":"AI Embedded Systems","url":"https://aiembeddedsystems.com/"}},"servers":[{"url":"https://demoapi.org","description":"Canonical public service"}],"paths":{"/api/demo/model-health":{"get":{"operationId":"get_local_model_health","summary":"Check whether a small local model service is ready to take work.","description":"Returns a stable fixture. It does not inspect your machine.","responses":{"200":{"description":"Labeled health fixture","content":{"application/json":{"example":{"status":"ready","model":"demo-7b-instruct","runtime":"local","queue_depth":0,"checked_at":"2026-07-15T14:32:00.000Z","fixture":true}}}},"400":{"description":"Request rejected","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Request rejected","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}},"additionalProperties":false}}}}}}},"/api/demo/vision-job":{"post":{"operationId":"preview_vision_job","summary":"Preview how an image inspection job would be accepted and scheduled.","description":"Returns sample IDs and timing. It never fetches the supplied image name.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["image_name","task","priority"],"properties":{"image_name":{"type":"string","minLength":1,"maxLength":120,"pattern":"^[a-zA-Z0-9][a-zA-Z0-9._-]{0,119}$"},"task":{"type":"string","enum":["surface-defect-check","label-read"]},"priority":{"type":"string","enum":["low","normal","high"]}},"additionalProperties":false},"example":{"image_name":"line-4-part-018.jpg","task":"surface-defect-check","priority":"normal"}}}},"responses":{"202":{"description":"Labeled queue receipt","content":{"application/json":{"example":{"accepted":true,"job_id":"job_demo_018","state":"queued","estimated_start_ms":240,"fixture":true}}}},"400":{"description":"Request rejected","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}},"additionalProperties":false}}}},"413":{"description":"Request rejected","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}},"additionalProperties":false}}}},"415":{"description":"Request rejected","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Request rejected","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}},"additionalProperties":false}}}}}}},"/api/demo/robot-route":{"post":{"operationId":"check_robot_route","summary":"Validate a short waypoint plan before handing it to a robot controller.","description":"Checks the payload only. It cannot connect to a robot or motion controller.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["robot_id","waypoints","max_speed_mps"],"properties":{"robot_id":{"type":"string","minLength":1,"maxLength":40,"pattern":"^[a-zA-Z0-9][a-zA-Z0-9_-]{0,39}$"},"waypoints":{"type":"array","minItems":2,"maxItems":8,"items":{"type":"object","required":["x","y"],"properties":{"x":{"type":"number","minimum":-100,"maximum":100},"y":{"type":"number","minimum":-100,"maximum":100}},"additionalProperties":false}},"max_speed_mps":{"type":"number","exclusiveMinimum":0,"maximum":2}},"additionalProperties":false},"example":{"robot_id":"cart-07","waypoints":[{"x":1.2,"y":0.5},{"x":2.8,"y":1.1}],"max_speed_mps":0.8}}}},"responses":{"200":{"description":"Labeled route check","content":{"application/json":{"example":{"valid":true,"route_id":"route_demo_cart_07","distance_m":1.71,"warnings":[],"fixture":true}}}},"400":{"description":"Request rejected","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}},"additionalProperties":false}}}},"413":{"description":"Request rejected","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}},"additionalProperties":false}}}},"415":{"description":"Request rejected","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}},"additionalProperties":false}}}},"429":{"description":"Request rejected","content":{"application/json":{"schema":{"type":"object","required":["error"],"properties":{"error":{"type":"string"}},"additionalProperties":false}}}}}}}}}