-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathopenapi.json
More file actions
1 lines (1 loc) · 78.7 KB
/
Copy pathopenapi.json
File metadata and controls
1 lines (1 loc) · 78.7 KB
1
{"openapi":"3.1.0","info":{"title":"FIVUCSAS Biometric Processor","description":"AI/ML microservice for face recognition and liveness detection","version":"1.0.0"},"paths":{"/api/v1/health":{"get":{"tags":["Health"],"summary":"Health Check","description":"Basic health check endpoint.\n\nReturns service health status and configuration information.\nThis is the original simple health endpoint for backward compatibility.\n\nReturns:\n HealthResponse with service status","operationId":"health_check_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/api/v1/health/detailed":{"get":{"tags":["Health"],"summary":"Detailed Health Check","description":"Comprehensive health check endpoint with system diagnostics.\n\nChecks the health of all critical system components:\n- Application status\n- Database connectivity\n- Cache status (if enabled)\n- ML models (detector and extractor)\n- Configuration\n\nReturns:\n Detailed health status with diagnostics\n\nStatus codes:\n 200: System is healthy\n 503: System is unhealthy (some checks failed)\n\nUsage:\n - Kubernetes liveness probe: GET /health/detailed\n - Monitoring systems: Poll this endpoint periodically\n - Dashboard: Display real-time health status","operationId":"detailed_health_check_api_v1_health_detailed_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Detailed Health Check Api V1 Health Detailed Get"}}}}}}},"/api/v1/health/live":{"get":{"tags":["Health"],"summary":"Liveness Check","description":"Liveness check endpoint (lightweight).\n\nThis endpoint indicates whether the application is running.\nIt performs minimal checks and responds quickly.\n\nReturns:\n Simple status indicating the application is alive\n\nUsage:\n - Kubernetes liveness probe: GET /health/live\n - Returns 200 if application is running\n - Should restart container if this fails","operationId":"liveness_check_api_v1_health_live_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Liveness Check Api V1 Health Live Get"}}}}}}},"/api/v1/health/ready":{"get":{"tags":["Health"],"summary":"Readiness Check","description":"Readiness check endpoint.\n\nThis endpoint indicates whether the application is ready to serve traffic.\nChecks that all required dependencies are available.\n\nReturns:\n Readiness status\n\nStatus codes:\n 200: Application is ready\n 503: Application is not ready\n\nUsage:\n - Kubernetes readiness probe: GET /health/ready\n - Load balancer health check","operationId":"readiness_check_api_v1_health_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Readiness Check Api V1 Health Ready Get"}}}}}}},"/api/v1/metrics/cache":{"get":{"tags":["Health"],"summary":"Cache Metrics","description":"Get cache performance metrics.\n\nReturns detailed caching statistics for monitoring and optimization.\n\nReturns:\n Cache metrics including hit rate, size, and TTL\n\nRaises:\n HTTPException 404: If caching is not enabled","operationId":"cache_metrics_api_v1_metrics_cache_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Cache Metrics Api V1 Metrics Cache Get"}}}}}}},"/api/v1/enroll":{"post":{"tags":["Enrollment"],"summary":"Enroll Face","description":"Enroll a user's face.\n\nSECURITY: This endpoint is protected by rate limiting (default: 10 requests/minute)\nto prevent enrollment flooding and DoS attacks. See ENROLLMENT_RATE_LIMIT_PER_MINUTE config.\n\nThis endpoint:\n1. Validates the uploaded image\n2. Detects face in the image\n3. Assesses image quality\n4. Extracts face embedding\n5. Stores embedding in repository\n\nArgs:\n user_id: Unique identifier for the user\n file: Face image file (JPEG/PNG)\n tenant_id: Optional tenant identifier for multi-tenancy\n use_case: Injected enrollment use case\n storage: Injected file storage\n\nReturns:\n EnrollmentResponse with enrollment result\n\nRaises:\n HTTPException 400: Bad request (no face, multiple faces, poor quality)\n HTTPException 500: Internal server error","operationId":"enroll_face_api_v1_enroll_post","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional idempotency key to prevent duplicate enrollments","title":"Idempotency-Key"},"description":"Optional idempotency key to prevent duplicate enrollments"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_enroll_face_api_v1_enroll_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnrollmentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/enroll/multi":{"post":{"tags":["Enrollment"],"summary":"Enroll Face Multi Image","description":"Enroll a user's face using multiple images (template fusion).\n\nSECURITY: This endpoint is protected by rate limiting (default: 10 requests/minute)\nto prevent enrollment flooding and DoS attacks. See ENROLLMENT_RATE_LIMIT_PER_MINUTE config.\n\nThis endpoint implements multi-image biometric enrollment:\n- Accepts 2-5 face images per user\n- Processes each image independently (detect, assess quality, extract embedding)\n- Fuses embeddings using quality-weighted average\n- Creates a single robust template\n- Improves verification accuracy by 30-40% with poor quality photos\n\nProcess:\n1. Validates uploaded images (2-5 required)\n2. Detects face in each image\n3. Assesses quality of each image\n4. Extracts embedding from each image\n5. Fuses embeddings using weighted average (higher quality = higher weight)\n6. Stores fused template in repository\n\nArgs:\n user_id: Unique identifier for the user\n files: 2-5 face image files (JPEG/PNG)\n tenant_id: Optional tenant identifier for multi-tenancy\n use_case: Injected multi-image enrollment use case\n storage: Injected file storage\n\nReturns:\n MultiImageEnrollmentResponse with enrollment result\n\nRaises:\n HTTPException 400: Bad request (invalid count, no face, multiple faces, poor quality)\n HTTPException 500: Internal server error","operationId":"enroll_face_multi_image_api_v1_enroll_multi_post","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional idempotency key to prevent duplicate enrollments","title":"Idempotency-Key"},"description":"Optional idempotency key to prevent duplicate enrollments"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_enroll_face_multi_image_api_v1_enroll_multi_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiImageEnrollmentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/verify":{"post":{"tags":["Verification"],"summary":"Verify Face","description":"Verify a user's face (1:1 matching).\n\nThis endpoint:\n1. Detects face in uploaded image\n2. Extracts face embedding\n3. Retrieves stored embedding for user\n4. Compares embeddings\n5. Returns verification result\n\nArgs:\n user_id: User identifier to verify against\n file: Face image file (JPEG/PNG)\n tenant_id: Optional tenant identifier for multi-tenancy\n use_case: Injected verification use case\n storage: Injected file storage\n\nReturns:\n VerificationResponse with verification result\n\nRaises:\n HTTPException 400: Bad request (no face, multiple faces)\n HTTPException 404: User not enrolled\n HTTPException 500: Internal server error","operationId":"verify_face_api_v1_verify_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_verify_face_api_v1_verify_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/liveness":{"post":{"tags":["Liveness"],"summary":"Check Liveness","description":"Check liveness of a face.\n\nThis endpoint:\n1. Detects face in image\n2. Performs liveness check\n3. Returns liveness result\n\nArgs:\n file: Face image file (JPEG/PNG)\n use_case: Injected liveness check use case\n storage: Injected file storage\n\nReturns:\n LivenessResponse with liveness check result\n\nRaises:\n HTTPException 400: Bad request (no face, multiple faces)\n HTTPException 500: Internal server error\n\nNote:\n Currently uses stub liveness detector.\n Will be updated in Sprint 3 with real smile/blink detection.","operationId":"check_liveness_api_v1_liveness_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_check_liveness_api_v1_liveness_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LivenessResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search":{"post":{"tags":["Search"],"summary":"Search Face","description":"Search for a face across all enrolled users (1:N identification).\n\nThis endpoint:\n1. Validates the uploaded image\n2. Detects face in the image\n3. Extracts face embedding\n4. Searches for similar embeddings\n5. Returns ranked list of matches\n\nArgs:\n file: Face image file (JPEG/PNG)\n max_results: Maximum number of matches to return (1-100)\n threshold: Distance threshold for matching (None = use default 0.6)\n tenant_id: Optional tenant identifier for multi-tenancy\n use_case: Injected search use case\n storage: Injected file storage\n\nReturns:\n SearchResponse with list of matches\n\nRaises:\n HTTPException 400: Bad request (no face, multiple faces, invalid image)\n HTTPException 500: Internal server error","operationId":"search_face_api_v1_search_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_search_face_api_v1_search_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/batch/enroll":{"post":{"tags":["batch"],"summary":"Batch Enroll","description":"Batch enroll multiple faces.\n\nUpload multiple image files along with a JSON array mapping each file\nto its user_id and optional tenant_id.\n\nArgs:\n files: List of image files (must match items array order)\n items: JSON array of BatchEnrollmentItemRequest objects\n skip_duplicates: Whether to skip users that already exist\n use_case: Batch enrollment use case\n storage: File storage service\n\nReturns:\n BatchEnrollmentResponse with results for each item\n\nExample items JSON:\n [\n {\"user_id\": \"user1\", \"tenant_id\": \"tenant1\"},\n {\"user_id\": \"user2\", \"tenant_id\": \"tenant1\"},\n {\"user_id\": \"user3\"}\n ]","operationId":"batch_enroll_api_v1_batch_enroll_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_batch_enroll_api_v1_batch_enroll_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchEnrollmentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/batch/verify":{"post":{"tags":["batch"],"summary":"Batch Verify","description":"Batch verify multiple faces.\n\nUpload multiple image files along with a JSON array mapping each file\nto its item_id, user_id, and optional tenant_id.\n\nArgs:\n files: List of image files (must match items array order)\n items: JSON array of BatchVerificationItemRequest objects\n threshold: Similarity threshold for matching\n use_case: Batch verification use case\n storage: File storage service\n\nReturns:\n BatchVerificationResponse with results for each item\n\nExample items JSON:\n [\n {\"item_id\": \"verify1\", \"user_id\": \"user1\", \"tenant_id\": \"tenant1\"},\n {\"item_id\": \"verify2\", \"user_id\": \"user2\", \"tenant_id\": \"tenant1\"},\n {\"item_id\": \"verify3\", \"user_id\": \"user3\"}\n ]","operationId":"batch_verify_api_v1_batch_verify_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_batch_verify_api_v1_batch_verify_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchVerificationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/card-type/detect-live":{"post":{"tags":["Card Type"],"summary":"Detect card type from image","description":"Detects the card type from the provided image.Supported classes: tc_kimlik, ehliyet, pasaport, ogrenci_karti,akademisyen_karti.Designed for real-time mobile camera preview (0.5-1 second intervals).","operationId":"detect_live_api_v1_card_type_detect_live_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_detect_live_api_v1_card_type_detect_live_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CardTypeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/quality/analyze":{"post":{"tags":["Quality"],"summary":"Analyze image quality","description":"Analyzes image quality and returns detailed feedback including issues detected and actionable suggestions for improvement.","operationId":"analyze_quality_api_v1_quality_analyze_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_analyze_quality_api_v1_quality_analyze_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QualityFeedbackResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/faces/detect-all":{"post":{"tags":["Face Detection"],"summary":"Detect all faces in image","description":"Detects all faces in the image and returns bounding boxes, quality scores, and basic landmarks for each face.","operationId":"detect_all_faces_api_v1_faces_detect_all_post","parameters":[{"name":"max_faces","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":50,"minimum":1},{"type":"null"}],"description":"Maximum number of faces to return","default":10,"title":"Max Faces"},"description":"Maximum number of faces to return"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_detect_all_faces_api_v1_faces_detect_all_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MultiFaceResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/demographics/analyze":{"post":{"tags":["Demographics"],"summary":"Analyze face demographics","description":"Estimates age, gender, and optionally emotion from a face image. Race estimation can be enabled via configuration.","operationId":"analyze_demographics_api_v1_demographics_analyze_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_analyze_demographics_api_v1_demographics_analyze_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemographicsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/landmarks/detect":{"post":{"tags":["Landmarks"],"summary":"Detect facial landmarks","description":"Detects detailed facial landmarks (468 points with MediaPipe). Includes facial regions mapping and head pose estimation.","operationId":"detect_landmarks_api_v1_landmarks_detect_post","parameters":[{"name":"include_3d","in":"query","required":false,"schema":{"type":"boolean","description":"Include 3D coordinates for landmarks","default":false,"title":"Include 3D"},"description":"Include 3D coordinates for landmarks"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_detect_landmarks_api_v1_landmarks_detect_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LandmarkResultResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/compare":{"post":{"tags":["Comparison"],"summary":"Compare two face images","description":"Compares two face images directly without enrollment. Returns similarity score and match determination.","operationId":"compare_faces_api_v1_compare_post","parameters":[{"name":"threshold","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"description":"Similarity threshold for match determination","default":0.6,"title":"Threshold"},"description":"Similarity threshold for match determination"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_compare_faces_api_v1_compare_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FaceComparisonResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/similarity/matrix":{"post":{"tags":["Similarity"],"summary":"Compute similarity matrix","description":"Computes NxN similarity matrix for multiple face images. Returns pairwise similarities and face clusters.","operationId":"compute_similarity_matrix_api_v1_similarity_matrix_post","parameters":[{"name":"threshold","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"description":"Threshold for considering faces as matching","default":0.6,"title":"Threshold"},"description":"Threshold for considering faces as matching"}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_compute_similarity_matrix_api_v1_similarity_matrix_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SimilarityMatrixResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/embeddings/export":{"get":{"tags":["Embeddings"],"summary":"Export embeddings","description":"Exports all face embeddings for a tenant to JSON format. Useful for backup or migration.","operationId":"export_embeddings_api_v1_embeddings_export_get","parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"type":"string","description":"Tenant identifier","default":"default","title":"Tenant Id"},"description":"Tenant identifier"},{"name":"format","in":"query","required":false,"schema":{"const":"json","type":"string","description":"Export format","default":"json","title":"Format"},"description":"Export format"},{"name":"include_metadata","in":"query","required":false,"schema":{"type":"boolean","description":"Include user metadata in export","default":true,"title":"Include Metadata"},"description":"Include user metadata in export"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/embeddings/import":{"post":{"tags":["Embeddings"],"summary":"Import embeddings","description":"Imports face embeddings from JSON format. Supports merge, replace, and skip_existing modes.","operationId":"import_embeddings_api_v1_embeddings_import_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_import_embeddings_api_v1_embeddings_import_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Import Embeddings Api V1 Embeddings Import Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/register":{"post":{"tags":["Webhooks"],"summary":"Register webhook","description":"Register a new webhook endpoint for receiving notifications.","operationId":"register_webhook_api_v1_webhooks_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookRegisterRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookConfigResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks":{"get":{"tags":["Webhooks"],"summary":"List webhooks","description":"List all registered webhooks.","operationId":"list_webhooks_api_v1_webhooks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookListResponse"}}}}}}},"/api/v1/webhooks/{webhook_id}":{"delete":{"tags":["Webhooks"],"summary":"Delete webhook","description":"Delete a registered webhook.","operationId":"delete_webhook_api_v1_webhooks__webhook_id__delete","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Delete Webhook Api V1 Webhooks Webhook Id Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/{webhook_id}/test":{"post":{"tags":["Webhooks"],"summary":"Test webhook","description":"Send a test event to the webhook endpoint.","operationId":"test_webhook_api_v1_webhooks__webhook_id__test_post","parameters":[{"name":"webhook_id","in":"path","required":true,"schema":{"type":"string","title":"Webhook Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookTestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/proctoring/sessions":{"post":{"tags":["proctoring"],"summary":"Create Session","description":"Create a new proctoring session.\n\nCreates a new session for monitoring an exam-taker. The session must be\nstarted separately to begin active monitoring.","operationId":"create_session_api_v1_proctoring_sessions_post","parameters":[{"name":"X-Tenant-ID","in":"header","required":true,"schema":{"type":"string","title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSessionRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["proctoring"],"summary":"List Sessions","description":"List proctoring sessions with optional filters.","operationId":"list_sessions_api_v1_proctoring_sessions_get","parameters":[{"name":"exam_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Exam Id"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"X-Tenant-ID","in":"header","required":true,"schema":{"type":"string","title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/proctoring/sessions/{session_id}/start":{"post":{"tags":["proctoring"],"summary":"Start Session","description":"Start a proctoring session.\n\nBegins active monitoring. Requires a baseline image or existing user embedding.","operationId":"start_session_api_v1_proctoring_sessions__session_id__start_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}},{"name":"X-Tenant-ID","in":"header","required":true,"schema":{"type":"string","title":"X-Tenant-Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartSessionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/proctoring/sessions/{session_id}/pause":{"post":{"tags":["proctoring"],"summary":"Pause Session","description":"Pause a proctoring session.","operationId":"pause_session_api_v1_proctoring_sessions__session_id__pause_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}},{"name":"X-Tenant-ID","in":"header","required":true,"schema":{"type":"string","title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/proctoring/sessions/{session_id}/resume":{"post":{"tags":["proctoring"],"summary":"Resume Session","description":"Resume a paused proctoring session.","operationId":"resume_session_api_v1_proctoring_sessions__session_id__resume_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}},{"name":"X-Tenant-ID","in":"header","required":true,"schema":{"type":"string","title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/proctoring/sessions/{session_id}/end":{"post":{"tags":["proctoring"],"summary":"End Session","description":"End a proctoring session.","operationId":"end_session_api_v1_proctoring_sessions__session_id__end_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}},{"name":"X-Tenant-ID","in":"header","required":true,"schema":{"type":"string","title":"X-Tenant-Id"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndSessionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EndSessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/proctoring/sessions/{session_id}":{"get":{"tags":["proctoring"],"summary":"Get Session","description":"Get session details.","operationId":"get_session_api_v1_proctoring_sessions__session_id__get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}},{"name":"X-Tenant-ID","in":"header","required":true,"schema":{"type":"string","title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/proctoring/sessions/{session_id}/frames":{"post":{"tags":["proctoring"],"summary":"Submit Frame","description":"Submit a frame for analysis.\n\nAnalyzes the frame for face verification, gaze tracking, object detection,\nand other proctoring checks. Returns analysis results and any incidents created.","operationId":"submit_frame_api_v1_proctoring_sessions__session_id__frames_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}},{"name":"X-Tenant-ID","in":"header","required":true,"schema":{"type":"string","title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitFrameRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitFrameResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/proctoring/sessions/{session_id}/incidents":{"post":{"tags":["proctoring"],"summary":"Create Incident","description":"Manually create an incident for a session.","operationId":"create_incident_api_v1_proctoring_sessions__session_id__incidents_post","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}},{"name":"X-Tenant-ID","in":"header","required":true,"schema":{"type":"string","title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateIncidentRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateIncidentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["proctoring"],"summary":"List Incidents","description":"List incidents for a session.","operationId":"list_incidents_api_v1_proctoring_sessions__session_id__incidents_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"}},{"name":"reviewed","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Reviewed"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/proctoring/incidents/{incident_id}":{"get":{"tags":["proctoring"],"summary":"Get Incident","description":"Get incident details.","operationId":"get_incident_api_v1_proctoring_incidents__incident_id__get","parameters":[{"name":"incident_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Incident Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IncidentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/proctoring/incidents/{incident_id}/review":{"post":{"tags":["proctoring"],"summary":"Review Incident","description":"Review an incident and take action.","operationId":"review_incident_api_v1_proctoring_incidents__incident_id__review_post","parameters":[{"name":"incident_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Incident Id"}},{"name":"X-Reviewer-ID","in":"header","required":false,"schema":{"type":"string","title":"X-Reviewer-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewIncidentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/proctoring/sessions/{session_id}/report":{"get":{"tags":["proctoring"],"summary":"Get Session Report","description":"Get comprehensive session report.","operationId":"get_session_report_api_v1_proctoring_sessions__session_id__report_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}},{"name":"X-Tenant-ID","in":"header","required":true,"schema":{"type":"string","title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionReportResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/proctoring/sessions/{session_id}/rate-limit":{"get":{"tags":["proctoring"],"summary":"Get Rate Limit Status","description":"Get rate limit status for a session.","operationId":"get_rate_limit_status_api_v1_proctoring_sessions__session_id__rate_limit_get","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/proctoring/ws/stats":{"get":{"tags":["proctoring-websocket"],"summary":"Get Websocket Stats","description":"Get WebSocket connection statistics.","operationId":"get_websocket_stats_api_v1_proctoring_ws_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/admin/stats":{"get":{"tags":["Admin"],"summary":"Get System Stats","description":"Get system statistics.\n\nReturns real-time statistics about the biometric system including\nenrollment counts, verification metrics, and system health.","operationId":"get_system_stats_api_v1_admin_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SystemStats"}}}}}}},"/api/v1/admin/activity":{"get":{"tags":["Admin"],"summary":"Get Recent Activity","description":"Get recent system activity.\n\nReturns the last 10 operations performed on the system.","operationId":"get_recent_activity_api_v1_admin_activity_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecentActivity"}}}}}}}},"components":{"schemas":{"Activity":{"properties":{"id":{"type":"string","title":"Id"},"type":{"type":"string","title":"Type"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"timestamp":{"type":"string","title":"Timestamp"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"}},"type":"object","required":["id","type","timestamp"],"title":"Activity","description":"Activity log entry."},"AgeEstimateResponse":{"properties":{"value":{"type":"integer","title":"Value"},"range":{"items":{},"type":"array","title":"Range"},"confidence":{"type":"number","title":"Confidence"}},"type":"object","required":["value","range","confidence"],"title":"AgeEstimateResponse","description":"API response model for age estimate."},"BasicLandmarksResponse":{"properties":{"left_eye":{"items":{"type":"integer"},"type":"array","title":"Left Eye"},"right_eye":{"items":{"type":"integer"},"type":"array","title":"Right Eye"},"nose":{"items":{"type":"integer"},"type":"array","title":"Nose"},"mouth_left":{"items":{"type":"integer"},"type":"array","title":"Mouth Left"},"mouth_right":{"items":{"type":"integer"},"type":"array","title":"Mouth Right"}},"type":"object","required":["left_eye","right_eye","nose","mouth_left","mouth_right"],"title":"BasicLandmarksResponse","description":"API response model for basic landmarks."},"BatchEnrollmentResponse":{"properties":{"total_items":{"type":"integer","title":"Total Items","description":"Total number of items processed"},"successful":{"type":"integer","title":"Successful","description":"Number of successful enrollments"},"failed":{"type":"integer","title":"Failed","description":"Number of failed enrollments"},"skipped":{"type":"integer","title":"Skipped","description":"Number of skipped enrollments (duplicates)"},"results":{"items":{"$ref":"#/components/schemas/BatchItemResultResponse"},"type":"array","title":"Results","description":"Individual results for each item"},"message":{"type":"string","title":"Message","description":"Summary message"}},"type":"object","required":["total_items","successful","failed","skipped","message"],"title":"BatchEnrollmentResponse","description":"Response model for batch enrollment operation."},"BatchItemResultResponse":{"properties":{"item_id":{"type":"string","title":"Item Id","description":"Item identifier"},"status":{"type":"string","title":"Status","description":"Status: success, failed, or skipped"},"data":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Data","description":"Result data if successful"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Error message if failed"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code","description":"Error code for programmatic handling"}},"type":"object","required":["item_id","status"],"title":"BatchItemResultResponse","description":"Response model for a single batch item result."},"BatchVerificationResponse":{"properties":{"total_items":{"type":"integer","title":"Total Items","description":"Total number of items processed"},"successful":{"type":"integer","title":"Successful","description":"Number of successful verifications"},"failed":{"type":"integer","title":"Failed","description":"Number of failed verifications"},"results":{"items":{"$ref":"#/components/schemas/BatchItemResultResponse"},"type":"array","title":"Results","description":"Individual results for each item"},"message":{"type":"string","title":"Message","description":"Summary message"}},"type":"object","required":["total_items","successful","failed","message"],"title":"BatchVerificationResponse","description":"Response model for batch verification operation."},"Body_analyze_demographics_api_v1_demographics_analyze_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_analyze_demographics_api_v1_demographics_analyze_post"},"Body_analyze_quality_api_v1_quality_analyze_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_analyze_quality_api_v1_quality_analyze_post"},"Body_batch_enroll_api_v1_batch_enroll_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files","description":"Image files for enrollment"},"items":{"type":"string","title":"Items","description":"JSON array of enrollment items"},"skip_duplicates":{"type":"boolean","title":"Skip Duplicates","description":"Skip users that already exist","default":true}},"type":"object","required":["files","items"],"title":"Body_batch_enroll_api_v1_batch_enroll_post"},"Body_batch_verify_api_v1_batch_verify_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files","description":"Image files for verification"},"items":{"type":"string","title":"Items","description":"JSON array of verification items"},"threshold":{"type":"number","maximum":2.0,"minimum":0.0,"title":"Threshold","description":"Similarity threshold","default":0.6}},"type":"object","required":["files","items"],"title":"Body_batch_verify_api_v1_batch_verify_post"},"Body_check_liveness_api_v1_liveness_post":{"properties":{"file":{"type":"string","format":"binary","title":"File","description":"Face image file"}},"type":"object","required":["file"],"title":"Body_check_liveness_api_v1_liveness_post"},"Body_compare_faces_api_v1_compare_post":{"properties":{"file1":{"type":"string","format":"binary","title":"File1","description":"First face image"},"file2":{"type":"string","format":"binary","title":"File2","description":"Second face image"}},"type":"object","required":["file1","file2"],"title":"Body_compare_faces_api_v1_compare_post"},"Body_compute_similarity_matrix_api_v1_similarity_matrix_post":{"properties":{"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files","description":"Face images to compare"},"labels":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Labels","description":"Comma-separated labels for faces (e.g., 'person_a,person_b,person_c')"}},"type":"object","required":["files"],"title":"Body_compute_similarity_matrix_api_v1_similarity_matrix_post"},"Body_detect_all_faces_api_v1_faces_detect_all_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_detect_all_faces_api_v1_faces_detect_all_post"},"Body_detect_landmarks_api_v1_landmarks_detect_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_detect_landmarks_api_v1_landmarks_detect_post"},"Body_detect_live_api_v1_card_type_detect_live_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_detect_live_api_v1_card_type_detect_live_post"},"Body_enroll_face_api_v1_enroll_post":{"properties":{"user_id":{"type":"string","title":"User Id","description":"User identifier"},"file":{"type":"string","format":"binary","title":"File","description":"Face image file"},"tenant_id":{"type":"string","title":"Tenant Id","description":"Optional tenant identifier"}},"type":"object","required":["user_id","file"],"title":"Body_enroll_face_api_v1_enroll_post"},"Body_enroll_face_multi_image_api_v1_enroll_multi_post":{"properties":{"user_id":{"type":"string","title":"User Id","description":"User identifier"},"files":{"items":{"type":"string","format":"binary"},"type":"array","title":"Files","description":"2-5 face image files"},"tenant_id":{"type":"string","title":"Tenant Id","description":"Optional tenant identifier"}},"type":"object","required":["user_id","files"],"title":"Body_enroll_face_multi_image_api_v1_enroll_multi_post"},"Body_import_embeddings_api_v1_embeddings_import_post":{"properties":{"file":{"type":"string","format":"binary","title":"File","description":"JSON export file"},"mode":{"type":"string","enum":["merge","replace","skip_existing"],"title":"Mode","description":"Import mode: merge (update existing), replace (clear first), skip_existing","default":"merge"},"tenant_id":{"type":"string","title":"Tenant Id","description":"Target tenant","default":"default"}},"type":"object","required":["file"],"title":"Body_import_embeddings_api_v1_embeddings_import_post"},"Body_search_face_api_v1_search_post":{"properties":{"file":{"type":"string","format":"binary","title":"File","description":"Face image file"},"max_results":{"type":"integer","maximum":100.0,"minimum":1.0,"title":"Max Results","description":"Maximum results to return","default":5},"threshold":{"anyOf":[{"type":"number","maximum":2.0,"minimum":0.0},{"type":"null"}],"title":"Threshold","description":"Distance threshold"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id","description":"Optional tenant identifier"}},"type":"object","required":["file"],"title":"Body_search_face_api_v1_search_post"},"Body_verify_face_api_v1_verify_post":{"properties":{"user_id":{"type":"string","title":"User Id","description":"User identifier to verify against"},"file":{"type":"string","format":"binary","title":"File","description":"Face image file"},"tenant_id":{"type":"string","title":"Tenant Id","description":"Optional tenant identifier"}},"type":"object","required":["user_id","file"],"title":"Body_verify_face_api_v1_verify_post"},"BoundingBoxResponse":{"properties":{"x":{"type":"integer","title":"X"},"y":{"type":"integer","title":"Y"},"width":{"type":"integer","title":"Width"},"height":{"type":"integer","title":"Height"}},"type":"object","required":["x","y","width","height"],"title":"BoundingBoxResponse","description":"API response model for bounding box."},"CardTypeResponse":{"properties":{"detected":{"type":"boolean","title":"Detected"},"class_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Class Id"},"class_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Class Name"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"}},"type":"object","required":["detected"],"title":"CardTypeResponse","description":"API response model for card type detection."},"ClusterResponse":{"properties":{"cluster_id":{"type":"integer","title":"Cluster Id"},"members":{"items":{"type":"string"},"type":"array","title":"Members"}},"type":"object","required":["cluster_id","members"],"title":"ClusterResponse","description":"API response model for cluster."},"CreateIncidentRequest":{"properties":{"incident_type":{"type":"string","title":"Incident Type"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence"},"severity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"}},"type":"object","required":["incident_type","confidence"],"title":"CreateIncidentRequest","description":"Request to create an incident."},"CreateIncidentResponse":{"properties":{"incident_id":{"type":"string","title":"Incident Id"},"session_id":{"type":"string","title":"Session Id"},"incident_type":{"type":"string","title":"Incident Type"},"severity":{"type":"string","title":"Severity"},"confidence":{"type":"number","title":"Confidence"},"risk_contribution":{"type":"number","title":"Risk Contribution"}},"type":"object","required":["incident_id","session_id","incident_type","severity","confidence","risk_contribution"],"title":"CreateIncidentResponse","description":"Response from creating an incident."},"CreateSessionRequest":{"properties":{"exam_id":{"type":"string","maxLength":255,"minLength":1,"title":"Exam Id"},"user_id":{"type":"string","maxLength":255,"minLength":1,"title":"User Id"},"config":{"anyOf":[{"$ref":"#/components/schemas/SessionConfigSchema"},{"type":"null"}]},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"}},"type":"object","required":["exam_id","user_id"],"title":"CreateSessionRequest","description":"Request to create a proctoring session."},"CreateSessionResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"exam_id":{"type":"string","title":"Exam Id"},"user_id":{"type":"string","title":"User Id"},"status":{"type":"string","title":"Status"},"config":{"additionalProperties":true,"type":"object","title":"Config"}},"type":"object","required":["session_id","exam_id","user_id","status","config"],"title":"CreateSessionResponse","description":"Response from creating a session."},"DemographicsResponse":{"properties":{"age":{"$ref":"#/components/schemas/AgeEstimateResponse"},"gender":{"$ref":"#/components/schemas/GenderEstimateResponse"},"race":{"anyOf":[{"$ref":"#/components/schemas/RaceEstimateResponse"},{"type":"null"}]},"emotion":{"anyOf":[{"$ref":"#/components/schemas/EmotionEstimateResponse"},{"type":"null"}]}},"type":"object","required":["age","gender"],"title":"DemographicsResponse","description":"API response model for demographics analysis."},"DetectedFaceResponse":{"properties":{"face_id":{"type":"integer","title":"Face Id"},"bounding_box":{"$ref":"#/components/schemas/BoundingBoxResponse"},"confidence":{"type":"number","title":"Confidence"},"quality_score":{"type":"number","title":"Quality Score"},"landmarks":{"anyOf":[{"$ref":"#/components/schemas/BasicLandmarksResponse"},{"type":"null"}]}},"type":"object","required":["face_id","bounding_box","confidence","quality_score"],"title":"DetectedFaceResponse","description":"API response model for detected face."},"EmotionEstimateResponse":{"properties":{"dominant":{"type":"string","title":"Dominant"},"confidence":{"type":"number","title":"Confidence"},"all":{"additionalProperties":{"type":"number"},"type":"object","title":"All"}},"type":"object","required":["dominant","confidence","all"],"title":"EmotionEstimateResponse","description":"API response model for emotion estimate."},"EndSessionRequest":{"properties":{"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Termination reason: normal, user, proctor, identity_failure, multiple_persons, critical_violation, deepfake, technical, timeout"}},"type":"object","title":"EndSessionRequest","description":"Request to end a session."},"EndSessionResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"status":{"type":"string","title":"Status"},"ended_at":{"type":"string","title":"Ended At"},"duration_seconds":{"type":"number","title":"Duration Seconds"},"termination_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Termination Reason"},"final_risk_score":{"type":"number","title":"Final Risk Score"},"total_incidents":{"type":"integer","title":"Total Incidents"}},"type":"object","required":["session_id","status","ended_at","duration_seconds","termination_reason","final_risk_score","total_incidents"],"title":"EndSessionResponse","description":"Response from ending a session."},"EnrollmentResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether enrollment was successful"},"user_id":{"type":"string","title":"User Id","description":"User identifier"},"quality_score":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Quality Score","description":"Image quality score (0-100)"},"message":{"type":"string","title":"Message","description":"Human-readable message"},"embedding_dimension":{"type":"integer","title":"Embedding Dimension","description":"Dimension of face embedding"}},"type":"object","required":["success","user_id","quality_score","message","embedding_dimension"],"title":"EnrollmentResponse","description":"Face enrollment response.","example":{"embedding_dimension":128,"message":"Face enrolled successfully","quality_score":85.5,"success":true,"user_id":"user123"}},"FaceComparisonResponse":{"properties":{"match":{"type":"boolean","title":"Match"},"similarity":{"type":"number","title":"Similarity"},"distance":{"type":"number","title":"Distance"},"threshold":{"type":"number","title":"Threshold"},"confidence":{"type":"string","title":"Confidence"},"face1":{"$ref":"#/components/schemas/FaceInfoResponse"},"face2":{"$ref":"#/components/schemas/FaceInfoResponse"},"message":{"type":"string","title":"Message"}},"type":"object","required":["match","similarity","distance","threshold","confidence","face1","face2","message"],"title":"FaceComparisonResponse","description":"API response model for face comparison."},"FaceInfoResponse":{"properties":{"detected":{"type":"boolean","title":"Detected"},"quality_score":{"type":"number","title":"Quality Score"},"bounding_box":{"anyOf":[{"$ref":"#/components/schemas/BoundingBoxResponse"},{"type":"null"}]}},"type":"object","required":["detected","quality_score"],"title":"FaceInfoResponse","description":"API response model for face info."},"FrameAnalysisResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"frame_number":{"type":"integer","title":"Frame Number"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"face_detected":{"type":"boolean","title":"Face Detected"},"face_matched":{"type":"boolean","title":"Face Matched"},"face_confidence":{"type":"number","title":"Face Confidence"},"face_count":{"type":"integer","title":"Face Count"},"liveness_passed":{"type":"boolean","title":"Liveness Passed"},"liveness_score":{"type":"number","title":"Liveness Score"},"gaze":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Gaze"},"objects":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Objects"},"audio":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Audio"},"deepfake":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Deepfake"},"risk_score":{"type":"number","title":"Risk Score"},"has_critical_issues":{"type":"boolean","title":"Has Critical Issues"},"processing_time_ms":{"type":"number","title":"Processing Time Ms"}},"type":"object","required":["session_id","frame_number","timestamp","face_detected","face_matched","face_confidence","face_count","liveness_passed","liveness_score","gaze","objects","audio","deepfake","risk_score","has_critical_issues","processing_time_ms"],"title":"FrameAnalysisResponse","description":"Frame analysis result."},"GenderEstimateResponse":{"properties":{"value":{"type":"string","title":"Value"},"confidence":{"type":"number","title":"Confidence"}},"type":"object","required":["value","confidence"],"title":"GenderEstimateResponse","description":"API response model for gender estimate."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HeadPoseResponse":{"properties":{"pitch":{"type":"number","title":"Pitch"},"yaw":{"type":"number","title":"Yaw"},"roll":{"type":"number","title":"Roll"}},"type":"object","required":["pitch","yaw","roll"],"title":"HeadPoseResponse","description":"API response model for head pose."},"HealthResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Service status"},"version":{"type":"string","title":"Version","description":"Service version"},"model":{"type":"string","title":"Model","description":"Face recognition model in use"},"detector":{"type":"string","title":"Detector","description":"Face detector in use"}},"type":"object","required":["status","version","model","detector"],"title":"HealthResponse","description":"Health check response.","example":{"detector":"opencv","model":"Facenet","status":"healthy","version":"1.0.0"}},"IncidentInfoSchema":{"properties":{"id":{"type":"string","title":"Id"},"type":{"type":"string","title":"Type"},"severity":{"type":"string","title":"Severity"},"timestamp":{"type":"string","title":"Timestamp"},"message":{"type":"string","title":"Message"}},"type":"object","required":["id","type","severity","timestamp","message"],"title":"IncidentInfoSchema","description":"Basic incident info returned with frame submission."},"IncidentListResponse":{"properties":{"incidents":{"items":{"$ref":"#/components/schemas/IncidentResponse"},"type":"array","title":"Incidents"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["incidents","total"],"title":"IncidentListResponse","description":"List of incidents response."},"IncidentResponse":{"properties":{"id":{"type":"string","title":"Id"},"session_id":{"type":"string","title":"Session Id"},"incident_type":{"type":"string","title":"Incident Type"},"severity":{"type":"string","title":"Severity"},"confidence":{"type":"number","title":"Confidence"},"timestamp":{"type":"string","format":"date-time","title":"Timestamp"},"details":{"additionalProperties":true,"type":"object","title":"Details"},"evidence_count":{"type":"integer","title":"Evidence Count"},"reviewed":{"type":"boolean","title":"Reviewed"},"reviewed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reviewed At"},"reviewed_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reviewed By"},"review_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Action"},"review_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Notes"},"risk_contribution":{"type":"number","title":"Risk Contribution"}},"type":"object","required":["id","session_id","incident_type","severity","confidence","timestamp","details","evidence_count","reviewed","reviewed_at","reviewed_by","review_action","review_notes","risk_contribution"],"title":"IncidentResponse","description":"Incident details response."},"LandmarkResponse":{"properties":{"id":{"type":"integer","title":"Id"},"x":{"type":"integer","title":"X"},"y":{"type":"integer","title":"Y"},"z":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Z"}},"type":"object","required":["id","x","y"],"title":"LandmarkResponse","description":"API response model for single landmark."},"LandmarkResultResponse":{"properties":{"model":{"type":"string","title":"Model"},"landmark_count":{"type":"integer","title":"Landmark Count"},"landmarks":{"items":{"$ref":"#/components/schemas/LandmarkResponse"},"type":"array","title":"Landmarks"},"regions":{"additionalProperties":{"items":{"type":"integer"},"type":"array"},"type":"object","title":"Regions"},"head_pose":{"anyOf":[{"$ref":"#/components/schemas/HeadPoseResponse"},{"type":"null"}]}},"type":"object","required":["model","landmark_count","landmarks","regions"],"title":"LandmarkResultResponse","description":"API response model for landmark detection result."},"LivenessResponse":{"properties":{"is_live":{"type":"boolean","title":"Is Live","description":"Whether subject is determined to be live"},"liveness_score":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Liveness Score","description":"Liveness score (0-100)"},"challenge":{"type":"string","title":"Challenge","description":"Challenge type used"},"challenge_completed":{"type":"boolean","title":"Challenge Completed","description":"Whether challenge was completed"},"message":{"type":"string","title":"Message","description":"Human-readable message"}},"type":"object","required":["is_live","liveness_score","challenge","challenge_completed","message"],"title":"LivenessResponse","description":"Liveness check response.","example":{"challenge":"smile","challenge_completed":true,"is_live":true,"liveness_score":92.5,"message":"Liveness check passed"}},"MultiFaceResponse":{"properties":{"face_count":{"type":"integer","title":"Face Count"},"faces":{"items":{"$ref":"#/components/schemas/DetectedFaceResponse"},"type":"array","title":"Faces"},"image_dimensions":{"additionalProperties":true,"type":"object","title":"Image Dimensions"}},"type":"object","required":["face_count","faces","image_dimensions"],"title":"MultiFaceResponse","description":"API response model for multi-face detection."},"MultiImageEnrollmentResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether enrollment was successful"},"user_id":{"type":"string","title":"User Id","description":"User identifier"},"images_processed":{"type":"integer","maximum":5.0,"minimum":2.0,"title":"Images Processed","description":"Number of images processed"},"fused_quality_score":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Fused Quality Score","description":"Quality score of fused template (0-100)"},"average_quality_score":{"type":"number","maximum":100.0,"minimum":0.0,"title":"Average Quality Score","description":"Average quality of individual images (0-100)"},"individual_quality_scores":{"items":{"type":"number"},"type":"array","title":"Individual Quality Scores","description":"Quality scores of individual images"},"message":{"type":"string","title":"Message","description":"Human-readable message"},"embedding_dimension":{"type":"integer","title":"Embedding Dimension","description":"Dimension of fused embedding"},"fusion_strategy":{"type":"string","title":"Fusion Strategy","description":"Fusion strategy used","default":"weighted_average"}},"type":"object","required":["success","user_id","images_processed","fused_quality_score","average_quality_score","individual_quality_scores","message","embedding_dimension"],"title":"MultiImageEnrollmentResponse","description":"Multi-image face enrollment response.","example":{"average_quality_score":82.3,"embedding_dimension":512,"fused_quality_score":87.5,"fusion_strategy":"weighted_average","images_processed":3,"individual_quality_scores":[78.5,85.0,83.5],"message":"Multi-image enrollment completed successfully","success":true,"user_id":"user123"}},"QualityFeedbackResponse":{"properties":{"overall_score":{"type":"number","title":"Overall Score"},"passed":{"type":"boolean","title":"Passed"},"issues":{"items":{"$ref":"#/components/schemas/QualityIssueResponse"},"type":"array","title":"Issues"},"metrics":{"$ref":"#/components/schemas/QualityMetricsResponse"}},"type":"object","required":["overall_score","passed","issues","metrics"],"title":"QualityFeedbackResponse","description":"API response model for quality feedback."},"QualityIssueResponse":{"properties":{"code":{"type":"string","title":"Code"},"severity":{"type":"string","title":"Severity"},"message":{"type":"string","title":"Message"},"value":{"type":"number","title":"Value"},"threshold":{"type":"number","title":"Threshold"},"suggestion":{"type":"string","title":"Suggestion"}},"type":"object","required":["code","severity","message","value","threshold","suggestion"],"title":"QualityIssueResponse","description":"API response model for quality issue."},"QualityMetricsResponse":{"properties":{"blur_score":{"type":"number","title":"Blur Score"},"brightness":{"type":"number","title":"Brightness"},"face_size":{"type":"number","title":"Face Size"},"face_angle":{"type":"number","title":"Face Angle"},"occlusion":{"type":"number","title":"Occlusion"}},"type":"object","required":["blur_score","brightness","face_size","face_angle","occlusion"],"title":"QualityMetricsResponse","description":"API response model for quality metrics.\n\nAll values are normalized to 0-100 scale."},"RaceEstimateResponse":{"properties":{"dominant":{"type":"string","title":"Dominant"},"confidence":{"type":"number","title":"Confidence"},"all":{"additionalProperties":{"type":"number"},"type":"object","title":"All"}},"type":"object","required":["dominant","confidence","all"],"title":"RaceEstimateResponse","description":"API response model for race estimate."},"RateLimitStatusResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"frames_last_minute":{"type":"integer","title":"Frames Last Minute"},"remaining_this_minute":{"type":"integer","title":"Remaining This Minute"},"violation_count":{"type":"integer","title":"Violation Count"},"is_throttled":{"type":"boolean","title":"Is Throttled"}},"type":"object","required":["session_id","frames_last_minute","remaining_this_minute","violation_count","is_throttled"],"title":"RateLimitStatusResponse","description":"Rate limit status response."},"RecentActivity":{"properties":{"activities":{"items":{"$ref":"#/components/schemas/Activity"},"type":"array","title":"Activities"}},"type":"object","required":["activities"],"title":"RecentActivity","description":"Recent activity response."},"ReviewIncidentRequest":{"properties":{"action":{"type":"string","title":"Action","description":"Review action: dismissed, acknowledged, warning_issued, session_paused, session_terminated, escalated"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"}},"type":"object","required":["action"],"title":"ReviewIncidentRequest","description":"Request to review an incident."},"SearchMatchResponse":{"properties":{"user_id":{"type":"string","title":"User Id","description":"Matched user identifier"},"distance":{"type":"number","maximum":2.0,"minimum":0.0,"title":"Distance","description":"Cosine distance (0=identical)"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence","description":"Match confidence (0-1)"}},"type":"object","required":["user_id","distance","confidence"],"title":"SearchMatchResponse","description":"Individual search match response.","example":{"confidence":0.85,"distance":0.15,"user_id":"user_123"}},"SearchResponse":{"properties":{"found":{"type":"boolean","title":"Found","description":"Whether any matches were found"},"matches":{"items":{"$ref":"#/components/schemas/SearchMatchResponse"},"type":"array","title":"Matches","description":"List of matching users"},"total_searched":{"type":"integer","minimum":0.0,"title":"Total Searched","description":"Total users searched"},"threshold":{"type":"number","maximum":2.0,"minimum":0.0,"title":"Threshold","description":"Distance threshold used"},"best_match":{"anyOf":[{"$ref":"#/components/schemas/SearchMatchResponse"},{"type":"null"}],"description":"Best match (lowest distance)"},"message":{"type":"string","title":"Message","description":"Result message"}},"type":"object","required":["found","total_searched","threshold","message"],"title":"SearchResponse","description":"Face search response.","example":{"best_match":{"confidence":0.85,"distance":0.15,"user_id":"user_123"},"found":true,"matches":[{"confidence":0.85,"distance":0.15,"user_id":"user_123"},{"confidence":0.75,"distance":0.25,"user_id":"user_456"}],"message":"Found 2 matches","threshold":0.6,"total_searched":100}},"SessionConfigSchema":{"properties":{"verification_interval_sec":{"type":"integer","maximum":300.0,"minimum":10.0,"title":"Verification Interval Sec","default":60},"verification_threshold":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Verification Threshold","default":0.6},"max_verification_failures":{"type":"integer","maximum":10.0,"minimum":1.0,"title":"Max Verification Failures","default":3},"gaze_away_threshold_sec":{"type":"number","maximum":30.0,"minimum":1.0,"title":"Gaze Away Threshold Sec","default":5.0},"gaze_sensitivity":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Gaze Sensitivity","default":0.7},"enable_object_detection":{"type":"boolean","title":"Enable Object Detection","default":true},"enable_audio_monitoring":{"type":"boolean","title":"Enable Audio Monitoring","default":true},"enable_multi_face_detection":{"type":"boolean","title":"Enable Multi Face Detection","default":true},"enable_deepfake_detection":{"type":"boolean","title":"Enable Deepfake Detection","default":true},"enable_session_rate_limiting":{"type":"boolean","title":"Enable Session Rate Limiting","default":true},"deepfake_confidence_threshold":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Deepfake Confidence Threshold","default":0.7},"max_frames_per_second":{"type":"number","maximum":10.0,"minimum":0.5,"title":"Max Frames Per Second","default":2.0},"max_frames_per_minute":{"type":"integer","maximum":300.0,"minimum":10.0,"title":"Max Frames Per Minute","default":60},"risk_threshold_warning":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Risk Threshold Warning","default":0.5},"risk_threshold_critical":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Risk Threshold Critical","default":0.8},"max_pause_duration_sec":{"type":"integer","maximum":1800.0,"minimum":60.0,"title":"Max Pause Duration Sec","default":300},"session_timeout_sec":{"type":"integer","maximum":28800.0,"minimum":3600.0,"title":"Session Timeout Sec","default":14400}},"type":"object","title":"SessionConfigSchema","description":"Session configuration schema."},"SessionListResponse":{"properties":{"sessions":{"items":{"$ref":"#/components/schemas/SessionResponse"},"type":"array","title":"Sessions"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"}},"type":"object","required":["sessions","total","limit","offset"],"title":"SessionListResponse","description":"List of sessions response."},"SessionReportResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"exam_id":{"type":"string","title":"Exam Id"},"user_id":{"type":"string","title":"User Id"},"status":{"type":"string","title":"Status"},"duration_seconds":{"type":"number","title":"Duration Seconds"},"risk_score":{"type":"number","title":"Risk Score"},"verification_count":{"type":"integer","title":"Verification Count"},"verification_failures":{"type":"integer","title":"Verification Failures"},"verification_success_rate":{"type":"number","title":"Verification Success Rate"},"total_incidents":{"type":"integer","title":"Total Incidents"},"incidents_by_severity":{"additionalProperties":{"type":"integer"},"type":"object","title":"Incidents By Severity"},"critical_incidents":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Critical Incidents"},"timeline":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Timeline"},"summary":{"type":"string","title":"Summary"}},"type":"object","required":["session_id","exam_id","user_id","status","duration_seconds","risk_score","verification_count","verification_failures","verification_success_rate","total_incidents","incidents_by_severity","critical_incidents","timeline","summary"],"title":"SessionReportResponse","description":"Session report response."},"SessionResponse":{"properties":{"id":{"type":"string","title":"Id"},"exam_id":{"type":"string","title":"Exam Id"},"user_id":{"type":"string","title":"User Id"},"tenant_id":{"type":"string","title":"Tenant Id"},"status":{"type":"string","title":"Status"},"risk_score":{"type":"number","title":"Risk Score"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"ended_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ended At"},"verification_count":{"type":"integer","title":"Verification Count"},"verification_failures":{"type":"integer","title":"Verification Failures"},"incident_count":{"type":"integer","title":"Incident Count"},"total_gaze_away_sec":{"type":"number","title":"Total Gaze Away Sec"},"termination_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Termination Reason"},"duration_seconds":{"type":"number","title":"Duration Seconds"},"verification_success_rate":{"type":"number","title":"Verification Success Rate"},"config":{"additionalProperties":true,"type":"object","title":"Config"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"}},"type":"object","required":["id","exam_id","user_id","tenant_id","status","risk_score","created_at","started_at","ended_at","verification_count","verification_failures","incident_count","total_gaze_away_sec","termination_reason","duration_seconds","verification_success_rate","config","metadata"],"title":"SessionResponse","description":"Session details response."},"SimilarityMatrixResponse":{"properties":{"size":{"type":"integer","title":"Size"},"labels":{"items":{"type":"string"},"type":"array","title":"Labels"},"matrix":{"items":{"items":{"type":"number"},"type":"array"},"type":"array","title":"Matrix"},"clusters":{"items":{"$ref":"#/components/schemas/ClusterResponse"},"type":"array","title":"Clusters"},"pairs":{"items":{"$ref":"#/components/schemas/SimilarityPairResponse"},"type":"array","title":"Pairs"},"threshold":{"type":"number","title":"Threshold"},"computation_time_ms":{"type":"integer","title":"Computation Time Ms"}},"type":"object","required":["size","labels","matrix","clusters","pairs","threshold","computation_time_ms"],"title":"SimilarityMatrixResponse","description":"API response model for similarity matrix."},"SimilarityPairResponse":{"properties":{"a":{"type":"string","title":"A"},"b":{"type":"string","title":"B"},"similarity":{"type":"number","title":"Similarity"},"match":{"type":"boolean","title":"Match"}},"type":"object","required":["a","b","similarity","match"],"title":"SimilarityPairResponse","description":"API response model for similarity pair."},"StartSessionRequest":{"properties":{"baseline_image_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Baseline Image Base64"}},"type":"object","title":"StartSessionRequest","description":"Request to start a session."},"StartSessionResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"status":{"type":"string","title":"Status"},"started_at":{"type":"string","title":"Started At"},"has_baseline":{"type":"boolean","title":"Has Baseline"}},"type":"object","required":["session_id","status","started_at","has_baseline"],"title":"StartSessionResponse","description":"Response from starting a session."},"SubmitFrameRequest":{"properties":{"frame_base64":{"type":"string","title":"Frame Base64","description":"Base64 encoded frame image"},"frame_number":{"type":"integer","minimum":0.0,"title":"Frame Number"},"audio_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audio Base64","description":"Base64 encoded audio data"},"audio_sample_rate":{"type":"integer","maximum":48000.0,"minimum":8000.0,"title":"Audio Sample Rate","default":16000}},"type":"object","required":["frame_base64","frame_number"],"title":"SubmitFrameRequest","description":"Request to submit a frame for analysis."},"SubmitFrameResponse":{"properties":{"session_id":{"type":"string","title":"Session Id"},"frame_number":{"type":"integer","title":"Frame Number"},"risk_score":{"type":"number","title":"Risk Score"},"face_detected":{"type":"boolean","title":"Face Detected"},"face_matched":{"type":"boolean","title":"Face Matched"},"incidents_created":{"type":"integer","title":"Incidents Created"},"processing_time_ms":{"type":"number","title":"Processing Time Ms"},"analysis":{"$ref":"#/components/schemas/FrameAnalysisResponse"},"rate_limit":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Rate Limit"},"incidents":{"anyOf":[{"items":{"$ref":"#/components/schemas/IncidentInfoSchema"},"type":"array"},{"type":"null"}],"title":"Incidents"}},"type":"object","required":["session_id","frame_number","risk_score","face_detected","face_matched","incidents_created","processing_time_ms","analysis","rate_limit"],"title":"SubmitFrameResponse","description":"Response from frame submission."},"SystemStats":{"properties":{"total_enrollments":{"type":"integer","title":"Total Enrollments"},"total_verifications":{"type":"integer","title":"Total Verifications"},"total_searches":{"type":"integer","title":"Total Searches"},"active_sessions":{"type":"integer","title":"Active Sessions"},"api_calls_today":{"type":"integer","title":"Api Calls Today"},"api_calls_this_week":{"type":"integer","title":"Api Calls This Week"},"average_response_time_ms":{"type":"number","title":"Average Response Time Ms"},"storage_used_gb":{"type":"number","title":"Storage Used Gb"},"uptime_hours":{"type":"number","title":"Uptime Hours"},"verification_success_rate":{"type":"number","title":"Verification Success Rate"},"spoof_detection_rate":{"type":"number","title":"Spoof Detection Rate"}},"type":"object","required":["total_enrollments","total_verifications","total_searches","active_sessions","api_calls_today","api_calls_this_week","average_response_time_ms","storage_used_gb","uptime_hours","verification_success_rate","spoof_detection_rate"],"title":"SystemStats","description":"System statistics response."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerificationResponse":{"properties":{"verified":{"type":"boolean","title":"Verified","description":"Whether faces match"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence","description":"Confidence score (0.0-1.0)"},"distance":{"type":"number","minimum":0.0,"title":"Distance","description":"Similarity distance"},"threshold":{"type":"number","title":"Threshold","description":"Threshold used for verification"},"message":{"type":"string","title":"Message","description":"Human-readable message"}},"type":"object","required":["verified","confidence","distance","threshold","message"],"title":"VerificationResponse","description":"Face verification response.","example":{"confidence":0.87,"distance":0.13,"message":"Face verified successfully","threshold":0.6,"verified":true}},"WebhookConfigResponse":{"properties":{"webhook_id":{"type":"string","title":"Webhook Id"},"url":{"type":"string","title":"Url"},"events":{"items":{"type":"string"},"type":"array","title":"Events"},"enabled":{"type":"boolean","title":"Enabled"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["webhook_id","url","events","enabled","created_at"],"title":"WebhookConfigResponse","description":"API response model for webhook config."},"WebhookListResponse":{"properties":{"webhooks":{"items":{"$ref":"#/components/schemas/WebhookConfigResponse"},"type":"array","title":"Webhooks"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["webhooks","count"],"title":"WebhookListResponse","description":"Response model for webhook list."},"WebhookRegisterRequest":{"properties":{"url":{"type":"string","title":"Url"},"secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Secret"},"events":{"items":{"type":"string"},"type":"array","title":"Events","default":["enrollment","verification","liveness"]}},"type":"object","required":["url"],"title":"WebhookRegisterRequest","description":"Request model for webhook registration."},"WebhookTestResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code"},"response_time_ms":{"type":"integer","title":"Response Time Ms"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["success","response_time_ms"],"title":"WebhookTestResponse","description":"API response model for webhook test."}}}}