{"openapi":"3.1.0","info":{"title":"AutoVision API","version":"0.1.0"},"servers":[{"url":"https://autovision.dev"}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer"}}},"paths":{"/api/v1/lenses":{"get":{"summary":"Discover registered vision lenses and approved AI models","security":[{"apiKey":[]}],"responses":{"200":{"description":"Implemented, separate-API and planned lens catalog, approved model keys and capabilities. No inference or quota charge."},"401":{"description":"Invalid API key"}}}},"/api/v1/faces":{"post":{"summary":"Stateless face measurements (operator-supplied models required)","description":"Returns sensitive biometric measurements; no saved job or identity gallery. Requires classify:false; each frame consumes one quota unit.","security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"image":{"type":"string","contentEncoding":"base64"},"frames":{"type":"array","minItems":1,"maxItems":12,"items":{"type":"object","required":["image","at_ms"],"properties":{"image":{"type":"string","contentEncoding":"base64"},"at_ms":{"type":"number","minimum":0,"maximum":30000}}}},"classify":{"const":false}},"oneOf":[{"required":["image"]},{"required":["frames"]}]}}}},"responses":{"200":{"description":"No-store face measurements, no saved job","content":{"application/json":{"schema":{"type":"object","required":["model_id","frames"],"properties":{"model_id":{"type":"string"},"frames":{"type":"array","maxItems":12,"items":{"type":"object","properties":{"at_ms":{"type":"number"},"faces":{"type":"array","maxItems":20,"items":{"type":"object","properties":{"box":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"width":{"type":"number","minimum":0,"maximum":1},"height":{"type":"number","minimum":0,"maximum":1}}},"embedding":{"type":"array","minItems":128,"maxItems":128,"items":{"type":"number"}}}}}}}}}}}}},"400":{"description":"Invalid input or classification requested"},"401":{"description":"Invalid API key"},"429":{"description":"Image quota reached"},"503":{"description":"Face models or runtime unavailable"}}}},"/api/v1/analyze":{"post":{"summary":"Analyze an image or 1–12 timed frames","security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"image":{"type":"string","contentEncoding":"base64"},"frames":{"type":"array","minItems":1,"maxItems":12,"items":{"type":"object","required":["image","at_ms"],"properties":{"image":{"type":"string","contentEncoding":"base64"},"at_ms":{"type":"number","minimum":0,"maximum":30000}}}},"enhanced":{"type":"boolean","description":"Opt into bounded autonomous inspection; false disables, omission inherits organization setting. Requires classify:true. Follow-up tools consume additional image quota. Returns inspection status, advisory review_recommended and trace."},"classify":{"type":"boolean"},"detection_labels":{"type":"array","maxItems":83,"items":{"type":"string"},"description":"Optional catalog labels overriding organization preferences. COCO labels are detected by OpenCV YOLOX on every frame (person is always included), independent of classify. package, smoke and fire are advisory Bedrock grounding and require classify:true."}},"oneOf":[{"required":["image"]},{"required":["frames"]}]}}}},"responses":{"200":{"description":"Observations, classification status, media metadata and job_id","content":{"text/event-stream":{"schema":{"type":"string"},"description":"With Accept: text/event-stream, emits pipeline SSE events for dynamically added steps and final result. No resume."},"application/json":{"schema":{"type":"object","required":["frames","observations","timeline","classification","job_id"],"properties":{"frames":{"type":"array","items":{"type":"object","properties":{"at_ms":{"type":"number"},"observations":{"type":"array","items":{"type":"object"}},"detections":{"type":"array","items":{"type":"object"}}}}},"observations":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"value":{"type":"number"},"detected":{"type":"boolean"}}}},"timeline":{"type":"array","description":"Per-frame motion against the previous frame; null for the first frame.","items":{"type":"object","required":["at_ms","motion","detected"],"properties":{"at_ms":{"type":"number"},"motion":{"type":["number","null"],"minimum":0,"maximum":1},"detected":{"type":"boolean"}}}},"classification":{"type":"object","properties":{"status":{"type":"string","enum":["not_requested","not_configured","unavailable","complete"]},"summary":{"type":"string"}}},"inspection":{"type":"object","description":"Bounded advisory inspection; consuming apps own notifications and actions.","properties":{"status":{"type":"string","enum":["not_requested","not_triggered","tool_complete","complete","needs_review","unavailable","quota_exhausted","budget_exhausted"]},"review_recommended":{"type":"boolean"},"reason":{"type":"string"},"followup_count":{"type":"integer","minimum":0,"maximum":2},"trace":{"type":"array","items":{"type":"object"}}}},"job_id":{"type":"string"}}}}}},"400":{"description":"Invalid input"},"401":{"description":"Invalid key"},"413":{"description":"Too large"},"429":{"description":"Quota reached"},"503":{"description":"Unavailable"}}}},"/api/v1/detect":{"post":{"summary":"Legacy two-frame motion comparison","description":"Compatibility endpoint; use /api/v1/analyze for new integrations. Consumes one quota unit and records a private job.","deprecated":true,"security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"image":{"type":"string","contentEncoding":"base64"},"previous_image":{"type":"string","contentEncoding":"base64"},"demo":{"const":true}},"oneOf":[{"required":["image","previous_image"]},{"required":["demo"]}]}}}},"responses":{"200":{"description":"Motion observations, metrics, engine version and job_id"},"400":{"description":"Invalid input"},"401":{"description":"Invalid key"},"413":{"description":"Too large"},"415":{"description":"Use application/json"},"429":{"description":"Quota reached"},"503":{"description":"Unavailable"}}}},"/mcp":{"post":{"summary":"MCP Streamable HTTP endpoint (stateless, JSON-RPC 2.0)","description":"Model Context Protocol endpoint exposing analyze_image, analyze_video_frames inspect_scene, inspect_region, enhance_low_light, assess_scene and list_vision_lenses, with the same inputs, quotas and job records as /api/v1/analyze. Send Accept: application/json, text/event-stream. /api/mcp is an alias.","security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["jsonrpc","method"],"properties":{"jsonrpc":{"const":"2.0"},"id":{"type":["string","number"]},"method":{"type":"string","examples":["initialize","tools/list","tools/call"]},"params":{"type":"object"}}}}}},"responses":{"200":{"description":"JSON-RPC response; tool results carry the analysis in structuredContent"},"401":{"description":"Missing or invalid API key"},"403":{"description":"Browser request from another origin"}}}},"/api/health":{"get":{"summary":"Health","responses":{"200":{"description":"Service health"}}}}}}