{"openapi":"3.1.0","info":{"title":"spark","version":"0.1.0"},"paths":{"/spark/conversations":{"post":{"tags":["spark"],"summary":"Create Conversation","operationId":"create_conversation_spark_conversations_post","parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}},{"name":"X-Clinic-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Clinic-Id"}},{"name":"X-Break-Glass-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Break-Glass-Token"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationCreate","default":{}}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["spark"],"summary":"List Conversations","operationId":"list_conversations_spark_conversations_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}},{"name":"X-Clinic-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Clinic-Id"}},{"name":"X-Break-Glass-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Break-Glass-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ConversationOut"},"title":"Response List Conversations Spark Conversations Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/spark/conversations/{conversation_id}":{"get":{"tags":["spark"],"summary":"Get Conversation","operationId":"get_conversation_spark_conversations__conversation_id__get","parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}},{"name":"X-Clinic-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Clinic-Id"}},{"name":"X-Break-Glass-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Break-Glass-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationWithMessages"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["spark"],"summary":"Archive Conversation","operationId":"archive_conversation_spark_conversations__conversation_id__delete","parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}},{"name":"X-Clinic-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Clinic-Id"}},{"name":"X-Break-Glass-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Break-Glass-Token"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/spark/conversations/{conversation_id}/messages":{"post":{"tags":["spark"],"summary":"Send Message","operationId":"send_message_spark_conversations__conversation_id__messages_post","parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","title":"Conversation Id"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}},{"name":"X-Clinic-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Clinic-Id"}},{"name":"X-Break-Glass-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Break-Glass-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssistantTurnOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Root","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/status":{"get":{"summary":"Status","operationId":"status_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/readyz":{"get":{"summary":"Readyz","description":"Readiness probe — returns 200 only when the DB is reachable.\n\nCloud Run uses this to gate traffic routing.  A 503 causes the instance\nto be removed from the load balancer without a restart (unlike liveness).","operationId":"readyz_readyz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/authz/break-glass":{"post":{"summary":"Break Glass Endpoint","operationId":"break_glass_endpoint_authz_break_glass_post","parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}},{"name":"X-Clinic-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Clinic-Id"}},{"name":"X-Break-Glass-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Break-Glass-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Payload"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/spark/budget":{"get":{"tags":["spark-budget"],"summary":"Get Budget","operationId":"get_budget_spark_budget_get","parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}},{"name":"X-Clinic-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Clinic-Id"}},{"name":"X-Break-Glass-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Break-Glass-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/spark/budget/override":{"post":{"tags":["spark-budget"],"summary":"Enable Override","operationId":"enable_override_spark_budget_override_post","parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}},{"name":"X-Clinic-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Clinic-Id"}},{"name":"X-Break-Glass-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Break-Glass-Token"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetOverrideRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["spark-budget"],"summary":"Disable Override","operationId":"disable_override_spark_budget_override_delete","parameters":[{"name":"authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}},{"name":"X-Clinic-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Clinic-Id"}},{"name":"X-Break-Glass-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Break-Glass-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BudgetStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/spark/audit/log":{"get":{"tags":["spark-audit"],"summary":"Get Audit Log","operationId":"get_audit_log_spark_audit_log_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"authorization","in":"header","required":true,"schema":{"type":"string","title":"Authorization"}},{"name":"X-Clinic-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Clinic-Id"}},{"name":"X-Break-Glass-Token","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Break-Glass-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AuditLogOut"},"title":"Response Get Audit Log Spark Audit Log Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AssistantTurnOut":{"properties":{"message":{"$ref":"#/components/schemas/MessageOut"},"tool_events":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Tool Events"},"total_cost_cents":{"type":"integer","title":"Total Cost Cents"},"cache_hit":{"type":"boolean","title":"Cache Hit"},"model_used":{"type":"string","title":"Model Used"},"budget_warning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Budget Warning"}},"type":"object","required":["message","tool_events","total_cost_cents","cache_hit","model_used","budget_warning"],"title":"AssistantTurnOut"},"AuditLogOut":{"properties":{"id":{"type":"string","title":"Id"},"conversation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conversation Id"},"clinic_id":{"type":"string","title":"Clinic Id"},"user_id":{"type":"string","title":"User Id"},"action_type":{"type":"string","title":"Action Type"},"action_details":{"title":"Action Details"},"data_accessed":{"anyOf":[{},{"type":"null"}],"title":"Data Accessed"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","conversation_id","clinic_id","user_id","action_type","action_details","data_accessed","created_at"],"title":"AuditLogOut"},"BudgetOverrideRequest":{"properties":{"expires_hours":{"type":"integer","title":"Expires Hours","default":48}},"type":"object","title":"BudgetOverrideRequest"},"BudgetStatus":{"properties":{"clinic_id":{"type":"string","title":"Clinic Id"},"period_month":{"type":"string","title":"Period Month"},"spent_cents":{"type":"integer","title":"Spent Cents"},"cap_cents":{"type":"integer","title":"Cap Cents"},"override_active":{"type":"boolean","title":"Override Active"},"override_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Override Expires At"},"pct_used":{"type":"number","title":"Pct Used"},"status":{"type":"string","title":"Status"}},"type":"object","required":["clinic_id","period_month","spent_cents","cap_cents","override_active","override_expires_at","pct_used","status"],"title":"BudgetStatus"},"ConversationCreate":{"properties":{},"type":"object","title":"ConversationCreate"},"ConversationOut":{"properties":{"id":{"type":"string","title":"Id"},"clinic_id":{"type":"string","title":"Clinic Id"},"user_id":{"type":"string","title":"User Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"status":{"type":"string","title":"Status"},"message_count":{"type":"integer","title":"Message Count"},"total_cost_cents":{"type":"integer","title":"Total Cost Cents"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"last_message_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Message At"}},"type":"object","required":["id","clinic_id","user_id","title","status","message_count","total_cost_cents","created_at","updated_at","last_message_at"],"title":"ConversationOut"},"ConversationWithMessages":{"properties":{"id":{"type":"string","title":"Id"},"clinic_id":{"type":"string","title":"Clinic Id"},"user_id":{"type":"string","title":"User Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"status":{"type":"string","title":"Status"},"message_count":{"type":"integer","title":"Message Count"},"total_cost_cents":{"type":"integer","title":"Total Cost Cents"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"last_message_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Message At"},"messages":{"items":{"$ref":"#/components/schemas/MessageOut"},"type":"array","title":"Messages","default":[]}},"type":"object","required":["id","clinic_id","user_id","title","status","message_count","total_cost_cents","created_at","updated_at","last_message_at"],"title":"ConversationWithMessages"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"MessageCreate":{"properties":{"content":{"type":"string","title":"Content"}},"type":"object","required":["content"],"title":"MessageCreate"},"MessageOut":{"properties":{"id":{"type":"string","title":"Id"},"conversation_id":{"type":"string","title":"Conversation Id"},"role":{"type":"string","title":"Role"},"content":{"type":"string","title":"Content"},"tool_calls":{"anyOf":[{},{"type":"null"}],"title":"Tool Calls"},"tool_call_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Call Id"},"tool_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Name"},"model_used":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Used"},"cache_hit":{"type":"boolean","title":"Cache Hit"},"input_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Input Tokens"},"output_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Output Tokens"},"cost_cents":{"type":"integer","title":"Cost Cents"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","conversation_id","role","content","tool_calls","tool_call_id","tool_name","model_used","cache_hit","input_tokens","output_tokens","cost_cents","created_at"],"title":"MessageOut"},"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"}}}}