{"openapi":"3.1.0","info":{"title":"Face Terminal — face check API","description":"Check a live selfie against a photo or ID document. Send your key in X-API-Key.","version":"0.1.0"},"paths":{"/v1/face/verify":{"post":{"tags":["face"],"summary":"Face Verify","description":"Standalone face verification for ANY uploaded image that shows a face: the uploader captures a\nlive selfie, and two agents run — Face Match Analyst (selfie vs the face in the uploaded image) and\nPresentation-Attack Analyst (is the selfie a genuine live capture). They run in PARALLEL, and the\noverall status is GATED on both. Advisory only — a human makes the final identity decision. Both\nimages are retained to the audit trail.","operationId":"face_verify_v1_face_verify_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_face_verify_v1_face_verify_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/face/flash":{"post":{"tags":["face"],"summary":"Face Flash Issue","description":"A fresh screen-flash challenge for the caller's next liveness capture: a random colour sequence (names + the\nRGB to paint) and a signed, single-use token valid for 2 minutes, bound to this caller. The browser shows the\ncolours while recording and returns the token + when each colour was painted; /v1/face/verify checks the face in\nthe clip followed them (app/face_flash.py).","operationId":"face_flash_issue_v1_face_flash_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_face_verify_v1_face_verify_post":{"properties":{"reference":{"type":"string","contentMediaType":"application/octet-stream","title":"Reference"},"selfie":{"type":"string","contentMediaType":"application/octet-stream","title":"Selfie"},"clip":{"type":"string","contentMediaType":"application/octet-stream","title":"Clip"},"challenge":{"type":"string","title":"Challenge"},"consent":{"type":"string","title":"Consent"},"lab_label":{"type":"string","title":"Lab Label"},"lab_note":{"type":"string","title":"Lab Note"}},"type":"object","required":["reference","selfie"],"title":"Body_face_verify_v1_face_verify_post"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}