{"openapi":"3.1.0","info":{"title":"AI Platform API","version":"2.0.0"},"paths":{"/health/live":{"get":{"summary":"Live","operationId":"live_health_live_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Live Health Live Get"}}}}}}},"/health/ready":{"get":{"summary":"Ready","operationId":"ready_health_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Ready Health Ready Get"}}}}}}},"/v1/lead-scoring/score":{"post":{"summary":"Score","operationId":"score_v1_lead_scoring_score_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-AI-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Ai-Key"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","format":"uuid","title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScoreResponse"}}}},"401":{"description":"Missing, invalid or revoked app credential","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScoringError"}}}},"413":{"description":"Request body exceeds size limit","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScoringError"}}}},"422":{"description":"Invalid input or AI key, or idempotency key reused with another body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScoringError"}}}},"503":{"description":"Database unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScoringError"}}}}}}},"/v1/admin/login":{"post":{"summary":"Login","operationId":"login_v1_admin_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminLoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/me":{"get":{"summary":"Me","operationId":"me_v1_admin_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/admin/logout":{"post":{"summary":"Logout","operationId":"logout_v1_admin_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/admin/ai-profiles":{"get":{"summary":"List Profiles","operationId":"list_profiles_v1_admin_ai_profiles_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIProfileList"}}}}}},"post":{"summary":"Create Profile","operationId":"create_profile_v1_admin_ai_profiles_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIProfileInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIProfile"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/ai-profiles/{revision}/activate":{"post":{"summary":"Activate Profile","operationId":"activate_profile_v1_admin_ai_profiles__revision__activate_post","parameters":[{"name":"revision","in":"path","required":true,"schema":{"type":"integer","title":"Revision"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AIProfile"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/ai-profiles/try":{"post":{"summary":"Try Profile","operationId":"try_profile_v1_admin_ai_profiles_try_post","parameters":[{"name":"X-AI-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Ai-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TryProfileRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScoreResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/runs":{"get":{"summary":"List Runs","operationId":"list_runs_v1_admin_runs_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunList"}}}}}}},"/v1/admin/runs/{run_id}":{"get":{"summary":"Admin Run","operationId":"admin_run_v1_admin_runs__run_id__get","parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/apps":{"get":{"summary":"List Apps","operationId":"list_apps_v1_admin_apps_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppList"}}}}}}},"/v1/admin/apps/{app_id}":{"delete":{"summary":"Revoke","operationId":"revoke_v1_admin_apps__app_id__delete","parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AIDetail":{"properties":{"summary":{"type":"string","title":"Summary"},"suggested_action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Suggested Action"},"signals":{"items":{"$ref":"#/components/schemas/AISignal"},"type":"array","title":"Signals"}},"additionalProperties":false,"type":"object","required":["summary","suggested_action","signals"],"title":"AIDetail"},"AIProfile":{"properties":{"revision":{"type":"integer","title":"Revision"},"active":{"type":"boolean","title":"Active"},"provider":{"type":"string","enum":["aihub","openai_compatible"],"title":"Provider"},"base_url":{"type":"string","title":"Base Url"},"model":{"type":"string","title":"Model"},"timeout_seconds":{"type":"integer","title":"Timeout Seconds"},"reasoning_effort":{"anyOf":[{"type":"string","enum":["minimal","low","medium","high"]},{"type":"null"}],"title":"Reasoning Effort"},"instructions":{"type":"string","title":"Instructions"},"include_reference_date":{"type":"boolean","title":"Include Reference Date"},"timezone":{"type":"string","title":"Timezone"},"suggested_action_enabled":{"type":"boolean","title":"Suggested Action Enabled"},"created_by":{"type":"string","title":"Created By"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"additionalProperties":false,"type":"object","required":["revision","active","provider","base_url","model","timeout_seconds","reasoning_effort","instructions","include_reference_date","timezone","suggested_action_enabled","created_by","created_at"],"title":"AIProfile"},"AIProfileInput":{"properties":{"provider":{"type":"string","enum":["aihub","openai_compatible"],"title":"Provider"},"base_url":{"type":"string","maxLength":2048,"minLength":1,"title":"Base Url"},"model":{"type":"string","maxLength":128,"minLength":1,"title":"Model"},"timeout_seconds":{"type":"integer","maximum":60.0,"minimum":1.0,"title":"Timeout Seconds","default":50},"reasoning_effort":{"anyOf":[{"type":"string","enum":["minimal","low","medium","high"]},{"type":"null"}],"title":"Reasoning Effort"},"instructions":{"type":"string","maxLength":8000,"minLength":1,"title":"Instructions"},"include_reference_date":{"type":"boolean","title":"Include Reference Date","default":true},"timezone":{"type":"string","maxLength":64,"minLength":1,"title":"Timezone","default":"Asia/Ho_Chi_Minh"},"suggested_action_enabled":{"type":"boolean","title":"Suggested Action Enabled","default":true}},"additionalProperties":false,"type":"object","required":["provider","base_url","model","instructions"],"title":"AIProfileInput"},"AIProfileList":{"properties":{"profiles":{"items":{"$ref":"#/components/schemas/AIProfile"},"type":"array","title":"Profiles"}},"additionalProperties":false,"type":"object","required":["profiles"],"title":"AIProfileList"},"AISignal":{"properties":{"polarity":{"type":"string","enum":["positive","negative"],"title":"Polarity"},"signal":{"type":"string","title":"Signal"},"detail":{"type":"string","title":"Detail"},"source":{"type":"string","title":"Source"}},"additionalProperties":false,"type":"object","required":["polarity","signal","detail","source"],"title":"AISignal"},"AdminLoginRequest":{"properties":{"email":{"type":"string","maxLength":254,"minLength":3,"title":"Email"},"password":{"type":"string","maxLength":1024,"minLength":1,"title":"Password"}},"additionalProperties":false,"type":"object","required":["email","password"],"title":"AdminLoginRequest"},"AppList":{"properties":{"apps":{"items":{"$ref":"#/components/schemas/AppSummary"},"type":"array","title":"Apps"}},"additionalProperties":false,"type":"object","required":["apps"],"title":"AppList"},"AppSummary":{"properties":{"app_id":{"type":"string","title":"App Id"},"active":{"type":"boolean","title":"Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"additionalProperties":false,"type":"object","required":["app_id","active","created_at","updated_at"],"title":"AppSummary"},"BreakdownItem":{"properties":{"rule_id":{"type":"string","title":"Rule Id"},"matched":{"type":"boolean","title":"Matched"},"points":{"type":"integer","title":"Points"}},"additionalProperties":false,"type":"object","required":["rule_id","matched","points"],"title":"BreakdownItem"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LeadScoringSnapshot":{"properties":{"captured_at":{"type":"string","format":"date-time","title":"Captured At"},"lead_profile":{"$ref":"#/components/schemas/SnapshotLeadProfile"},"conversations":{"items":{"$ref":"#/components/schemas/SnapshotConversation"},"type":"array","maxItems":10,"title":"Conversations"}},"additionalProperties":false,"type":"object","required":["captured_at","lead_profile"],"title":"LeadScoringSnapshot","description":"Bounded lead evidence captured by the client at one moment."},"RuleInput":{"properties":{"id":{"type":"string","maxLength":64,"minLength":1,"title":"Id"},"field":{"type":"string","maxLength":128,"minLength":1,"title":"Field"},"operator":{"type":"string","enum":["eq","ne","gt","gte","lt","lte","contains","exists","between","in"],"title":"Operator"},"value":{"title":"Value"},"points":{"type":"integer","maximum":100.0,"minimum":-100.0,"title":"Points"},"description":{"anyOf":[{"type":"string","maxLength":99},{"type":"null"}],"title":"Description","description":"Optional context for AI scoring; does not change rule matching or points."}},"additionalProperties":false,"type":"object","required":["id","field","operator","points"],"title":"RuleInput"},"RunDetail":{"properties":{"run_id":{"type":"string","title":"Run Id"},"app_id":{"type":"string","title":"App Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"profile_revision":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Profile Revision"},"profile_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Profile Model"},"duration_ms":{"type":"integer","title":"Duration Ms"},"request":{"$ref":"#/components/schemas/RunRequest"},"result":{"$ref":"#/components/schemas/ScoreResponse"}},"additionalProperties":false,"type":"object","required":["run_id","app_id","created_at","profile_revision","profile_model","duration_ms","request","result"],"title":"RunDetail","description":"Stored request, result and the profile revision that produced it."},"RunList":{"properties":{"runs":{"items":{"$ref":"#/components/schemas/RunSummary"},"type":"array","title":"Runs"}},"additionalProperties":false,"type":"object","required":["runs"],"title":"RunList"},"RunMetrics":{"properties":{"profile_field_count":{"type":"integer","minimum":0.0,"title":"Profile Field Count","description":"Count of non-null name, phone, email, and status fields."},"conversation_count":{"type":"integer","minimum":0.0,"title":"Conversation Count"},"message_count":{"type":"integer","minimum":0.0,"title":"Message Count"},"contact_message_count":{"type":"integer","minimum":0.0,"title":"Contact Message Count"},"conversation_turn_count":{"type":"integer","minimum":0.0,"title":"Conversation Turn Count","description":"Consecutive sender groups after ordering conversation messages by sent_at."},"contact_started_conversation_count":{"type":"integer","minimum":0.0,"title":"Contact Started Conversation Count","description":"Count of non-empty conversations whose earliest valid sent_at message is from contact; equal message timestamps retain message snapshot order."},"contact_message_recency_days":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Contact Message Recency Days"},"contact_message_recency_hours":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Contact Message Recency Hours","description":"Hours from the newest contact message with a valid sent_at to captured_at, clamped to zero and rounded to two decimal places; null when either timestamp is unavailable."},"customer_initiated_return":{"type":"boolean","title":"Customer Initiated Return","description":"True only when more than one non-empty conversation has a valid message sent_at and at least one conversation after the first starts with a contact message. Conversations are ordered by earliest valid message sent_at, with equal start times retaining original snapshot position. A conversation starts with the sender of its earliest valid message; equal message timestamps retain message snapshot order. Empty conversations are ignored."}},"additionalProperties":false,"type":"object","required":["profile_field_count","conversation_count","message_count","contact_message_count","conversation_turn_count","contact_started_conversation_count","contact_message_recency_hours","customer_initiated_return"],"title":"RunMetrics"},"RunRequest":{"properties":{"snapshot":{"$ref":"#/components/schemas/LeadScoringSnapshot"},"scoring_config":{"$ref":"#/components/schemas/ScoringConfigurationInput"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata","description":"Opaque client data, stored and returned unchanged (at most 10KB)."}},"additionalProperties":false,"type":"object","required":["snapshot","scoring_config"],"title":"RunRequest"},"RunSummary":{"properties":{"run_id":{"type":"string","title":"Run Id"},"app_id":{"type":"string","title":"App Id"},"external_id":{"type":"string","title":"External Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"final_score":{"type":"integer","title":"Final Score"},"rule_score":{"type":"integer","title":"Rule Score"},"ai_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ai Score"},"result_mode":{"type":"string","enum":["rules_only","hybrid","rules_only_fallback"],"title":"Result Mode"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"}},"additionalProperties":false,"type":"object","required":["run_id","app_id","external_id","created_at","final_score","rule_score","ai_score","result_mode","error_code"],"title":"RunSummary"},"ScoreResponse":{"properties":{"run_id":{"type":"string","title":"Run Id"},"final_score":{"type":"integer","title":"Final Score"},"rule_score":{"type":"integer","title":"Rule Score"},"ai_score":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ai Score"},"result_mode":{"type":"string","enum":["rules_only","hybrid","rules_only_fallback"],"title":"Result Mode"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"},"breakdown":{"items":{"$ref":"#/components/schemas/BreakdownItem"},"type":"array","title":"Breakdown"},"ai":{"anyOf":[{"$ref":"#/components/schemas/AIDetail"},{"type":"null"}]},"metrics":{"$ref":"#/components/schemas/RunMetrics"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"}},"additionalProperties":false,"type":"object","required":["run_id","final_score","rule_score","ai_score","result_mode","error_code","breakdown","ai","metrics","metadata"],"title":"ScoreResponse"},"ScoringConfigurationInput":{"properties":{"rules":{"items":{"$ref":"#/components/schemas/RuleInput"},"type":"array","maxItems":100,"title":"Rules"},"rule_weight":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Rule Weight"},"ai_weight":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Ai Weight"}},"additionalProperties":false,"type":"object","required":["rules","rule_weight","ai_weight"],"title":"ScoringConfigurationInput"},"ScoringError":{"properties":{"detail":{"type":"string","title":"Detail"}},"additionalProperties":false,"type":"object","required":["detail"],"title":"ScoringError"},"SnapshotConversation":{"properties":{"conversation_id":{"type":"string","maxLength":255,"minLength":1,"title":"Conversation Id"},"channel":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Channel"},"messages":{"items":{"$ref":"#/components/schemas/SnapshotMessage"},"type":"array","title":"Messages"}},"additionalProperties":false,"type":"object","required":["conversation_id"],"title":"SnapshotConversation"},"SnapshotLeadProfile":{"properties":{"external_id":{"type":"string","maxLength":255,"minLength":1,"title":"External Id"},"name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Name"},"phone":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Phone"},"email":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Email"},"status":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Status"},"custom_fields":{"additionalProperties":true,"type":"object","title":"Custom Fields"}},"additionalProperties":false,"type":"object","required":["external_id"],"title":"SnapshotLeadProfile"},"SnapshotMessage":{"properties":{"message_id":{"type":"string","maxLength":255,"minLength":1,"title":"Message Id"},"sender_type":{"type":"string","enum":["contact","agent","bot"],"title":"Sender Type"},"content":{"type":"string","minLength":1,"title":"Content"},"sent_at":{"type":"string","format":"date-time","title":"Sent At"}},"additionalProperties":false,"type":"object","required":["message_id","sender_type","content","sent_at"],"title":"SnapshotMessage"},"TryProfileRequest":{"properties":{"profile":{"$ref":"#/components/schemas/AIProfileInput"},"request":{"$ref":"#/components/schemas/RunRequest"}},"additionalProperties":false,"type":"object","required":["profile","request"],"title":"TryProfileRequest"},"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"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}