{"openapi":"3.1.0","info":{"title":"TickTest 波段回测 API","description":"A股量化波段回测服务 —— 纯均线引擎，日频向量化，平均6ms/次","version":"0.1.0"},"paths":{"/api/v1/health":{"get":{"tags":["health"],"summary":"Health Check","description":"检查回测API及上游服务健康状况","operationId":"health_check_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/v1/capabilities":{"get":{"tags":["capabilities"],"summary":"Get Capabilities","description":"GET — 获取 TickTest 服务能力自描述","operationId":"get_capabilities_v1_capabilities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["capabilities"],"summary":"Post Capabilities","description":"POST — 获取 TickTest 服务能力自描述（与 GET 同）","operationId":"post_capabilities_v1_capabilities_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/capabilities":{"get":{"tags":["capabilities"],"summary":"Get Capabilities","description":"GET — 获取 TickTest 服务能力自描述","operationId":"get_capabilities_api_v1_capabilities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["capabilities"],"summary":"Post Capabilities","description":"POST — 获取 TickTest 服务能力自描述（与 GET 同）","operationId":"post_capabilities_api_v1_capabilities_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/validate":{"post":{"tags":["validate"],"summary":"Validate Strategy","description":"验证策略 family + params 是否合法。\n\n请求示例:\n    {\"family\": \"MA_CROSSOVER\", \"params\": {\"fast\": 5, \"slow\": 20}}\n    {\"family\": \"SINGLE_MA\", \"params\": {\"ma_n\": 20, \"buy_frequency\": \"weekly\"}}\n    {\"family\": \"TURTLE_TRADING\", \"params\": {}}\n\n成功响应:\n    {\"valid\": true, \"params\": {...}, \"errors\": [], \"warnings\": [...]}\n\n失败响应:\n    {\"valid\": false, \"errors\": [...], \"known_families\": [...]}","operationId":"validate_strategy_api_v1_validate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/backtest":{"post":{"tags":["backtest"],"summary":"Run Backtest","description":"执行批量回测（代理到5104策略服务）— 入口持单用户并发闸","operationId":"run_backtest_api_v1_backtest_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BacktestRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BacktestResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v2/agent/backtest":{"post":{"tags":["backtest-agent"],"summary":"Agent Backtest","description":"**AI Agent 统一回测入口**\n\n接收策略自然语言描述，自动解析为可执行策略，完成回测后返回六大必返指标。\n\n六大指标:\n- **sharpe_ratio** — 年化夏普比率\n- **max_drawdown** — 最大回撤 (%)\n- **win_rate** — 胜率 (%)\n- **annualized_return** — 年化收益率 (%)\n- **total_return** — 总收益率 (%)\n- **profit_curve** — 累计收益曲线（逐日）\n\n**支付流程**（生产环境, TICKTEST_REQUIRE_PAYMENT=true）:\n1. 调用 `/api/v2/agent/backtest` → 返回 HTTP 402 + Payment-Needed 头\n2. AI Agent 展示支付界面 → 用户授权支付\n3. Agent 重新请求并携带 Payment-Proof 头 → 验证 → 执行回测 → 履约确认","operationId":"agent_backtest_api_v2_agent_backtest_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BacktestAgentRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BacktestAgentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/payment/create":{"post":{"tags":["payment"],"summary":"Create Payment","description":"创建支付宝 AI 收支付订单（电脑网站支付）。\n返回支付 HTML 表单，前端需渲染并自动提交。\n\n支付宝注册地址: https://api.ticktest.cn/v1/backtest\n支付完成后通过 notify_url 自动回调充值。","operationId":"create_payment_api_v1_payment_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePaymentResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/payment/precreate":{"post":{"tags":["payment"],"summary":"Precreate Payment","description":"创建当面付（扫码支付）订单，直接返回二维码 URL。Agent 可嵌为 <img src='qr_code'>。","operationId":"precreate_payment_api_v1_payment_precreate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrecreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/payment/alipay/credit/precreate":{"post":{"tags":["payment"],"summary":"Alipay Credit Precreate","description":"信用套餐扫码支付（当面付）— 直接返回二维码 URL。","operationId":"alipay_credit_precreate_api_v1_payment_alipay_credit_precreate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlipayCreditCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrecreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/payment/alipay/credit/create":{"post":{"tags":["payment"],"summary":"Alipay Credit Create","description":"创建支付宝信用套餐支付订单（电脑网站支付）。","operationId":"alipay_credit_create_api_v1_payment_alipay_credit_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlipayCreditCreateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AlipayCreditCreateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/payment/alipay/credit/notify":{"post":{"tags":["payment"],"summary":"Alipay Credit Notify","description":"支付宝信用套餐异步通知回调（无需认证——支付宝服务器调用）。","operationId":"alipay_credit_notify_api_v1_payment_alipay_credit_notify_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/payment/alipay/credit/return":{"get":{"tags":["payment"],"summary":"Alipay Credit Return","description":"支付宝信用套餐同步回跳端点。","operationId":"alipay_credit_return_api_v1_payment_alipay_credit_return_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/payment/zhifufm/create":{"post":{"tags":["payment"],"summary":"Zhifufm Create Order","description":"创建支付FM订单（微信/支付宝聚合支付）。\n\n需要登录（Bearer Token）。返回 pay_url，前端渲染为二维码。\n支付完成后支付FM异步回调 → TickTest 充值到账。","operationId":"zhifufm_create_order_api_v1_payment_zhifufm_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZFMCreateOrderRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ZFMCreateOrderResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/payment/zhifufm_callback":{"get":{"tags":["payment"],"summary":"Zhifufm Callback","description":"支付FM 异步回调端点（无需认证——支付FM服务器调用）。\n\n验签 → 查订单关联用户 → 充值信用点到账。\n\n⚠ 必须返回纯文本 \"success\"，否则支付FM会重试（最多9次）。","operationId":"zhifufm_callback_api_v1_payment_zhifufm_callback_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["payment"],"summary":"Zhifufm Callback","description":"支付FM 异步回调端点（无需认证——支付FM服务器调用）。\n\n验签 → 查订单关联用户 → 充值信用点到账。\n\n⚠ 必须返回纯文本 \"success\"，否则支付FM会重试（最多9次）。","operationId":"zhifufm_callback_api_v1_payment_zhifufm_callback_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/payment/vmq/create":{"post":{"tags":["payment"],"summary":"Vmq Create Order","description":"创建V免签支付订单。\n\n返回支付宝/微信收款码 + 唯一金额，用户按指定金额扫码支付。\n手机监控App检测到账后POST到 /vmq/notify → 自动匹配 → 充值到账。","operationId":"vmq_create_order_api_v1_payment_vmq_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VMQCreateOrderRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VMQCreateOrderResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/payment/vmq/notify":{"post":{"tags":["payment"],"summary":"Vmq Notify","description":"V免签 支付通知接收端点。\n\n手机监控App检测到支付宝/微信收款后POST通知到此端点。\n支持多种JSON格式:\n  V免签:  {\"type\":\"alipay\",\"money\":\"29.03\",\"time\":\"...\",\"mark\":\"...\"}\n  简化:   {\"amount\":\"29.03\",\"type\":\"alipay\"}\n  通用:   {\"price\":\"29.03\",\"payType\":\"alipay\"}\n\n⚠ 此端点需被监控App直接访问，建议加 secret 验证。","operationId":"vmq_notify_api_v1_payment_vmq_notify_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/pay":{"post":{"tags":["payment"],"summary":"Vmq Pay Alias","description":"V免签 App 默认推送端点 → 转发到 /vmq/notify","operationId":"vmq_pay_alias_pay_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/appHeart":{"get":{"tags":["payment"],"summary":"Vmq App Heart","description":"V免签 App 心跳检测。sign = MD5(t + key)","operationId":"vmq_app_heart_appHeart_get","parameters":[{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}},{"name":"sign","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sign"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/appPush":{"get":{"tags":["payment"],"summary":"Vmq App Push","description":"V免签 App 支付通知端点（GET）。\n签名: MD5(type + price + t + key)\ntype: 1=微信, 2=支付宝","operationId":"vmq_app_push_appPush_get","parameters":[{"name":"t","in":"query","required":false,"schema":{"type":"string","default":"","title":"T"}},{"name":"type","in":"query","required":false,"schema":{"type":"string","default":"","title":"Type"}},{"name":"price","in":"query","required":false,"schema":{"type":"string","default":"","title":"Price"}},{"name":"sign","in":"query","required":false,"schema":{"type":"string","default":"","title":"Sign"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/payment/health":{"get":{"tags":["payment"],"summary":"Payment Health","description":"查询支付服务状态（密钥加载 + SDK 可用性 + Python 版本兼容性）","operationId":"payment_health_api_v1_payment_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/payment/methods":{"get":{"tags":["payment"],"summary":"Get Payment Methods","description":"根据请求 IP 返回可用的支付方式。\n\n规则:\n  - 中国大陆 IP   → [\"alipay\"]\n  - 境外 IP       → [\"alipay\", \"usdt\"] (如果 Bepusdt 已配置 API Key)\n  - 未配置 Key    → [\"alipay\"]（安全兜底）","operationId":"get_payment_methods_api_v1_payment_methods_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/payment/usdt/per-use/create":{"post":{"tags":["payment"],"summary":"Usdt Per Use Create","description":"创建 USDT 单次回测支付订单（¥0.50/次）。\n\n流程:\n  1. 生成商户订单号: USDT_PERUSE_{timestamp}_{user_hash}\n  2. 调用 usdt_service.create_usdt_order()\n  3. 写入 payment_orders (payment_method='usdt', order_type='per_use')\n  4. 返回收款地址 + USDT 金额","operationId":"usdt_per_use_create_api_v1_payment_usdt_per_use_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/USDTPerUseRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/USDTOrderResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/payment/usdt/package/create":{"post":{"tags":["payment"],"summary":"Usdt Package Create","description":"创建 USDT 套餐支付订单。\n\n流程:\n  1. 查 USDT_PLANS[plan_id] → cny_amount + credits\n  2. 生成商户订单号: USDT_PKG_{plan_id}_{timestamp}_{user_hash}\n  3. 调用 usdt_service.create_usdt_order()\n  4. 写入 payment_orders (payment_method='usdt', order_type='package', symbol=plan_id)\n  5. 返回收款地址 + USDT 金额","operationId":"usdt_package_create_api_v1_payment_usdt_package_create_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/USDTPackageRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/USDTOrderResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/payment/usdt/notify":{"post":{"tags":["payment"],"summary":"Usdt Notify","description":"Bepusdt 支付异步通知回调（无需认证——Bepusdt 服务器调用）。\n\n流程:\n  1. 解析 JSON body\n  2. verify_usdt_signature() 验签\n  3. 查 payment_orders WHERE out_trade_no = order_id\n  4. 跳过已支付订单（防重复）\n  5. order_type='per_use': 标记为已支付\n  6. order_type='package': earn_credits() 充值 + 标记为已支付\n  7. 返回 PlainTextResponse(\"ok\")\n\n⚠ 必须返回纯文本 \"ok\"，Bepusdt 才会确认通知成功（最多重试5次）","operationId":"usdt_notify_api_v1_payment_usdt_notify_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/payment/usdt/status":{"get":{"tags":["payment"],"summary":"Usdt Payment Status","description":"查询 USDT 支付订单状态。\n\nArgs:\n    order_id: 商户订单号 (e.g. USDT_PERUSE_1752670000_abc12345)\n\nReturns:\n    {status: 'pending' | 'paid' | 'expired', order_id: '...'}","operationId":"usdt_payment_status_api_v1_payment_usdt_status_get","parameters":[{"name":"order_id","in":"query","required":true,"schema":{"type":"string","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/USDTStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/send-code":{"post":{"tags":["auth"],"summary":"Send Verification Code","description":"向指定邮箱发送 6 位数字验证码（{TTL} 分钟内有效）。\n\n用于注册时的邮箱验证，防止虚假邮箱刷信用点。\n同一邮箱可多次获取验证码，以最新一条为准。\n\n防滥用三层防护（1.5）：\n  层零 — 全局熔断：1分钟内超100次全局请求 → 拒发（不发邮件）\n  层一 — 同邮箱冷静期：60秒内重复 → 返回success但不发邮件\n  层二 — 正常发码：通过全部检查后才发邮件","operationId":"send_verification_code_api_v1_auth_send_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendCodeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/register":{"post":{"tags":["auth"],"summary":"Register","description":"注册新用户。\n\n需先通过 POST /api/v1/auth/send-code 获取邮箱验证码。\n免费套餐自动赠送 500 信用点（≈20次回测）。\n✅ 注册即签发 API Key — 仅显示一次，请立即保存。\n\n1.3 错误归一：所有错误分支返回相同消息，防止邮箱枚举。","operationId":"register_api_v1_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/me":{"get":{"tags":["auth"],"summary":"Get Me","description":"查询当前用户信息 & 信用点余额（需 Bearer Token 认证）。\n\n返回用户基本信息 + 信用点账户状态。\n用户身份由 AuthMiddleware 注入到 request.scope['user_id']。","operationId":"get_me_api_v1_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserInfoResponse"}}}}}}},"/api/v1/auth/tokens":{"get":{"tags":["auth"],"summary":"List Tokens","description":"列出当前用户的所有 Token（需 Bearer Token 认证）。\n返回每个 Token 的元数据，不返回原始值。","operationId":"list_tokens_api_v1_auth_tokens_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenListResponse"}}}}}}},"/api/v1/auth/tokens/generate":{"post":{"tags":["auth"],"summary":"Generate New Token","description":"为当前用户生成新的 API Token（需 Bearer Token 认证）。\n新 Token 的原始值仅在本次响应中返回，请立即保存。","operationId":"generate_new_token_api_v1_auth_tokens_generate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateTokenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GenerateTokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/tokens/revoke":{"post":{"tags":["auth"],"summary":"Revoke User Token","description":"吊销指定的 Token（需 Bearer Token 认证）。\n支持传入 token_id 或原始 token 字符串。","operationId":"revoke_user_token_api_v1_auth_tokens_revoke_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/tokens/{token_id}":{"delete":{"tags":["auth"],"summary":"Delete Token","description":"删除指定的 Token（需 Bearer Token 认证）。\n\n按 Token 主键 ID 进行软删除（设 is_active=0）。\n仅允许删除属于当前用户的 Token。","operationId":"delete_token_api_v1_auth_tokens__token_id__delete","parameters":[{"name":"token_id","in":"path","required":true,"schema":{"type":"integer","title":"Token Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/recover/send-code":{"post":{"tags":["auth"],"summary":"Recover Send Code","description":"忘记 Key 恢复 — 降级为网页引导（1.4）。\n\n不再执行吊销+重签，改为引导用户登录 ticktest.cn 控制台管理 API Key。","operationId":"recover_send_code_api_v1_auth_recover_send_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendCodeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/recover":{"post":{"tags":["auth"],"summary":"Recover Key","description":"忘记 Key 恢复 — 降级为网页引导（1.4）。\n\n不再执行吊销+重签，改为引导用户登录 ticktest.cn 控制台管理 API Key。","operationId":"recover_key_api_v1_auth_recover_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecoverRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecoverResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/login/send-code":{"post":{"tags":["auth"],"summary":"Login Send Code","description":"邮箱验证码登录 — 第一步：发送登录验证码到邮箱。\n\n🔴 人机验证：必须携带 verify_token（通过滑块拼图验证获得）。\n无 verify_token 或 token 无效/过期 → 拒绝发送验证码。\n防止 AI Agent 绕过前端直接调用 send-code 接口。\n\n适用于控制台 Web UI：用户输入邮箱+验证码，\n后端自动判断注册或登录（见 POST /api/v1/auth/login）。","operationId":"login_send_code_api_v1_auth_login_send_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginSendCodeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendCodeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/login":{"post":{"tags":["auth"],"summary":"Login With Code","description":"邮箱验证码登录 — 第二步：验证身份 → 自动判断注册/登录 → 签发 session_token。\n\n🔴 统一入口：未注册则自动注册（name=邮箱@前部分, plan=free, 送500信用点），\n已注册则直接登录。前端根据 is_new_user 字段显示不同提示。\n\n🔴 session_token（cs_ 前缀）与 API Token（tt_ 前缀）的区别：\n- session_token：邮箱登录后返回，24h 过期，用于控制台 Web UI 认证\n- API Token：长期密钥，用于 AI Agent 程序化调用回测 API\n\n🔑 与 Key 恢复的关键区别：\n- Key 恢复：吊销全部旧 API Token → 签发新 API Token（安全重置，适用于忘记/泄露 Key）\n- 邮箱登录：仅签发新 session_token，不创建、不吊销任何 API Token\n  如邮箱未注册，先自动注册再登录\n\n适用于控制台 Web UI 用户登录，获取会话凭证后调用控制台 API。","operationId":"login_with_code_api_v1_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/v1/auth/challenge":{"post":{"tags":["auth"],"summary":"Create Challenge","description":"生成滑块拼图验证挑战（服务端渲染版）。\n\n服务端生成随机背景图 + 锯齿拼图块（base64），\ncutout_x 仅存在服务端内存中，不发送给客户端。\nchallenge 有效期 5 分钟，一次性使用。\n\n用于 login/send-code 前的人机验证流程:\n  1. POST /challenge      → 获取背景图 + 拼图块\n  2. 前端渲染图片 + 用户拖动滑块\n  3. POST /verify-challenge → 提交 user_x → 获取 verify_token\n  4. POST /login/send-code  → 携带 verify_token","operationId":"create_challenge_api_v1_auth_challenge_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChallengeResponse"}}}}}}},"/api/v1/auth/verify-challenge":{"post":{"tags":["auth"],"summary":"Verify Challenge Endpoint","description":"验证滑块拼图位置。\n\n校验 user_x 与 cutout_x 的差值是否在 tolerance 范围内。\n通过后返回 verify_token（5分钟有效，一次性使用）。\n失败需重新获取 challenge 重试。","operationId":"verify_challenge_endpoint_api_v1_auth_verify_challenge_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyChallengeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyChallengeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/health":{"get":{"tags":["auth"],"summary":"Auth Health","description":"认证服务健康检查（公开端点）","operationId":"auth_health_api_v1_auth_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/credits/balance":{"get":{"tags":["credits"],"summary":"Get Credit Balance","description":"查询当前用户的信用点余额（需 Bearer Token 认证）。\n\n返回余额、使用统计、预计剩余回测次数。","operationId":"get_credit_balance_api_v1_credits_balance_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BalanceResponse"}}}}}}},"/api/v1/credits/transactions":{"get":{"tags":["credits"],"summary":"Get Credit Transactions","description":"查询当前用户的信用点交易流水（需 Bearer Token 认证）。\n\n支持按类型筛选 + 分页。","operationId":"get_credit_transactions_api_v1_credits_transactions_get","parameters":[{"name":"tx_type","in":"query","required":false,"schema":{"type":"string","description":"筛选类型: spend/earn/空=全部","default":"","title":"Tx Type"},"description":"筛选类型: spend/earn/空=全部"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"每页条数","default":50,"title":"Limit"},"description":"每页条数"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"偏移量","default":0,"title":"Offset"},"description":"偏移量"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransactionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/search_stock":{"get":{"tags":["search"],"summary":"Search Stock","description":"模糊搜索A股股票（优先新浪接口，离线兜底）","operationId":"search_stock_api_search_stock_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"搜索关键词（名称或代码）","default":"","title":"Q"},"description":"搜索关键词（名称或代码）"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/search_stock":{"get":{"tags":["search"],"summary":"Search Stock","description":"模糊搜索A股股票（优先新浪接口，离线兜底）","operationId":"search_stock_api_v1_search_stock_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","description":"搜索关键词（名称或代码）","default":"","title":"Q"},"description":"搜索关键词（名称或代码）"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/feedback":{"post":{"tags":["feedback"],"summary":"Submit Feedback","description":"提交反馈：网页表单（source=web）与 AI Agent（source=agent）同用此端点","operationId":"submit_feedback_api_v1_feedback_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeedbackIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/":{"get":{"summary":"Root","description":"根路径 —— 重定向到文档","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"AlipayCreditCreateRequest":{"properties":{"plan_id":{"type":"string","title":"Plan Id","description":"套餐ID: basic(29元) / pro(99元) / enterprise(299元)"}},"type":"object","required":["plan_id"],"title":"AlipayCreditCreateRequest","description":"支付宝信用套餐创建订单请求"},"AlipayCreditCreateResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"out_trade_no":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Out Trade No"},"amount":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amount"},"plan_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Name"},"credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits"},"payment_form":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Form"},"pay_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pay Url"},"pay_method":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pay Method"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success"],"title":"AlipayCreditCreateResponse"},"BacktestAgentRequest":{"properties":{"symbol":{"type":"string","title":"Symbol","description":"股票代码，如 000001 或 sz000001"},"strategy":{"type":"string","title":"Strategy","description":"策略自然语言描述，如 'MA5上穿MA20买入，MA5下穿MA20卖出'"},"start_date":{"type":"string","title":"Start Date","description":"回测开始日期 YYYY-MM-DD，默认6个月前"},"end_date":{"type":"string","title":"End Date","description":"回测结束日期 YYYY-MM-DD，默认今天"},"market":{"type":"string","title":"Market","description":"市场: sh/sz/bj（symbol 格式为纯6位时使用）","default":"sz"},"initial_capital":{"type":"number","title":"Initial Capital","description":"初始资金","default":1000000},"strategy_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strategy Name","description":"策略名称（可选，不传则自动生成）"}},"type":"object","required":["symbol","strategy"],"title":"BacktestAgentRequest","description":"AI Agent 统一回测请求","example":{"end_date":"2026-06-26","initial_capital":1000000,"market":"sz","start_date":"2026-01-01","strategy":"MA5上穿MA20买入，MA5下穿MA20卖出，14:55强制平仓","symbol":"000001"}},"BacktestAgentResponse":{"properties":{"status":{"type":"string","title":"Status","description":"success / error"},"symbol":{"type":"string","title":"Symbol","default":""},"strategy_name":{"type":"string","title":"Strategy Name","default":""},"strategy_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Strategy Code","description":"解析后的策略代码（.acl 格式）"},"period":{"type":"string","title":"Period","default":""},"sharpe_ratio":{"type":"number","title":"Sharpe Ratio","default":0.0},"max_drawdown":{"type":"number","title":"Max Drawdown","default":0.0},"win_rate":{"type":"number","title":"Win Rate","default":0.0},"annualized_return":{"type":"number","title":"Annualized Return","default":0.0},"total_return":{"type":"number","title":"Total Return","default":0.0},"profit_curve":{"items":{"type":"number"},"type":"array","title":"Profit Curve","description":"累计收益曲线（逐日）"},"trade_count":{"type":"integer","title":"Trade Count","default":0},"total_pnl":{"type":"number","title":"Total Pnl","default":0.0},"avg_pnl":{"type":"number","title":"Avg Pnl","default":0.0},"payment_required":{"type":"boolean","title":"Payment Required","default":false},"payment_form":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Form","description":"支付宝支付 HTML 表单（需付费时返回）"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["status"],"title":"BacktestAgentResponse","description":"AI Agent 统一回测响应 — 六大必返指标"},"BacktestDayResult":{"properties":{"date":{"type":"string","title":"Date","default":""},"win":{"type":"boolean","title":"Win","default":false},"did_trade":{"type":"boolean","title":"Did Trade","default":false},"t_pnl":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"T Pnl","default":0.0},"signal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Signal"},"trend":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trend"},"buy_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Buy Price"},"sell_price":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sell Price"},"trade_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Trade Amount"},"shares":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Shares"},"operations":{"anyOf":[{"items":{},"type":"array"},{"type":"null"}],"title":"Operations"},"balance":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Balance","nullable":true}},"type":"object","title":"BacktestDayResult","description":"单日回测结果\n\nBUY 日: signal='BUY', t_pnl/sell_price/win 为空（未平仓，无实现盈亏）\nSELL 日: signal='SELL', 有完整的 t_pnl/win/sell_price"},"BacktestRequest":{"properties":{"symbol":{"type":"string","title":"Symbol","description":"股票代码，如 sh600157"},"strategy":{"type":"string","title":"Strategy","description":"策略文件名，如 g_t0_signal_strategy_v3.py"},"start_date":{"type":"string","title":"Start Date","description":"回测起始日期 YYYY-MM-DD，默认半年前"},"end_date":{"type":"string","title":"End Date","description":"回测结束日期 YYYY-MM-DD，默认今天"},"initial_capital":{"type":"number","title":"Initial Capital","description":"初始资金，默认100万","default":1000000.0},"position_ratio":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Position Ratio","description":"仓位比例(0~1)，与base_position二选一"},"base_position":{"type":"integer","title":"Base Position","description":"底仓市值(元)","default":50000},"buy_steps":{"type":"integer","title":"Buy Steps","description":"买入分批数","default":1},"sell_steps":{"type":"integer","title":"Sell Steps","description":"卖出分批数","default":1},"slippage_pct":{"type":"number","title":"Slippage Pct","description":"滑点百分比，如0.1代表0.1%","default":0.1},"tolerance_sec":{"type":"integer","title":"Tolerance Sec","description":"容忍秒数","default":0}},"type":"object","required":["symbol","strategy"],"title":"BacktestRequest","description":"回测请求"},"BacktestResponse":{"properties":{"success":{"type":"boolean","title":"Success","default":true},"symbol":{"type":"string","title":"Symbol"},"strategy":{"type":"string","title":"Strategy"},"named_strategy":{"type":"string","title":"Named Strategy","default":""},"start_date":{"type":"string","title":"Start Date"},"end_date":{"type":"string","title":"End Date"},"dates":{"items":{"type":"string"},"type":"array","title":"Dates","default":[]},"stats":{"$ref":"#/components/schemas/BacktestStats"},"results":{"items":{"$ref":"#/components/schemas/BacktestDayResult"},"type":"array","title":"Results"},"account_final":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Account Final"},"position_ratio":{"type":"number","title":"Position Ratio","default":0.5},"errors":{"items":{"type":"string"},"type":"array","title":"Errors"}},"type":"object","required":["symbol","strategy","start_date","end_date"],"title":"BacktestResponse","description":"回测响应"},"BacktestStats":{"properties":{"total_days":{"type":"integer","title":"Total Days","default":0},"trade_days":{"type":"integer","title":"Trade Days","default":0},"win_count":{"type":"integer","title":"Win Count","default":0},"win_rate":{"type":"number","title":"Win Rate","default":0.0},"total_pnl":{"type":"number","title":"Total Pnl","default":0.0},"avg_pnl":{"type":"number","title":"Avg Pnl","default":0.0},"sharpe":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Sharpe"},"total_return":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Total Return"},"annual_return":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Annual Return"},"max_drawdown":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Max Drawdown"}},"type":"object","title":"BacktestStats","description":"回测统计"},"BalanceResponse":{"properties":{"status":{"type":"string","title":"Status"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"balance":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Balance"},"total_earned":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Earned"},"total_spent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Spent"},"plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan"},"backtest_cost":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Backtest Cost"},"remaining_backtests":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Remaining Backtests"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["status"],"title":"BalanceResponse","description":"信用点余额响应"},"ChallengeResponse":{"properties":{"status":{"type":"string","title":"Status","default":"success"},"challenge_id":{"type":"string","title":"Challenge Id","description":"挑战唯一标识（32位 hex）"},"bg_image":{"type":"string","title":"Bg Image","description":"背景图（data:image/png;base64,...，含缺口）","default":""},"puzzle_piece":{"type":"string","title":"Puzzle Piece","description":"拼图块（data:image/png;base64,...，带阴影，用于滑块）","default":""},"piece_y":{"type":"integer","title":"Piece Y","description":"拼图块 Y 坐标（px，前端据此定位滑块轨道）"}},"type":"object","required":["challenge_id","piece_y"],"title":"ChallengeResponse","description":"拼图验证挑战响应（服务端渲染版）\n\n⚠️ 不再返回 cutout_x！攻击者无法从 API 响应中拿到答案坐标。\n前端仅获得背景图 + 拼图块，用户拖动滑块后提交 user_x 供服务端比对。"},"CreatePaymentResponse":{"properties":{"status":{"type":"string","title":"Status"},"out_trade_no":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Out Trade No"},"amount":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amount"},"payment_form":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Form","description":"支付宝支付 HTML 表单"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["status"],"title":"CreatePaymentResponse"},"FeedbackIn":{"properties":{"category":{"type":"string","title":"Category","description":"bug / feature / strategy / other"},"message":{"type":"string","title":"Message","description":"反馈内容，≤2000字"},"contact":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact","description":"可选联系方式，≤200字"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"agent / web","default":"agent"}},"type":"object","required":["category","message"],"title":"FeedbackIn"},"GenerateTokenRequest":{"properties":{"name":{"type":"string","title":"Name","description":"Token 名称/用途","default":"api-key"},"expires_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expires Days","description":"过期天数，None=永不过期"}},"type":"object","title":"GenerateTokenRequest","description":"生成 Token 请求"},"GenerateTokenResponse":{"properties":{"status":{"type":"string","title":"Status"},"token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"},"token_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Prefix"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["status"],"title":"GenerateTokenResponse","description":"生成 Token 响应"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"type":"string","title":"Status","default":"ok"},"port":{"type":"integer","title":"Port"},"strategy_service_available":{"type":"boolean","title":"Strategy Service Available","default":false},"data_service_available":{"type":"boolean","title":"Data Service Available","default":false},"cache_service_available":{"type":"boolean","title":"Cache Service Available","default":false}},"type":"object","required":["port"],"title":"HealthResponse","description":"健康检查响应"},"LoginRequest":{"properties":{"email":{"type":"string","title":"Email","description":"注册时使用的邮箱"},"verification_code":{"type":"string","title":"Verification Code","description":"邮箱验证码（6位数字）"}},"type":"object","required":["email","verification_code"],"title":"LoginRequest","description":"登录 — 邮箱 + 验证码"},"LoginResponse":{"properties":{"status":{"type":"string","title":"Status"},"session_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token"},"session_token_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Token Prefix"},"session_expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Expires At"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits"},"plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan"},"tokens":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Tokens","default":[]},"is_new_user":{"type":"boolean","title":"Is New User","default":false},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["status"],"title":"LoginResponse","description":"登录响应 — 始终返回 session_token（控制台 API 认证用）"},"LoginSendCodeRequest":{"properties":{"email":{"type":"string","title":"Email","description":"注册时使用的邮箱"},"verify_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verify Token","description":"人机验证令牌（必填，须先完成滑块拼图验证）"}},"type":"object","required":["email"],"title":"LoginSendCodeRequest","description":"登录 — 发送验证码请求"},"PaymentRequest":{"properties":{"symbol":{"type":"string","title":"Symbol","description":"股票代码，如 sz000001"},"strategy":{"type":"string","title":"Strategy","description":"策略描述，如 MA5上穿MA20买入"},"start_date":{"type":"string","title":"Start Date","description":"回测开始日期","default":"2026-01-01"},"end_date":{"type":"string","title":"End Date","description":"回测结束日期","default":"2026-06-26"},"out_trade_no":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Out Trade No","description":"商户订单号（自动生成）"},"total_amount":{"type":"string","title":"Total Amount","description":"订单金额","default":"0.50"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject","description":"订单标题"}},"type":"object","required":["symbol","strategy"],"title":"PaymentRequest","description":"支付创建请求 — 需绑定回测参数"},"PrecreateResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"out_trade_no":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Out Trade No"},"qr_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Qr Code","description":"支付宝当面付二维码 URL，可直接渲染为 <img> 标签"},"amount":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amount"},"plan_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Name"},"credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success"],"title":"PrecreateResponse"},"RecoverRequest":{"properties":{"email":{"type":"string","title":"Email","description":"注册时使用的邮箱"},"verification_code":{"type":"string","title":"Verification Code","description":"邮箱验证码（6位数字）"}},"type":"object","required":["email","verification_code"],"title":"RecoverRequest","description":"Key恢复 — 验证身份并签发新Token"},"RecoverResponse":{"properties":{"status":{"type":"string","title":"Status"},"token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"},"token_prefix":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token Prefix"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["status"],"title":"RecoverResponse","description":"Key恢复响应"},"RegisterRequest":{"properties":{"name":{"type":"string","title":"Name","description":"用户名/昵称（选填）","default":""},"email":{"type":"string","title":"Email","description":"邮箱（必填，需先获取验证码）"},"verification_code":{"type":"string","title":"Verification Code","description":"邮箱验证码（6位数字）"},"plan":{"type":"string","title":"Plan","description":"套餐: free/basic/pro/enterprise","default":"free"}},"type":"object","required":["email","verification_code"],"title":"RegisterRequest","description":"注册请求 — 邮箱 + 验证码 必填"},"RegisterResponse":{"properties":{"status":{"type":"string","title":"Status"},"api_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Api Key"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits"},"plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["status"],"title":"RegisterResponse","description":"注册响应 — 注册即签发 API Key"},"RevokeRequest":{"properties":{"token_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Token Id"},"token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Token"}},"type":"object","title":"RevokeRequest","description":"吊销 Token 请求"},"SendCodeRequest":{"properties":{"email":{"type":"string","title":"Email","description":"接收验证码的邮箱地址（必填）"}},"type":"object","required":["email"],"title":"SendCodeRequest","description":"发送验证码请求"},"SendCodeResponse":{"properties":{"status":{"type":"string","title":"Status"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["status"],"title":"SendCodeResponse","description":"发送验证码响应"},"TokenListResponse":{"properties":{"status":{"type":"string","title":"Status"},"tokens":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Tokens","default":[]},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["status"],"title":"TokenListResponse","description":"Token 列表响应"},"TransactionsResponse":{"properties":{"status":{"type":"string","title":"Status"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"total":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total"},"items":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Items","default":[]}},"type":"object","required":["status"],"title":"TransactionsResponse","description":"交易流水响应"},"USDTOrderResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"order_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order Id"},"trade_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trade Id"},"receive_address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Receive Address"},"actual_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Actual Amount"},"cny_amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Cny Amount"},"expiration_time":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expiration Time"},"payment_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Payment Url"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success"],"title":"USDTOrderResponse","description":"USDT 订单创建响应"},"USDTPackageRequest":{"properties":{"plan_id":{"type":"string","title":"Plan Id","description":"套餐ID: basic/pro/enterprise"}},"type":"object","required":["plan_id"],"title":"USDTPackageRequest","description":"USDT 套餐支付请求"},"USDTPerUseRequest":{"properties":{"symbol":{"type":"string","title":"Symbol","description":"股票代码，如 000001"},"strategy":{"type":"string","title":"Strategy","description":"策略描述"}},"type":"object","required":["symbol","strategy"],"title":"USDTPerUseRequest","description":"单次回测 USDT 支付请求"},"USDTStatusResponse":{"properties":{"status":{"type":"string","title":"Status"},"order_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order Id"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["status"],"title":"USDTStatusResponse","description":"USDT 订单状态查询响应"},"UserInfoResponse":{"properties":{"status":{"type":"string","title":"Status"},"user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"plan":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan"},"credits_balance":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits Balance"},"total_earned":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Earned"},"total_spent":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Spent"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["status"],"title":"UserInfoResponse","description":"用户信息响应"},"VMQCreateOrderRequest":{"properties":{"plan_id":{"type":"string","title":"Plan Id","description":"套餐ID: basic(¥29) / pro(¥99) / enterprise(¥299)"},"pay_type":{"type":"string","title":"Pay Type","description":"支付方式: alipay / wechat","default":"alipay"},"amount":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amount","description":"固定金额（切换支付方式时传入，防止价格变动）"}},"type":"object","required":["plan_id"],"title":"VMQCreateOrderRequest"},"VMQCreateOrderResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"order_no":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order No"},"amount":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Amount"},"qr_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Qr Url"},"plan_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Name"},"credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success"],"title":"VMQCreateOrderResponse"},"ValidateRequest":{"properties":{"family":{"type":"string","title":"Family"},"params":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Params"}},"type":"object","required":["family"],"title":"ValidateRequest","description":"策略验证请求"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifyChallengeRequest":{"properties":{"challenge_id":{"type":"string","title":"Challenge Id","description":"挑战 ID"},"user_x":{"type":"integer","title":"User X","description":"用户滑动的 X 坐标（px）"},"user_y":{"type":"integer","title":"User Y","description":"用户滑动的 Y 坐标（px，可选）","default":0}},"type":"object","required":["challenge_id","user_x"],"title":"VerifyChallengeRequest","description":"验证滑块位置请求"},"VerifyChallengeResponse":{"properties":{"status":{"type":"string","title":"Status"},"verify_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verify Token","description":"人机验证令牌（验证通过后返回，32位 hex）"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message","description":"错误信息（验证失败时返回）"}},"type":"object","required":["status"],"title":"VerifyChallengeResponse","description":"验证滑块位置响应"},"ZFMCreateOrderRequest":{"properties":{"plan_id":{"type":"string","title":"Plan Id","description":"套餐ID: basic(¥29) / pro(¥99) / enterprise(¥299)"},"pay_type":{"type":"string","title":"Pay Type","description":"支付方式: tloop(微信) / aloop(支付宝)","default":"tloop"}},"type":"object","required":["plan_id"],"title":"ZFMCreateOrderRequest","description":"支付FM 创建订单请求"},"ZFMCreateOrderResponse":{"properties":{"success":{"type":"boolean","title":"Success"},"order_no":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order No"},"platform_order_no":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform Order No"},"pay_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pay Url"},"amount":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Amount"},"plan_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Name"},"credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["success"],"title":"ZFMCreateOrderResponse"}}}}