{"openapi":"3.1.0","info":{"title":"Compresr Platform API","version":"1.0.0"},"paths":{"/api/profile/create":{"post":{"tags":["Profile"],"summary":"Create Profile","description":"Create user profile after signup/OAuth.\n\nAccepts optional body: {\"account_type\": \"user\" | \"enterprise\"}\nOnce set, account_type cannot be changed (protected by DB trigger).","operationId":"create_profile_api_profile_create_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/profile/role":{"get":{"tags":["Profile"],"summary":"Get Role","description":"Return the caller's role and account type.","operationId":"get_role_api_profile_role_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/profile/me":{"get":{"tags":["Profile"],"summary":"Get Profile","description":"Get user profile.","operationId":"get_profile_api_profile_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]},"patch":{"tags":["Profile"],"summary":"Update Profile","description":"Update user profile.","operationId":"update_profile_api_profile_me_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileUpdateResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/profile/rate-limits":{"get":{"tags":["Profile"],"summary":"Get User Rate Limits","description":"Get rate limits for authenticated user based on their tier.","operationId":"get_user_rate_limits_api_profile_rate_limits_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RateLimitsResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/profile/can-delete":{"get":{"tags":["Profile"],"summary":"Check Can Delete","description":"Check if account can be deleted.","operationId":"check_can_delete_api_profile_can_delete_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccountResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/profile/delete":{"delete":{"tags":["Profile"],"summary":"Delete Account","description":"Delete account (requires confirmation='DELETE').","operationId":"delete_account_api_profile_delete_delete","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteAccountRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/compress/question-agnostic/":{"post":{"tags":["Compression"],"summary":"Compress Query Agnostic","description":"Compress single context without requiring a question.\n\nFor multiple contexts, use the /batch endpoint.","operationId":"compress_query_agnostic_api_compress_question_agnostic__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgnosticCompressionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgnosticCompressionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/compress/question-agnostic/batch":{"post":{"tags":["Compression"],"summary":"Compress Query Agnostic Batch","description":"Batch compress multiple contexts without questions.","operationId":"compress_query_agnostic_batch_api_compress_question_agnostic_batch_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgnosticCompressionBatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgnosticCompressionBatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/compress/question-agnostic/stream":{"post":{"tags":["Compression"],"summary":"Compress Query Agnostic Stream","description":"Stream question-agnostic compression result over SSE.","operationId":"compress_query_agnostic_stream_api_compress_question_agnostic_stream_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgnosticCompressionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/compress/question-agnostic/health":{"get":{"tags":["Compression"],"summary":"Health Query Agnostic","description":"Health check for question-agnostic compression.","operationId":"health_query_agnostic_api_compress_question_agnostic_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/api/compress/question-agnostic/models":{"get":{"tags":["Compression"],"summary":"Models Query Agnostic","description":"List available question-agnostic compression models.","operationId":"models_query_agnostic_api_compress_question_agnostic_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoDataResponse"}}}}}}},"/api/compress/question-agnostic/models/{model_id}":{"get":{"tags":["Compression"],"summary":"Model Query Agnostic","description":"Get details for a specific question-agnostic compression model.","operationId":"model_query_agnostic_api_compress_question_agnostic_models__model_id__get","parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"string","title":"Model Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoDataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/compress/question-specific/":{"post":{"tags":["Compression"],"summary":"Compress Query Specific","description":"Compress single context with question-aware filtering.\n\nFor multiple context+query pairs, use the /batch endpoint.","operationId":"compress_query_specific_api_compress_question_specific__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuerySpecificCompressionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuerySpecificCompressionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/compress/question-specific/batch":{"post":{"tags":["Compression"],"summary":"Compress Query Specific Batch","description":"Batch compress multiple contexts with queries.","operationId":"compress_query_specific_batch_api_compress_question_specific_batch_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuerySpecificCompressionBatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuerySpecificCompressionBatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/compress/question-specific/stream":{"post":{"tags":["Compression"],"summary":"Compress Query Specific Stream","description":"Stream question-specific compression result over SSE.","operationId":"compress_query_specific_stream_api_compress_question_specific_stream_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuerySpecificCompressionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/compress/question-specific/health":{"get":{"tags":["Compression"],"summary":"Health Query Specific","description":"Health check for question-specific compression.","operationId":"health_query_specific_api_compress_question_specific_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/api/compress/question-specific/models":{"get":{"tags":["Compression"],"summary":"Models Query Specific","description":"List available question-specific compression models.","operationId":"models_query_specific_api_compress_question_specific_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoDataResponse"}}}}}}},"/api/compress/question-specific/models/{model_id}":{"get":{"tags":["Compression"],"summary":"Model Query Specific","description":"Get details for a specific question-specific compression model.","operationId":"model_query_specific_api_compress_question_specific_models__model_id__get","parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"string","title":"Model Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoDataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/compress/markdown/":{"post":{"tags":["Compression"],"summary":"Compress Markdown","description":"Compress single markdown context.\n\nFor multiple contexts, use the /batch endpoint.","operationId":"compress_markdown_api_compress_markdown__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgnosticCompressionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgnosticCompressionResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/compress/markdown/batch":{"post":{"tags":["Compression"],"summary":"Compress Markdown Batch","description":"Batch compress multiple markdown contexts.","operationId":"compress_markdown_batch_api_compress_markdown_batch_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgnosticCompressionBatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgnosticCompressionBatchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/compress/markdown/stream":{"post":{"tags":["Compression"],"summary":"Compress Markdown Stream","description":"Stream compressed markdown result over SSE.","operationId":"compress_markdown_stream_api_compress_markdown_stream_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AgnosticCompressionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/compress/markdown/health":{"get":{"tags":["Compression"],"summary":"Health Markdown","description":"Health check for markdown compression.","operationId":"health_markdown_api_compress_markdown_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/api/compress/markdown/models":{"get":{"tags":["Compression"],"summary":"Models Markdown","description":"List available markdown compression models.","operationId":"models_markdown_api_compress_markdown_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoDataResponse"}}}}}}},"/api/compress/markdown/models/{model_id}":{"get":{"tags":["Compression"],"summary":"Model Markdown","description":"Get details for a specific markdown compression model.","operationId":"model_markdown_api_compress_markdown_models__model_id__get","parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"string","title":"Model Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoDataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/compress/history/":{"post":{"tags":["Compression-Agentic"],"summary":"Compress History","operationId":"compress_history_api_compress_history__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryCompressRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryCompressResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/compress/history/batch":{"post":{"tags":["Compression-Agentic"],"summary":"Compress History Batch","operationId":"compress_history_batch_api_compress_history_batch_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryBatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/compress/history/stream":{"post":{"tags":["Compression-Agentic"],"summary":"Compress History Stream","operationId":"compress_history_stream_api_compress_history_stream_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HistoryCompressRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/compress/history/health":{"get":{"tags":["Compression-Agentic"],"summary":"Health History","operationId":"health_history_api_compress_history_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health History Api Compress History Health Get"}}}}}}},"/api/compress/history/models":{"get":{"tags":["Compression-Agentic"],"summary":"Models History","operationId":"models_history_api_compress_history_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoDataResponse"}}}}}}},"/api/compress/history/models/{model_id}":{"get":{"tags":["Compression-Agentic"],"summary":"Model History","operationId":"model_history_api_compress_history_models__model_id__get","parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"string","title":"Model Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoDataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/compress/tool-output/":{"post":{"tags":["Compression-Agentic"],"summary":"Compress Tool Output","operationId":"compress_tool_output_api_compress_tool_output__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolOutputCompressRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolOutputCompressResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/compress/tool-output/batch":{"post":{"tags":["Compression-Agentic"],"summary":"Compress Tool Output Batch","operationId":"compress_tool_output_batch_api_compress_tool_output_batch_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolOutputBatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/compress/tool-output/stream":{"post":{"tags":["Compression-Agentic"],"summary":"Compress Tool Output Stream","operationId":"compress_tool_output_stream_api_compress_tool_output_stream_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolOutputCompressRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/compress/tool-output/health":{"get":{"tags":["Compression-Agentic"],"summary":"Health Tool Output","operationId":"health_tool_output_api_compress_tool_output_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Tool Output Api Compress Tool Output Health Get"}}}}}}},"/api/compress/tool-output/models":{"get":{"tags":["Compression-Agentic"],"summary":"Models Tool Output","operationId":"models_tool_output_api_compress_tool_output_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoDataResponse"}}}}}}},"/api/compress/tool-output/models/{model_id}":{"get":{"tags":["Compression-Agentic"],"summary":"Model Tool Output","operationId":"model_tool_output_api_compress_tool_output_models__model_id__get","parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"string","title":"Model Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoDataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/compress/tool-discovery/":{"post":{"tags":["Compression-Agentic"],"summary":"Compress Tool Discovery","operationId":"compress_tool_discovery_api_compress_tool_discovery__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolDiscoveryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolDiscoveryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/compress/tool-discovery/batch":{"post":{"tags":["Compression-Agentic"],"summary":"Compress Tool Discovery Batch","operationId":"compress_tool_discovery_batch_api_compress_tool_discovery_batch_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolDiscoveryBatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/compress/tool-discovery/stream":{"post":{"tags":["Compression-Agentic"],"summary":"Compress Tool Discovery Stream","operationId":"compress_tool_discovery_stream_api_compress_tool_discovery_stream_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolDiscoveryRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/compress/tool-discovery/health":{"get":{"tags":["Compression-Agentic"],"summary":"Health Tool Discovery","operationId":"health_tool_discovery_api_compress_tool_discovery_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Tool Discovery Api Compress Tool Discovery Health Get"}}}}}}},"/api/compress/tool-discovery/models":{"get":{"tags":["Compression-Agentic"],"summary":"Models Tool Discovery","operationId":"models_tool_discovery_api_compress_tool_discovery_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoDataResponse"}}}}}}},"/api/compress/tool-discovery/models/{model_id}":{"get":{"tags":["Compression-Agentic"],"summary":"Model Tool Discovery","operationId":"model_tool_discovery_api_compress_tool_discovery_models__model_id__get","parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"string","title":"Model Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoDataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/demo/stream":{"get":{"tags":["Compression-Demo"],"summary":"Demo Stream","description":"Stream a demo compression result over SSE (GET - small payloads). Requires login.","operationId":"demo_stream_api_demo_stream_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"context","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Context"}},{"name":"compression_model_name","in":"query","required":false,"schema":{"type":"string","default":"espresso_v1","title":"Compression Model Name"}},{"name":"question","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question"}},{"name":"target_ratio","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Target Ratio"}},{"name":"coarse","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Coarse"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Compression-Demo"],"summary":"Demo Stream Post","description":"Stream a demo compression result over SSE (POST - large payloads). Requires login.","operationId":"demo_stream_post_api_demo_stream_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoStreamRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/demo/test-output":{"post":{"tags":["Compression-Demo"],"summary":"Demo Test Output","description":"Stream an LLM answer using the compressed context (SSE). Requires login.","operationId":"demo_test_output_api_demo_test_output_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoTestOutputRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/demo/samples":{"get":{"tags":["Compression-Demo"],"summary":"Demo Samples","description":"Get sample texts and available demo models.","operationId":"demo_samples_api_demo_samples_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoDataResponse"}}}}}}},"/api/demo/health":{"get":{"tags":["Compression-Demo"],"summary":"Demo Health","description":"Health check for demo compression.","operationId":"demo_health_api_demo_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Demo Health Api Demo Health Get"}}}}}}},"/api/demo/models":{"get":{"tags":["Compression-Demo"],"summary":"Demo Models","description":"List available demo compression models.","operationId":"demo_models_api_demo_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoDataResponse"}}}}}}},"/api/compress/models":{"get":{"tags":["Compression-Models"],"summary":"List Compression Models","description":"List all available compression models, optionally filtered by type.","operationId":"list_compression_models_api_compress_models_get","parameters":[{"name":"model_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoDataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/compress/models/{model_id}":{"get":{"tags":["Compression-Models"],"summary":"Get Compression Model","description":"Get details for a specific compression model.","operationId":"get_compression_model_api_compress_models__model_id__get","parameters":[{"name":"model_id","in":"path","required":true,"schema":{"type":"string","title":"Model Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DemoDataResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/api-keys":{"get":{"tags":["API Keys"],"summary":"List Api Keys","description":"Get all API keys for current user (excludes demo-scoped keys).","operationId":"list_api_keys_api_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyListResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]},{"HTTPBearer":[]}]},"post":{"tags":["API Keys"],"summary":"Create Api Key","description":"Create a new API key.\n\n- **name**: Display name for the key\n- **scope**: API key scope (user or enterprise; demo is admin-only)\n- **daily_limit**: Optional daily request limit (NULL = unlimited)\n- **expires_at**: Optional expiration date (NULL = 30 days from now)\n\n**Enterprise keys (scope=enterprise):**\n- Require admin approval before activation\n- Use postpaid billing (monthly invoicing)\n- Require company_name and request_message\n- Get Business subscription access + unlimited rate limits\n\n**Important**: The plain key is only shown once! Store it securely.","operationId":"create_api_key_api_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyCreateRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyCreatedResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]},{"HTTPBearer":[]}]}},"/api/api-keys/demo-key-info":{"get":{"tags":["API Keys"],"summary":"Get Demo Key Info","description":"Get demo key information (remaining requests, etc.) without exposing the key.","operationId":"get_demo_key_info_api_api_keys_demo_key_info_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]},{"HTTPBearer":[]}]}},"/api/api-keys/{key_id}/revoke":{"put":{"tags":["API Keys"],"summary":"Revoke Api Key","description":"Revoke an API key (soft delete).\n\n- **key_id**: Key UUID to revoke","operationId":"revoke_api_key_api_api_keys__key_id__revoke_put","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Bad Request"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/api-keys/{key_id}":{"get":{"tags":["API Keys"],"summary":"Get Api Key","description":"Get a specific API key's details.\n\n- **key_id**: Key UUID","operationId":"get_api_key_api_api_keys__key_id__get","security":[{"HTTPBearer":[]},{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/APIKeyResponse"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/create-checkout-session":{"post":{"tags":["Billing"],"summary":"Create Checkout Session","description":"Create Stripe Checkout session for adding funds.\n\nReturns a URL to redirect user to Stripe's hosted payment page.\nAfter payment succeeds, Stripe webhook updates the balance.\n\nArgs:\n    request: Amount in USD ($1 min, $10,000 max)\n\nReturns:\n    url: Stripe Checkout URL to redirect user to\n    session_id: Stripe session ID for reference","operationId":"create_checkout_session_api_billing_create_checkout_session_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutSessionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutSessionResponse"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Bad Request"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/upload":{"post":{"tags":["Billing"],"summary":"Upload Money","description":"[ADMIN ONLY] Manually credit a user account.\n\nSEC-004: This endpoint is restricted to admins only. Normal users credit\ntheir balance via the Stripe checkout flow, which is verified by webhook.","operationId":"upload_money_api_billing_upload_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoneyUploadRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoneyUploadResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/billing/transactions":{"get":{"tags":["Billing"],"summary":"Get Transactions","description":"Get transaction history with optional filters.\n\nQuery params:\n    - limit: Max results (default 50)\n    - start_date: Filter from date (ISO format: 2025-01-01)\n    - end_date: Filter to date (ISO format: 2025-12-31)","operationId":"get_transactions_api_billing_transactions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Date"}},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Date"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionResponse"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/receipts":{"get":{"tags":["Billing"],"summary":"Get Receipts","description":"Get payment receipts with Stripe invoice PDF links.\n\nReturns receipts from payment_receipts table which contain:\n- Stripe invoice IDs and PDF download URLs\n- Payment method details\n- Receipt numbers\n\nNote: These are formal Stripe invoices, separate from charge receipts\navailable in transactions.metadata.receipt_url.\n\nCached for 5 minutes (receipts rarely change).","operationId":"get_receipts_api_billing_receipts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentReceiptsResponse"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/tiers":{"get":{"tags":["Billing"],"summary":"Get Tiers","description":"Get all tier information for frontend.\n\nReturns:\n    - tiers: List of all tiers with rate limits, thresholds, etc.\n    - Each tier includes: name, display_name, min_monthly_tokens, rate_limits, max_api_keys, fee_percentage\n\nTiers are based on monthly compressed token usage, not money uploaded.\nFrontend should use this instead of hardcoding tier names.","operationId":"get_tiers_api_billing_tiers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TiersResponse"}}}}}}},"/api/billing/invoices":{"get":{"tags":["Billing"],"summary":"Get Invoices","description":"Get enterprise invoice history (postpaid only).\n\nPrepaid wallet top-ups are on GET /billing/transactions (separate concept).","operationId":"get_invoices_api_billing_invoices_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"enum":["paid","pending","draft","failed"],"type":"string"},{"type":"null"}],"description":"Filter by status: paid, pending, draft, failed","title":"Status"},"description":"Filter by status: paid, pending, draft, failed"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceListResponse"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/invoices/pay":{"post":{"tags":["Billing"],"summary":"Create Invoice Payment","description":"Create Stripe Checkout session to pay pending enterprise invoice.\n\nArgs:\n    request: billing_month to pay (YYYY-MM format)\n\nReturns:\n    url: Stripe Checkout URL to redirect user to\n    session_id: Stripe session ID\n    amount_usd: Total amount to pay","operationId":"create_invoice_payment_api_billing_invoices_pay_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoicePaymentRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoicePaymentResponse"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Bad Request"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/enterprise/budget":{"put":{"tags":["Billing"],"summary":"Set Enterprise Budget","description":"Set or update monthly budget for an enterprise API key.\n\nSet monthly_budget_usd to null to remove the budget (unlimited spending).\nBudget is a soft cap - alerts the user but doesn't block API usage.\nSpending is still limited by the admin-set credit_limit_usd.\n\nArgs:\n    request: api_key_id and monthly_budget_usd\n\nReturns:\n    Updated budget status for the key","operationId":"set_enterprise_budget_api_billing_enterprise_budget_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnterpriseBudgetUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnterpriseBudgetResponse"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Bad Request"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/enterprise/budget/{api_key_id}":{"delete":{"tags":["Billing"],"summary":"Remove Enterprise Budget","description":"Remove monthly budget for an enterprise API key (set to unlimited).\n\nArgs:\n    api_key_id: API key UUID\n\nReturns:\n    Updated budget status (with budget = null)","operationId":"remove_enterprise_budget_api_billing_enterprise_budget__api_key_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"api_key_id","in":"path","required":true,"schema":{"type":"string","title":"Api Key Id"}},{"name":"X-API-Key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnterpriseBudgetResponse"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/billing/webhooks/stripe":{"post":{"tags":["Billing"],"summary":"Stripe Webhook","description":"Handle Stripe webhooks (checkout.session.completed, payment_intent.succeeded).\n\nRecords transaction + updates balance when Stripe payment completes.\n\nSECURITY:\n- Validates Stripe signature before processing\n- Uses database UNIQUE constraint on stripe_payment_intent_id\n  to prevent race condition double-crediting\n\nHandles:\n- checkout.session.completed: When Checkout Session payment succeeds\n- payment_intent.succeeded: When direct PaymentIntent succeeds\n- payment_intent.payment_failed: Logs failed payments","operationId":"stripe_webhook_api_billing_webhooks_stripe_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponse"}}}}}}},"/api/usage/stats":{"get":{"tags":["Usage"],"summary":"Get Usage Stats","description":"Get comprehensive usage statistics with time series.","operationId":"get_usage_stats_api_usage_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"period","in":"query","required":false,"schema":{"enum":["last_day","last_week","last_month","last_90_days","last_year","current_month","custom"],"type":"string","description":"Time period: last_day, last_week, last_month, last_90_days, last_year, current_month, custom","default":"last_day","title":"Period"},"description":"Time period: last_day, last_week, last_month, last_90_days, last_year, current_month, custom"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Start date for custom period (YYYY-MM-DD)","title":"Start Date"},"description":"Start date for custom period (YYYY-MM-DD)"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End date for custom period (YYYY-MM-DD)","title":"End Date"},"description":"End date for custom period (YYYY-MM-DD)"},{"name":"group_by","in":"query","required":false,"schema":{"enum":["hour","day"],"type":"string","description":"Group by: hour or day","default":"day","title":"Group By"},"description":"Group by: hour or day"},{"name":"api_key_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by specific API key ID","title":"Api Key Id"},"description":"Filter by specific API key ID"},{"name":"model","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by specific model","title":"Model"},"description":"Filter by specific model"},{"name":"include_per_key","in":"query","required":false,"schema":{"type":"boolean","description":"When true (and no api_key_id filter), include per-key breakdown in one response.","default":false,"title":"Include Per Key"},"description":"When true (and no api_key_id filter), include per-key breakdown in one response."},{"name":"skip_cache","in":"query","required":false,"schema":{"type":"boolean","description":"Force-drain the Redis usage stream so pending events land in usage_logs before reading. Use when the user clicks refresh.","default":false,"title":"Skip Cache"},"description":"Force-drain the Redis usage stream so pending events land in usage_logs before reading. Use when the user clicks refresh."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageStatsResponse"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Bad Request"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users":{"get":{"tags":["Admin"],"summary":"Get Users","description":"Get all users with filtering and sorting.\n\nUses UserListRequest schema for query parameters.\nSet skip_emails=true (default) for faster response in list views.","operationId":"get_users_api_admin_users_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":100,"pattern":"^[a-zA-Z0-9\\s\\-@._]+$"},{"type":"null"}],"title":"Search"}},{"name":"tier","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"}},{"name":"plan","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan"}},{"name":"has_enterprise_key","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Enterprise Key"}},{"name":"balance_min","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Balance Min"}},{"name":"balance_max","in":"query","required":false,"schema":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Balance Max"}},{"name":"date_from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date From"}},{"name":"date_to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Date To"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":50,"title":"Limit"}},{"name":"sort_by","in":"query","required":false,"schema":{"enum":["created_at","full_name","last_login","total_used_money","total_uploaded_money","lifetime_charges","current_remaining_credits","total_api_calls","tier","plan","prepaid_added","prepaid_balance","prepaid_spent","postpaid_paid","postpaid_unpaid","postpaid_current_month","total_requests","total_tokens"],"type":"string","default":"created_at","title":"Sort By"}},{"name":"sort_order","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","default":"desc","title":"Sort Order"}},{"name":"skip_emails","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Skip Emails"}},{"name":"include_admins","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Admins"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserListResponse"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/sync":{"post":{"tags":["Admin"],"summary":"Sync Users","description":"Force sync users data from database.\n\nClears all backend caches (email cache), flushes Redis usage stream to DB,\nand fetches fresh user data.\nUse this when you need to see the latest data that may be stale due to caching.","operationId":"sync_users_api_admin_users_sync_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserListResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/users/by-email/{email}":{"get":{"tags":["Admin"],"summary":"Get User By Email","description":"Get user details by email address.","operationId":"get_user_by_email_api_admin_users_by_email__email__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"email","in":"path","required":true,"schema":{"type":"string","maxLength":254,"pattern":"^[a-zA-Z0-9._%+\\-]+@[a-zA-Z0-9.\\-]+\\.[a-zA-Z]{2,}$","title":"Email"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserDetailsResponse"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}":{"get":{"tags":["Admin"],"summary":"Get User Details","description":"Get detailed user information.","operationId":"get_user_details_api_admin_users__user_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserDetailsResponse"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Admin"],"summary":"Delete User","description":"Delete a user account with data retention.\n\nFor enterprise accounts with unpaid invoices, returns 409 with billing details.\nA final invoice is auto-generated for unbilled current-month usage.\nDeletion proceeds only after all invoices are paid.","operationId":"delete_user_api_admin_users__user_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"User Id"}},{"name":"reason","in":"query","required":false,"schema":{"type":"string","maxLength":500,"title":"Reason"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Admin"],"summary":"Update User","description":"Update user profile information.","operationId":"update_user_api_admin_users__user_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}/analytics":{"get":{"tags":["Admin"],"summary":"Get User Analytics","description":"Get comprehensive analytics for a specific user.\n\nIncludes:\n- Profile information\n- Financial summary (spending, credits, budget)\n- API usage statistics (calls, tokens, compression)\n- API keys list\n- Usage breakdown by model and request type","operationId":"get_user_analytics_api_admin_users__user_id__analytics_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserAnalyticsResponse"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/audit":{"get":{"tags":["Admin"],"summary":"Get Audit Logs","description":"Get audit logs.\n\nUses AuditLogsRequest schema for query parameters.","operationId":"get_audit_logs_api_admin_audit_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditLogsResponse"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/stats":{"get":{"tags":["Admin"],"summary":"Get Admin Stats","description":"Get platform statistics for admin dashboard.\n\n- **period**: Time period (last_day, last_week, last_month, last_90_days, last_year, custom)\n- **start_date**: Start date for custom period (YYYY-MM-DD)\n- **end_date**: End date for custom period (YYYY-MM-DD)\n- **api_key_types**: Filter by API key types (comma-separated: demo, completion, compress)\n- **compression_models**: Filter by compression models (comma-separated)\n- **tiers**: Filter by customer tiers (comma-separated: tier1, tier2, tier3, tier4, tier5)","operationId":"get_admin_stats_api_admin_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Time period: last_day, last_week, last_month, last_90_days, last_year, custom","default":"last_day","title":"Period"},"description":"Time period: last_day, last_week, last_month, last_90_days, last_year, custom"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}],"description":"Start date for custom period (ISO format: YYYY-MM-DD)","title":"Start Date"},"description":"Start date for custom period (ISO format: YYYY-MM-DD)"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$"},{"type":"null"}],"description":"End date for custom period (ISO format: YYYY-MM-DD)","title":"End Date"},"description":"End date for custom period (ISO format: YYYY-MM-DD)"},{"name":"api_key_types","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by API key types (comma-separated): demo, completion, compress, or None for all","title":"Api Key Types"},"description":"Filter by API key types (comma-separated): demo, completion, compress, or None for all"},{"name":"compression_models","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by compression models (comma-separated, e.g., americano, latte) or None for all","title":"Compression Models"},"description":"Filter by compression models (comma-separated, e.g., americano, latte) or None for all"},{"name":"tiers","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by customer tiers (comma-separated, e.g., tier1, tier2, tier3) or None for all","title":"Tiers"},"description":"Filter by customer tiers (comma-separated, e.g., tier1, tier2, tier3) or None for all"},{"name":"skip_cache","in":"query","required":false,"schema":{"type":"boolean","description":"Invalidate cache and fetch fresh from DB. (Legacy alias: refresh)","default":false,"title":"Skip Cache"},"description":"Invalidate cache and fetch fresh from DB. (Legacy alias: refresh)"},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean","description":"DEPRECATED — use skip_cache. Kept for backward compatibility.","default":false,"title":"Refresh"},"description":"DEPRECATED — use skip_cache. Kept for backward compatibility."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminStatsResponse"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/active-users":{"get":{"tags":["Admin"],"summary":"Get Daily Active Users","description":"Get the list of users who were active on a specific date.\n\nReturns user names, emails, and request counts for the given day.","operationId":"get_daily_active_users_api_admin_active_users_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"date","in":"query","required":true,"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Date to get active users for (YYYY-MM-DD)","title":"Date"},"description":"Date to get active users for (YYYY-MM-DD)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DailyActiveUsersResponse"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/newsletter/subscribers":{"get":{"tags":["Admin"],"summary":"Get Newsletter Subscribers","description":"Get all newsletter subscribers (admin only).\n\n- **status**: Filter by subscription status (active/unsubscribed)","operationId":"get_newsletter_subscribers_api_admin_newsletter_subscribers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status: active, unsubscribed","title":"Status"},"description":"Filter by status: active, unsubscribed"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterListResponse"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/newsletter/subscribers/{subscriber_id}":{"delete":{"tags":["Admin"],"summary":"Delete Newsletter Subscriber","description":"Delete a newsletter subscriber permanently.","operationId":"delete_newsletter_subscriber_api_admin_newsletter_subscribers__subscriber_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"subscriber_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"Subscriber Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/downloads/stats":{"get":{"tags":["Admin"],"summary":"Get Download Stats","description":"Get product download statistics for admin dashboard.\n\nTracks downloads of all Compresr products:\n- **gateway**: Context-Gateway CLI installs\n- **sdk_pypi**: Python SDK downloads (PyPI)\n- **extension_vscode**: VS Code extension installs\n\nFilters:\n- **period**: Time period (last_day, last_week, etc.)\n- **source**: Filter by specific product source","operationId":"get_download_stats_api_admin_downloads_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","description":"Time period: last_day, last_week, last_month, last_90_days, last_year, custom","default":"last_week","title":"Period"},"description":"Time period: last_day, last_week, last_month, last_90_days, last_year, custom"},{"name":"start_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Start date for custom period (ISO format: YYYY-MM-DD)","title":"Start Date"},"description":"Start date for custom period (ISO format: YYYY-MM-DD)"},{"name":"end_date","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"End date for custom period (ISO format: YYYY-MM-DD)","title":"End Date"},"description":"End date for custom period (ISO format: YYYY-MM-DD)"},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by source: gateway, sdk_pypi, extension_vscode (or None for all)","title":"Source"},"description":"Filter by source: gateway, sdk_pypi, extension_vscode (or None for all)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DownloadStatsResponse"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/enterprise-keys/billing":{"get":{"tags":["Admin"],"summary":"Get Enterprise Billing","description":"Get enterprise billing dashboard data.\n\nReturns all enterprise keys with their billing details:\n- Summary cards: total paid, unpaid, current month usage\n- List of enterprise keys with invoices","operationId":"get_enterprise_billing_api_admin_enterprise_keys_billing_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnterpriseBillingResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/enterprise-keys/pending":{"get":{"tags":["Admin"],"summary":"List Pending Enterprise Keys","description":"List all pending enterprise keys awaiting admin approval.\n\nReturns enterprise keys with status='pending' that need admin review.\nIncludes user info, company name, request message, and expected usage.","operationId":"list_pending_enterprise_keys_api_admin_enterprise_keys_pending_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PendingEnterpriseKeysResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/enterprise-keys/{key_id}/approve":{"put":{"tags":["Admin"],"summary":"Approve Enterprise Key","description":"Approve a pending enterprise key (Admin only).\n\nOnce approved:\n- Key status changes to 'active'\n- User can start using the key with postpaid billing\n- Credit limit is set (default or custom)\n\nOptionally override the credit limit.","operationId":"approve_enterprise_key_api_admin_enterprise_keys__key_id__approve_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"Key Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnterpriseKeyApprovalRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnterpriseKeyApprovalResponse"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/enterprise-keys/{key_id}/decline":{"put":{"tags":["Admin"],"summary":"Decline Enterprise Key","description":"Decline a pending enterprise key (Admin only).\n\nOnce declined:\n- Key status changes to 'declined'\n- User is notified with the decline reason\n- Key cannot be used\n\nProvide a decline_reason to explain why.","operationId":"decline_enterprise_key_api_admin_enterprise_keys__key_id__decline_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","pattern":"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$","title":"Key Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnterpriseKeyApprovalRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnterpriseKeyApprovalResponse"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/settings/excluded-patterns":{"get":{"tags":["Admin"],"summary":"Get Excluded Patterns","description":"Get all excluded email patterns grouped by source.\n\nReturns patterns from:\n- **patterns**: Editable patterns stored in DB (managed here)\n- **hardcoded**: Built-in patterns (e.g. \"e2e_test\") -- cannot be removed\n- **env_patterns**: Patterns from STATS_EXCLUDED_EMAIL_PATTERNS env var -- read-only","operationId":"get_excluded_patterns_api_admin_settings_excluded_patterns_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExcludedPatternsResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["Admin"],"summary":"Add Excluded Pattern","description":"Add a new excluded email pattern (Admin only).\n\nPatterns are matched as substrings against user emails and names.\nExamples: \"@test.com\", \"staging\", \"internal\".","operationId":"add_excluded_pattern_api_admin_settings_excluded_patterns_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AddExcludedPatternRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]},"delete":{"tags":["Admin"],"summary":"Remove Excluded Pattern","description":"Remove an excluded email pattern (Admin only).\n\nCannot remove built-in patterns like \"e2e_test\".","operationId":"remove_excluded_pattern_api_admin_settings_excluded_patterns_delete","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemoveExcludedPatternRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/dashboard/stats":{"get":{"tags":["Dashboard"],"summary":"Get Dashboard Stats","description":"Get dashboard statistics for authenticated user.\n\nReturns comprehensive dashboard data including:\n- Current balance\n- Usage statistics\n- API key summaries\n- Recent activity\n\nQuery params:\n- skip_cache: Force fresh data from database, bypassing Redis cache","operationId":"get_dashboard_stats_api_dashboard_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"skip_cache","in":"query","required":false,"schema":{"type":"boolean","description":"Force refresh, bypassing cache","default":false,"title":"Skip Cache"},"description":"Force refresh, bypassing cache"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardStatsResponse"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/pricing/compression-models":{"get":{"tags":["Pricing"],"summary":"Get Compression Models","description":"Get our compression model(s) with pricing info (cached).\n\nUsed by frontend to display our pricing (e.g., espresso_v1 @ $0.10/1M tokens).\n\nReturns:\n- List of compression models with:\n  - name: Model name (e.g., \"espresso_v1\")\n  - display_name: Human-readable name\n  - description: Model description\n  - input_price_per_1m: Our price per 1M input tokens","operationId":"get_compression_models_api_pricing_compression_models_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompressionModelsResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/api/pricing/estimate-cost":{"post":{"tags":["Pricing"],"summary":"Estimate Compression Cost","description":"Estimate the cost of using our compression service.\n\nUsed by frontend pricing calculator.\n\nUser provides:\n- Compression model\n- Number of input tokens\n- Desired compression ratio\n\nReturns cost breakdown.","operationId":"estimate_compression_cost_api_pricing_estimate_cost_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstimateCostRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EstimateCostResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newsletter/subscribe":{"post":{"tags":["Newsletter"],"summary":"Subscribe To Newsletter","description":"Subscribe an email to the newsletter.\n\n- No authentication required\n- Rate limited: 10 requests per IP per hour (prevents abuse)\n- Sends welcome email with unsubscribe link\n- If already subscribed, returns success with flag\n- If previously unsubscribed, reactivates subscription","operationId":"subscribe_to_newsletter_api_newsletter_subscribe_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterSubscribeRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterSubscribeResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too Many Requests","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newsletter/unsubscribe":{"post":{"tags":["Newsletter"],"summary":"Unsubscribe From Newsletter","description":"Unsubscribe from the newsletter using token.\n\n- No authentication required\n- Token is from the unsubscribe link in emails","operationId":"unsubscribe_from_newsletter_api_newsletter_unsubscribe_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterUnsubscribeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterUnsubscribeResponse"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Bad Request"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["Newsletter"],"summary":"Unsubscribe Via Link","description":"Unsubscribe from the newsletter via GET request (for email links).\n\nThis endpoint allows one-click unsubscribe from email links.\nFormat: /newsletter/unsubscribe?token=<uuid>","operationId":"unsubscribe_via_link_api_newsletter_unsubscribe_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","format":"uuid","description":"Unsubscribe token from email","title":"Token"},"description":"Unsubscribe token from email"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterUnsubscribeResponse"}}}},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Bad Request"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/newsletter/status":{"get":{"tags":["Newsletter"],"summary":"Get Subscription Status","description":"Get subscription status by token.\n\nUsed by unsubscribe page to show current status.","operationId":"get_subscription_status_api_newsletter_status_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","format":"uuid","description":"Unsubscribe token from email","title":"Token"},"description":"Unsubscribe token from email"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsletterStatusResponse"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/feature/request":{"post":{"tags":["Feature Requests"],"summary":"Submit Feature Request","description":"Submit a feature request.\n\n- No authentication required\n- Validates email, subject, and description\n- Stores request for admin review\n- Rate limited: 5 requests per hour per IP","operationId":"submit_feature_request_api_feature_request_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureRequestCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureRequestResponse"}}}},"400":{"description":"Bad Request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limit exceeded"},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/feature/admin/requests":{"get":{"tags":["Feature Requests"],"summary":"List Feature Requests","description":"List all feature requests with filtering.\n\n- Requires Support or Admin role\n- Supports filtering by status and priority\n- Supports search in email, subject, and description","operationId":"list_feature_requests_api_feature_admin_requests_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by status","title":"Status"},"description":"Filter by status"},{"name":"priority","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by priority","title":"Priority"},"description":"Filter by priority"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search in email, subject, or description","title":"Search"},"description":"Search in email, subject, or description"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Max results","default":50,"title":"Limit"},"description":"Max results"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Pagination offset","default":0,"title":"Offset"},"description":"Pagination offset"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureRequestListResponse"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/feature/admin/requests/{request_id}":{"get":{"tags":["Feature Requests"],"summary":"Get Feature Request","description":"Get a single feature request by ID.\n\n- Requires Support or Admin role","operationId":"get_feature_request_api_feature_admin_requests__request_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureRequest"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Feature Requests"],"summary":"Update Feature Request","description":"Update a feature request status, priority, or notes.\n\n- Requires Admin role","operationId":"update_feature_request_api_feature_admin_requests__request_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Request Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureRequestUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureRequest"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Feature Requests"],"summary":"Delete Feature Request","description":"Delete a feature request.\n\n- Requires Admin role\n- This action is permanent","operationId":"delete_feature_request_api_feature_admin_requests__request_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageResponse"}}}},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/install":{"get":{"tags":["Gateway"],"summary":"Get Install Script","description":"Serve the Context-Gateway install script.\n\n- No authentication required\n- Rate limited to 60 requests/minute per IP\n- Tracks download for analytics (version + geo only)\n- Fetches install.sh from GitHub (cached for 5 minutes)\n\nUsage:\n    curl -fsSL https://compresr.ai/install | sh","operationId":"get_install_script_api_install_get","parameters":[{"name":"v","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"description":"Gateway version (default: latest)","title":"V"},"description":"Gateway version (default: latest)"},{"name":"req","in":"query","required":true,"schema":{"title":"Req"}}],"responses":{"200":{"description":"Install script","content":{"application/json":{"schema":{}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gateway/downloads":{"get":{"tags":["Gateway"],"summary":"Get Public Download Count","description":"Get total Context-Gateway download count (public, no auth).\n\n- Rate limited to 120 requests/minute per IP\n- Used by frontend to display download count badge.\n- Returns all-time total downloads with 5-minute caching.","operationId":"get_public_download_count_api_gateway_downloads_get","parameters":[{"name":"req","in":"query","required":true,"schema":{"title":"Req"}}],"responses":{"200":{"description":"Total download count","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Public Download Count Api Gateway Downloads Get"}}}},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gateway/stats":{"get":{"tags":["Gateway"],"summary":"Get Gateway Stats","description":"Get Context-Gateway install statistics.\n\n**Requires admin authentication**\n\nReturns aggregated stats:\n- Total installs (all time)\n- Installs by time period (day, week, month)\n- Breakdown by OS\n- Breakdown by version\n- Top 10 countries","operationId":"get_gateway_stats_api_gateway_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GatewayInstallStatsResponse"}}}},"401":{"description":"Unauthorized - requires API key"},"403":{"description":"Forbidden - admin access required"},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/gateway/installs":{"get":{"tags":["Gateway"],"summary":"Get Recent Installs","description":"Get recent Context-Gateway installs.\n\n**Requires admin authentication**\n\nReturns list of recent install records for admin dashboard.","operationId":"get_recent_installs_api_gateway_installs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"description":"Number of records to return","default":50,"title":"Limit"},"description":"Number of records to return"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GatewayInstallListResponse"}}}},"401":{"description":"Unauthorized - requires API key"},"403":{"description":"Forbidden - admin access required"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/gateway/status":{"get":{"tags":["Gateway"],"summary":"Get Gateway Status","description":"Get current usage status for Context-Gateway CLI display.\n\n**Requires API key authentication** (any valid COMPRESR_API_KEY)\n\nReturns lightweight status summary:\n- Credits remaining (subscription + wallet combined)\n- Usage percentage of monthly budget\n- Tier information\n- Request counts\n\nUsed by Context-Gateway to display a persistent status bar showing\nthe user's balance and usage during operation.","operationId":"get_gateway_status_api_gateway_status_get","parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"responses":{"200":{"description":"User's usage status for gateway display","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GatewayStatusResponse"}}}},"401":{"description":"Unauthorized - requires API key"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Internal Server Error"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/check-email":{"post":{"tags":["Auth"],"summary":"Check Email Exists","description":"Check if an email already has a completed account.\n\nReturns {\"exists\": true} only if the email is registered AND has a\nuser_profiles row (completed signup). Users mid-OTP-verification\nwon't be blocked, so \"Resend OTP\" still works.","operationId":"check_email_exists_api_auth_check_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailCheckRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailCheckResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/authorize/cli-token":{"post":{"tags":["OAuth Authorization"],"summary":"Get Cli Token","description":"Get or create the user's CLI Key for Context Gateway CLI.\n\nKey scope matches user's account_type (user=prepaid, enterprise=postpaid).\nSEC-001: key_plain is not stored, so existing keys are rotated.","operationId":"get_cli_token_api_authorize_cli_token_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CLIKeyResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]},{"HTTPBearer":[]}]}},"/api/authorize/ws-callback":{"post":{"tags":["OAuth Authorization"],"summary":"Ws Callback","description":"Deliver a CLI key to a waiting WebSocket session.\n\nCalled by the frontend after the user authorizes in the browser.\nGets or rotates the user's CLI Key (scope matches account_type),\nthen pushes it over the WebSocket to the CLI.","operationId":"ws_callback_api_authorize_ws_callback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WsCallbackRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WsCallbackResponse"}}}},"500":{"description":"Internal Server Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]},{"HTTPBearer":[]}]}},"/api/authorize/success":{"get":{"tags":["OAuth Authorization"],"summary":"Authorization Success","description":"Redirect to frontend success page.","operationId":"authorization_success_api_authorize_success_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/telemetry/register":{"post":{"tags":["On-Prem Telemetry"],"summary":"Register signing secret for HMAC verification","description":"Register a signing secret for on-prem HMAC signature verification.\n    \n    Call this once when setting up on-prem, before sending telemetry.\n    The signing secret is stored securely and used to verify HMAC signatures.\n    \n    **Note:** This is optional - the first telemetry batch will auto-register.\n    \n    **Required Headers:**\n    - `X-API-Key`: Your Compresr API key\n    \n    **Body:**\n    - `signing_secret`: Your API key (cmp_xxx format) - used for signing\n    - `instance_id`: Optional instance identifier","operationId":"register_signing_secret_api_v1_telemetry_register_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterSigningSecretRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterSigningSecretResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/telemetry/batch":{"post":{"tags":["On-Prem Telemetry"],"summary":"Ingest telemetry batch from on-prem instance","description":"Receive and store a batch of telemetry events from an on-prem Compresr instance.\n    \n    **Required Headers:**\n    - `X-API-Key`: Compresr API key (authentication)\n    - `X-Compresr-Signature`: HMAC signature (integrity)\n    \n    **Optional Headers:**\n    - `X-Instance-ID`: On-prem instance identifier\n    \n    **First Request (auto-registration):**\n    Include signing_secret in the body - it will be registered automatically.\n    \n    **Signature Format:**\n    ```\n    t=timestamp,v1=HMAC-SHA256(timestamp + \".\" + JSON(payload), signing_secret)\n    ```\n    \n    **Event Types:**\n    - `compression`: Counted for billing\n    - `error`: Logged only\n    - `startup`/`shutdown`: Operational\n    \n    **Idempotency:**\n    Same batch_id within 24h returns success without reprocessing.","operationId":"ingest_telemetry_batch_api_v1_telemetry_batch_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"x-instance-id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"On-prem instance ID","title":"X-Instance-Id"},"description":"On-prem instance ID"},{"name":"x-compresr-signature","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"HMAC signature","title":"X-Compresr-Signature"},"description":"HMAC signature"},{"name":"X-API-Key","in":"header","required":true,"schema":{"type":"string","title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelemetryBatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelemetryBatchResponse"}}}},"401":{"description":"Invalid API key or signature","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelemetryErrorResponse"}}}},"400":{"description":"Invalid request body","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Duplicate batch (idempotency)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TelemetryErrorResponse"}}}},"500":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/telemetry/health":{"get":{"tags":["On-Prem Telemetry"],"summary":"Telemetry endpoint health check","description":"Simple health check for telemetry ingestion endpoint.","operationId":"telemetry_health_api_v1_telemetry_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Telemetry Health Api V1 Telemetry Health Get"}}}}}}},"/":{"get":{"summary":"Root","description":"Health check endpoint","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","description":"Health check endpoint for ALB.\n\nCRITICAL: Must respond within 5 seconds (ALB timeout).\nRedis checks are optional - failure should not fail the health check.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health/deep":{"get":{"summary":"Deep Health","description":"Deep health check with dependency status.\n\nUse for monitoring dashboards and debugging.\nNOT for ALB health checks (too slow).\n\nQuery params:\n    include_stripe: Include Stripe API check\n    include_compression: Include compression service check","operationId":"deep_health_health_deep_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"include_stripe","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Stripe"}},{"name":"include_compression","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Include Compression"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/health/circuits":{"get":{"summary":"Circuit Status","description":"Circuit breaker status for all services.\n\nUse for monitoring circuit breaker states and detecting\nfailing downstream services.\n\nSecurity: Requires support/admin role to prevent information disclosure.","operationId":"circuit_status_health_circuits_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/metrics":{"get":{"summary":"Metrics","description":"Prometheus-compatible metrics endpoint.\n\nReturns metrics in Prometheus exposition format for scraping.\n\nSecurity: Requires support/admin role to prevent information disclosure.","operationId":"metrics_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/metrics/json":{"get":{"summary":"Metrics Json","description":"Metrics as JSON for dashboards and debugging.\n\nSecurity: Requires support/admin role to prevent information disclosure.","operationId":"metrics_json_metrics_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/ready":{"get":{"summary":"Readiness","description":"Readiness probe for Kubernetes/orchestrator.\n\nReturns 200 only if the service can handle requests:\n- Compression engine is initialized\n- At least one model is available","operationId":"readiness_ready_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/logs/stats":{"get":{"summary":"Logs Stats","description":"Get log file sizes for monitoring.\n\nReturns current sizes of error.log and warning.log.\nUseful to check if rotation is working and total disk usage.","operationId":"logs_stats_logs_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}}},"components":{"schemas":{"APIKeyCreateRequest":{"properties":{"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name","description":"Display name for the key"},"scope":{"$ref":"#/components/schemas/APIKeyScope","description":"API key scope: user (regular prepaid) or enterprise (postpaid, requires admin approval)","default":"user"},"daily_limit":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Daily Limit","description":"Optional daily request limit (NULL = unlimited). Use for testing or rate-limited access."},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"Key expiration date (NULL = never expires, default = 30 days from now)"},"request_message":{"anyOf":[{"type":"string","maxLength":1000,"minLength":1},{"type":"null"}],"title":"Request Message","description":"Message explaining the reason for requesting API access. Required for enterprise keys."},"company_name":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Company Name","description":"Company name (required for enterprise keys)"},"expected_monthly_usage":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Expected Monthly Usage","description":"Expected monthly usage in USD (helps set credit limit for enterprise keys)"}},"type":"object","required":["name"],"title":"APIKeyCreateRequest","description":"Request to create an API key."},"APIKeyCreatedResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"data":{"anyOf":[{"$ref":"#/components/schemas/APIKeyCreatedResult"},{"type":"null"}]}},"type":"object","title":"APIKeyCreatedResponse","description":"Response for API key creation."},"APIKeyCreatedResult":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"scope":{"$ref":"#/components/schemas/APIKeyScope"},"status":{"$ref":"#/components/schemas/APIKeyStatus"},"billing_mode":{"$ref":"#/components/schemas/BillingMode","default":"prepaid"},"key":{"type":"string","title":"Key","description":"The API key - store securely, shown only once!"},"key_preview":{"type":"string","title":"Key Preview","description":"Masked preview of the key"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"}},"type":"object","required":["id","name","scope","status","key","key_preview","created_at"],"title":"APIKeyCreatedResult","description":"API key with secret (only shown once)."},"APIKeyListResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"data":{"items":{"$ref":"#/components/schemas/APIKeyResult"},"type":"array","title":"Data","default":[]}},"type":"object","title":"APIKeyListResponse","description":"Response for listing API keys."},"APIKeyResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"data":{"anyOf":[{"$ref":"#/components/schemas/APIKeyResult"},{"type":"null"}]}},"type":"object","title":"APIKeyResponse","description":"Response for getting a single API key."},"APIKeyResult":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"scope":{"$ref":"#/components/schemas/APIKeyScope"},"status":{"$ref":"#/components/schemas/APIKeyStatus"},"billing_mode":{"$ref":"#/components/schemas/BillingMode","default":"prepaid"},"key_preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Preview"},"key_plain":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Plain"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"total_requests":{"type":"integer","title":"Total Requests","default":0},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"daily_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Daily Limit"},"daily_requests_remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Daily Requests Remaining"},"last_reset_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Reset At"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"credit_limit_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Credit Limit Usd"},"current_balance_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Current Balance Usd"}},"type":"object","required":["id","name","scope","status","created_at"],"title":"APIKeyResult","description":"API key info."},"APIKeyScope":{"type":"string","enum":["demo","user","enterprise"],"title":"APIKeyScope","description":"API Key access scopes."},"APIKeyStatus":{"type":"string","enum":["pending","active","expired","declined"],"title":"APIKeyStatus","description":"API Key status values."},"AccountType":{"type":"string","enum":["user","enterprise"],"title":"AccountType","description":"Account type: determines billing mode and allowed API key scopes.\n\n- USER: Prepaid wallet billing, can create user-scope keys\n- ENTERPRISE: Postpaid invoice billing, can create enterprise-scope keys"},"ActiveUserInfo":{"properties":{"user_id":{"type":"string","title":"User Id","description":"User ID"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"User email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name","description":"User full name"},"request_count":{"type":"integer","title":"Request Count","description":"Number of requests on this day","default":0}},"type":"object","required":["user_id"],"title":"ActiveUserInfo","description":"User info for daily active users list."},"AddExcludedPatternRequest":{"properties":{"pattern":{"type":"string","maxLength":254,"minLength":1,"title":"Pattern","description":"Pattern to exclude"}},"type":"object","required":["pattern"],"title":"AddExcludedPatternRequest","description":"Request to add a new excluded email pattern."},"AdminStatsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"total_users":{"type":"integer","title":"Total Users","default":0},"total_admin_users":{"type":"integer","title":"Total Admin Users","default":0},"active_users":{"type":"integer","title":"Active Users","default":0},"active_users_previous_period":{"type":"integer","title":"Active Users Previous Period","default":0},"new_signups":{"type":"integer","title":"New Signups","default":0},"paying_users":{"type":"integer","title":"Paying Users","default":0},"churned_users":{"type":"integer","title":"Churned Users","default":0},"users_by_tier":{"additionalProperties":{"type":"integer"},"type":"object","title":"Users By Tier"},"credit_spent":{"type":"number","title":"Credit Spent","default":0.0},"credit_spent_in_period":{"type":"number","title":"Credit Spent In Period","default":0.0},"admin_credit_spent":{"type":"number","title":"Admin Credit Spent","default":0.0},"admin_credit_spent_in_period":{"type":"number","title":"Admin Credit Spent In Period","default":0.0},"user_savings_usd":{"type":"number","title":"User Savings Usd","default":0.0},"admin_savings_usd":{"type":"number","title":"Admin Savings Usd","default":0.0},"revenue":{"type":"number","title":"Revenue","default":0.0},"revenue_in_period":{"type":"number","title":"Revenue In Period","default":0.0},"revenue_previous_period":{"type":"number","title":"Revenue Previous Period","default":0.0},"enterprise_revenue":{"type":"number","title":"Enterprise Revenue","default":0.0},"enterprise_revenue_in_period":{"type":"number","title":"Enterprise Revenue In Period","default":0.0},"total_requests":{"type":"integer","title":"Total Requests","default":0},"user_requests":{"type":"integer","title":"User Requests","default":0},"admin_requests":{"type":"integer","title":"Admin Requests","default":0},"anonymous_demo_requests":{"type":"integer","title":"Anonymous Demo Requests","default":0},"requests_per_minute":{"type":"number","title":"Requests Per Minute","default":0.0},"total_tokens":{"type":"integer","title":"Total Tokens","default":0},"user_tokens":{"type":"integer","title":"User Tokens","default":0},"admin_tokens":{"type":"integer","title":"Admin Tokens","default":0},"user_tokens_saved":{"type":"integer","title":"User Tokens Saved","default":0},"admin_tokens_saved":{"type":"integer","title":"Admin Tokens Saved","default":0},"newsletter_total":{"type":"integer","title":"Newsletter Total","default":0},"newsletter_active":{"type":"integer","title":"Newsletter Active","default":0},"newsletter_unsubscribed":{"type":"integer","title":"Newsletter Unsubscribed","default":0},"features_total":{"type":"integer","title":"Features Total","default":0},"features_pending":{"type":"integer","title":"Features Pending","default":0},"features_approved":{"type":"integer","title":"Features Approved","default":0},"gateway_unique_users":{"type":"integer","title":"Gateway Unique Users","default":0},"gateway_total_requests":{"type":"integer","title":"Gateway Total Requests","default":0},"gateway_requests_in_period":{"type":"integer","title":"Gateway Requests In Period","default":0},"downloads_total":{"type":"integer","title":"Downloads Total","default":0},"downloads_in_period":{"type":"integer","title":"Downloads In Period","default":0},"downloads_gateway":{"type":"integer","title":"Downloads Gateway","default":0},"daily_active_users":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Daily Active Users","description":"Daily active users: [{timestamp, count}]"},"time_series":{"items":{"$ref":"#/components/schemas/AdminTimeSeriesDataPoint"},"type":"array","title":"Time Series"},"revenue_breakdown":{"anyOf":[{"$ref":"#/components/schemas/RevenueBreakdown"},{"type":"null"}]},"model_stats":{"items":{"$ref":"#/components/schemas/ModelStats"},"type":"array","title":"Model Stats"},"period":{"type":"string","title":"Period","default":"last_day"},"period_start":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period Start"},"period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period End"}},"type":"object","title":"AdminStatsResponse","description":"Platform statistics for admin dashboard."},"AdminTimeSeriesDataPoint":{"properties":{"timestamp":{"type":"string","title":"Timestamp","description":"ISO timestamp"},"requests":{"type":"integer","title":"Requests","description":"Number of requests","default":0},"tokens":{"type":"integer","title":"Tokens","description":"Total tokens processed","default":0},"cost_usd":{"type":"number","title":"Cost Usd","description":"Cost in USD (user spending)","default":0.0},"revenue_usd":{"type":"number","title":"Revenue Usd","description":"Revenue in USD","default":0.0},"compression_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Compression Model","description":"Compression model used"},"api_key_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key Type","description":"API key type/scope (demo, user, enterprise)"},"request_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Source","description":"Request source: sdk, demo, or gateway"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier","description":"User tier"}},"type":"object","required":["timestamp"],"title":"AdminTimeSeriesDataPoint","description":"Time series data point for admin charts - includes filter dimensions for client-side filtering.\n\nNote: This extends the basic TimeSeriesDataPoint from usage.py with admin-specific fields."},"AgnosticCompressionBatchInput":{"properties":{"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context","description":"Context text to compress. If null or empty, the corresponding result has compressed_context='' with zero tokens and is not billed."}},"type":"object","title":"AgnosticCompressionBatchInput","description":"A single input in an agnostic batch compression request."},"AgnosticCompressionBatchRequest":{"properties":{"inputs":{"items":{"$ref":"#/components/schemas/AgnosticCompressionBatchInput"},"type":"array","maxItems":100,"minItems":1,"title":"Inputs","description":"List of inputs to compress"},"compression_model_name":{"type":"string","title":"Compression Model Name","description":"Compression model to use"},"target_compression_ratio":{"anyOf":[{"type":"number","maximum":200.0,"minimum":0.0},{"type":"null"}],"title":"Target Compression Ratio","description":"Target ratio: 0-1 (strength) or >1 for factor (e.g., 2=2x). Max 200."},"source":{"anyOf":[{"$ref":"#/components/schemas/Source"},{"type":"null"}],"description":"Source of request: demo, extension, sdk:<client>, gateway:<provider>"}},"type":"object","required":["inputs","compression_model_name"],"title":"AgnosticCompressionBatchRequest","description":"Batch request for agnostic compression (per-item contexts, no questions)."},"AgnosticCompressionBatchResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"data":{"anyOf":[{"$ref":"#/components/schemas/AgnosticCompressionBatchResult"},{"type":"null"}]}},"type":"object","title":"AgnosticCompressionBatchResponse","description":"Response for agnostic batch compression."},"AgnosticCompressionBatchResult":{"properties":{"total_original_tokens":{"type":"integer","title":"Total Original Tokens","default":0},"total_compressed_tokens":{"type":"integer","title":"Total Compressed Tokens","default":0},"total_tokens_saved":{"type":"integer","title":"Total Tokens Saved","default":0},"average_compression_ratio":{"type":"number","title":"Average Compression Ratio","default":0.0},"count":{"type":"integer","title":"Count","default":0},"results":{"items":{"$ref":"#/components/schemas/AgnosticCompressionResult"},"type":"array","title":"Results"}},"type":"object","title":"AgnosticCompressionBatchResult","description":"Results for agnostic batch compression."},"AgnosticCompressionRequest":{"properties":{"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context","description":"Context text to compress (single string). If null or empty, the endpoint returns an empty compressed_context with zero tokens and no billing — no error is raised."},"compression_model_name":{"type":"string","title":"Compression Model Name","description":"Compression model to use (e.g., 'espresso_v1')"},"target_compression_ratio":{"anyOf":[{"type":"number","maximum":200.0,"minimum":0.0},{"type":"null"}],"title":"Target Compression Ratio","description":"Target compression ratio: 0-1 (strength) or >1 for factor (e.g., 2=2x). Max 200."},"source":{"anyOf":[{"$ref":"#/components/schemas/Source"},{"type":"null"}],"description":"Source of request: demo, extension, sdk:<client>, gateway:<provider>"}},"type":"object","required":["compression_model_name"],"title":"AgnosticCompressionRequest","description":"Request for single agnostic compression.\n\nUse /batch endpoint for multiple contexts.\nBackbone: Lingua"},"AgnosticCompressionResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"data":{"anyOf":[{"$ref":"#/components/schemas/AgnosticCompressionResult"},{"type":"null"}]}},"type":"object","title":"AgnosticCompressionResponse","description":"Response for agnostic compression."},"AgnosticCompressionResult":{"properties":{"original_context":{"type":"string","title":"Original Context","description":"Original context text"},"original_tokens":{"type":"integer","title":"Original Tokens","description":"Token count of original context"},"compressed_tokens":{"type":"integer","title":"Compressed Tokens","description":"Token count after compression"},"target_compression_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Target Compression Ratio","description":"User-requested compression ratio (if provided)"},"actual_compression_ratio":{"type":"number","title":"Actual Compression Ratio","description":"Actual achieved compression ratio (0-1)"},"tokens_saved":{"type":"integer","title":"Tokens Saved","description":"Number of tokens saved"},"duration_ms":{"type":"integer","title":"Duration Ms","description":"Processing time in milliseconds"},"compressed_context":{"type":"string","title":"Compressed Context","description":"Compressed context text"}},"type":"object","required":["original_context","original_tokens","compressed_tokens","actual_compression_ratio","tokens_saved","duration_ms","compressed_context"],"title":"AgnosticCompressionResult","description":"Result for single agnostic compression."},"ApiKeyUsageSummary":{"properties":{"api_key_id":{"type":"string","title":"Api Key Id","description":"API key UUID"},"api_key_name":{"type":"string","title":"Api Key Name","description":"API key name"},"requests_this_month":{"type":"integer","title":"Requests This Month","description":"Requests made this month (resets monthly)","default":0},"money_used_this_month":{"type":"number","title":"Money Used This Month","description":"Money used via this key this month (USD)","default":0.0},"budget_limit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Budget Limit","description":"Budget limit for this key (USD)"},"budget_remaining":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Budget Remaining","description":"Budget remaining for this key (USD)"}},"type":"object","required":["api_key_id","api_key_name"],"title":"ApiKeyUsageSummary","description":"Summary of usage for a single API key (dashboard view).\n\nNote: requests_this_month uses current_month_requests from DB which resets monthly."},"AuditLogEntry":{"properties":{"id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Id"},"admin_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Id"},"admin_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Name"},"action":{"type":"string","title":"Action"},"target_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target User Id"},"details":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Details"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["action"],"title":"AuditLogEntry","description":"Audit log entry."},"AuditLogsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"logs":{"items":{"$ref":"#/components/schemas/AuditLogEntry"},"type":"array","title":"Logs","default":[]},"total":{"type":"integer","title":"Total","default":0},"page":{"type":"integer","title":"Page","default":1},"limit":{"type":"integer","title":"Limit","default":50}},"type":"object","title":"AuditLogsResponse","description":"Paginated audit logs."},"BillingMode":{"type":"string","enum":["prepaid","postpaid"],"title":"BillingMode","description":"Billing mode for API keys.\n\nPREPAID: User must have positive balance. Session stops if balance runs out.\n         Used by regular users (demo, user scopes).\n\nPOSTPAID: Can go negative. Invoiced monthly.\n          Used by enterprise keys only (requires admin approval)."},"CLIKeyResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"token":{"type":"string","title":"Token"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","token","message"],"title":"CLIKeyResponse","description":"Response containing the CLI API key."},"CheckoutSessionRequest":{"properties":{"amount_usd":{"type":"number","maximum":10000.0,"minimum":1.0,"title":"Amount Usd","description":"Amount to upload ($1-$10,000)"}},"type":"object","required":["amount_usd"],"title":"CheckoutSessionRequest","description":"Request to create a Stripe Checkout session."},"CheckoutSessionResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Stripe Checkout URL to redirect user"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id","description":"Stripe session ID"}},"type":"object","title":"CheckoutSessionResponse","description":"Response for Stripe Checkout session creation."},"CompressionModelInfo":{"properties":{"name":{"type":"string","title":"Name","description":"Model name (e.g., 'espresso_v1')"},"display_name":{"type":"string","title":"Display Name","description":"Human-readable name"},"description":{"type":"string","title":"Description","description":"Description of the compression technology"},"input_price_per_1m":{"type":"number","title":"Input Price Per 1M","description":"Our price per 1M input tokens"},"min_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Min Tier","description":"Minimum subscription tier required"}},"type":"object","required":["name","display_name","description","input_price_per_1m"],"title":"CompressionModelInfo","description":"Our compression model with pricing info."},"CompressionModelsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"data":{"items":{"$ref":"#/components/schemas/CompressionModelInfo"},"type":"array","title":"Data"}},"type":"object","required":["data"],"title":"CompressionModelsResponse","description":"Response containing our compression models with pricing."},"CostBreakdown":{"properties":{"input_tokens":{"type":"integer","minimum":0.0,"title":"Input Tokens","description":"Original input token count"},"compressed_tokens":{"type":"integer","minimum":0.0,"title":"Compressed Tokens","description":"Estimated compressed token count"},"tokens_saved":{"type":"integer","minimum":0.0,"title":"Tokens Saved","description":"Estimated tokens saved"},"compression_ratio":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Compression Ratio","description":"Compression ratio (0-1)"},"processing_cost_usd":{"type":"number","minimum":0.0,"title":"Processing Cost Usd","description":"Estimated processing cost in USD"},"model":{"type":"string","title":"Model","description":"Compression model used for estimate"},"input_price_per_1m":{"type":"number","minimum":0.0,"title":"Input Price Per 1M","description":"Input price per 1M tokens"}},"type":"object","required":["input_tokens","compressed_tokens","tokens_saved","compression_ratio","processing_cost_usd","model","input_price_per_1m"],"title":"CostBreakdown","description":"Cost breakdown for the estimate."},"DailyActiveUsersResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"date":{"type":"string","title":"Date","description":"Date (YYYY-MM-DD)"},"count":{"type":"integer","title":"Count","description":"Number of active users","default":0},"users":{"items":{"$ref":"#/components/schemas/ActiveUserInfo"},"type":"array","title":"Users","description":"List of active users"}},"type":"object","required":["date"],"title":"DailyActiveUsersResponse","description":"Response for daily active users list."},"DashboardStats":{"properties":{"total_uploaded_money":{"type":"number","title":"Total Uploaded Money","description":"Total money uploaded to account (USD)","default":0.0},"total_used_money":{"type":"number","title":"Total Used Money","description":"Total money consumed via API usage (USD)","default":0.0},"wallet_balance_usd":{"type":"number","title":"Wallet Balance Usd","description":"Wallet balance from Stripe deposits (USD)","default":0.0},"total_available_usd":{"type":"number","title":"Total Available Usd","description":"Total spendable balance (wallet_balance_usd)","default":0.0},"usage_percentage":{"type":"number","title":"Usage Percentage","description":"Percentage of uploaded money used","default":0.0},"monthly_budget":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Budget","description":"User's monthly budget limit (USD, None for admin/unlimited)"},"budget_used_this_month":{"type":"number","title":"Budget Used This Month","description":"Money used this month (USD)","default":0.0},"budget_remaining_this_month":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Budget Remaining This Month","description":"Budget remaining this month (USD, None for unlimited)"},"budget_percentage":{"type":"number","title":"Budget Percentage","description":"Percentage of monthly budget used","default":0.0},"spend_this_month":{"type":"number","title":"Spend This Month","description":"Total money spent this month (USD)","default":0.0},"total_api_calls":{"type":"integer","title":"Total Api Calls","description":"Total API calls (all time)","default":0},"api_calls_this_month":{"type":"integer","title":"Api Calls This Month","description":"API calls in current month","default":0},"active_api_keys":{"type":"integer","title":"Active Api Keys","description":"Number of active API keys","default":0},"cloud_calls_this_month":{"type":"integer","title":"Cloud Calls This Month","description":"API calls this month sourced from cloud SDK / direct API","default":0},"onprem_calls_this_month":{"type":"integer","title":"Onprem Calls This Month","description":"API calls this month sourced from on-prem instances","default":0},"days_until_month_reset":{"type":"integer","title":"Days Until Month Reset","description":"Days until current month ends","default":0},"current_month":{"type":"string","title":"Current Month","description":"Current month (YYYY-MM format)","default":""},"avg_compression_ratio":{"type":"number","title":"Avg Compression Ratio","description":"Average compression ratio (last 30 days)","default":0.0},"total_tokens_saved":{"type":"integer","title":"Total Tokens Saved","description":"Total tokens saved (all time)","default":0},"tokens_saved_this_month":{"type":"integer","title":"Tokens Saved This Month","description":"Tokens saved this month","default":0},"total_input_tokens_this_month":{"type":"integer","title":"Total Input Tokens This Month","description":"Total input tokens processed this month","default":0},"tier":{"$ref":"#/components/schemas/TierName","description":"Current rate-limit tier (tier1, tier2, etc.)","default":"tier1"},"account_type":{"$ref":"#/components/schemas/AccountType","description":"Account type: user (prepaid wallet) or enterprise (postpaid invoicing)","default":"user"},"is_admin":{"type":"boolean","title":"Is Admin","description":"Whether user is admin (infinite usage)","default":false},"account_created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Created At","description":"Account creation date"},"api_key_usage":{"items":{"$ref":"#/components/schemas/ApiKeyUsageSummary"},"type":"array","title":"Api Key Usage","description":"Usage breakdown per API key"},"enterprise_keys":{"items":{"$ref":"#/components/schemas/EnterpriseKeyUsage"},"type":"array","title":"Enterprise Keys","description":"Usage for enterprise (postpaid) API keys"},"has_unpaid_invoices":{"type":"boolean","title":"Has Unpaid Invoices","description":"Whether user has any unpaid enterprise invoices","default":false},"unpaid_invoice_amount_usd":{"type":"number","title":"Unpaid Invoice Amount Usd","description":"Total amount of unpaid enterprise invoices (USD)","default":0.0},"top_models":{"items":{"$ref":"#/components/schemas/ModelStatsItem"},"type":"array","title":"Top Models","description":"Top 3 most used models with usage stats"}},"type":"object","title":"DashboardStats","description":"Comprehensive dashboard statistics - money-based system."},"DashboardStatsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"data":{"anyOf":[{"$ref":"#/components/schemas/DashboardStats"},{"type":"null"}]}},"type":"object","title":"DashboardStatsResponse","description":"Response for dashboard statistics."},"DeleteAccountInfo":{"properties":{"can_delete":{"type":"boolean","title":"Can Delete","default":true},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"pending_balance":{"type":"number","title":"Pending Balance","default":0.0},"pending_reports":{"type":"integer","title":"Pending Reports","default":0}},"type":"object","title":"DeleteAccountInfo","description":"Delete account check information."},"DeleteAccountRequest":{"properties":{"confirmation":{"type":"string","const":"DELETE","title":"Confirmation","description":"Must be 'DELETE' to confirm"}},"type":"object","required":["confirmation"],"title":"DeleteAccountRequest","description":"Request to delete account."},"DeleteAccountResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"data":{"anyOf":[{"$ref":"#/components/schemas/DeleteAccountInfo"},{"type":"null"}]}},"type":"object","title":"DeleteAccountResponse","description":"Response for DELETE /profile/delete."},"DemoCompressionModelOption":{"properties":{"value":{"type":"string","title":"Value"},"label":{"type":"string","title":"Label"},"description":{"type":"string","title":"Description","default":""}},"type":"object","required":["value","label"],"title":"DemoCompressionModelOption","description":"Compression model option for demo interface dropdown."},"DemoData":{"properties":{"sample_texts":{"items":{"$ref":"#/components/schemas/SampleText"},"type":"array","title":"Sample Texts"},"compression_models":{"items":{"$ref":"#/components/schemas/DemoCompressionModelOption"},"type":"array","title":"Compression Models","default":[]}},"type":"object","required":["sample_texts"],"title":"DemoData","description":"Demo data container with samples and compression models."},"DemoDataResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"data":{"$ref":"#/components/schemas/DemoData"}},"type":"object","required":["data"],"title":"DemoDataResponse","description":"Response for demo data endpoint."},"DemoStreamRequest":{"properties":{"context":{"type":"string","maxLength":1000000,"minLength":1,"title":"Context"},"compression_model_name":{"type":"string","title":"Compression Model Name","default":"latte_v1"},"question":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Question"},"target_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Target Ratio"},"coarse":{"type":"boolean","title":"Coarse","default":true}},"type":"object","required":["context"],"title":"DemoStreamRequest"},"DemoTestOutputRequest":{"properties":{"question":{"type":"string","minLength":1,"title":"Question"},"compressed_context":{"type":"string","minLength":1,"title":"Compressed Context"}},"type":"object","required":["question","compressed_context"],"title":"DemoTestOutputRequest"},"DownloadStatsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"period":{"type":"string","title":"Period","description":"Time period (last_hour, last_day, etc.)"},"period_start":{"type":"string","title":"Period Start","description":"Start of period (ISO)"},"period_end":{"type":"string","title":"Period End","description":"End of period (ISO)"},"total_downloads":{"type":"integer","title":"Total Downloads","description":"Total downloads in period","default":0},"time_series":{"items":{"$ref":"#/components/schemas/DownloadTimeSeriesPoint"},"type":"array","title":"Time Series","description":"Time series data for charting"},"by_source":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Source","description":"Downloads by source in period: gateway, sdk_pypi, extension_vscode"},"by_source_total":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Source Total","description":"All-time downloads by source for display cards"},"by_os":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Os","description":"Downloads by OS"},"by_country":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Country","description":"Downloads by country"}},"type":"object","required":["period","period_start","period_end"],"title":"DownloadStatsResponse","description":"Product download statistics for admin dashboard."},"DownloadTimeSeriesPoint":{"properties":{"timestamp":{"type":"string","title":"Timestamp","description":"ISO timestamp"},"downloads":{"type":"integer","title":"Downloads","description":"Number of downloads","default":0},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Product source (gateway, sdk_pypi, extension_vscode)"}},"type":"object","required":["timestamp"],"title":"DownloadTimeSeriesPoint","description":"Time series data point for downloads chart."},"EmailCheckRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"}},"type":"object","required":["email"],"title":"EmailCheckRequest"},"EmailCheckResponse":{"properties":{"exists":{"type":"boolean","title":"Exists"}},"type":"object","required":["exists"],"title":"EmailCheckResponse"},"EnterpriseBillingResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"summary":{"$ref":"#/components/schemas/EnterpriseBillingSummary"},"keys":{"items":{"$ref":"#/components/schemas/EnterpriseKeyBilling"},"type":"array","title":"Keys"},"total":{"type":"integer","title":"Total","description":"Total enterprise keys","default":0}},"type":"object","title":"EnterpriseBillingResponse","description":"Response for enterprise billing dashboard."},"EnterpriseBillingSummary":{"properties":{"total_paid":{"type":"number","title":"Total Paid","description":"Total paid invoices (all enterprise keys)","default":0.0},"total_unpaid":{"type":"number","title":"Total Unpaid","description":"Total unpaid invoices","default":0.0},"total_current_month":{"type":"number","title":"Total Current Month","description":"Current month usage (not yet invoiced)","default":0.0},"paid_invoice_count":{"type":"integer","title":"Paid Invoice Count","description":"Number of paid invoices","default":0},"unpaid_invoice_count":{"type":"integer","title":"Unpaid Invoice Count","description":"Number of unpaid invoices","default":0},"active_enterprise_keys":{"type":"integer","title":"Active Enterprise Keys","description":"Number of active enterprise keys","default":0}},"type":"object","title":"EnterpriseBillingSummary","description":"Summary stats for enterprise billing cards."},"EnterpriseBudgetResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"api_key_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key Id","description":"API key UUID"},"api_key_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key Name","description":"API key name"},"monthly_budget_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Budget Usd","description":"Monthly budget (null = unlimited)"},"current_month_usage_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Current Month Usage Usd","description":"Current month's usage"},"budget_utilization_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Budget Utilization Percent","description":"Percentage of budget used (null if no budget)"},"is_over_budget":{"type":"boolean","title":"Is Over Budget","description":"Whether current usage exceeds budget","default":false}},"type":"object","title":"EnterpriseBudgetResponse","description":"Response for budget update operation."},"EnterpriseBudgetUpdate":{"properties":{"api_key_id":{"type":"string","pattern":"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$","title":"Api Key Id","description":"API key UUID to update"},"monthly_budget_usd":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Monthly Budget Usd","description":"Monthly budget in USD. Set to null/None to remove budget (unlimited)."}},"type":"object","required":["api_key_id"],"title":"EnterpriseBudgetUpdate","description":"Request to set or update monthly budget for an enterprise API key."},"EnterpriseInvoice":{"properties":{"id":{"type":"string","title":"Id","description":"Invoice record ID"},"api_key_id":{"type":"string","title":"Api Key Id","description":"API key ID"},"billing_month":{"type":"string","title":"Billing Month","description":"Billing month (YYYY-MM)"},"usage_usd":{"type":"number","title":"Usage Usd","description":"Usage amount for the month","default":0.0},"total_requests":{"type":"integer","title":"Total Requests","description":"Total requests in the month","default":0},"invoice_paid":{"type":"boolean","title":"Invoice Paid","description":"Whether invoice is paid","default":false},"invoice_generated_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Generated At","description":"When invoice was generated"},"paid_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paid At","description":"When invoice was paid"}},"type":"object","required":["id","api_key_id","billing_month"],"title":"EnterpriseInvoice","description":"Single enterprise invoice record."},"EnterpriseKeyApprovalRequest":{"properties":{"action":{"type":"string","enum":["approve","decline"],"title":"Action","description":"Action: 'approve' or 'decline'"},"credit_limit_usd":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Credit Limit Usd","description":"Override credit limit for this key (only for approve action)"},"decline_reason":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Decline Reason","description":"Reason for declining (only for decline action)"}},"type":"object","required":["action"],"title":"EnterpriseKeyApprovalRequest","description":"Request to approve or decline an enterprise key."},"EnterpriseKeyApprovalResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"type":"string","title":"Message","description":"Result message"},"key_id":{"type":"string","title":"Key Id","description":"The key ID that was processed"},"new_status":{"type":"string","enum":["active","declined"],"title":"New Status","description":"New status: 'active' or 'declined'"}},"type":"object","required":["message","key_id","new_status"],"title":"EnterpriseKeyApprovalResponse","description":"Response for enterprise key approval/decline."},"EnterpriseKeyBilling":{"properties":{"key_id":{"type":"string","title":"Key Id","description":"API key ID"},"key_name":{"type":"string","title":"Key Name","description":"Key display name"},"key_preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Preview","description":"Key preview (first 12 chars)"},"status":{"type":"string","title":"Status","description":"Key status: active, pending, revoked"},"created_at":{"type":"string","title":"Created At","description":"Key creation timestamp"},"user_id":{"type":"string","title":"User Id","description":"User ID who owns the key"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email","description":"User email"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name","description":"Company name"},"credit_limit_usd":{"type":"number","title":"Credit Limit Usd","description":"Credit limit for this key","default":10000.0},"monthly_budget_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Budget Usd","description":"Monthly budget if set"},"total_paid":{"type":"number","title":"Total Paid","description":"Total paid invoices (all time)","default":0.0},"total_unpaid":{"type":"number","title":"Total Unpaid","description":"Total unpaid invoices","default":0.0},"current_month_usage":{"type":"number","title":"Current Month Usage","description":"Current month usage (not yet invoiced)","default":0.0},"paid_invoice_count":{"type":"integer","title":"Paid Invoice Count","description":"Number of paid invoices","default":0},"unpaid_invoice_count":{"type":"integer","title":"Unpaid Invoice Count","description":"Number of unpaid invoices","default":0},"invoices":{"items":{"$ref":"#/components/schemas/EnterpriseInvoice"},"type":"array","title":"Invoices","description":"All invoices for this key"}},"type":"object","required":["key_id","key_name","status","created_at","user_id"],"title":"EnterpriseKeyBilling","description":"Enterprise key with billing details for admin dashboard."},"EnterpriseKeyUsage":{"properties":{"api_key_id":{"type":"string","title":"Api Key Id","description":"API key UUID"},"api_key_name":{"type":"string","title":"Api Key Name","description":"API key name","default":"Enterprise Key"},"scope":{"$ref":"#/components/schemas/APIKeyScope","description":"Key scope","default":"enterprise"},"billing_mode":{"type":"string","const":"postpaid","title":"Billing Mode","description":"Billing mode (postpaid)","default":"postpaid"},"current_balance_usd":{"type":"number","title":"Current Balance Usd","description":"Current balance/debt (USD)","default":0.0},"current_month_usage_usd":{"type":"number","title":"Current Month Usage Usd","description":"Current month usage (USD)","default":0.0},"credit_limit_usd":{"type":"number","title":"Credit Limit Usd","description":"Credit limit (USD)","default":10000.0},"credit_remaining_usd":{"type":"number","title":"Credit Remaining Usd","description":"Remaining credit (USD)","default":0.0},"monthly_budget_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Budget Usd","description":"Monthly spending budget"},"budget_utilization_percent":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Budget Utilization Percent","description":"Budget usage percentage"},"is_over_budget":{"type":"boolean","title":"Is Over Budget","description":"Whether over budget","default":false},"total_requests":{"type":"integer","title":"Total Requests","description":"Total requests (lifetime)","default":0},"current_month_requests":{"type":"integer","title":"Current Month Requests","description":"Requests in the current billing month","default":0},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At","description":"Last used timestamp"}},"type":"object","required":["api_key_id"],"title":"EnterpriseKeyUsage","description":"Usage summary for enterprise (postpaid) API keys.\n\nEnterprise keys use a different billing model:\n- Prepaid (regular): User pays upfront, balance deducted from user_wallets\n- Postpaid (enterprise): Usage accumulated on key, invoiced monthly\n\nFor postpaid keys, current_balance_usd is negative (representing debt/usage).\nMonthly usage resets at the start of each month and is stored in history for invoicing."},"ErrorResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":false},"error":{"type":"string","title":"Error"},"code":{"type":"string","title":"Code"},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail"},"retry_after":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retry After"},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Field"}},"type":"object","required":["error","code"],"title":"ErrorResponse","description":"Standard error response."},"EstimateCostRequest":{"properties":{"compression_model":{"type":"string","title":"Compression Model","description":"Compression model to use","default":"latte_v1"},"input_tokens":{"type":"integer","exclusiveMinimum":0.0,"title":"Input Tokens","description":"Number of input tokens"},"compression_ratio":{"type":"number","exclusiveMaximum":1.0,"exclusiveMinimum":0.0,"title":"Compression Ratio","description":"Target compression ratio (e.g., 0.3)","default":0.5}},"type":"object","required":["input_tokens"],"title":"EstimateCostRequest","description":"Request to estimate compression cost."},"EstimateCostResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"data":{"$ref":"#/components/schemas/CostBreakdown"}},"type":"object","required":["data"],"title":"EstimateCostResponse","description":"Response for cost estimation."},"ExcludedPatternsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"patterns":{"items":{"type":"string"},"type":"array","title":"Patterns","description":"Editable patterns stored in DB"},"hardcoded":{"items":{"type":"string"},"type":"array","title":"Hardcoded","description":"Built-in patterns that cannot be removed"},"env_patterns":{"items":{"type":"string"},"type":"array","title":"Env Patterns","description":"Patterns from STATS_EXCLUDED_EMAIL_PATTERNS env var (read-only)"}},"type":"object","title":"ExcludedPatternsResponse","description":"Response for excluded email patterns (grouped by source)."},"FeatureRequest":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"subject":{"type":"string","title":"Subject"},"description":{"type":"string","title":"Description"},"status":{"type":"string","title":"Status"},"priority":{"type":"string","title":"Priority"},"admin_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin Notes"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"reviewed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reviewed At"}},"type":"object","required":["id","email","subject","description","status","priority","created_at","updated_at"],"title":"FeatureRequest","description":"Full feature request details."},"FeatureRequestCreate":{"properties":{"email":{"type":"string","format":"email","title":"Email","description":"Email address"},"subject":{"type":"string","maxLength":255,"minLength":5,"title":"Subject","description":"Feature request subject/title"},"description":{"type":"string","maxLength":2000,"minLength":20,"title":"Description","description":"Detailed description of the feature request"}},"type":"object","required":["email","subject","description"],"title":"FeatureRequestCreate","description":"Request to submit a feature request."},"FeatureRequestListResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"requests":{"items":{"$ref":"#/components/schemas/FeatureRequest"},"type":"array","title":"Requests","default":[]},"total":{"type":"integer","title":"Total","default":0},"pending_count":{"type":"integer","title":"Pending Count","default":0},"under_review_count":{"type":"integer","title":"Under Review Count","default":0},"planned_count":{"type":"integer","title":"Planned Count","default":0},"in_progress_count":{"type":"integer","title":"In Progress Count","default":0}},"type":"object","title":"FeatureRequestListResponse","description":"Response with list of feature requests (admin only)."},"FeatureRequestPriority":{"type":"string","enum":["low","normal","high","critical"],"title":"FeatureRequestPriority","description":"Feature request priority levels."},"FeatureRequestResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id","description":"Request ID (None on error)"},"email":{"type":"string","title":"Email","description":"Submitted email"},"subject":{"type":"string","title":"Subject","description":"Feature subject"}},"type":"object","required":["email","subject"],"title":"FeatureRequestResponse","description":"Response after submitting a feature request."},"FeatureRequestStatus":{"type":"string","enum":["pending","under_review","planned","in_progress","completed","declined"],"title":"FeatureRequestStatus","description":"Feature request status types."},"FeatureRequestUpdate":{"properties":{"status":{"anyOf":[{"$ref":"#/components/schemas/FeatureRequestStatus"},{"type":"null"}],"description":"New status"},"priority":{"anyOf":[{"$ref":"#/components/schemas/FeatureRequestPriority"},{"type":"null"}],"description":"Priority level"},"admin_notes":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Admin Notes","description":"Internal admin notes"}},"type":"object","title":"FeatureRequestUpdate","description":"Update a feature request (admin only)."},"GatewayInstallListResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"installs":{"items":{"$ref":"#/components/schemas/GatewayInstallRecord"},"type":"array","title":"Installs"},"total":{"type":"integer","title":"Total","default":0}},"type":"object","title":"GatewayInstallListResponse","description":"Response with list of recent installs."},"GatewayInstallRecord":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Version"},"country_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country Code"},"region":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Region"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"}},"type":"object","required":["id","created_at"],"title":"GatewayInstallRecord","description":"Single install record (for admin views)."},"GatewayInstallStatsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"period":{"type":"string","title":"Period","description":"Time period (last_hour, last_day, last_week, etc.)"},"period_start":{"type":"string","title":"Period Start","description":"Start of period (ISO)"},"period_end":{"type":"string","title":"Period End","description":"End of period (ISO)"},"total_installs":{"type":"integer","title":"Total Installs","description":"Total number of installs in period"},"by_version":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Version","description":"Installs by version"},"top_countries":{"additionalProperties":{"type":"integer"},"type":"object","title":"Top Countries","description":"Top countries"}},"type":"object","required":["period","period_start","period_end","total_installs"],"title":"GatewayInstallStatsResponse","description":"Response with gateway install statistics."},"GatewayStatusResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"data":{"anyOf":[{"$ref":"#/components/schemas/GatewayStatusResult"},{"type":"null"}]}},"type":"object","title":"GatewayStatusResponse","description":"Response wrapper for gateway status."},"GatewayStatusResult":{"properties":{"tier":{"type":"string","title":"Tier","description":"Rate-limit tier: tier1, tier2, tier3, tier4, tier5","default":"tier1"},"credits_remaining_usd":{"type":"number","title":"Credits Remaining Usd","description":"Total remaining credits (subscription + wallet) in USD","default":0.0},"credits_used_this_month":{"type":"number","title":"Credits Used This Month","description":"Credits used this billing month in USD","default":0.0},"monthly_budget_usd":{"type":"number","title":"Monthly Budget Usd","description":"Monthly budget/allocation in USD (0 = unlimited for admins)","default":0.0},"usage_percent":{"type":"number","title":"Usage Percent","description":"Percentage of monthly budget used (0-100)","default":0.0},"requests_today":{"type":"integer","title":"Requests Today","description":"Number of compression requests today","default":0},"requests_this_month":{"type":"integer","title":"Requests This Month","description":"Number of compression requests this billing month","default":0},"daily_request_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Daily Request Limit","description":"Daily request limit (None = unlimited)"},"is_admin":{"type":"boolean","title":"Is Admin","description":"Whether user has admin/unlimited access","default":false}},"type":"object","title":"GatewayStatusResult","description":"Usage status for Context-Gateway CLI display.\n\nProvides a lightweight summary for the gateway to display\nbalance and usage info to users during operation."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"type":"string","title":"Status","description":"Service status"},"compression_server":{"type":"boolean","title":"Compression Server","description":"Whether compression server is available"}},"type":"object","required":["status","compression_server"],"title":"HealthResponse","description":"Health check response."},"HistoryBatchRequest":{"properties":{"inputs":{"items":{"$ref":"#/components/schemas/HistoryCompressRequest"},"type":"array","maxItems":100,"minItems":1,"title":"Inputs"}},"type":"object","required":["inputs"],"title":"HistoryBatchRequest","description":"Batch request for history compression."},"HistoryCompressRequest":{"properties":{"messages":{"items":{"$ref":"#/components/schemas/HistoryMessage"},"type":"array","maxItems":1000,"minItems":1,"title":"Messages","description":"Conversation history to compress (list of messages, REQUIRED, max 1000)"},"keep_recent":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Keep Recent","description":"Number of recent messages to keep uncompressed (default: 3)","default":3},"compression_model_name":{"type":"string","title":"Compression Model Name","description":"Compression model to use (e.g., 'hcc_americano')"},"target_compression_ratio":{"type":"number","maximum":200.0,"minimum":0.0,"title":"Target Compression Ratio","description":"Target compression ratio: 0-1 (strength) or >1 for factor. Max 200. Default: 0.3","default":0.3},"source":{"anyOf":[{"$ref":"#/components/schemas/Source"},{"type":"null"}],"description":"Source of request: demo, extension, sdk:<client>, gateway:<provider>"}},"type":"object","required":["messages","compression_model_name"],"title":"HistoryCompressRequest","description":"Request to compress conversation history.\n\nmessages: List of HistoryMessage objects (required)\nkeep_recent: Number of recent messages to keep uncompressed (default: 3)\n\nBackbone: Lingua (no query supported) - conversion happens in compressor"},"HistoryCompressResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"data":{"anyOf":[{"$ref":"#/components/schemas/HistoryCompressResult"},{"type":"null"}]}},"type":"object","title":"HistoryCompressResponse","description":"Response for history compression."},"HistoryCompressResult":{"properties":{"summary":{"type":"string","title":"Summary","description":"Compressed history summary"},"original_tokens":{"type":"integer","title":"Original Tokens","description":"Token count of original history"},"compressed_tokens":{"type":"integer","title":"Compressed Tokens","description":"Token count of summary"},"messages_compressed":{"type":"integer","title":"Messages Compressed","description":"Number of messages that were compressed"},"messages_kept":{"type":"integer","title":"Messages Kept","description":"Number of recent messages kept"},"compression_ratio":{"type":"number","title":"Compression Ratio","description":"Actual compression ratio achieved"},"duration_ms":{"type":"integer","title":"Duration Ms","description":"Processing time in milliseconds","default":0}},"type":"object","required":["summary","original_tokens","compressed_tokens","messages_compressed","messages_kept","compression_ratio"],"title":"HistoryCompressResult","description":"Result of history compression."},"HistoryMessage":{"properties":{"role":{"type":"string","title":"Role","description":"Message role: 'user', 'assistant', 'system', or 'tool'"},"content":{"type":"string","title":"Content","description":"Message content"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"Optional name for the message sender"},"tool_call_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Call Id","description":"Tool call ID for tool messages"}},"type":"object","required":["role","content"],"title":"HistoryMessage","description":"A message in conversation history."},"IdentityManifest":{"properties":{"instance_id":{"type":"string","title":"Instance Id","description":"UUID matching /data/identity.json"},"api_key_hash":{"type":"string","pattern":"^[a-f0-9]{64}$","title":"Api Key Hash","description":"SHA-256 hex of the api_key the on-prem instance was first bound to"},"created_at":{"type":"string","title":"Created At","description":"ISO-8601 timestamp manifest was created"}},"additionalProperties":true,"type":"object","required":["instance_id","api_key_hash","created_at"],"title":"IdentityManifest","description":"On-prem identity manifest, sent in each upload for rebirth detection.\n\nThe on-prem instance persists this manifest in ``/data/identity.json``\nHMAC-bound to the api_key on first authenticated request. Subsequent\nuploads carry the same values. If we see a *new* ``instance_id`` or an\nearlier ``created_at`` for the same api_key, it signals that the operator\ndeleted the local manifest — typically an attempt to reset a per-instance\ngrace period or quota."},"Invoice":{"properties":{"id":{"type":"string","title":"Id","description":"Invoice UUID"},"invoice_type":{"$ref":"#/components/schemas/InvoiceType","description":"Invoice type","default":"enterprise"},"billing_month":{"type":"string","title":"Billing Month","description":"Billing month (YYYY-MM)"},"amount_usd":{"type":"number","title":"Amount Usd","description":"Invoice amount in USD"},"status":{"$ref":"#/components/schemas/InvoiceStatus","description":"Payment status"},"stripe_invoice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Invoice Id","description":"Stripe invoice ID"},"invoice_pdf_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Pdf Url","description":"PDF download URL"},"created_at":{"type":"string","title":"Created At","description":"Invoice creation timestamp"},"paid_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paid At","description":"Payment timestamp"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Invoice description"},"api_key_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key Name","description":"API key name (for enterprise)"},"can_pay":{"type":"boolean","title":"Can Pay","description":"Whether user can pay this invoice now","default":false}},"type":"object","required":["id","billing_month","amount_usd","status","created_at"],"title":"Invoice","description":"Enterprise invoice model (postpaid billing only)."},"InvoiceListResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"data":{"items":{"$ref":"#/components/schemas/Invoice"},"type":"array","title":"Data","default":[]},"total_pending_usd":{"type":"number","title":"Total Pending Usd","description":"Total pending amount","default":0.0}},"type":"object","title":"InvoiceListResponse","description":"Response for listing invoices."},"InvoicePaymentRequest":{"properties":{"billing_month":{"type":"string","title":"Billing Month","description":"Billing month to pay (YYYY-MM)"}},"type":"object","required":["billing_month"],"title":"InvoicePaymentRequest","description":"Request to create payment session for pending invoice."},"InvoicePaymentResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url","description":"Stripe Checkout URL"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id","description":"Stripe session ID"},"amount_usd":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount Usd","description":"Amount to pay"}},"type":"object","title":"InvoicePaymentResponse","description":"Response for invoice payment session."},"InvoiceStatus":{"type":"string","enum":["draft","pending","paid","failed"],"title":"InvoiceStatus","description":"Invoice payment status."},"InvoiceType":{"type":"string","enum":["enterprise"],"title":"InvoiceType","description":"Invoice types — enterprise postpaid only.\n\nPrepaid wallet top-ups are 'transactions', not invoices."},"MRRDataPoint":{"properties":{"month":{"type":"string","title":"Month"},"prepaid":{"type":"number","title":"Prepaid","default":0.0},"enterprise":{"type":"number","title":"Enterprise","default":0.0},"total":{"type":"number","title":"Total","default":0.0}},"type":"object","required":["month"],"title":"MRRDataPoint","description":"Monthly recurring revenue data point."},"MessageResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"type":"string","title":"Message"}},"type":"object","required":["message"],"title":"MessageResponse","description":"Simple message response."},"ModelStats":{"properties":{"model":{"type":"string","title":"Model"},"requests":{"type":"integer","title":"Requests","default":0},"tokens":{"type":"integer","title":"Tokens","default":0},"cost_usd":{"type":"number","title":"Cost Usd","default":0.0}},"type":"object","required":["model"],"title":"ModelStats","description":"Stats breakdown by model."},"ModelStatsItem":{"properties":{"model":{"type":"string","title":"Model","description":"Model name"},"requests":{"type":"integer","title":"Requests","description":"Number of requests","default":0},"input_tokens":{"type":"integer","title":"Input Tokens","description":"Original input tokens","default":0},"compressed_input_tokens":{"type":"integer","title":"Compressed Input Tokens","description":"Compressed input tokens","default":0},"output_tokens":{"type":"integer","title":"Output Tokens","description":"Output tokens","default":0},"cost_usd":{"type":"number","title":"Cost Usd","description":"Cost in USD","default":0.0}},"type":"object","required":["model"],"title":"ModelStatsItem","description":"Aggregated stats for a single model."},"MoneyUploadRequest":{"properties":{"amount_usd":{"type":"number","maximum":10000.0,"exclusiveMinimum":0.0,"title":"Amount Usd","description":"Amount to upload in USD (max $10,000)"},"payment_method_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Method Id","description":"Stripe payment method ID"},"target_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target User Id","description":"User ID to credit (admin only). Defaults to admin's own account if omitted."},"idempotency_key":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"title":"Idempotency Key","description":"Caller-supplied idempotency key to prevent double-credits on retry"}},"type":"object","required":["amount_usd"],"title":"MoneyUploadRequest","description":"Request to upload money to account."},"MoneyUploadResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"data":{"anyOf":[{"$ref":"#/components/schemas/Transaction"},{"type":"null"}]},"new_balance":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"New Balance"}},"type":"object","title":"MoneyUploadResponse","description":"Response for money upload."},"NewsletterListResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"subscribers":{"items":{"$ref":"#/components/schemas/NewsletterSubscriber"},"type":"array","title":"Subscribers","default":[]},"total_active":{"type":"integer","title":"Total Active","default":0},"total_unsubscribed":{"type":"integer","title":"Total Unsubscribed","default":0}},"type":"object","title":"NewsletterListResponse","description":"Response with list of subscribers (admin only)."},"NewsletterStatusResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"email":{"type":"string","title":"Email"},"status":{"type":"string","title":"Status"},"subscribed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Subscribed At"},"unsubscribed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Unsubscribed At"}},"type":"object","required":["email","status"],"title":"NewsletterStatusResponse","description":"Response with subscription status."},"NewsletterSubscribeRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email","description":"Email address to subscribe"},"source":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Source","description":"Source of subscription","default":"landing_page"}},"type":"object","required":["email"],"title":"NewsletterSubscribeRequest","description":"Request to subscribe to newsletter."},"NewsletterSubscribeResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"email":{"type":"string","title":"Email","description":"Subscribed email address"},"already_subscribed":{"type":"boolean","title":"Already Subscribed","description":"Whether email was already subscribed","default":false}},"type":"object","required":["email"],"title":"NewsletterSubscribeResponse","description":"Response after subscribing to newsletter."},"NewsletterSubscriber":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"status":{"type":"string","title":"Status"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"subscribed_at":{"type":"string","format":"date-time","title":"Subscribed At"},"unsubscribed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Unsubscribed At"}},"type":"object","required":["id","email","status","subscribed_at"],"title":"NewsletterSubscriber","description":"Newsletter subscriber details (for admin views)."},"NewsletterUnsubscribeRequest":{"properties":{"token":{"type":"string","format":"uuid","title":"Token","description":"Unsubscribe token from email link"}},"type":"object","required":["token"],"title":"NewsletterUnsubscribeRequest","description":"Request to unsubscribe from newsletter."},"NewsletterUnsubscribeResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"email":{"type":"string","title":"Email","description":"Unsubscribed email address"}},"type":"object","required":["email"],"title":"NewsletterUnsubscribeResponse","description":"Response after unsubscribing from newsletter."},"PaymentReceipt":{"properties":{"id":{"type":"string","title":"Id"},"receipt_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Receipt Number"},"amount_usd":{"type":"number","title":"Amount Usd","description":"Payment amount in USD"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"type":"string","enum":["completed","pending","failed","refunded"],"title":"Status","description":"completed, pending, failed, refunded"},"stripe_payment_intent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Payment Intent Id"},"stripe_invoice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Invoice Id"},"invoice_pdf_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Pdf Url","description":"Stripe invoice PDF download URL"},"payment_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Method"},"payment_method_last4":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Method Last4"},"paid_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paid At"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","amount_usd","status","created_at"],"title":"PaymentReceipt","description":"Stripe payment receipt with invoice PDF link."},"PaymentReceiptsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"data":{"items":{"$ref":"#/components/schemas/PaymentReceipt"},"type":"array","title":"Data","default":[]}},"type":"object","title":"PaymentReceiptsResponse","description":"Response for GET /billing/receipts."},"PendingEnterpriseKey":{"properties":{"id":{"type":"string","title":"Id","description":"API key ID"},"user_id":{"type":"string","title":"User Id","description":"User ID who requested the key"},"user_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Email","description":"User's email"},"name":{"type":"string","title":"Name","description":"Key display name"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name","description":"Company name"},"request_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Message","description":"Reason for requesting enterprise access"},"expected_monthly_usage":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Expected Monthly Usage","description":"Expected monthly usage in USD"},"credit_limit_usd":{"type":"number","title":"Credit Limit Usd","description":"Credit limit for this key","default":10000.0},"created_at":{"type":"string","title":"Created At","description":"Request creation timestamp"}},"type":"object","required":["id","user_id","name","created_at"],"title":"PendingEnterpriseKey","description":"Pending enterprise key awaiting admin approval."},"PendingEnterpriseKeysResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"data":{"items":{"$ref":"#/components/schemas/PendingEnterpriseKey"},"type":"array","title":"Data"},"total":{"type":"integer","title":"Total","description":"Total pending keys","default":0}},"type":"object","title":"PendingEnterpriseKeysResponse","description":"Response for listing pending enterprise keys."},"Profile":{"properties":{"user_id":{"type":"string","title":"User Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"role":{"type":"string","enum":["user","admin","support"],"title":"Role","default":"user"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"account_type":{"$ref":"#/components/schemas/AccountType","default":"user"},"tier":{"$ref":"#/components/schemas/TierName","default":"tier1"},"extra_usage_enabled":{"type":"boolean","title":"Extra Usage Enabled","default":true},"extra_usage_limit":{"type":"number","title":"Extra Usage Limit","default":0.0},"wallet_balance":{"type":"number","title":"Wallet Balance","default":0.0},"lifetime_deposited":{"type":"number","title":"Lifetime Deposited","default":0.0},"lifetime_used":{"type":"number","title":"Lifetime Used","default":0.0},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"is_admin":{"type":"boolean","title":"Is Admin","description":"Admin access — derived from role.","readOnly":true}},"type":"object","required":["user_id","is_admin"],"title":"Profile","description":"User profile data aggregated from multiple tables.\n\nData sources (after M_14 migration):\n- user_profiles: user_id, full_name, company_name, country, role\n- user_subscriptions: tier (tier1-tier5 based on usage)\n- user_wallets: balance_usd, lifetime totals\n\nNote: Enterprise status is determined by active enterprise API tokens,\nnot the plan column (which is no longer used)."},"ProfileResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"data":{"anyOf":[{"$ref":"#/components/schemas/Profile"},{"type":"null"}]}},"type":"object","title":"ProfileResponse","description":"Response for GET /profile/me."},"ProfileUpdateRequest":{"properties":{"full_name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Full Name","description":"User's full name"},"company_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Company Name","description":"Company name"},"country":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Country","description":"Country"},"extra_usage_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Extra Usage Enabled","description":"Enable extra usage (use wallet balance when subscription credits exhausted)"},"extra_usage_limit":{"anyOf":[{"type":"number","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Extra Usage Limit","description":"Spending limit for extra wallet usage in USD (max $100)"}},"type":"object","title":"ProfileUpdateRequest","description":"Request to update profile.\n\nNote: subscription-related fields (extra_usage_*) are now in user_subscriptions\nbut can still be updated via this endpoint for convenience."},"ProfileUpdateResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"data":{"anyOf":[{"$ref":"#/components/schemas/Profile"},{"type":"null"}]}},"type":"object","title":"ProfileUpdateResponse","description":"Response for PATCH /profile/me."},"QuerySpecificCompressionBatchInput":{"properties":{"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context","description":"Context text to compress. If null or empty, the corresponding result has compressed_context='' with zero tokens and is not billed."},"query":{"type":"string","minLength":1,"title":"Query","description":"Query for this context (REQUIRED)"}},"type":"object","required":["query"],"title":"QuerySpecificCompressionBatchInput","description":"A single input in a question-specific batch compression request."},"QuerySpecificCompressionBatchRequest":{"properties":{"inputs":{"items":{"$ref":"#/components/schemas/QuerySpecificCompressionBatchInput"},"type":"array","maxItems":100,"minItems":1,"title":"Inputs","description":"List of inputs to compress"},"compression_model_name":{"type":"string","title":"Compression Model Name","description":"Compression model to use"},"target_compression_ratio":{"anyOf":[{"type":"number","maximum":200.0,"minimum":0.0},{"type":"null"}],"title":"Target Compression Ratio","description":"Target ratio: 0-1 (strength) or >1 for factor. Max 200."},"coarse":{"type":"boolean","title":"Coarse","description":"Use coarse-grained compression (paragraph-level). Applies to all items. Default: True.","default":true},"source":{"anyOf":[{"$ref":"#/components/schemas/Source"},{"type":"null"}],"description":"Source of request: demo, extension, sdk:<client>, gateway:<provider>"}},"type":"object","required":["inputs","compression_model_name"],"title":"QuerySpecificCompressionBatchRequest","description":"Batch request for question-specific compression (per-item context+query pairs).\n\nEach input has its own context and query. Use this when you need different\nqueries for different contexts."},"QuerySpecificCompressionBatchResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"data":{"anyOf":[{"$ref":"#/components/schemas/QuerySpecificCompressionBatchResult"},{"type":"null"}]}},"type":"object","title":"QuerySpecificCompressionBatchResponse","description":"Response for question-specific batch compression."},"QuerySpecificCompressionBatchResult":{"properties":{"total_original_tokens":{"type":"integer","title":"Total Original Tokens","default":0},"total_compressed_tokens":{"type":"integer","title":"Total Compressed Tokens","default":0},"total_tokens_saved":{"type":"integer","title":"Total Tokens Saved","default":0},"average_compression_ratio":{"type":"number","title":"Average Compression Ratio","default":0.0},"count":{"type":"integer","title":"Count","default":0},"results":{"items":{"$ref":"#/components/schemas/QuerySpecificCompressionResult"},"type":"array","title":"Results"}},"type":"object","title":"QuerySpecificCompressionBatchResult","description":"Results for question-specific batch compression."},"QuerySpecificCompressionRequest":{"properties":{"context":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context","description":"Context text to compress (single string). If null or empty, the endpoint returns an empty compressed_context with zero tokens and no billing — no error is raised."},"compression_model_name":{"type":"string","title":"Compression Model Name","description":"Compression model to use (e.g., 'latte_v1')"},"query":{"type":"string","minLength":1,"title":"Query","description":"Query for context-aware filtering (REQUIRED)"},"target_compression_ratio":{"anyOf":[{"type":"number","maximum":200.0,"minimum":0.0},{"type":"null"}],"title":"Target Compression Ratio","description":"Target ratio: 0-1 (strength) or >1 for factor (e.g., 2=2x). Max 200."},"coarse":{"type":"boolean","title":"Coarse","description":"Use coarse-grained compression (paragraph-level). Default: True.","default":true},"heuristic_chunking":{"type":"boolean","title":"Heuristic Chunking","description":"Use heuristic chunking for better structure preservation. Default: False.","default":false},"disable_placeholders":{"type":"boolean","title":"Disable Placeholders","description":"Disable placeholder tokens in compressed output. Default: False.","default":false},"source":{"anyOf":[{"$ref":"#/components/schemas/Source"},{"type":"null"}],"description":"Source of request: demo, extension, sdk:<client>, gateway:<provider>"}},"type":"object","required":["compression_model_name","query"],"title":"QuerySpecificCompressionRequest","description":"Request for single question-specific compression.\n\nUse /batch endpoint for multiple context+query pairs.\nBackbone: GemFilter"},"QuerySpecificCompressionResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"data":{"anyOf":[{"$ref":"#/components/schemas/QuerySpecificCompressionResult"},{"type":"null"}]}},"type":"object","title":"QuerySpecificCompressionResponse","description":"Response for question-specific compression."},"QuerySpecificCompressionResult":{"properties":{"original_context":{"type":"string","title":"Original Context","description":"Original context text"},"original_tokens":{"type":"integer","title":"Original Tokens","description":"Token count of original context"},"compressed_tokens":{"type":"integer","title":"Compressed Tokens","description":"Token count after compression"},"target_compression_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Target Compression Ratio","description":"User-requested compression ratio (if provided)"},"actual_compression_ratio":{"type":"number","title":"Actual Compression Ratio","description":"Actual achieved compression ratio (0-1)"},"tokens_saved":{"type":"integer","title":"Tokens Saved","description":"Number of tokens saved"},"duration_ms":{"type":"integer","title":"Duration Ms","description":"Processing time in milliseconds"},"compressed_context":{"type":"string","title":"Compressed Context","description":"Compressed context text"}},"type":"object","required":["original_context","original_tokens","compressed_tokens","actual_compression_ratio","tokens_saved","duration_ms","compressed_context"],"title":"QuerySpecificCompressionResult","description":"Result for single question-specific compression."},"RateLimits":{"properties":{"tier":{"$ref":"#/components/schemas/TierName","description":"Tier name"},"rpm":{"type":"integer","title":"Rpm","description":"Requests per minute (-1 = unlimited)"},"tpm":{"type":"integer","title":"Tpm","description":"Tokens per minute (-1 = unlimited)"},"rpd":{"type":"integer","title":"Rpd","description":"Requests per day (-1 = unlimited)"},"max_api_keys":{"type":"integer","title":"Max Api Keys","description":"Max API keys (-1 = unlimited)"}},"type":"object","required":["tier","rpm","tpm","rpd","max_api_keys"],"title":"RateLimits","description":"User rate limits data."},"RateLimitsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"data":{"anyOf":[{"$ref":"#/components/schemas/RateLimits"},{"type":"null"}]}},"type":"object","title":"RateLimitsResponse","description":"Response for GET /profile/rate-limits."},"RegisterSigningSecretRequest":{"properties":{"signing_secret":{"type":"string","title":"Signing Secret","description":"Signing secret (your API key cmp_xxx)"},"instance_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instance Id","description":"Instance identifier"}},"type":"object","required":["signing_secret"],"title":"RegisterSigningSecretRequest","description":"Request to register a signing secret for HMAC verification."},"RegisterSigningSecretResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"}},"type":"object","required":["success","message"],"title":"RegisterSigningSecretResponse","description":"Response from signing secret registration."},"RemoveExcludedPatternRequest":{"properties":{"pattern":{"type":"string","title":"Pattern","description":"Pattern to remove"}},"type":"object","required":["pattern"],"title":"RemoveExcludedPatternRequest","description":"Request to remove an excluded email pattern."},"RevenueBreakdown":{"properties":{"prepaid_total":{"type":"number","title":"Prepaid Total","default":0.0},"prepaid_in_period":{"type":"number","title":"Prepaid In Period","default":0.0},"enterprise_invoiced_total":{"type":"number","title":"Enterprise Invoiced Total","default":0.0},"enterprise_invoiced_in_period":{"type":"number","title":"Enterprise Invoiced In Period","default":0.0},"enterprise_paid_total":{"type":"number","title":"Enterprise Paid Total","default":0.0},"enterprise_paid_in_period":{"type":"number","title":"Enterprise Paid In Period","default":0.0},"enterprise_pending_total":{"type":"number","title":"Enterprise Pending Total","default":0.0},"enterprise_pending_in_period":{"type":"number","title":"Enterprise Pending In Period","default":0.0},"enterprise_unbilled":{"type":"number","title":"Enterprise Unbilled","default":0.0},"prepaid_mtd":{"type":"number","title":"Prepaid Mtd","default":0.0},"enterprise_mtd":{"type":"number","title":"Enterprise Mtd","default":0.0},"total_mtd":{"type":"number","title":"Total Mtd","default":0.0},"prepaid_time_series":{"items":{"$ref":"#/components/schemas/RevenueDataPoint"},"type":"array","title":"Prepaid Time Series"},"enterprise_time_series":{"items":{"$ref":"#/components/schemas/RevenueDataPoint"},"type":"array","title":"Enterprise Time Series"},"enterprise_daily_time_series":{"items":{"$ref":"#/components/schemas/RevenueDataPoint"},"type":"array","title":"Enterprise Daily Time Series"},"unbilled_time_series":{"items":{"$ref":"#/components/schemas/RevenueDataPoint"},"type":"array","title":"Unbilled Time Series"},"mrr_trend":{"items":{"$ref":"#/components/schemas/MRRDataPoint"},"type":"array","title":"Mrr Trend"}},"type":"object","title":"RevenueBreakdown","description":"Comprehensive revenue breakdown for admin dashboard."},"RevenueDataPoint":{"properties":{"timestamp":{"type":"string","title":"Timestamp"},"amount":{"type":"number","title":"Amount","default":0.0}},"type":"object","required":["timestamp"],"title":"RevenueDataPoint","description":"Single revenue data point for time series."},"RoleResponse":{"properties":{"role":{"type":"string","title":"Role","description":"User role: user, admin, support"},"is_admin":{"type":"boolean","title":"Is Admin","description":"Whether user is admin or support"},"account_type":{"type":"string","title":"Account Type","description":"Account type: user or enterprise"}},"type":"object","required":["role","is_admin","account_type"],"title":"RoleResponse","description":"Response for /profile/role endpoint."},"SampleText":{"properties":{"name":{"type":"string","title":"Name"},"text":{"type":"string","title":"Text"}},"type":"object","required":["name","text"],"title":"SampleText","description":"Sample text for demo interface."},"Source":{"type":"string","enum":["demo","extension","sdk:python","sdk:typescript","sdk:curl","gateway:unknown","gateway:anthropic","gateway:openai","gateway:gemini"],"title":"Source","description":"Source of API request with detail.\n\nFormat: source[:detail]\n- demo, extension: no detail needed\n- sdk:python, sdk:typescript, sdk:curl\n- gateway:anthropic, gateway:openai, gateway:gemini"},"TelemetryBatchRequest":{"properties":{"batch_id":{"type":"string","title":"Batch Id","description":"Unique batch ID (UUID)"},"instance_id":{"type":"string","title":"Instance Id","description":"On-prem instance ID (UUID)"},"events":{"items":{"$ref":"#/components/schemas/TelemetryEvent"},"type":"array","maxItems":100,"minItems":1,"title":"Events","description":"List of telemetry events (max 100 per batch)"},"identity":{"anyOf":[{"$ref":"#/components/schemas/IdentityManifest"},{"type":"null"}],"description":"Signed on-prem identity manifest. Optional — older on-prem builds (< 1.1.0) don't send it. When present, the platform logs identity changes (instance_id or created_at moving) for audit. Future versions will block on mismatch."},"signing_secret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signing Secret","description":"Signing secret for HMAC verification (include on first request only)"}},"additionalProperties":true,"type":"object","required":["batch_id","instance_id","events"],"title":"TelemetryBatchRequest","description":"Batch of telemetry events from on-prem instance."},"TelemetryBatchResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Whether batch was accepted"},"batch_id":{"type":"string","title":"Batch Id","description":"Echo of batch ID"},"events_received":{"type":"integer","title":"Events Received","description":"Number of events received"},"events_stored":{"type":"integer","title":"Events Stored","description":"Number of events stored"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"Additional message"}},"type":"object","required":["success","batch_id","events_received","events_stored"],"title":"TelemetryBatchResponse","description":"Response to telemetry batch upload."},"TelemetryErrorResponse":{"properties":{"success":{"type":"boolean","title":"Success","description":"Always false for errors","default":false},"error":{"type":"string","title":"Error","description":"Error message"},"error_code":{"type":"string","title":"Error Code","description":"Error code for debugging"}},"type":"object","required":["error","error_code"],"title":"TelemetryErrorResponse","description":"Error response for telemetry batch upload."},"TelemetryEvent":{"properties":{"event_id":{"type":"string","title":"Event Id","description":"Unique event ID (UUID)"},"timestamp":{"type":"string","title":"Timestamp","description":"Event timestamp (ISO8601)"},"event_type":{"type":"string","title":"Event Type","description":"Event type (compression, error, startup, shutdown)"},"model_name":{"type":"string","title":"Model Name","description":"Compression model used"},"original_tokens":{"type":"integer","maximum":1000000.0,"minimum":0.0,"title":"Original Tokens","description":"Original token count","default":0},"compressed_tokens":{"type":"integer","maximum":1000000.0,"minimum":0.0,"title":"Compressed Tokens","description":"Compressed token count","default":0},"tokens_saved":{"type":"integer","maximum":1000000.0,"minimum":0.0,"title":"Tokens Saved","description":"Tokens saved (original - compressed)","default":0},"duration_ms":{"type":"integer","maximum":3600000.0,"minimum":0.0,"title":"Duration Ms","description":"Processing duration in milliseconds (max 1h)","default":0},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata","description":"Additional metadata (max 10KB, 50 keys, 3 levels deep)"},"event_hmac":{"anyOf":[{"type":"string","pattern":"^[a-f0-9]{64}$"},{"type":"null"}],"title":"Event Hmac","description":"Per-event HMAC-SHA256(api_key, canonical_event_bytes) computed by on-prem at insert time. Optional — older on-prem builds don't send it. The platform rejects events whose tag doesn't verify."}},"additionalProperties":true,"type":"object","required":["event_id","timestamp","event_type","model_name"],"title":"TelemetryEvent","description":"Single telemetry event from on-prem instance.\n\nThe optional ``event_hmac`` field is the per-event integrity tag computed\nby the on-prem instance at insert time using HMAC-SHA256(api_key, canonical_event_bytes).\nOlder on-prem builds (< 1.1.0) don't send it; newer builds always do. The\nplatform verifies it server-side and rejects events with a bad tag —\nclosing the in-flight SQLite tamper window."},"TierInfo":{"properties":{"name":{"type":"string","title":"Name","description":"Tier identifier: tier1, tier2, tier3, tier4, tier5"},"display_name":{"type":"string","title":"Display Name","description":"Human-readable tier name"},"min_monthly_tokens":{"type":"integer","title":"Min Monthly Tokens","description":"Minimum monthly compressed tokens to reach this tier"},"max_api_keys":{"type":"integer","title":"Max Api Keys","description":"Maximum API keys allowed"},"fee_percentage":{"type":"number","title":"Fee Percentage","description":"Service fee percentage"},"rate_limits":{"$ref":"#/components/schemas/TierRateLimits"}},"type":"object","required":["name","display_name","min_monthly_tokens","max_api_keys","fee_percentage","rate_limits"],"title":"TierInfo","description":"Tier information with all details."},"TierName":{"type":"string","enum":["tier1","tier2","tier3","tier4","tier5"],"title":"TierName","description":"Rate-limit tier names (based on monthly compressed tokens)."},"TierRateLimits":{"properties":{"rpm":{"type":"integer","title":"Rpm","description":"Requests Per Minute"},"tpm":{"type":"integer","title":"Tpm","description":"Tokens Per Minute"},"rpd":{"type":"integer","title":"Rpd","description":"Requests Per Day"}},"type":"object","required":["rpm","tpm","rpd"],"title":"TierRateLimits","description":"Rate limiting configuration for a tier."},"TiersResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"tiers":{"items":{"$ref":"#/components/schemas/TierInfo"},"type":"array","title":"Tiers","default":[]}},"type":"object","title":"TiersResponse","description":"Response for tier information."},"TimeSeriesDataPoint":{"properties":{"timestamp":{"type":"string","title":"Timestamp","description":"ISO timestamp"},"requests":{"type":"integer","title":"Requests","description":"Number of requests","default":0},"input_tokens":{"type":"integer","title":"Input Tokens","description":"Original input tokens","default":0},"compressed_input_tokens":{"type":"integer","title":"Compressed Input Tokens","description":"Compressed input tokens","default":0},"output_tokens":{"type":"integer","title":"Output Tokens","description":"Output tokens","default":0},"cost_usd":{"type":"number","title":"Cost Usd","description":"Cost in USD","default":0.0},"savings_usd":{"type":"number","title":"Savings Usd","description":"Savings in USD","default":0.0}},"type":"object","required":["timestamp"],"title":"TimeSeriesDataPoint","description":"Single data point in time series."},"ToolDefinition":{"properties":{"name":{"type":"string","title":"Name","description":"Unique tool name"},"description":{"type":"string","title":"Description","description":"Tool description","default":""},"parameters":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Parameters","description":"JSON schema for tool parameters"}},"type":"object","required":["name"],"title":"ToolDefinition","description":"Definition of a tool for discovery."},"ToolDiscoveryBatchRequest":{"properties":{"inputs":{"items":{"$ref":"#/components/schemas/ToolDiscoveryRequest"},"type":"array","maxItems":100,"minItems":1,"title":"Inputs"}},"type":"object","required":["inputs"],"title":"ToolDiscoveryBatchRequest","description":"Batch request for tool discovery compression."},"ToolDiscoveryRequest":{"properties":{"query":{"type":"string","minLength":1,"title":"Query","description":"User's query to find relevant tools (REQUIRED)"},"tools":{"items":{"$ref":"#/components/schemas/ToolDefinition"},"type":"array","minItems":1,"title":"Tools","description":"All available tools"},"max_tools":{"type":"integer","maximum":50.0,"minimum":1.0,"title":"Max Tools","description":"Maximum number of tools to return (default: 5)","default":5},"always_keep":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Always Keep","description":"Tool names to always include in results"},"compression_model_name":{"type":"string","title":"Compression Model Name","description":"Compression model to use (e.g., 'tdc_espresso')"},"source":{"anyOf":[{"$ref":"#/components/schemas/Source"},{"type":"null"}],"description":"Source of request: demo, extension, sdk:<client>, gateway:<provider>"}},"type":"object","required":["query","tools","compression_model_name"],"title":"ToolDiscoveryRequest","description":"Request to discover relevant tools.\n\nBackbone: SaT (conversion happens in compressor layer)\n- chunks = tool descriptions\n- query = user's query\n- output = filtered list of relevant tool names"},"ToolDiscoveryResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"data":{"anyOf":[{"$ref":"#/components/schemas/ToolDiscoveryResult"},{"type":"null"}]}},"type":"object","title":"ToolDiscoveryResponse","description":"Response for tool discovery."},"ToolDiscoveryResult":{"properties":{"relevant_tools":{"items":{"type":"string"},"type":"array","title":"Relevant Tools","description":"Names of relevant tools"},"tool_count":{"type":"integer","title":"Tool Count","description":"Number of tools returned"},"original_tool_count":{"type":"integer","title":"Original Tool Count","description":"Number of tools in input"},"reasoning":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reasoning","description":"Why these tools were selected"},"duration_ms":{"type":"integer","title":"Duration Ms","description":"Processing time in milliseconds","default":0}},"type":"object","required":["relevant_tools","tool_count","original_tool_count"],"title":"ToolDiscoveryResult","description":"Result of tool discovery."},"ToolOutputBatchRequest":{"properties":{"inputs":{"items":{"$ref":"#/components/schemas/ToolOutputCompressRequest"},"type":"array","maxItems":100,"minItems":1,"title":"Inputs"}},"type":"object","required":["inputs"],"title":"ToolOutputBatchRequest","description":"Batch request for tool output compression."},"ToolOutputCompressRequest":{"properties":{"tool_output":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"title":"Tool Output","description":"Tool output to compress - single string or list of strings"},"query":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Query","description":"User's query for context-aware compression (required for GemFilter, prohibited for Lingua)"},"tool_name":{"type":"string","title":"Tool Name","description":"Name of the tool that produced the output"},"compression_model_name":{"type":"string","title":"Compression Model Name","description":"Compression model to use (e.g., 'toc_latte' or 'toc_americano')"},"target_compression_ratio":{"type":"number","maximum":200.0,"minimum":0.0,"title":"Target Compression Ratio","description":"Target compression ratio: 0-1 (strength) or >1 for factor. Max 200. Default: 0.5","default":0.5},"source":{"anyOf":[{"$ref":"#/components/schemas/Source"},{"type":"null"}],"description":"Source of request: demo, extension, sdk:<client>, gateway:<provider>"}},"type":"object","required":["tool_output","tool_name","compression_model_name"],"title":"ToolOutputCompressRequest","description":"Request to compress tool output.\n\nAccepts tool_output as either:\n- str: Single tool output\n- List[str]: Multiple tool outputs (output type matches input type)\n\nBackbone mapping (conversion happens in compressor layer):\n- Lingua models (toc_americano): query PROHIBITED\n- GemFilter models (toc_latte): query REQUIRED"},"ToolOutputCompressResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"data":{"anyOf":[{"$ref":"#/components/schemas/ToolOutputCompressResult"},{"type":"null"}]}},"type":"object","title":"ToolOutputCompressResponse","description":"Response for tool output compression."},"ToolOutputCompressResult":{"properties":{"compressed_output":{"anyOf":[{"type":"string"},{"items":{"type":"string"},"type":"array"}],"title":"Compressed Output","description":"Compressed tool output - same type as input"},"original_tokens":{"type":"integer","title":"Original Tokens","description":"Token count of original output"},"compressed_tokens":{"type":"integer","title":"Compressed Tokens","description":"Token count after compression"},"compression_ratio":{"type":"number","title":"Compression Ratio","description":"Actual compression ratio achieved"},"tool_name":{"type":"string","title":"Tool Name","description":"Name of the tool"},"duration_ms":{"type":"integer","title":"Duration Ms","description":"Processing time in milliseconds","default":0}},"type":"object","required":["compressed_output","original_tokens","compressed_tokens","compression_ratio","tool_name"],"title":"ToolOutputCompressResult","description":"Result of tool output compression - output type matches input type."},"Transaction":{"properties":{"id":{"type":"string","title":"Id"},"type":{"type":"string","enum":["money_upload","free_trial","refund","adjustment"],"title":"Type","description":"money_upload, free_trial, refund, adjustment"},"amount_usd":{"type":"number","title":"Amount Usd","description":"Amount in USD"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"status":{"type":"string","enum":["completed","pending","failed","refunded"],"title":"Status","description":"completed, pending, failed, refunded"},"payment_provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Provider"},"payment_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Id"},"payment_method_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Method Type","description":"card, apple_pay, google_pay, link, etc."},"card_brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Card Brand","description":"visa, mastercard, amex, etc."},"card_last4":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Card Last4","description":"Last 4 digits of card"},"receipt_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Receipt Url","description":"Stripe receipt/invoice URL"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","type","amount_usd","status","created_at"],"title":"Transaction","description":"Money upload transaction info."},"TransactionResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"data":{"anyOf":[{"items":{"$ref":"#/components/schemas/Transaction"},"type":"array"},{"$ref":"#/components/schemas/Transaction"},{"type":"null"}],"title":"Data"}},"type":"object","title":"TransactionResponse","description":"Response for transaction(s)."},"UsageBreakdown":{"properties":{"name":{"type":"string","title":"Name"},"count":{"type":"integer","title":"Count","default":0},"tokens":{"type":"integer","title":"Tokens","default":0},"cost_usd":{"type":"number","title":"Cost Usd","default":0.0}},"type":"object","required":["name"],"title":"UsageBreakdown","description":"Usage breakdown by request type or model."},"UsageStatsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"data":{"anyOf":[{"$ref":"#/components/schemas/UsageStatsResult"},{"type":"null"}]}},"type":"object","title":"UsageStatsResponse","description":"Response for usage statistics."},"UsageStatsResult":{"properties":{"period":{"type":"string","title":"Period","description":"Time period (last_day, last_week, etc.)"},"period_start":{"type":"string","title":"Period Start","description":"Start of period (ISO)"},"period_end":{"type":"string","title":"Period End","description":"End of period (ISO)"},"group_by":{"type":"string","title":"Group By","description":"Grouping: hour or day"},"time_series":{"items":{"$ref":"#/components/schemas/TimeSeriesDataPoint"},"type":"array","title":"Time Series","description":"Time series data points"},"total_requests":{"type":"integer","title":"Total Requests","description":"Total number of requests","default":0},"total_input_tokens":{"type":"integer","title":"Total Input Tokens","description":"Total original input tokens","default":0},"total_compressed_input_tokens":{"type":"integer","title":"Total Compressed Input Tokens","description":"Total compressed input tokens","default":0},"total_output_tokens":{"type":"integer","title":"Total Output Tokens","description":"Total output tokens","default":0},"total_cost_usd":{"type":"number","title":"Total Cost Usd","description":"Total cost in USD","default":0.0},"total_savings_usd":{"type":"number","title":"Total Savings Usd","description":"Total savings in USD","default":0.0},"total_spent_usd":{"type":"number","title":"Total Spent Usd","description":"Total amount spent in USD","default":0.0},"api_key_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key Id","description":"Filtered by API key ID"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model","description":"Filtered by model"},"per_key_time_series":{"anyOf":[{"additionalProperties":{"items":{"$ref":"#/components/schemas/TimeSeriesDataPoint"},"type":"array"},"type":"object"},{"type":"null"}],"title":"Per Key Time Series","description":"Per-API-key time series, keyed by api_token_id. Set when include_per_key=true."}},"type":"object","required":["period","period_start","period_end","group_by"],"title":"UsageStatsResult","description":"Comprehensive usage statistics result with time series."},"UserAPIKeyInfo":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"scope":{"$ref":"#/components/schemas/APIKeyScope"},"status":{"$ref":"#/components/schemas/APIKeyStatus"},"key_preview":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Key Preview"},"total_requests":{"type":"integer","title":"Total Requests","default":0},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"daily_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Daily Limit"},"daily_requests_remaining":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Daily Requests Remaining"},"budget_limit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Budget Limit"},"budget_used_this_month":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Budget Used This Month"}},"type":"object","required":["id","name","scope","status"],"title":"UserAPIKeyInfo","description":"API key summary for user analytics."},"UserAnalyticsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"user_id":{"type":"string","title":"User Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"tier":{"$ref":"#/components/schemas/TierName","default":"tier1"},"role":{"type":"string","enum":["user","admin","support"],"title":"Role","default":"user"},"account_type":{"$ref":"#/components/schemas/AccountType","default":"user"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"last_login":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Login"},"prepaid_added":{"type":"number","title":"Prepaid Added","default":0.0},"prepaid_spent":{"type":"number","title":"Prepaid Spent","default":0.0},"prepaid_balance":{"type":"number","title":"Prepaid Balance","default":0.0},"monthly_budget":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Monthly Budget"},"spend_this_month":{"type":"number","title":"Spend This Month","default":0.0},"postpaid_paid":{"type":"number","title":"Postpaid Paid","default":0.0},"postpaid_unpaid":{"type":"number","title":"Postpaid Unpaid","default":0.0},"postpaid_current_month":{"type":"number","title":"Postpaid Current Month","default":0.0},"total_requests":{"type":"integer","title":"Total Requests","default":0},"api_calls_this_month":{"type":"integer","title":"Api Calls This Month","default":0},"total_input_tokens":{"type":"integer","title":"Total Input Tokens","default":0},"total_output_tokens":{"type":"integer","title":"Total Output Tokens","default":0},"total_tokens_saved":{"type":"integer","title":"Total Tokens Saved","default":0},"avg_compression_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Compression Ratio"},"avg_latency_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Avg Latency Ms"},"median_latency_ms":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Median Latency Ms"},"api_keys":{"items":{"$ref":"#/components/schemas/UserAPIKeyInfo"},"type":"array","title":"Api Keys","default":[]},"active_api_keys":{"type":"integer","title":"Active Api Keys","default":0},"usage_by_model":{"items":{"$ref":"#/components/schemas/UsageBreakdown"},"type":"array","title":"Usage By Model","default":[]},"usage_by_type":{"items":{"$ref":"#/components/schemas/UsageBreakdown"},"type":"array","title":"Usage By Type","default":[]},"usage_by_source":{"items":{"$ref":"#/components/schemas/UsageBreakdown"},"type":"array","title":"Usage By Source","default":[]},"last_request_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Request At"},"outcomes_30d":{"additionalProperties":{"type":"integer"},"type":"object","title":"Outcomes 30D","default":{}},"requests_succeeded_30d":{"type":"integer","title":"Requests Succeeded 30D","default":0},"requests_skipped_30d":{"type":"integer","title":"Requests Skipped 30D","default":0},"requests_rejected_30d":{"type":"integer","title":"Requests Rejected 30D","default":0},"requests_errored_30d":{"type":"integer","title":"Requests Errored 30D","default":0}},"type":"object","required":["user_id"],"title":"UserAnalyticsResponse","description":"Detailed user analytics for admin view."},"UserBasic":{"properties":{"user_id":{"type":"string","title":"User Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country"},"role":{"type":"string","enum":["user","admin","support"],"title":"Role","default":"user"},"tier":{"$ref":"#/components/schemas/TierName","default":"tier1"},"account_type":{"$ref":"#/components/schemas/AccountType","default":"user"},"prepaid_added":{"type":"number","title":"Prepaid Added","default":0.0},"prepaid_balance":{"type":"number","title":"Prepaid Balance","default":0.0},"prepaid_spent":{"type":"number","title":"Prepaid Spent","default":0.0},"postpaid_paid":{"type":"number","title":"Postpaid Paid","default":0.0},"postpaid_unpaid":{"type":"number","title":"Postpaid Unpaid","default":0.0},"postpaid_current_month":{"type":"number","title":"Postpaid Current Month","default":0.0},"total_requests":{"type":"integer","title":"Total Requests","default":0},"total_tokens":{"type":"integer","title":"Total Tokens","default":0},"requests_rejected_30d":{"type":"integer","title":"Requests Rejected 30D","default":0},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"last_login":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Login"}},"type":"object","required":["user_id"],"title":"UserBasic","description":"Basic user info for admin list - Redesigned billing structure.\n\n4 Column Groups:\n1. User Info: name, email, account_type, tier\n2. Prepaid (Credits): added, balance, spent\n3. Postpaid (Invoices): paid, unpaid, current_month\n4. Usage: requests, tokens, latency"},"UserDetailsResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"user_id":{"type":"string","title":"User Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name"},"tier":{"$ref":"#/components/schemas/TierName","default":"tier1"},"prepaid_spent":{"type":"number","title":"Prepaid Spent","default":0.0},"prepaid_added":{"type":"number","title":"Prepaid Added","default":0.0},"prepaid_balance":{"type":"number","title":"Prepaid Balance","default":0.0},"role":{"type":"string","enum":["user","admin","support"],"title":"Role","default":"user"},"account_type":{"$ref":"#/components/schemas/AccountType","default":"user"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"},"last_login":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Login"}},"type":"object","required":["user_id"],"title":"UserDetailsResponse"},"UserListResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"users":{"items":{"$ref":"#/components/schemas/UserBasic"},"type":"array","title":"Users","default":[]},"total":{"type":"integer","title":"Total","default":0},"page":{"type":"integer","title":"Page","default":1},"limit":{"type":"integer","title":"Limit","default":50},"tier_distribution":{"additionalProperties":{"type":"integer"},"type":"object","title":"Tier Distribution","default":{}},"admin_count":{"type":"integer","title":"Admin Count","default":0}},"type":"object","title":"UserListResponse","description":"User list for admin."},"UserUpdateRequest":{"properties":{"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name","description":"Full name"},"company_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Company Name","description":"Company name"},"country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Country","description":"Country"},"tier":{"anyOf":[{"$ref":"#/components/schemas/TierName"},{"type":"null"}],"description":"New rate-limit tier"},"current_remaining_credits":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":0.0},{"type":"null"}],"title":"Current Remaining Credits","description":"Set user balance/credits (must be finite, non-negative, max $100k)"}},"type":"object","title":"UserUpdateRequest","description":"Request to update 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"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"WebhookResponse":{"properties":{"received":{"type":"boolean","title":"Received","default":true},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","title":"WebhookResponse","description":"Response for Stripe webhook endpoint."},"WsCallbackRequest":{"properties":{"ws_session":{"type":"string","title":"Ws Session"},"state":{"type":"string","title":"State"}},"type":"object","required":["ws_session","state"],"title":"WsCallbackRequest","description":"Request body for WebSocket callback."},"WsCallbackResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"message":{"type":"string","title":"Message"}},"type":"object","required":["success","message"],"title":"WsCallbackResponse","description":"Response for WebSocket callback."}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}