{"openapi":"3.1.0","info":{"title":"Sparkient API","description":"Millisecond Decision Intelligence API","version":"1.0.0"},"paths":{"/":{"get":{"tags":["system"],"summary":"Root","description":"API info — public landing page for the service.","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"tags":["system"],"summary":"Health","description":"Liveness probe — always returns OK if the process is running.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Health Health Get"}}}}}}},"/ready":{"get":{"tags":["system"],"summary":"Readiness","description":"Readiness probe — checks DB, Redis, and model availability.","operationId":"readiness_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"boolean"}]},"type":"object","title":"Response Readiness Ready Get"}}}}}}},"/api/v1/auth/me":{"get":{"tags":["auth"],"summary":"Get Me","description":"Return the currently authenticated user and their organization.","operationId":"get_me_api_v1_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthMeResponse"}}}}}},"put":{"tags":["auth"],"summary":"Update Me","description":"Update the current user's name.","operationId":"update_me_api_v1_auth_me_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateUserRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthMeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/org":{"put":{"tags":["auth"],"summary":"Update Org","description":"Update the organization name (owner only).","operationId":"update_org_api_v1_auth_org_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateOrgRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/api-keys":{"get":{"tags":["api-keys"],"summary":"List Api Keys","description":"List all API keys for the authenticated organization.","operationId":"list_api_keys_api_v1_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ApiKeyResponse"},"type":"array","title":"Response List Api Keys Api V1 Api Keys Get"}}}}}},"post":{"tags":["api-keys"],"summary":"Create New Api Key","description":"Create a new API key for the authenticated organization.\n\nThe raw key is only returned once — store it securely.","operationId":"create_new_api_key_api_v1_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiKeyCreatedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/api-keys/{key_id}":{"delete":{"tags":["api-keys"],"summary":"Delete Api Key","description":"Soft-delete an API key (set is_active=False). Owner only.","operationId":"delete_api_key_api_v1_api_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Key Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/decision-types":{"post":{"tags":["decision-types"],"summary":"Create Decision Type","description":"Create a new decision type with its first version.","operationId":"create_decision_type_api_v1_decision_types_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DecisionTypeCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DecisionTypeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["decision-types"],"summary":"List Decision Types","description":"List all decision types with pagination.","operationId":"list_decision_types_api_v1_decision_types_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Decision Types Api V1 Decision Types Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/decision-types/{decision_type_id}":{"get":{"tags":["decision-types"],"summary":"Get Decision Type","description":"Get a decision type by ID with its active version.","operationId":"get_decision_type_api_v1_decision_types__decision_type_id__get","parameters":[{"name":"decision_type_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Decision Type Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DecisionTypeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["decision-types"],"summary":"Update Decision Type","description":"Update a decision type.\n\nOnly creates a new immutable version when logic fields change\n(options, reason_codes, hard_rules, input_schema,\nconfidence_thresholds, escalation_policy).  Metadata-only changes\n(name, description, pii_fields, retention_days) update the\nDecisionType row without bumping the version.","operationId":"update_decision_type_api_v1_decision_types__decision_type_id__put","parameters":[{"name":"decision_type_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Decision Type Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DecisionTypeUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DecisionTypeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["decision-types"],"summary":"Delete Decision Type","description":"Soft-delete a decision type.\n\nSets ``deleted_at`` so the row is excluded from all queries.\nAssociated data (versions, examples, policies, logs) is preserved\nfor audit purposes.","operationId":"delete_decision_type_api_v1_decision_types__decision_type_id__delete","parameters":[{"name":"decision_type_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Decision Type Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/decision-types/{decision_type_id}/versions":{"get":{"tags":["decision-types"],"summary":"List Versions","description":"List all versions for a decision type.","operationId":"list_versions_api_v1_decision_types__decision_type_id__versions_get","parameters":[{"name":"decision_type_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Decision Type Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DecisionTypeVersionResponse"},"title":"Response List Versions Api V1 Decision Types  Decision Type Id  Versions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/decision-types/{decision_type_id}/versions/{version_id}":{"get":{"tags":["decision-types"],"summary":"Get Version","description":"Get a specific version of a decision type.","operationId":"get_version_api_v1_decision_types__decision_type_id__versions__version_id__get","parameters":[{"name":"decision_type_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Decision Type Id"}},{"name":"version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Version Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DecisionTypeVersionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/decide":{"post":{"tags":["decisions"],"summary":"Decide","description":"Make a single decision.","operationId":"decide_api_v1_decide_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DecisionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DecisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/decide/batch":{"post":{"tags":["decisions"],"summary":"Decide Batch","description":"Make multiple decisions in parallel (max 50).","operationId":"decide_batch_api_v1_decide_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchDecisionRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchDecisionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/decision-types/{decision_type_id}/examples":{"post":{"tags":["examples"],"summary":"Upload Examples","description":"Upload user-provided training examples.","operationId":"upload_examples_api_v1_decision_types__decision_type_id__examples_post","parameters":[{"name":"decision_type_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Decision Type Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExampleBulkCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExampleResponse"},"title":"Response Upload Examples Api V1 Decision Types  Decision Type Id  Examples Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["examples"],"summary":"List Examples","description":"List training examples with filtering and pagination.","operationId":"list_examples_api_v1_decision_types__decision_type_id__examples_get","parameters":[{"name":"decision_type_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Decision Type Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by source: user, synthetic","title":"Source"},"description":"Filter by source: user, synthetic"},{"name":"reviewed","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by reviewed status","title":"Reviewed"},"description":"Filter by reviewed status"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Examples Api V1 Decision Types  Decision Type Id  Examples Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/decision-types/{decision_type_id}/examples/generate":{"post":{"tags":["examples"],"summary":"Generate Examples","description":"Generate synthetic training examples using the teacher model.","operationId":"generate_examples_api_v1_decision_types__decision_type_id__examples_generate_post","parameters":[{"name":"decision_type_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Decision Type Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateExamplesRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ExampleResponse"},"title":"Response Generate Examples Api V1 Decision Types  Decision Type Id  Examples Generate Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/decision-types/{decision_type_id}/examples/{example_id}":{"delete":{"tags":["examples"],"summary":"Delete Example","description":"Delete a single training example.","operationId":"delete_example_api_v1_decision_types__decision_type_id__examples__example_id__delete","parameters":[{"name":"decision_type_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Decision Type Id"}},{"name":"example_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Example Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/decision-types/{decision_type_id}/train":{"post":{"tags":["training"],"summary":"Trigger Training","description":"Trigger model training for a decision type.\n\nRequires at least 50 total examples and 10 per decision option.\n\nIn production, launches a Cloud Run Job and returns 202 Accepted.\nIn local mode, trains inline and returns 201 with results.","operationId":"trigger_training_api_v1_decision_types__decision_type_id__train_post","parameters":[{"name":"decision_type_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Decision Type Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"title":"Response Trigger Training Api V1 Decision Types  Decision Type Id  Train Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/decision-types/{decision_type_id}/policies":{"get":{"tags":["training"],"summary":"List Policies","description":"List all policies for a decision type.","operationId":"list_policies_api_v1_decision_types__decision_type_id__policies_get","parameters":[{"name":"decision_type_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Decision Type Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","additionalProperties":true},"title":"Response List Policies Api V1 Decision Types  Decision Type Id  Policies Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/decision-types/{decision_type_id}/policies/{policy_id}":{"get":{"tags":["training"],"summary":"Get Policy","description":"Get a specific policy with full metrics.","operationId":"get_policy_api_v1_decision_types__decision_type_id__policies__policy_id__get","parameters":[{"name":"decision_type_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Decision Type Id"}},{"name":"policy_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Policy Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Policy Api V1 Decision Types  Decision Type Id  Policies  Policy Id  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/decision-types/{decision_type_id}/policies/{policy_id}/deploy":{"post":{"tags":["training"],"summary":"Deploy Policy","description":"Deploy a policy (set as active, deactivate others).\n\nSets deployed=True on this policy and deployed=False on all other\npolicies for the same decision type.  Invalidates the cache.","operationId":"deploy_policy_api_v1_decision_types__decision_type_id__policies__policy_id__deploy_post","parameters":[{"name":"decision_type_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Decision Type Id"}},{"name":"policy_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Policy Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Deploy Policy Api V1 Decision Types  Decision Type Id  Policies  Policy Id  Deploy Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/decision-types/{decision_type_id}/logs":{"get":{"tags":["logs"],"summary":"Query Logs","description":"Query decision logs with filtering and pagination.","operationId":"query_logs_api_v1_decision_types__decision_type_id__logs_get","parameters":[{"name":"decision_type_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Decision Type Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}},{"name":"decision","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by decision value","title":"Decision"},"description":"Filter by decision value"},{"name":"escalated","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter by escalation status","title":"Escalated"},"description":"Filter by escalation status"},{"name":"min_confidence","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"description":"Minimum confidence","title":"Min Confidence"},"description":"Minimum confidence"},{"name":"max_confidence","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"description":"Maximum confidence","title":"Max Confidence"},"description":"Maximum confidence"},{"name":"start_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter logs after this time (ISO 8601)","title":"Start Time"},"description":"Filter logs after this time (ISO 8601)"},{"name":"end_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Filter logs before this time (ISO 8601)","title":"End Time"},"description":"Filter logs before this time (ISO 8601)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Query Logs Api V1 Decision Types  Decision Type Id  Logs Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/decision-types/{decision_type_id}/metrics":{"get":{"tags":["logs"],"summary":"Get Metrics","description":"Get aggregated metrics for the last 24 hours.\n\nReturns total_decisions, avg_confidence, avg_latency_ms,\nescalation_rate, and decision_distribution.","operationId":"get_metrics_api_v1_decision_types__decision_type_id__metrics_get","parameters":[{"name":"decision_type_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Decision Type Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Metrics Api V1 Decision Types  Decision Type Id  Metrics Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/decision-types/{decision_type_id}/export":{"get":{"tags":["export"],"summary":"Export Edge Bundle","description":"Export the active policy as a standalone edge bundle (ZIP).\n\nReturns a ZIP file containing the ONNX model, feature config,\nCEL rules, and metadata.  The bundle can be loaded with\n``EdgePredictor.from_bundle()`` for offline inference.","operationId":"export_edge_bundle_api_v1_decision_types__decision_type_id__export_get","parameters":[{"name":"decision_type_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Decision Type Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/metrics":{"get":{"tags":["metrics"],"summary":"Get Org Metrics","description":"Org-level aggregate metrics for the last 24 hours.\n\nReturns total_decisions, avg_latency_ms, active_types,\nsuccess_rate, decision_distribution, and recent_decisions.","operationId":"get_org_metrics_api_v1_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Get Org Metrics Api V1 Metrics Get"}}}}}}}},"components":{"schemas":{"ApiKeyCreatedResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"rate_limit":{"type":"integer","title":"Rate Limit"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"raw_key":{"type":"string","title":"Raw Key"}},"type":"object","required":["id","name","key_prefix","rate_limit","is_active","created_at","raw_key"],"title":"ApiKeyCreatedResponse","description":"Response shown only once on API key creation — includes the raw key."},"ApiKeyResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"rate_limit":{"type":"integer","title":"Rate Limit"},"is_active":{"type":"boolean","title":"Is Active"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"}},"type":"object","required":["id","name","key_prefix","rate_limit","is_active","created_at"],"title":"ApiKeyResponse","description":"Public representation of an API key (without the raw key)."},"AuthMeResponse":{"properties":{"user":{"$ref":"#/components/schemas/UserResponse"}},"type":"object","required":["user"],"title":"AuthMeResponse","description":"Response for GET /api/v1/auth/me."},"BatchDecisionRequest":{"properties":{"decisions":{"items":{"$ref":"#/components/schemas/DecisionRequest"},"type":"array","maxItems":50,"minItems":1,"title":"Decisions","description":"List of decision requests to evaluate"}},"type":"object","required":["decisions"],"title":"BatchDecisionRequest","description":"Batch of decision requests (max 50)."},"BatchDecisionResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/DecisionResponse"},"type":"array","title":"Results"}},"type":"object","required":["results"],"title":"BatchDecisionResponse","description":"Batch of decision responses."},"ConfidenceThresholds":{"properties":{"per_option":{"additionalProperties":{"type":"number"},"type":"object","title":"Per Option","description":"Minimum confidence required per decision option"},"escalate_below":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Escalate Below","description":"Escalate if best confidence falls below this value","default":0.7}},"type":"object","title":"ConfidenceThresholds","description":"Per-option confidence thresholds and escalation floor."},"CreateApiKeyRequest":{"properties":{"name":{"type":"string","maxLength":128,"title":"Name"}},"type":"object","required":["name"],"title":"CreateApiKeyRequest","description":"Request body for creating a new API key."},"DecisionRequest":{"properties":{"decision_type":{"type":"string","title":"Decision Type","description":"Name of the decision type to evaluate"},"input":{"additionalProperties":true,"type":"object","title":"Input","description":"Arbitrary input payload matching the decision type's schema"},"latency_budget_ms":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Latency Budget Ms","description":"Optional latency budget in milliseconds"}},"type":"object","required":["decision_type","input"],"title":"DecisionRequest","description":"Single decision request payload."},"DecisionResponse":{"properties":{"decision":{"type":"string","title":"Decision","description":"The chosen decision option"},"confidence":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Confidence","description":"Model confidence"},"reason_codes":{"items":{"type":"string"},"type":"array","title":"Reason Codes","description":"Reason codes explaining the decision"},"escalate":{"type":"boolean","title":"Escalate","description":"Whether the decision should be escalated to a human","default":false},"fallback_used":{"type":"boolean","title":"Fallback Used","description":"Whether a fallback strategy was used","default":false},"rules_triggered":{"items":{"type":"string"},"type":"array","title":"Rules Triggered","description":"Names of hard rules that fired"},"latency_ms":{"type":"number","title":"Latency Ms","description":"End-to-end latency in milliseconds"},"policy_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Policy Version","description":"Version identifier of the policy used"},"class_probabilities":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Class Probabilities","description":"Per-class probability scores from the ML classifier"},"explanation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Explanation","description":"Human-readable explanation of the decision"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id","description":"Unique identifier for this decision request"},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage","description":"Pipeline stage that produced the decision (rules, classifier, escalation, fallback)"}},"type":"object","required":["decision","confidence","latency_ms"],"title":"DecisionResponse","description":"Single decision response payload."},"DecisionTypeCreate":{"properties":{"name":{"type":"string","maxLength":256,"minLength":1,"title":"Name"},"description":{"type":"string","title":"Description","default":""},"options":{"items":{"type":"string"},"type":"array","maxItems":50,"minItems":2,"title":"Options","description":"At least two decision options"},"reason_codes":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"Reason Codes"},"rules":{"items":{"$ref":"#/components/schemas/RuleDefinition"},"type":"array","title":"Rules"},"confidence_thresholds":{"anyOf":[{"$ref":"#/components/schemas/ConfidenceThresholds"},{"type":"null"}]},"input_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Input Schema","description":"Optional JSON Schema describing expected input shape"},"escalation_policy":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Escalation Policy"},"pii_fields":{"items":{"type":"string"},"type":"array","title":"Pii Fields","default":[]},"retention_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retention Days"}},"type":"object","required":["name","options"],"title":"DecisionTypeCreate","description":"Payload for creating a new decision type."},"DecisionTypeResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"active_version":{"anyOf":[{"$ref":"#/components/schemas/DecisionTypeVersionResponse"},{"type":"null"}]},"pii_fields":{"items":{"type":"string"},"type":"array","title":"Pii Fields","default":[]},"retention_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retention Days"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","description","created_at","updated_at"],"title":"DecisionTypeResponse","description":"Serialised representation of a DecisionType with its active version."},"DecisionTypeUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":256,"minLength":1},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"options":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":50,"minItems":2},{"type":"null"}],"title":"Options"},"reason_codes":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":50},{"type":"null"}],"title":"Reason Codes"},"rules":{"anyOf":[{"items":{"$ref":"#/components/schemas/RuleDefinition"},"type":"array"},{"type":"null"}],"title":"Rules"},"confidence_thresholds":{"anyOf":[{"$ref":"#/components/schemas/ConfidenceThresholds"},{"type":"null"}]},"input_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Input Schema"},"escalation_policy":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Escalation Policy"},"pii_fields":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Pii Fields"},"retention_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retention Days"}},"type":"object","title":"DecisionTypeUpdate","description":"Payload for updating a decision type (all fields optional)."},"DecisionTypeVersionResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"version_number":{"type":"integer","title":"Version Number"},"options":{"items":{"type":"string"},"type":"array","title":"Options"},"reason_codes":{"items":{"type":"string"},"type":"array","title":"Reason Codes"},"hard_rules":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Hard Rules"},"input_schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Input Schema"},"confidence_thresholds":{"additionalProperties":true,"type":"object","title":"Confidence Thresholds"},"escalation_policy":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Escalation Policy"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","version_number","options","reason_codes","hard_rules","confidence_thresholds","created_at"],"title":"DecisionTypeVersionResponse","description":"Serialised representation of a DecisionTypeVersion."},"ExampleBulkCreate":{"properties":{"examples":{"items":{"$ref":"#/components/schemas/ExampleCreate"},"type":"array","maxItems":500,"minItems":1,"title":"Examples","description":"List of examples to create"}},"type":"object","required":["examples"],"title":"ExampleBulkCreate","description":"Payload for bulk-creating training examples."},"ExampleCreate":{"properties":{"input_payload":{"additionalProperties":true,"type":"object","title":"Input Payload","description":"The input that was evaluated"},"expected_decision":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Expected Decision","description":"The expected/labelled decision"},"confidence":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Confidence","description":"Confidence of the label"},"reason_codes":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":50},{"type":"null"}],"title":"Reason Codes","description":"Reason codes associated with the example"}},"type":"object","required":["input_payload"],"title":"ExampleCreate","description":"Payload for creating a single training example."},"ExampleResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"input_payload":{"additionalProperties":true,"type":"object","title":"Input Payload"},"expected_decision":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Decision"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"reason_codes":{"items":{"type":"string"},"type":"array","title":"Reason Codes"},"source":{"type":"string","title":"Source"},"reviewed":{"type":"boolean","title":"Reviewed"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","input_payload","reason_codes","source","reviewed","created_at"],"title":"ExampleResponse","description":"Serialised representation of a DecisionExample."},"GenerateExamplesRequest":{"properties":{"count":{"type":"integer","maximum":500.0,"minimum":10.0,"title":"Count","description":"Number of synthetic examples to generate (max 500)","default":50}},"type":"object","title":"GenerateExamplesRequest","description":"Request to generate synthetic training examples via LLM."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"OrgResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"}},"type":"object","required":["id","name","slug"],"title":"OrgResponse","description":"Public representation of an organization."},"RuleDefinition":{"properties":{"name":{"type":"string","title":"Name","description":"Unique rule name"},"condition":{"type":"string","title":"Condition","description":"CEL expression evaluated against input"},"then":{"type":"string","title":"Then","description":"Decision to force when condition is true"},"reason_code":{"type":"string","title":"Reason Code","description":"Reason code attached when rule fires"},"priority":{"type":"integer","minimum":0.0,"title":"Priority","description":"Lower number = higher priority","default":10}},"type":"object","required":["name","condition","then","reason_code"],"title":"RuleDefinition","description":"A single hard rule expressed as a CEL condition."},"UpdateOrgRequest":{"properties":{"name":{"type":"string","maxLength":256,"title":"Name"}},"type":"object","required":["name"],"title":"UpdateOrgRequest","description":"Request body for updating organization name."},"UpdateUserRequest":{"properties":{"name":{"type":"string","maxLength":256,"title":"Name"}},"type":"object","required":["name"],"title":"UpdateUserRequest","description":"Request body for updating user profile."},"UserResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"name":{"type":"string","title":"Name"},"role":{"type":"string","title":"Role"},"org":{"$ref":"#/components/schemas/OrgResponse"}},"type":"object","required":["id","email","name","role","org"],"title":"UserResponse","description":"Public representation of a user."},"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"}}}}