{"openapi":"3.1.0","info":{"title":"HappyCaption API","description":"Professional subtitle generation API - Transcription, Translation, and Export","version":"0.1.0"},"paths":{"/api/auth/login":{"post":{"tags":["auth"],"summary":"Login","description":"登录或注册（合一）\n\n- 用户名存在：验证密码，成功返回 token\n- 用户名不存在：自动创建账户并返回 token","operationId":"login_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/me":{"get":{"tags":["auth"],"summary":"Get Me","description":"获取当前用户信息","operationId":"get_me_api_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","description":"退出登录（语义化端点）\n\n实际的 token 失效由前端清除 localStorage 实现","operationId":"logout_api_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/tasks":{"get":{"tags":["tasks"],"summary":"List Tasks","operationId":"list_tasks_api_tasks_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response List Tasks Api Tasks Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["tasks"],"summary":"Create Task","description":"创建任务：\n- 有文件配额：立即启动处理\n- 无文件配额：返回 pending_payment，等待按次支付","operationId":"create_task_api_tasks_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_create_task_api_tasks_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tasks/translate-srt":{"post":{"tags":["tasks"],"summary":"Translate Srt Task","description":"SRT 直传翻译任务（2 步）：\n1) 背景提取（含术语确认/译前搜索）\n2) 翻译","operationId":"translate_srt_task_api_tasks_translate_srt_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_translate_srt_task_api_tasks_translate_srt_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/tasks/upload/init":{"post":{"tags":["tasks"],"summary":"Init Chunked Upload","operationId":"init_chunked_upload_api_tasks_upload_init_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_init_chunked_upload_api_tasks_upload_init_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Init Chunked Upload Api Tasks Upload Init Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/tasks/{task_id}/upload/chunk":{"post":{"tags":["tasks"],"summary":"Upload Chunk","operationId":"upload_chunk_api_tasks__task_id__upload_chunk_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_chunk_api_tasks__task_id__upload_chunk_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Upload Chunk Api Tasks  Task Id  Upload Chunk Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tasks/{task_id}/upload/status":{"get":{"tags":["tasks"],"summary":"Get Upload Status","operationId":"get_upload_status_api_tasks__task_id__upload_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Get Upload Status Api Tasks  Task Id  Upload Status Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tasks/{task_id}/upload/complete":{"post":{"tags":["tasks"],"summary":"Complete Chunked Upload","operationId":"complete_chunked_upload_api_tasks__task_id__upload_complete_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tasks/quota/start":{"post":{"tags":["tasks"],"summary":"Start Tasks With Quota","description":"套餐到账后，原子校验并扣减配额，再恢复一个或多个待支付任务。","operationId":"start_tasks_with_quota_api_tasks_quota_start_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StartTasksWithQuotaRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Start Tasks With Quota Api Tasks Quota Start Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/tasks/{task_id}/pay":{"post":{"tags":["tasks"],"summary":"Pay For Task","description":"为 pending_payment 任务创建虎皮椒支付宝订单。","operationId":"pay_for_task_api_tasks__task_id__pay_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Pay For Task Api Tasks  Task Id  Pay Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tasks/pay/batch":{"post":{"tags":["tasks"],"summary":"Pay For Tasks Batch","description":"为多个 pending_payment 任务创建单个虎皮椒支付宝订单。","operationId":"pay_for_tasks_batch_api_tasks_pay_batch_post","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Pay For Tasks Batch Api Tasks Pay Batch Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/tasks/{task_id}/start":{"post":{"tags":["tasks"],"summary":"Start Paid Task","description":"前端确认已付费后调用，启动任务处理。","operationId":"start_paid_task_api_tasks__task_id__start_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tasks/processing-count":{"get":{"tags":["tasks"],"summary":"Get Processing Count","operationId":"get_processing_count_api_tasks_processing_count_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/tasks/active-count":{"get":{"tags":["tasks"],"summary":"Get Active Count","operationId":"get_active_count_api_tasks_active_count_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}},"security":[{"HTTPBearer":[]}]}},"/api/tasks/{task_id}":{"get":{"tags":["tasks"],"summary":"Get Task Status","operationId":"get_task_status_api_tasks__task_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["tasks"],"summary":"Delete Task","operationId":"delete_task_api_tasks__task_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tasks/{task_id}/cancel":{"patch":{"tags":["tasks"],"summary":"Cancel Task","operationId":"cancel_task_api_tasks__task_id__cancel_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tasks/{task_id}/subtitles":{"get":{"tags":["tasks"],"summary":"Get Task Subtitles","operationId":"get_task_subtitles_api_tasks__task_id__subtitles_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tasks/{task_id}/files/{filename}":{"get":{"tags":["tasks"],"summary":"Download Subtitle File","operationId":"download_subtitle_file_api_tasks__task_id__files__filename__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}},{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tasks/{task_id}/terminology":{"get":{"tags":["terminology"],"summary":"Get Terminology","description":"获取任务的术语表\n\nArgs:\n    task_id: 任务ID\n    current_user: 当前用户\n\nReturns:\n    术语表 + 剩余超时时间","operationId":"get_terminology_api_tasks__task_id__terminology_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TerminologyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["terminology"],"summary":"Submit Terminology","description":"提交用户的术语决策\n\nArgs:\n    task_id: 任务ID\n    data: 术语决策数据\n    current_user: 当前用户\n\nReturns:\n    成功消息","operationId":"submit_terminology_api_tasks__task_id__terminology_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TerminologySubmit"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["terminology"],"summary":"Extend Terminology Timeout","description":"延长术语确认超时时间（用户编辑术语时调用）","operationId":"extend_terminology_timeout_api_tasks__task_id__terminology_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TerminologyTimeoutResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tasks/{task_id}/terminology/cancel":{"post":{"tags":["terminology"],"summary":"Cancel Terminology","description":"取消术语确认，任务标记为失败\n\nArgs:\n    task_id: 任务ID\n    current_user: 当前用户\n    db: 数据库会话\n\nReturns:\n    成功消息","operationId":"cancel_terminology_api_tasks__task_id__terminology_cancel_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/users/me/language":{"patch":{"tags":["users"],"summary":"Update Language","description":"更新用户语言偏好","operationId":"update_language_api_users_me_language_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LanguageUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/api-keys":{"get":{"tags":["API Keys"],"summary":"List Api Keys","description":"列出用户的所有 API Keys（包含完整密钥）","operationId":"list_api_keys_api_api_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ApiKeyResponse"},"type":"array","title":"Response List Api Keys Api Api Keys Get"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["API Keys"],"summary":"Create Api Key","description":"创建新的 API Key","operationId":"create_api_key_api_api_keys_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/api-keys/{key_id}":{"delete":{"tags":["API Keys"],"summary":"Delete Api Key","description":"删除 API Key","operationId":"delete_api_key_api_api_keys__key_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"integer","title":"Key Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/process":{"post":{"tags":["API v1"],"summary":"Process Video Api","description":"API Key 认证的视频处理端点\n- 自动跳过术语表确认\n- 返回任务 ID 和轮询端点","operationId":"process_video_api_api_v1_process_post","parameters":[{"name":"x-api-key","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Api-Key"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_process_video_api_api_v1_process_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProcessVideoResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tasks/{task_id}":{"get":{"tags":["API v1"],"summary":"Get Task Status Api","description":"获取任务状态（API Key 认证）","operationId":"get_task_status_api_api_v1_tasks__task_id__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task 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/TaskStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tasks/{task_id}/files/{filename}":{"get":{"tags":["API v1"],"summary":"Download File Api","description":"API Key 认证的文件下载端点\n- 验证任务所有权\n- 返回字幕文件（SRT/ASS/VTT/ZIP）","operationId":"download_file_api_api_v1_tasks__task_id__files__filename__get","parameters":[{"name":"task_id","in":"path","required":true,"schema":{"type":"string","title":"Task Id"}},{"name":"filename","in":"path","required":true,"schema":{"type":"string","title":"Filename"}},{"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"}}}}}}},"/api/subscriptions/products":{"get":{"tags":["subscriptions"],"summary":"Get Products List","operationId":"get_products_list_api_subscriptions_products_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProductsListResponse"}}}}}}},"/api/subscriptions/current":{"get":{"tags":["subscriptions"],"summary":"Get Current Quota","operationId":"get_current_quota_api_subscriptions_current_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserQuotaResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/subscriptions/checkout":{"post":{"tags":["subscriptions"],"summary":"Create Checkout","operationId":"create_checkout_api_subscriptions_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/subscriptions/payments":{"get":{"tags":["subscriptions"],"summary":"Get Payment History","operationId":"get_payment_history_api_subscriptions_payments_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/PaymentHistoryItem"},"title":"Response Get Payment History Api Subscriptions Payments Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/subscriptions/xunhu/checkout":{"post":{"tags":["subscriptions"],"summary":"Create Xunhu Checkout","operationId":"create_xunhu_checkout_api_subscriptions_xunhu_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/XunhuCheckoutResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/quota/current":{"get":{"tags":["quota"],"summary":"Get Current Quota","operationId":"get_current_quota_api_quota_current_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QuotaResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/quota/history":{"get":{"tags":["quota"],"summary":"Get Usage History","operationId":"get_usage_history_api_quota_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"months","in":"query","required":false,"schema":{"type":"integer","default":6,"title":"Months"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UsageHistoryItem"},"title":"Response Get Usage History Api Quota History Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/webhooks/creem":{"post":{"tags":["webhooks"],"summary":"Creem Webhook","operationId":"creem_webhook_api_webhooks_creem_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/webhooks/xunhupay":{"post":{"tags":["webhooks"],"summary":"Xunhupay Webhook","operationId":"xunhupay_webhook_api_webhooks_xunhupay_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/admin/stats":{"get":{"tags":["admin"],"summary":"Get Stats","description":"获取系统统计数据","operationId":"get_stats_api_admin_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatsResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/api/admin/users":{"get":{"tags":["admin"],"summary":"List Users","description":"获取用户列表","operationId":"list_users_api_admin_users_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/users/{user_id}":{"patch":{"tags":["admin"],"summary":"Update User","description":"更新用户信息","operationId":"update_user_api_admin_users__user_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/tasks":{"get":{"tags":["admin"],"summary":"List Tasks","description":"获取任务列表","operationId":"list_tasks_api_admin_tasks_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/admin/payments":{"get":{"tags":["admin"],"summary":"List Payments","description":"获取支付记录列表","operationId":"list_payments_api_admin_payments_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Page Size"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api":{"get":{"summary":"Api Root","description":"API 根路径","operationId":"api_root_api_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health Check","description":"健康检查","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/":{"get":{"summary":"Root","description":"根路径 - 返回前端首页","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"ApiKeyResponse":{"properties":{"key_id":{"type":"integer","title":"Key Id"},"api_key":{"type":"string","title":"Api Key"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"created_at":{"type":"string","title":"Created At"},"last_used_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Used At"},"is_active":{"type":"boolean","title":"Is Active"}},"type":"object","required":["key_id","api_key","name","created_at","last_used_at","is_active"],"title":"ApiKeyResponse"},"Body_create_task_api_tasks_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code"},"target_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Language","default":"zh"},"translation_tone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Translation Tone"},"tone_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tone Description"},"remove_cn_punctuation":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Remove Cn Punctuation"},"portrait_mode":{"type":"boolean","title":"Portrait Mode","default":false},"ass_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ass Style"}},"type":"object","required":["file"],"title":"Body_create_task_api_tasks_post"},"Body_init_chunked_upload_api_tasks_upload_init_post":{"properties":{"filename":{"type":"string","title":"Filename"},"file_size":{"type":"integer","exclusiveMinimum":0.0,"title":"File Size"},"chunk_size":{"type":"integer","exclusiveMinimum":0.0,"title":"Chunk Size","default":5242880},"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code"},"target_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Language","default":"zh"},"translation_tone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Translation Tone"},"tone_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tone Description"},"remove_cn_punctuation":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Remove Cn Punctuation"},"portrait_mode":{"type":"boolean","title":"Portrait Mode","default":false},"ass_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ass Style"}},"type":"object","required":["filename","file_size"],"title":"Body_init_chunked_upload_api_tasks_upload_init_post"},"Body_process_video_api_api_v1_process_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"language_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Language Code"},"target_language":{"type":"string","title":"Target Language","default":"zh"}},"type":"object","required":["file"],"title":"Body_process_video_api_api_v1_process_post"},"Body_translate_srt_task_api_tasks_translate_srt_post":{"properties":{"file":{"type":"string","format":"binary","title":"File"},"target_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Language","default":"zh"},"translation_tone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Translation Tone"},"tone_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tone Description"},"remove_cn_punctuation":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Remove Cn Punctuation"},"portrait_mode":{"type":"boolean","title":"Portrait Mode","default":false},"ass_style":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ass Style"}},"type":"object","required":["file"],"title":"Body_translate_srt_task_api_tasks_translate_srt_post"},"Body_upload_chunk_api_tasks__task_id__upload_chunk_post":{"properties":{"chunk":{"type":"string","format":"binary","title":"Chunk"},"chunk_index":{"type":"integer","minimum":0.0,"title":"Chunk Index"}},"type":"object","required":["chunk","chunk_index"],"title":"Body_upload_chunk_api_tasks__task_id__upload_chunk_post"},"CheckoutRequest":{"properties":{"product_id":{"type":"string","title":"Product Id"}},"type":"object","required":["product_id"],"title":"CheckoutRequest"},"CheckoutResponse":{"properties":{"checkout_url":{"type":"string","title":"Checkout Url"}},"type":"object","required":["checkout_url"],"title":"CheckoutResponse"},"CreateApiKeyRequest":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"CreateApiKeyRequest"},"CreateApiKeyResponse":{"properties":{"api_key":{"type":"string","title":"Api Key"},"key_id":{"type":"integer","title":"Key Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["api_key","key_id","name","created_at"],"title":"CreateApiKeyResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LanguageUpdate":{"properties":{"language":{"type":"string","title":"Language"}},"type":"object","required":["language"],"title":"LanguageUpdate"},"LoginRequest":{"properties":{"username":{"type":"string","maxLength":50,"minLength":2,"title":"Username"},"password":{"type":"string","maxLength":100,"minLength":4,"title":"Password"}},"type":"object","required":["username","password"],"title":"LoginRequest","description":"登录/注册请求"},"LoginResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"is_new_user":{"type":"boolean","title":"Is New User"},"user":{"$ref":"#/components/schemas/UserResponse"}},"type":"object","required":["access_token","is_new_user","user"],"title":"LoginResponse","description":"登录/注册响应"},"PaymentHistoryItem":{"properties":{"id":{"type":"integer","title":"Id"},"amount":{"type":"number","title":"Amount"},"currency":{"type":"string","title":"Currency"},"quota_files_added":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quota Files Added"},"status":{"type":"string","title":"Status"},"created_at":{"type":"string","title":"Created At"}},"type":"object","required":["id","amount","currency","quota_files_added","status","created_at"],"title":"PaymentHistoryItem"},"ProcessStep":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"description":{"type":"string","title":"Description"},"status":{"type":"string","title":"Status"},"progress":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Progress"}},"type":"object","required":["id","name","description","status"],"title":"ProcessStep","description":"处理步骤"},"ProcessVideoResponse":{"properties":{"task_id":{"type":"string","title":"Task Id"},"status":{"type":"string","title":"Status"},"poll_url":{"type":"string","title":"Poll Url"},"message":{"type":"string","title":"Message"}},"type":"object","required":["task_id","status","poll_url","message"],"title":"ProcessVideoResponse"},"ProductResponse":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"price":{"type":"number","title":"Price"},"price_cny":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Price Cny"},"currency":{"type":"string","title":"Currency"},"quota_files":{"type":"integer","title":"Quota Files"},"featured":{"type":"boolean","title":"Featured"}},"type":"object","required":["id","name","price","currency","quota_files","featured"],"title":"ProductResponse"},"ProductsListResponse":{"properties":{"products":{"items":{"$ref":"#/components/schemas/ProductResponse"},"type":"array","title":"Products"},"free_files":{"type":"integer","title":"Free Files"}},"type":"object","required":["products","free_files"],"title":"ProductsListResponse"},"QuotaResponse":{"properties":{"total_files":{"type":"integer","title":"Total Files"},"used_files":{"type":"integer","title":"Used Files"},"remaining_files":{"type":"integer","title":"Remaining Files"},"usage_percentage":{"type":"number","title":"Usage Percentage"}},"type":"object","required":["total_files","used_files","remaining_files","usage_percentage"],"title":"QuotaResponse"},"StartTasksWithQuotaRequest":{"properties":{"task_ids":{"items":{"type":"string"},"type":"array","title":"Task Ids"}},"type":"object","required":["task_ids"],"title":"StartTasksWithQuotaRequest"},"StatsResponse":{"properties":{"total_users":{"type":"integer","title":"Total Users"},"active_users":{"type":"integer","title":"Active Users"},"total_tasks":{"type":"integer","title":"Total Tasks"},"completed_tasks":{"type":"integer","title":"Completed Tasks"},"total_usage_files":{"type":"integer","title":"Total Usage Files"},"total_quota_files":{"type":"integer","title":"Total Quota Files"}},"type":"object","required":["total_users","active_users","total_tasks","completed_tasks","total_usage_files","total_quota_files"],"title":"StatsResponse"},"SubtitleFile":{"properties":{"name":{"type":"string","title":"Name"},"type":{"$ref":"#/components/schemas/SubtitleType"},"language":{"$ref":"#/components/schemas/SubtitleLanguage"},"url":{"type":"string","title":"Url"}},"type":"object","required":["name","type","language","url"],"title":"SubtitleFile","description":"字幕文件信息"},"SubtitleLanguage":{"type":"string","enum":["en","zh","bilingual"],"title":"SubtitleLanguage","description":"字幕语言"},"SubtitleType":{"type":"string","enum":["srt","ass","vtt","zip"],"title":"SubtitleType","description":"字幕类型"},"TaskResponse":{"properties":{"task_id":{"type":"string","title":"Task Id"},"status":{"$ref":"#/components/schemas/TaskStatus"},"steps":{"items":{"$ref":"#/components/schemas/ProcessStep"},"type":"array","title":"Steps"},"current_step":{"type":"integer","title":"Current Step"},"video_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Video Name"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Duration"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"subtitles":{"items":{"$ref":"#/components/schemas/SubtitleFile"},"type":"array","title":"Subtitles","default":[]},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"payment_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Status","default":"none"},"payg_price_cny":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Payg Price Cny"},"quota_credits_required":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quota Credits Required","default":1},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["task_id","status","steps","current_step","created_at","updated_at"],"title":"TaskResponse","description":"任务响应"},"TaskStatus":{"type":"string","enum":["pending","queued","dispatching","pending_payment","uploading","transcribing","extracting","generating","translating","completed","error","timeout","cancelled","waiting_user_input","processing"],"title":"TaskStatus","description":"任务状态枚举"},"TaskStatusResponse":{"properties":{"task_id":{"type":"string","title":"Task Id"},"status":{"type":"string","title":"Status"},"progress":{"type":"integer","title":"Progress"},"created_at":{"type":"string","title":"Created At"},"downloads":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Downloads"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["task_id","status","progress","created_at"],"title":"TaskStatusResponse"},"TerminologyResponse":{"properties":{"terms":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Terms"},"extraction_source":{"items":{"type":"string"},"type":"array","title":"Extraction Source"},"created_at":{"type":"string","title":"Created At"},"timeout_at":{"type":"string","title":"Timeout At"},"remaining_seconds":{"type":"integer","title":"Remaining Seconds"}},"type":"object","required":["terms","extraction_source","created_at","timeout_at","remaining_seconds"],"title":"TerminologyResponse","description":"术语表响应"},"TerminologySubmit":{"properties":{"terms":{"items":{"$ref":"#/components/schemas/TerminologyTerm"},"type":"array","title":"Terms"}},"type":"object","required":["terms"],"title":"TerminologySubmit","description":"术语确认提交"},"TerminologyTerm":{"properties":{"term":{"type":"string","title":"Term"},"category":{"type":"string","title":"Category"},"context":{"type":"string","title":"Context"},"suggestion":{"type":"string","title":"Suggestion"},"translation_suggestion":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Translation Suggestion"},"user_decision":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Decision"},"custom_translation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Custom Translation"},"auto_translated":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Auto Translated"}},"type":"object","required":["term","category","context","suggestion"],"title":"TerminologyTerm","description":"术语项"},"TerminologyTimeoutResponse":{"properties":{"remaining_seconds":{"type":"integer","title":"Remaining Seconds"}},"type":"object","required":["remaining_seconds"],"title":"TerminologyTimeoutResponse","description":"术语超时延长响应"},"UsageHistoryItem":{"properties":{"billing_period":{"type":"string","title":"Billing Period"},"total_files":{"type":"integer","title":"Total Files"},"total_seconds":{"type":"integer","title":"Total Seconds"},"total_minutes":{"type":"number","title":"Total Minutes"}},"type":"object","required":["billing_period","total_files","total_seconds","total_minutes"],"title":"UsageHistoryItem"},"UserQuotaResponse":{"properties":{"total_files":{"type":"integer","title":"Total Files"},"used_files":{"type":"integer","title":"Used Files"},"remaining_files":{"type":"integer","title":"Remaining Files"},"purchase_count":{"type":"integer","title":"Purchase Count"},"usage_percentage":{"type":"number","title":"Usage Percentage"}},"type":"object","required":["total_files","used_files","remaining_files","purchase_count","usage_percentage"],"title":"UserQuotaResponse"},"UserResponse":{"properties":{"id":{"type":"integer","title":"Id"},"username":{"type":"string","title":"Username"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"is_active":{"type":"boolean","title":"Is Active"},"quota_files":{"type":"integer","title":"Quota Files"},"quota_minutes":{"type":"integer","title":"Quota Minutes"},"preferred_language":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preferred Language","default":"en"},"is_admin":{"type":"boolean","title":"Is Admin","default":false}},"type":"object","required":["id","username","created_at","is_active","quota_files","quota_minutes"],"title":"UserResponse","description":"用户信息响应"},"UserUpdateRequest":{"properties":{"quota_files":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quota Files"},"is_active":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Active"},"is_admin":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Admin"}},"type":"object","title":"UserUpdateRequest"},"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"},"XunhuCheckoutResponse":{"properties":{"payment_url":{"type":"string","title":"Payment Url"},"trade_order_id":{"type":"string","title":"Trade Order Id"},"qrcode_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Qrcode Url"}},"type":"object","required":["payment_url","trade_order_id"],"title":"XunhuCheckoutResponse"}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}