{"openapi":"3.1.0","info":{"title":"nullprint-backend","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Index","operationId":"index__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/buy":{"get":{"summary":"Buy Page","operationId":"buy_page_buy_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"summary":"Buy","operationId":"buy_buy_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_buy_buy_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/signup/start":{"post":{"summary":"Signup Start Api","operationId":"signup_start_api_signup_start_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupStartBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/signup/verify":{"post":{"summary":"Signup Verify Api","operationId":"signup_verify_api_signup_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupVerifyBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/login":{"post":{"summary":"Api Auth Login","operationId":"api_auth_login_api_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiAuthBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/signup":{"post":{"summary":"Api Auth Signup","description":"Register + grant the trial + hand back the licence, in one round trip.\n\nWhen the email-verification switch is on there is no way to finish in one\ncall, so this refuses rather than inventing a second in-app step that would\ndrift from the web flow; the client sends the user to the website instead.","operationId":"api_auth_signup_api_auth_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiAuthBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/signup":{"get":{"summary":"Signup Page","operationId":"signup_page_signup_get","parameters":[{"name":"email","in":"query","required":false,"schema":{"type":"string","default":"","title":"Email"}},{"name":"step","in":"query","required":false,"schema":{"type":"string","default":"start","title":"Step"}},{"name":"ref","in":"query","required":false,"schema":{"type":"string","default":"","title":"Ref"}},{"name":"dl_token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Dl Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Signup Form","operationId":"signup_form_signup_post","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_signup_form_signup_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/signup/confirm":{"post":{"summary":"Signup Confirm Form","operationId":"signup_confirm_form_signup_confirm_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_signup_confirm_form_signup_confirm_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/set-password":{"get":{"summary":"Set Password Page","operationId":"set_password_page_set_password_get","parameters":[{"name":"token","in":"query","required":false,"schema":{"type":"string","default":"","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Set Password","operationId":"set_password_set_password_post","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_set_password_set_password_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/login":{"get":{"summary":"Login Page","operationId":"login_page_login_get","parameters":[{"name":"next","in":"query","required":false,"schema":{"type":"string","default":"/account","title":"Next"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Login","operationId":"login_login_post","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_login_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/logout":{"post":{"summary":"Logout","operationId":"logout_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/account":{"get":{"summary":"Account","operationId":"account_account_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/auth/device":{"post":{"summary":"Auth Device","operationId":"auth_device_auth_device_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DeviceStartBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/device/token":{"post":{"summary":"Auth Device Token","operationId":"auth_device_token_auth_device_token_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceTokenBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/healthz":{"get":{"summary":"Healthz","description":"Liveness for the reverse proxy / monitoring: process up + database reachable.","operationId":"healthz_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/license/refresh":{"post":{"summary":"License Refresh","description":"Subscription renewal receipt for the daemon (docs/ops/backend-contract.md):\nAuthorization: Bearer <previously issued token>. The token's signature proves the\ndevice once completed the device flow for that user; we re-read the user's\ncurrent tenant plan and mint a fresh token from it (new expires_at after a\nrenewal, new limit after an upgrade; a lapsed plan drops to the free tier first,\nbilling.lapse_to_free). 401 bad/foreign token · 401 device_revoked (X-Device-Id names a\ndevice kicked after this token's auth_at) · 402 no subscription · 403 member\ndisabled (also when the drop to free disabled this seat) · 404 user gone.","operationId":"license_refresh_license_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/activate":{"get":{"summary":"Activate Page","operationId":"activate_page_activate_get","parameters":[{"name":"user_code","in":"query","required":false,"schema":{"type":"string","default":"","title":"User Code"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Activate","operationId":"activate_activate_post","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_activate_activate_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/team":{"get":{"summary":"Team Page","operationId":"team_page_team_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/team/add":{"post":{"summary":"Team Add","operationId":"team_add_team_add_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_team_add_team_add_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/team/role":{"post":{"summary":"Team Role","operationId":"team_role_team_role_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_team_role_team_role_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/team/remove":{"post":{"summary":"Team Remove","operationId":"team_remove_team_remove_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_team_remove_team_remove_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/identities":{"get":{"summary":"Identities Page","operationId":"identities_page_identities_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}},"post":{"summary":"Identities Create","operationId":"identities_create_identities_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_identities_create_identities_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/identities/delete":{"post":{"summary":"Identities Delete","operationId":"identities_delete_identities_delete_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_identities_delete_identities_delete_post"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/console":{"get":{"summary":"Console Page","operationId":"console_page_console_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/console/api/{path}":{"get":{"summary":"Console Proxy Get","description":"把 GET 转发到本租户 daemon(身份列表/会话/实时画面)。","operationId":"console_proxy_get_console_api__path__get","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Console Proxy Post","description":"把 POST 转发到本租户 daemon(接管:点击/键盘/滚动/标签)。目标仍只从\nsession 租户解析 → 客户只能接管自己的会话。","operationId":"console_proxy_post_console_api__path__post","parameters":[{"name":"path","in":"path","required":true,"schema":{"type":"string","title":"Path"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/identities/{identity_id}/provision":{"post":{"summary":"Identity Provision","description":"物化:在该租户的隔离 daemon 里为这个身份创建真浏览器 profile(带独立指纹+代理)。\n这座桥把'DB 里的身份'变成'daemon 里能跑的浏览器'。","operationId":"identity_provision_identities__identity_id__provision_post","parameters":[{"name":"identity_id","in":"path","required":true,"schema":{"type":"string","title":"Identity Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me":{"get":{"summary":"Api Me","description":"壳的「我是谁」:角色 / 权限 / 自建配额(daemon /team/me 在线时转发到这里)。","operationId":"api_me_api_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/members":{"get":{"summary":"List Members","operationId":"list_members_api_members_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Create Member","operationId":"create_member_api_members_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberBody"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/members/{user_id}":{"patch":{"summary":"Patch Member","operationId":"patch_member_api_members__user_id__patch","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Member","operationId":"delete_member_api_members__user_id__delete","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}},{"name":"transfer","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Transfer"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/members/{user_id}/disable":{"post":{"summary":"Disable Member","operationId":"disable_member_api_members__user_id__disable_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","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/members/{user_id}/enable":{"post":{"summary":"Enable Member","operationId":"enable_member_api_members__user_id__enable_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","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/members/{user_id}/reset-password":{"post":{"summary":"Reset Password","operationId":"reset_password_api_members__user_id__reset_password_post","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/groups":{"get":{"summary":"List Groups","operationId":"list_groups_api_groups_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Create Group","operationId":"create_group_api_groups_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupBody"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/groups/{gid}":{"patch":{"summary":"Rename Group","operationId":"rename_group_api_groups__gid__patch","parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"integer","title":"Gid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Delete Group","operationId":"delete_group_api_groups__gid__delete","parameters":[{"name":"gid","in":"path","required":true,"schema":{"type":"integer","title":"Gid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/members/{user_id}/grants":{"get":{"summary":"Get Grants","operationId":"get_grants_api_members__user_id__grants_get","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Grants","operationId":"put_grants_api_members__user_id__grants_put","parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"integer","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/GrantItem"},"title":"Items"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/me/identities":{"get":{"summary":"Me Identities","operationId":"me_identities_api_me_identities_get","parameters":[{"name":"trashed","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Trashed"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/identities":{"post":{"summary":"Create Identity","operationId":"create_identity_api_identities_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdentityBody"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/identities/{iid}":{"patch":{"summary":"Patch Identity","operationId":"patch_identity_api_identities__iid__patch","parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"integer","title":"Iid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdentityPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Purge Identity","operationId":"purge_identity_api_identities__iid__delete","parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"integer","title":"Iid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/identities/{iid}/trash":{"post":{"summary":"Trash Identity","operationId":"trash_identity_api_identities__iid__trash_post","parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"integer","title":"Iid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/identities/{iid}/restore":{"post":{"summary":"Restore Identity","operationId":"restore_identity_api_identities__iid__restore_post","parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"integer","title":"Iid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/identities/{iid}/export":{"get":{"summary":"Export Identity","operationId":"export_identity_api_identities__iid__export_get","parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"integer","title":"Iid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/devices":{"post":{"summary":"Register Device","operationId":"register_device_api_devices_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeviceBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/portal-ticket":{"post":{"summary":"Portal Ticket","description":"App 里点「续费 / 升级」:给 owner 签一张一次性门户登录票(spec 2026-10-04-kick-device §4.1d)。\n先过 _api_member,被踢的设备、停用的成员都拿不到;库里只存 sha256。","operationId":"portal_ticket_api_portal_ticket_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/audit":{"get":{"summary":"Audit","operationId":"audit_api_audit_get","parameters":[{"name":"member","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Member"}},{"name":"identity","in":"query","required":false,"schema":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Identity"}},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"To"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"json","title":"Format"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":500,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/email/code":{"post":{"summary":"Send Verify Code","operationId":"send_verify_code_api_account_email_code_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/email/verify":{"post":{"summary":"Verify Email","operationId":"verify_email_api_account_email_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/email/change":{"post":{"summary":"Change Email Start","operationId":"change_email_start_api_account_email_change_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/account/email/change/verify":{"post":{"summary":"Change Email Verify","operationId":"change_email_verify_api_account_email_change_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/login":{"post":{"summary":"Login","operationId":"login_admin_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/totp":{"post":{"summary":"Totp Step","operationId":"totp_step_admin_totp_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CodeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/logout":{"post":{"summary":"Logout","operationId":"logout_admin_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/me":{"get":{"summary":"Me","operationId":"me_admin_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/me/password":{"post":{"summary":"Me Password","operationId":"me_password_admin_me_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/adminweb__PwBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/me/rebind-totp":{"post":{"summary":"Me Rebind Totp","operationId":"me_rebind_totp_admin_me_rebind_totp_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/overview":{"get":{"summary":"Overview","operationId":"overview_admin_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/ads/conversions.csv":{"get":{"summary":"Ads Conversions Csv","description":"10-19 Google Ads 离线转化导入用的 CSV(Google Click ID / Conversion Name / Conversion Time / Conversion Value / Conversion Currency):\n网页注册时带 gclid 的账号,每个一行「Signup」(gbraid / wbraid 的 Google 不收 gclid 导入,先不出)。since / until 按 UTC 日期筛注册时间。","operationId":"ads_conversions_csv_admin_ads_conversions_csv_get","parameters":[{"name":"since","in":"query","required":false,"schema":{"type":"string","default":"","title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"type":"string","default":"","title":"Until"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants":{"get":{"summary":"Tenants","description":"客户列表:按注册时间(tenant.created_at)倒序,分页;返回 {items, total, page, page_size},page_size 封顶 200。","operationId":"tenants_admin_tenants_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"expiring","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Expiring"}},{"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","minimum":1,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Tenant Create","description":"新建客户:账号 + 租户 + owner 走与自助注册相同的 backend._create_owner_account;7 天试用直接调 _grant_trial;\n标准套餐录收款走 billing.record_order(订单 / 审计 / 提成同「录入充值」);自定义套餐(仅超管)走\nbilling.set_subscription 的 custom 规则。客户没有密码 → 返回一次性设置密码链接,可选同时发邮件。","operationId":"tenant_create_admin_tenants_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTenantBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants/{tid}":{"get":{"summary":"Tenant Detail","operationId":"tenant_detail_admin_tenants__tid__get","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"integer","title":"Tid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Tenant Note","operationId":"tenant_note_admin_tenants__tid__patch","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"integer","title":"Tid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NoteBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants/{tid}/extend":{"post":{"summary":"Tenant Extend","description":"续期(不经订单):超管 / 财务 / 客服都可,必填原因(负责人 10-07,取代客服 1–7 天每月一次的限额);\n每笔进「未收款变更」(billing.extend 记 unpaid_change)。","operationId":"tenant_extend_admin_tenants__tid__extend_post","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"integer","title":"Tid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtendBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants/{tid}/set-plan":{"post":{"summary":"Tenant Set Plan","description":"改套餐:超管 / 财务 / 客服都可,必填原因;每笔进「未收款变更」。","operationId":"tenant_set_plan_admin_tenants__tid__set_plan_post","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"integer","title":"Tid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlanBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/unpaid":{"get":{"summary":"Unpaid List","description":"不经订单的续期 / 改套餐清单(三种员工角色都能看)。month=YYYY-MM 按北京时间自然月;status=pending|approved。\n返回 {items, totals[{currency, amount, count, pending}], count, pending, no_amount, month, status}。","operationId":"unpaid_list_admin_unpaid_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"month","in":"query","required":false,"schema":{"type":"string","default":"","title":"Month"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/unpaid/{uid}/approve":{"post":{"summary":"Unpaid Approve","operationId":"unpaid_approve_admin_unpaid__uid__approve_post","parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"integer","title":"Uid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/unpaid/{uid}":{"patch":{"summary":"Unpaid Set Amount","operationId":"unpaid_set_amount_admin_unpaid__uid__patch","parameters":[{"name":"uid","in":"path","required":true,"schema":{"type":"integer","title":"Uid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManualAmountBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants/{tid}/suspend":{"post":{"summary":"Tenant Suspend","operationId":"tenant_suspend_admin_tenants__tid__suspend_post","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"integer","title":"Tid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReasonBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants/{tid}/resume":{"post":{"summary":"Tenant Resume","operationId":"tenant_resume_admin_tenants__tid__resume_post","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"integer","title":"Tid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReasonBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants/{tid}/members/{uid}/reset-password":{"post":{"summary":"Member Reset Password","operationId":"member_reset_password_admin_tenants__tid__members__uid__reset_password_post","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"integer","title":"Tid"}},{"name":"uid","in":"path","required":true,"schema":{"type":"integer","title":"Uid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants/{tid}/devices/{did}/revoke":{"post":{"summary":"Device Revoke","operationId":"device_revoke_admin_tenants__tid__devices__did__revoke_post","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"integer","title":"Tid"}},{"name":"did","in":"path","required":true,"schema":{"type":"integer","title":"Did"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/orders":{"post":{"summary":"Order Record","description":"录收款单。自录自推:没带 confirm_self → 409 self_referral_confirm(前端弹「这是你自己推广的客户」);\n带了 → 照常入账,订单标 self_referred,超管确认前不计 BD 提成。","operationId":"order_record_admin_orders_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"summary":"Orders","description":"订单流水。测试单默认照样列出(前端划线),include_test=0 不列;合计(total / totals)一律不含测试单与作废单。\nself_pending=1 只列「自录自推,待超管确认」的(前端标红)。","operationId":"orders_admin_orders_get","parameters":[{"name":"from","in":"query","required":false,"schema":{"type":"string","default":"","title":"From"}},{"name":"to","in":"query","required":false,"schema":{"type":"string","default":"","title":"To"}},{"name":"channel","in":"query","required":false,"schema":{"type":"string","default":"","title":"Channel"}},{"name":"tenant","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Tenant"}},{"name":"include_test","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Include Test"}},{"name":"self_pending","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Self Pending"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/orders/{oid}/confirm-self":{"post":{"summary":"Order Confirm Self","description":"超管确认一笔「自录自推」订单:确认后照常计 BD 提成(审计 order.self_confirmed)。","operationId":"order_confirm_self_admin_orders__oid__confirm_self_post","parameters":[{"name":"oid","in":"path","required":true,"schema":{"type":"integer","title":"Oid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/orders/{oid}/void":{"post":{"summary":"Order Void","operationId":"order_void_admin_orders__oid__void_post","parameters":[{"name":"oid","in":"path","required":true,"schema":{"type":"integer","title":"Oid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/orders/{oid}/restore-forfeit":{"post":{"summary":"Order Restore Forfeit","description":"客服 / 超管一键补回老套餐在线付款时作废的天数(spec §8 追加项 D)。天数由系统给定、不可手填,\n每单只能补一次;不受 support 每月 1-7 天的续期限额(那条只管 tenants/{tid}/extend)。","operationId":"order_restore_forfeit_admin_orders__oid__restore_forfeit_post","parameters":[{"name":"oid","in":"path","required":true,"schema":{"type":"integer","title":"Oid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/orders/{oid}/refresh-pay-detail":{"post":{"summary":"Order Refresh Pay Detail","description":"明细弹窗打开时手续费/实际到账还是空的(webhook 时常查不到 balance_transaction),点一下让后台\n再查一次 Stripe(owner 10-04 追加)。只对 channel='stripe' 生效,fee 已经有值就不连 Stripe。","operationId":"order_refresh_pay_detail_admin_orders__oid__refresh_pay_detail_post","parameters":[{"name":"oid","in":"path","required":true,"schema":{"type":"integer","title":"Oid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/mixpay-orders":{"get":{"summary":"Mixpay Orders","description":"加密货币待处理(spec 2026-10-04-mixpay-crypto §4.9):mixpay_order 里没入账的单,给客服处理「付了没到账」。\nstatus 可筛其中一种;support 看不到金额。","operationId":"mixpay_orders_admin_mixpay_orders_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/mixpay-orders/{order_id}/verify":{"post":{"summary":"Mixpay Order Verify","description":"手动「重新核对」:只调 mixpay.verify(和回调同一套核对),不提供强制入账——核对不过的走手工录单(usdt)。","operationId":"mixpay_order_verify_admin_mixpay_orders__order_id__verify_post","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/catalog":{"get":{"summary":"Catalog Get","operationId":"catalog_get_admin_catalog_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"summary":"Catalog Put","description":"整表替换:带 id 的 UPDATE,没 id 的 INSERT,没传到的下架(不删——订单还引用着)。","operationId":"catalog_put_admin_catalog_put","requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CatalogItem"},"type":"array","title":"Items"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/settings":{"get":{"summary":"Settings Get","operationId":"settings_get_admin_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"summary":"Settings Put","operationId":"settings_put_admin_settings_put","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/admins":{"get":{"summary":"Admins List","description":"全部后台账号,含纯员工 BD(10-07 负责人:原来的 BD 兼财务 / 客服,超管在这里给他加角色)。","operationId":"admins_list_admin_admins_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Admins Create","operationId":"admins_create_admin_admins_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminBody"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/admins/{aid}":{"patch":{"summary":"Admins Patch","description":"改角色(多选,只有超管)/ 停用恢复。改角色写审计 admin.roles_changed {from, to},对方会话作废。\n纯员工 BD 也能在这里加财务 / 客服等角色(推广员行与邀请码不变);至少保留一个角色。","operationId":"admins_patch_admin_admins__aid__patch","parameters":[{"name":"aid","in":"path","required":true,"schema":{"type":"integer","title":"Aid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/admins/{aid}/reset-totp":{"post":{"summary":"Admins Reset Totp","operationId":"admins_reset_totp_admin_admins__aid__reset_totp_post","parameters":[{"name":"aid","in":"path","required":true,"schema":{"type":"integer","title":"Aid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/reminders":{"get":{"summary":"Reminders List","operationId":"reminders_list_admin_reminders_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/reminders/run":{"post":{"summary":"Reminders Run","description":"手动跑一次今天的 7/3/0 天提醒(timer 每天也会跑;已发过的不会重发)。","operationId":"reminders_run_admin_reminders_run_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/audit":{"get":{"summary":"Audit List","operationId":"audit_list_admin_audit_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/releases":{"get":{"summary":"Releases","description":"只读:更新源 latest.yml、下载站当前全量包、内核目录。文件不在就给 null,不 500。","operationId":"releases_admin_releases_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/promoter/me":{"get":{"summary":"Promoter Me","description":"推广员自己的数据:链接 / 码、渠道表、注册与付费客户数、每月提成、订单明细(不给租户名 / id;\n10-08 负责人定:自己客户的邮箱不脱敏)。","operationId":"promoter_me_admin_promoter_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/promo/codes":{"get":{"summary":"Promo Codes","description":"BD 自己的渠道列表(含主码 = 默认渠道),每条带注册数 / 付费客户数 / 累计提成。","operationId":"promo_codes_admin_promo_codes_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Promo Codes Create","description":"BD 自己加一个渠道码:备注必填;码选填(3–16 位字母 / 数字 / 横线,留空随机 6 位),全局不重复。","operationId":"promo_codes_create_admin_promo_codes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelBody"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/promo/codes/{cid}":{"patch":{"summary":"Promo Codes Patch","description":"BD 改自己的渠道码:备注随时可改;码只在还没带来注册时可改;停用后新注册不再认,已归属客户不变;可恢复。","operationId":"promo_codes_patch_admin_promo_codes__cid__patch","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/promoters/{pid}/codes":{"get":{"summary":"Promoters Codes","description":"后台「员工 BD」页看某个 BD 的渠道(备注 / 码 / 建时间 / 状态 / 统计);金额按 sees_money。","operationId":"promoters_codes_admin_promoters__pid__codes_get","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"integer","title":"Pid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/promoters/{pid}/codes/{cid}":{"patch":{"summary":"Promoters Codes Patch","description":"超管停用 / 恢复某个 BD 的渠道码(不改码、不改备注)。","operationId":"promoters_codes_patch_admin_promoters__pid__codes__cid__patch","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"integer","title":"Pid"}},{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChannelPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/promo/customers":{"get":{"summary":"Promo Customers","description":"BD 自己推广来的客户(邮箱不脱敏,负责人 10-08 定);别的 BD 的一律看不到。","operationId":"promo_customers_admin_promo_customers_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"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","minimum":1,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/promoters/{pid}/customers":{"get":{"summary":"Promoters Customers","description":"后台「员工 BD」页看某个 BD 的客户,同一张表;客服看不到累计付费金额。","operationId":"promoters_customers_admin_promoters__pid__customers_get","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"integer","title":"Pid"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"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","minimum":1,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/promoters":{"get":{"summary":"Promoters List","operationId":"promoters_list_admin_promoters_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Promoters Create","description":"新建推广员 = 一个 promoter 角色的后台账号 + 邀请码。临时密码只在这次响应里出现;首次登录强制绑验证器。","operationId":"promoters_create_admin_promoters_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoterBody"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/promoters/{pid}":{"patch":{"summary":"Promoters Patch","description":"改名 / 改邀请码(旧链接立即失效)/ 停用恢复(登录账号一起停,会话作废)。","operationId":"promoters_patch_admin_promoters__pid__patch","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"integer","title":"Pid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromoterPatch"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/promoters/{pid}/reset-login":{"post":{"summary":"Promoters Reset Login","description":"推广员忘密码 / 换手机:新临时密码 + 清验证器,旧会话全部作废。临时密码只在这次响应里出现。","operationId":"promoters_reset_login_admin_promoters__pid__reset_login_post","parameters":[{"name":"pid","in":"path","required":true,"schema":{"type":"integer","title":"Pid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/promoters/report":{"get":{"summary":"Promoters Report","description":"月度提成报表(北京时间自然月;提成行按订单入账月,冲回行按作废月;比例按当月业绩阶梯)。\nself_pending=1 只列「自录自推,待超管确认」的行。","operationId":"promoters_report_admin_promoters_report_get","parameters":[{"name":"month","in":"query","required":false,"schema":{"type":"string","default":"","title":"Month"}},{"name":"promoter","in":"query","required":false,"schema":{"type":"integer","default":0,"title":"Promoter"}},{"name":"self_pending","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Self Pending"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","default":"","title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/promoters/tiers":{"get":{"summary":"Bd Tiers","description":"员工 BD 阶梯表:默认表、各版本、本月生效的表(spec 2026-10-06 §3.3;next_month 保留兼容,已不用于生效)。","operationId":"bd_tiers_admin_promoters_tiers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"summary":"Bd Tiers Put","description":"改阶梯(仅超管,10-06 负责人定当场生效):生效月 = 修改所在的北京时间自然月,当月整月按新表重算,\n以前的月份仍按各自当时的表;同月再改 = 覆盖;旧规则下排到以后月份的版本一并删掉(否则下月会被它盖回去)。审计前后两张表。","operationId":"bd_tiers_put_admin_promoters_tiers_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TiersBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tenants/{tid}/referral":{"post":{"summary":"Tenant Referral","description":"超管手动改客户归属(审计):员工 BD(promoter_id)或普通客户(referrer_tenant_id),都空 = 清除。\n10-06 负责人定:从改的这一刻起,之后的订单算新推荐人;之前的订单仍算原推荐人(已产生的提成 / 分成、可疑审核都不动)。\n靠 referral_change 记一行(提成 / 分成按订单发生时的归属现算,见 referral.EFFECTIVE_JOIN)。","operationId":"tenant_referral_admin_tenants__tid__referral_post","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"integer","title":"Tid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReferralBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/rewards/withdrawals":{"get":{"summary":"Reward Withdrawals","operationId":"reward_withdrawals_admin_rewards_withdrawals_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"pending","title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/rewards/withdrawals/{wid}/paid":{"post":{"summary":"Reward Withdrawal Paid","operationId":"reward_withdrawal_paid_admin_rewards_withdrawals__wid__paid_post","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"integer","title":"Wid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TxidBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/rewards/withdrawals/{wid}/reject":{"post":{"summary":"Reward Withdrawal Reject","operationId":"reward_withdrawal_reject_admin_rewards_withdrawals__wid__reject_post","parameters":[{"name":"wid","in":"path","required":true,"schema":{"type":"integer","title":"Wid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RejectBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/rewards/affiliates":{"get":{"summary":"Reward Affiliates","operationId":"reward_affiliates_admin_rewards_affiliates_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/rewards/affiliates/{tid}":{"get":{"summary":"Reward Affiliate","operationId":"reward_affiliate_admin_rewards_affiliates__tid__get","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"integer","title":"Tid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/rewards/affiliates/{tid}/freeze":{"post":{"summary":"Reward Affiliate Freeze","description":"冻结:不能提现、推广码失效(新注册不再绑定);已产生的分成保留。解冻恢复。","operationId":"reward_affiliate_freeze_admin_rewards_affiliates__tid__freeze_post","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"integer","title":"Tid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FreezeBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/rewards/affiliates/{tid}/rescreen":{"post":{"summary":"Reward Affiliate Rescreen","operationId":"reward_affiliate_rescreen_admin_rewards_affiliates__tid__rescreen_post","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"integer","title":"Tid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/rewards/reviews":{"get":{"summary":"Reward Reviews","operationId":"reward_reviews_admin_rewards_reviews_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"pending","title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/rewards/reviews/{invitee}":{"post":{"summary":"Reward Review","description":"审核可疑邀请:approve 恢复分成;reject 取消该被邀请人带来的全部分成(没有记录的被邀请人可直接取消,reasons=[manual])。","operationId":"reward_review_admin_rewards_reviews__invitee__post","parameters":[{"name":"invitee","in":"path","required":true,"schema":{"type":"integer","title":"Invitee"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/portal/login":{"post":{"summary":"Login","operationId":"login_api_portal_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/portal/auth/config":{"get":{"summary":"Auth Config","description":"登录页要显示哪些入口:注册(自助试用开着)、Google(配了 OAuth 客户端)。","operationId":"auth_config_api_portal_auth_config_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/portal/ref/{code}":{"get":{"summary":"Ref Check","description":"注册页实时校验邀请码(spec 2026-10-05-promoter-referral §3.2):只回有没有效,无效也不阻止注册。\n员工 BD 码与客户推广码都认(spec 2026-10-06-referral-rewards §4.2)。","operationId":"ref_check_api_portal_ref__code__get","parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/portal/signup/code":{"post":{"summary":"Signup Code","operationId":"signup_code_api_portal_signup_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupCodeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/portal/signup":{"post":{"summary":"Signup","operationId":"signup_api_portal_signup_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignupBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/portal/ticket":{"post":{"summary":"Ticket Login","description":"App 换来的一次性票 → 门户会话(spec 2026-10-04-kick-device §4.1d)。票先作废再核对身份;只给 owner。","operationId":"ticket_login_api_portal_ticket_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/portal__TicketBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/portal/logout":{"post":{"summary":"Logout","operationId":"logout_api_portal_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/portal/me":{"get":{"summary":"Me","operationId":"me_api_portal_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/portal/members":{"get":{"summary":"Members","operationId":"members_api_portal_members_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/portal/devices":{"get":{"summary":"Devices","operationId":"devices_api_portal_devices_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/portal/devices/{did}/revoke":{"post":{"summary":"Device Revoke","operationId":"device_revoke_api_portal_devices__did__revoke_post","parameters":[{"name":"did","in":"path","required":true,"schema":{"type":"integer","title":"Did"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/portal/orders":{"get":{"summary":"Orders","operationId":"orders_api_portal_orders_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/portal/pricing":{"get":{"summary":"Pricing","operationId":"pricing_api_portal_pricing_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"zh","title":"Lang"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/portal/checkout/preview":{"post":{"summary":"Checkout Preview","description":"预估(只读):应付金额、付后档位、新到期日、换档折算天数。入账时按入账那一刻重算,可能差一天以内。","operationId":"checkout_preview_api_portal_checkout_preview_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/portal/checkout":{"post":{"summary":"Checkout","description":"建 Stripe Checkout Session,返回付款页 url(前端 location.href 跳过去)。金额只由服务器算,\n不接收前端金额;入账只在 webhook。","operationId":"checkout_api_portal_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/portal/mixpay/checkout":{"post":{"summary":"Mixpay Checkout","description":"加密货币付款建单(spec 2026-10-04-mixpay-crypto §4.4)。金额只由服务器算;关闭 / 不在白名单 → 404\n(不暴露功能存在)。_real_owner 在开关之前:非 owner 一律 403,和 Stripe 一致。","operationId":"mixpay_checkout_api_portal_mixpay_checkout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/portal/mixpay/orders/{order_id}":{"get":{"summary":"Mixpay Order","description":"加密货币付款结果页轮询(spec 2026-10-04-mixpay-crypto §4.7):只看本租户的单;pending / expired 且\n15 秒内没查过才回查 MixPay(MixPay 限 60 次 / 分)。关闭 / 不在白名单 → 404。","operationId":"mixpay_order_api_portal_mixpay_orders__order_id__get","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"string","title":"Order Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/portal/password":{"post":{"summary":"Password","operationId":"password_api_portal_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/portal__PwBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/portal/password/forgot":{"post":{"summary":"Password Forgot","description":"有这个邮箱就发重置链接;无论存不存在都回 200(不泄露账号存在性)。","operationId":"password_forgot_api_portal_password_forgot_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgotBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/portal/oauth/google/start":{"get":{"summary":"Start","operationId":"start_api_portal_oauth_google_start_get","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","default":"en","title":"Lang"}},{"name":"ref","in":"query","required":false,"schema":{"type":"string","default":"","title":"Ref"}},{"name":"ref_link","in":"query","required":false,"schema":{"type":"string","default":"","title":"Ref Link"}},{"name":"desktop","in":"query","required":false,"schema":{"type":"string","default":"","title":"Desktop"}},{"name":"dl","in":"query","required":false,"schema":{"type":"string","default":"","title":"Dl"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/portal/oauth/google/callback":{"get":{"summary":"Callback","operationId":"callback_api_portal_oauth_google_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/google/start":{"post":{"summary":"Desktop Start","operationId":"desktop_start_api_auth_google_start_post","requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/DesktopStartBody"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/auth/google/token":{"post":{"summary":"Desktop Token","description":"RFC 8628 风格:authorization_pending · slow_down · expired_token(不存在 / 已用 / 过期不区分)·\naccess_denied + reason;成功 = /api/auth/login 同形状,签票前检查失败原样 4xx {detail:{reason}}。","operationId":"desktop_token_api_auth_google_token_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DesktopTokenBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stripe/webhook":{"post":{"summary":"Webhook","description":"Stripe 推送:验签(Stripe-Signature + STRIPE_WEBHOOK_SECRET,5 分钟容差)失败 400;\n处理 checkout.session.completed / async_payment_succeeded,其它事件 200 忽略。","operationId":"webhook_api_stripe_webhook_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/mixpay/callback":{"post":{"summary":"Callback","description":"MixPay 回调(只带 orderId / traceId / payeeId,无签名):只当「去查一下」,入账全靠 verify 回查。\n终态回 200 {\"code\":\"SUCCESS\"} 让它别再推;未定回 202 {\"code\":\"PENDING\"} 让它按重试表再推(RoamProxy 跑通的做法)。\n不受 MIXPAY_ENABLED 影响(关开关后已建的单付了也要入账);nginx 只放行 52.198.117.57(spec §8)。","operationId":"callback_api_mixpay_callback_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/portal/rewards":{"get":{"summary":"Portal Rewards","operationId":"portal_rewards_api_portal_rewards_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/portal/rewards/withdraw":{"post":{"summary":"Portal Withdraw","operationId":"portal_withdraw_api_portal_rewards_withdraw_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WithdrawBody"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/rewards":{"get":{"summary":"Api Rewards","operationId":"api_rewards_api_rewards_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/rewards/withdraw":{"post":{"summary":"Api Withdraw","operationId":"api_withdraw_api_rewards_withdraw_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WithdrawBody"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dl/token":{"post":{"summary":"Issue Api","description":"官网下载按钮调用(公开,CORS 只放官网来源)。失败时官网退回直链下载,用户照样能下。","operationId":"issue_api_api_dl_token_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/dl/token/{token}":{"get":{"summary":"Lookup Api","description":"客户端注册页:凭证 → 显示用推荐码(灰色锁定显示)。只回码本身;认不出 → {code: null}。","operationId":"lookup_api_api_dl_token__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/portal/tickets/login":{"post":{"summary":"Portal Ticket Login","description":"桌面「提交工单」后带来的一次性票 → 门户会话。和续费票不同:任何在职成员都可以(只拿到自己角色的门户)。","operationId":"portal_ticket_login_api_portal_tickets_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TicketLoginBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/portal/tickets":{"get":{"summary":"Portal List","operationId":"portal_list_api_portal_tickets_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Portal Create","operationId":"portal_create_api_portal_tickets_post","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_portal_create_api_portal_tickets_post"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/portal/tickets/{tid}":{"get":{"summary":"Portal Detail","operationId":"portal_detail_api_portal_tickets__tid__get","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"integer","title":"Tid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/portal/tickets/{tid}/reply":{"post":{"summary":"Portal Reply","operationId":"portal_reply_api_portal_tickets__tid__reply_post","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"integer","title":"Tid"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_portal_reply_api_portal_tickets__tid__reply_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/portal/tickets/{tid}/close":{"post":{"summary":"Portal Close","operationId":"portal_close_api_portal_tickets__tid__close_post","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"integer","title":"Tid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/portal/ticket-files/{aid}":{"get":{"summary":"Portal File","operationId":"portal_file_api_portal_ticket_files__aid__get","parameters":[{"name":"aid","in":"path","required":true,"schema":{"type":"integer","title":"Aid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tickets":{"post":{"summary":"Api Create","operationId":"api_create_api_tickets_post","requestBody":{"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_api_create_api_tickets_post"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/tickets/{tid}/portal-ticket":{"post":{"summary":"Api Portal Ticket","description":"给能看这张工单的成员签一次性门户票(180 秒、只存 sha256、purpose='tickets')。","operationId":"api_portal_ticket_api_tickets__tid__portal_ticket_post","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"integer","title":"Tid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tickets/stats":{"get":{"summary":"Admin Stats","operationId":"admin_stats_admin_tickets_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/tickets/assignees":{"get":{"summary":"Admin Assignees","operationId":"admin_assignees_admin_tickets_assignees_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/tickets/settings":{"get":{"summary":"Admin Settings","operationId":"admin_settings_admin_tickets_settings_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"summary":"Admin Settings Put","operationId":"admin_settings_put_admin_tickets_settings_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SettingsBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tickets":{"get":{"summary":"Admin List","operationId":"admin_list_admin_tickets_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","default":"","title":"Status"}},{"name":"category","in":"query","required":false,"schema":{"type":"string","default":"","title":"Category"}},{"name":"assignee","in":"query","required":false,"schema":{"type":"string","default":"","title":"Assignee"}},{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tickets/{tid}":{"get":{"summary":"Admin Detail","operationId":"admin_detail_admin_tickets__tid__get","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"integer","title":"Tid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tickets/{tid}/reply":{"post":{"summary":"Admin Reply","operationId":"admin_reply_admin_tickets__tid__reply_post","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"integer","title":"Tid"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_admin_reply_admin_tickets__tid__reply_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tickets/{tid}/status":{"post":{"summary":"Admin Status","operationId":"admin_status_admin_tickets__tid__status_post","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"integer","title":"Tid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tickets/{tid}/assign":{"post":{"summary":"Admin Assign","operationId":"admin_assign_admin_tickets__tid__assign_post","parameters":[{"name":"tid","in":"path","required":true,"schema":{"type":"integer","title":"Tid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/ticket-files/{aid}":{"get":{"summary":"Admin File","operationId":"admin_file_admin_ticket_files__aid__get","parameters":[{"name":"aid","in":"path","required":true,"schema":{"type":"integer","title":"Aid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/launch-tickets":{"post":{"summary":"Launch Tickets","description":"按请求顺序(daemon 按身份建立先后排)放票:已在用(4 天内领过)的身份照发;新身份在套餐名额内才发,\n满了进 refused(over_limit)。同一身份换种子一天最多 50 次(seed_churn)。","operationId":"launch_tickets_api_launch_tickets_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/launch_tickets__TicketBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/launch-tickets/release":{"post":{"summary":"Release","description":"删身份后腾出名额(该身份已发出的票照样在 exp 前有效,最多 72 小时)。","operationId":"release_api_launch_tickets_release_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReleaseBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/kernels/link":{"post":{"summary":"Kernel Link","description":"登录用户(含免费版)要内核 zip 的下载链接,1 小时有效;租户暂停 → 403。","operationId":"kernel_link_api_kernels_link_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/geoip/links":{"get":{"summary":"Geoip Links","description":"{\"mmdb\": [url…], \"sha256\": [url…]},两组一一对应。大陆 → [COS, 香港];其它 → [香港, COS]。","operationId":"geoip_links_api_geoip_links_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/extensions/links":{"get":{"summary":"Ext Links","description":"{store_id, version, file, sha256, size, urls, expires}。422 bad_id · 404 not_mirrored(不在清单里)·\n503 没配任何源 · 429 问太勤。不用登录(扩展本身是商店公开包,链接 1 小时有效)。","operationId":"ext_links_api_extensions_links_get","parameters":[{"name":"id","in":"query","required":false,"schema":{"type":"string","default":"","title":"Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stepup/methods":{"get":{"summary":"Methods","operationId":"methods_api_stepup_methods_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/stepup/password":{"post":{"summary":"By Password","operationId":"by_password_api_stepup_password_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordScope"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stepup/email-code":{"post":{"summary":"Email Code","operationId":"email_code_api_stepup_email_code_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Scope"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stepup/email":{"post":{"summary":"By Email","operationId":"by_email_api_stepup_email_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailScope"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/stepup/audit":{"post":{"summary":"Audit","description":"daemon 上报一次导出 / 导入(spec §6.7):记租户审计;子账号成功导入 / 导出时邮件通知主账号和有 view_audit 的管理员。\n不收也不存任何 Cookie 值。","operationId":"audit_api_stepup_audit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/stepup_api__AuditBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookie-sync/key":{"get":{"summary":"Get Key","operationId":"get_key_api_cookie_sync_key_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"put":{"summary":"Put Key","operationId":"put_key_api_cookie_sync_key_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Reset Key","operationId":"reset_key_api_cookie_sync_key_delete","responses":{"204":{"description":"Successful Response"}}}},"/api/cookie-sync/devices":{"post":{"summary":"Approve Device","description":"新电脑输过恢复码后登记本设备(之后才给它密文)。老板 10-18 定:这一步不再验二次验证票 —— 能拿出恢复码就已证明是本人,\n这台也登录过账号;密文本来就是端到端加密的。验证码只留给建码 / 换码 / 重置 / 接管。","operationId":"approve_device_api_cookie_sync_devices_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/identities/{iid}/cookie-sync":{"get":{"summary":"Get State","operationId":"get_state_api_identities__iid__cookie_sync_get","parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"integer","title":"Iid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Enable","operationId":"enable_api_identities__iid__cookie_sync_put","parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"integer","title":"Iid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnableBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Disable","description":"关闭 = 物理删除密文和包装密钥(连带租约)。备份里的加密副本由 np-prune-predeploy / R2 生命周期在 30 天内删掉。","operationId":"disable_api_identities__iid__cookie_sync_delete","parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"integer","title":"Iid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookie-sync/enable-batch":{"post":{"summary":"Enable Batch","description":"0e4 云同步页(方案 docs/reviews/2026-10-18-云同步入口-调研与方案.md §3 A):一张票(名单 = 所选身份)同时建恢复码 + 开所选身份,\n验证只弹一次。票的范围规则本来就是「票里的名单 ⊇ 请求的名单」,只是 jti 一次性,所以合成一个请求。逐个身份给结果(已开 / 超上限不算整体失败)。","operationId":"enable_batch_api_cookie_sync_enable_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookie-sync/overview":{"get":{"summary":"Overview","description":"0e4 云同步页:我能看到的每个身份(未进回收站)的同步状态,一次拿齐;不带包装密钥(那是打开身份时按身份取的)。","operationId":"overview_api_cookie_sync_overview_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/identities/{iid}/cookie-sync/blob":{"get":{"summary":"Get Blob","operationId":"get_blob_api_identities__iid__cookie_sync_blob_get","parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"integer","title":"Iid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"summary":"Put Blob","operationId":"put_blob_api_identities__iid__cookie_sync_blob_put","parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"integer","title":"Iid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BlobBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/identities/{iid}/lease":{"post":{"summary":"Acquire","operationId":"acquire_api_identities__iid__lease_post","parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"integer","title":"Iid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeaseBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Release","description":"释放:有人在等接管 → 直接交给他(他下一次拿租约就是持有者);否则删掉。","operationId":"release_api_identities__iid__lease_delete","parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"integer","title":"Iid"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/identities/{iid}/lease/heartbeat":{"post":{"summary":"Heartbeat","operationId":"heartbeat_api_identities__iid__lease_heartbeat_post","parameters":[{"name":"iid","in":"path","required":true,"schema":{"type":"integer","title":"Iid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/cookie-sync/audit":{"post":{"summary":"Report","operationId":"report_api_cookie_sync_audit_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/cookie_sync__AuditBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dl/downloads/{file}":{"get":{"summary":"Downloads","operationId":"downloads_dl_downloads__file__get","parameters":[{"name":"file","in":"path","required":true,"schema":{"type":"string","title":"File"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"head":{"summary":"Downloads","operationId":"downloads_dl_downloads__file__get","parameters":[{"name":"file","in":"path","required":true,"schema":{"type":"string","title":"File"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dl/updates/nullprint/{platform}/{file}":{"get":{"summary":"Updates","operationId":"updates_dl_updates_nullprint__platform___file__get","parameters":[{"name":"platform","in":"path","required":true,"schema":{"type":"string","title":"Platform"}},{"name":"file","in":"path","required":true,"schema":{"type":"string","title":"File"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"head":{"summary":"Updates","operationId":"updates_dl_updates_nullprint__platform___file__get","parameters":[{"name":"platform","in":"path","required":true,"schema":{"type":"string","title":"Platform"}},{"name":"file","in":"path","required":true,"schema":{"type":"string","title":"File"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AdminBody":{"properties":{"login":{"type":"string","title":"Login"},"password":{"type":"string","title":"Password"},"roles":{"anyOf":[{"items":{"type":"string","enum":["super","support","finance","promoter"]},"type":"array"},{"type":"null"}],"title":"Roles"},"role":{"anyOf":[{"type":"string","enum":["super","support","finance"]},{"type":"null"}],"title":"Role"}},"type":"object","required":["login","password"],"title":"AdminBody"},"AdminPatch":{"properties":{"roles":{"anyOf":[{"items":{"type":"string","enum":["super","support","finance","promoter"]},"type":"array"},{"type":"null"}],"title":"Roles"},"role":{"anyOf":[{"type":"string","enum":["super","support","finance"]},{"type":"null"}],"title":"Role"},"disabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Disabled"}},"type":"object","title":"AdminPatch"},"ApiAuthBody":{"properties":{"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"login":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Login"},"password":{"type":"string","title":"Password"},"product":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product"},"ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ref"},"dl_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dl Token"}},"type":"object","required":["password"],"title":"ApiAuthBody"},"ApproveBody":{"properties":{"note":{"type":"string","title":"Note","default":""}},"type":"object","title":"ApproveBody"},"AssignBody":{"properties":{"admin_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Admin Id"}},"type":"object","title":"AssignBody"},"BatchBody":{"properties":{"key":{"anyOf":[{"$ref":"#/components/schemas/KeyBody"},{"type":"null"}]},"items":{"items":{"$ref":"#/components/schemas/BatchItem"},"type":"array","title":"Items"}},"additionalProperties":false,"type":"object","required":["items"],"title":"BatchBody"},"BatchItem":{"properties":{"identity_id":{"type":"integer","title":"Identity Id"},"wrap_nonce":{"type":"string","title":"Wrap Nonce"},"wrapped_dek":{"type":"string","title":"Wrapped Dek"}},"additionalProperties":false,"type":"object","required":["identity_id","wrap_nonce","wrapped_dek"],"title":"BatchItem"},"BlobBody":{"properties":{"base_version":{"type":"integer","title":"Base Version"},"nonce":{"type":"string","title":"Nonce"},"ct":{"type":"string","title":"Ct"},"origin_kernel":{"type":"integer","title":"Origin Kernel"},"origin_platform":{"type":"string","title":"Origin Platform"},"count":{"type":"integer","title":"Count"}},"additionalProperties":false,"type":"object","required":["base_version","nonce","ct","origin_kernel","origin_platform","count"],"title":"BlobBody"},"Body_activate_activate_post":{"properties":{"user_code":{"type":"string","title":"User Code"},"action":{"type":"string","title":"Action"}},"type":"object","required":["user_code","action"],"title":"Body_activate_activate_post"},"Body_admin_reply_admin_tickets__tid__reply_post":{"properties":{"body":{"type":"string","title":"Body"},"internal":{"type":"boolean","title":"Internal","default":false},"status":{"type":"string","title":"Status","default":""},"files":{"anyOf":[{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array"},{"type":"null"}],"title":"Files"}},"type":"object","required":["body"],"title":"Body_admin_reply_admin_tickets__tid__reply_post"},"Body_api_create_api_tickets_post":{"properties":{"category":{"type":"string","title":"Category"},"subject":{"type":"string","title":"Subject"},"body":{"type":"string","title":"Body"},"lang":{"type":"string","title":"Lang","default":"zh"},"files":{"anyOf":[{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array"},{"type":"null"}],"title":"Files"}},"type":"object","required":["category","subject","body"],"title":"Body_api_create_api_tickets_post"},"Body_buy_buy_post":{"properties":{"email":{"type":"string","title":"Email"},"plan":{"type":"string","title":"Plan"}},"type":"object","required":["email","plan"],"title":"Body_buy_buy_post"},"Body_identities_create_identities_post":{"properties":{"name":{"type":"string","title":"Name"},"platform":{"type":"string","title":"Platform","default":""},"country":{"type":"string","title":"Country","default":""}},"type":"object","required":["name"],"title":"Body_identities_create_identities_post"},"Body_identities_delete_identities_delete_post":{"properties":{"identity_id":{"type":"string","title":"Identity Id"}},"type":"object","required":["identity_id"],"title":"Body_identities_delete_identities_delete_post"},"Body_login_login_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"next":{"type":"string","title":"Next","default":"/account"}},"type":"object","required":["email","password"],"title":"Body_login_login_post"},"Body_portal_create_api_portal_tickets_post":{"properties":{"category":{"type":"string","title":"Category"},"subject":{"type":"string","title":"Subject"},"body":{"type":"string","title":"Body"},"lang":{"type":"string","title":"Lang","default":"zh"},"files":{"anyOf":[{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array"},{"type":"null"}],"title":"Files"}},"type":"object","required":["category","subject","body"],"title":"Body_portal_create_api_portal_tickets_post"},"Body_portal_reply_api_portal_tickets__tid__reply_post":{"properties":{"body":{"type":"string","title":"Body"},"files":{"anyOf":[{"items":{"type":"string","contentMediaType":"application/octet-stream"},"type":"array"},{"type":"null"}],"title":"Files"}},"type":"object","required":["body"],"title":"Body_portal_reply_api_portal_tickets__tid__reply_post"},"Body_set_password_set_password_post":{"properties":{"token":{"type":"string","title":"Token"},"password":{"type":"string","title":"Password"}},"type":"object","required":["token","password"],"title":"Body_set_password_set_password_post"},"Body_signup_confirm_form_signup_confirm_post":{"properties":{"email":{"type":"string","title":"Email"},"code":{"type":"string","title":"Code"}},"type":"object","required":["email","code"],"title":"Body_signup_confirm_form_signup_confirm_post"},"Body_signup_form_signup_post":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"product":{"type":"string","title":"Product","default":""},"ref":{"type":"string","title":"Ref","default":""},"dl_token":{"type":"string","title":"Dl Token","default":""}},"type":"object","required":["email","password"],"title":"Body_signup_form_signup_post"},"Body_team_add_team_add_post":{"properties":{"email":{"type":"string","title":"Email"},"role":{"type":"string","title":"Role"}},"type":"object","required":["email","role"],"title":"Body_team_add_team_add_post"},"Body_team_remove_team_remove_post":{"properties":{"user_id":{"type":"string","title":"User Id"}},"type":"object","required":["user_id"],"title":"Body_team_remove_team_remove_post"},"Body_team_role_team_role_post":{"properties":{"user_id":{"type":"string","title":"User Id"},"role":{"type":"string","title":"Role"}},"type":"object","required":["user_id","role"],"title":"Body_team_role_team_role_post"},"CatalogItem":{"properties":{"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"},"name":{"type":"string","title":"Name"},"price_month":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Price Month"},"currency":{"type":"string","title":"Currency","default":"USD"},"profile_limit":{"type":"integer","title":"Profile Limit"},"seats":{"type":"integer","title":"Seats","default":2},"active":{"type":"boolean","title":"Active","default":true},"sort":{"type":"integer","title":"Sort","default":0}},"type":"object","required":["name","price_month","profile_limit"],"title":"CatalogItem"},"ChangeBody":{"properties":{"password":{"type":"string","title":"Password"},"new_email":{"type":"string","title":"New Email"}},"type":"object","required":["password","new_email"],"title":"ChangeBody"},"ChannelBody":{"properties":{"note":{"type":"string","title":"Note"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},"type":"object","required":["note"],"title":"ChannelBody"},"ChannelPatch":{"properties":{"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"disabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Disabled"}},"type":"object","title":"ChannelPatch"},"CheckoutBody":{"properties":{"catalog_id":{"type":"integer","title":"Catalog Id"},"months":{"type":"integer","title":"Months"}},"type":"object","required":["catalog_id","months"],"title":"CheckoutBody"},"CodeBody":{"properties":{"code":{"type":"string","title":"Code"}},"type":"object","required":["code"],"title":"CodeBody"},"CreateTenantBody":{"properties":{"email":{"type":"string","title":"Email"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"mode":{"type":"string","enum":["trial","standard","custom"],"title":"Mode"},"catalog_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Catalog Id"},"months":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Months"},"payment":{"anyOf":[{"$ref":"#/components/schemas/PaymentPart"},{"type":"null"}]},"plan_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Name"},"profile_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Profile Limit"},"seats":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seats"},"expires_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expires At"},"promoter_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Promoter Id"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"contact":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact"},"send_email":{"type":"boolean","title":"Send Email","default":false},"lang":{"type":"string","enum":["en","zh"],"title":"Lang","default":"en"},"confirm_self":{"type":"boolean","title":"Confirm Self","default":false}},"type":"object","required":["email","mode"],"title":"CreateTenantBody"},"DesktopStartBody":{"properties":{"product":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product"},"lang":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lang"},"ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ref"},"dl_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dl Token"}},"type":"object","title":"DesktopStartBody"},"DesktopTokenBody":{"properties":{"poll_code":{"type":"string","title":"Poll Code"}},"type":"object","required":["poll_code"],"title":"DesktopTokenBody"},"DeviceBody":{"properties":{"fingerprint":{"type":"string","title":"Fingerprint"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"},"client_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Version"}},"type":"object","required":["fingerprint"],"title":"DeviceBody"},"DeviceStartBody":{"properties":{"product":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product"}},"type":"object","title":"DeviceStartBody"},"DeviceTokenBody":{"properties":{"device_code":{"type":"string","title":"Device Code"}},"type":"object","required":["device_code"],"title":"DeviceTokenBody"},"EmailScope":{"properties":{"act":{"type":"string","title":"Act"},"pids":{"items":{"type":"string"},"type":"array","title":"Pids","default":[]},"mh":{"type":"string","title":"Mh"},"hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hours"},"code":{"type":"string","title":"Code"}},"type":"object","required":["act","mh","code"],"title":"EmailScope"},"EnableBody":{"properties":{"wrap_nonce":{"type":"string","title":"Wrap Nonce"},"wrapped_dek":{"type":"string","title":"Wrapped Dek"}},"additionalProperties":false,"type":"object","required":["wrap_nonce","wrapped_dek"],"title":"EnableBody"},"ExtendBody":{"properties":{"days":{"type":"integer","title":"Days","default":0},"months":{"type":"integer","title":"Months","default":0},"reason":{"type":"string","title":"Reason","default":""}},"type":"object","title":"ExtendBody"},"ForgotBody":{"properties":{"email":{"type":"string","title":"Email"}},"type":"object","required":["email"],"title":"ForgotBody"},"FreezeBody":{"properties":{"frozen":{"type":"boolean","title":"Frozen"},"reason":{"type":"string","title":"Reason","default":""}},"type":"object","required":["frozen"],"title":"FreezeBody"},"GrantItem":{"properties":{"kind":{"type":"string","title":"Kind"},"id":{"type":"integer","title":"Id"}},"type":"object","required":["kind","id"],"title":"GrantItem"},"GroupBody":{"properties":{"name":{"type":"string","title":"Name"}},"type":"object","required":["name"],"title":"GroupBody"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IdentityBody":{"properties":{"name":{"type":"string","title":"Name"},"config":{"additionalProperties":true,"type":"object","title":"Config","default":{}},"group_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Group Id"}},"type":"object","required":["name"],"title":"IdentityBody"},"IdentityPatch":{"properties":{"config_version":{"type":"integer","title":"Config Version"},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"group_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Group Id"}},"type":"object","required":["config_version"],"title":"IdentityPatch"},"IssueBody":{"properties":{"ref":{"type":"string","title":"Ref"},"first_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"First At"},"platform":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform"}},"type":"object","required":["ref"],"title":"IssueBody"},"Item":{"properties":{"pid":{"type":"string","title":"Pid"},"fp":{"type":"string","title":"Fp"}},"type":"object","required":["pid","fp"],"title":"Item"},"Kdf":{"properties":{"alg":{"type":"string","title":"Alg"},"n":{"type":"integer","title":"N"},"r":{"type":"integer","title":"R"},"p":{"type":"integer","title":"P"}},"additionalProperties":false,"type":"object","required":["alg","n","r","p"],"title":"Kdf"},"KeyBody":{"properties":{"salt":{"type":"string","title":"Salt"},"kdf":{"$ref":"#/components/schemas/Kdf"},"check_nonce":{"type":"string","title":"Check Nonce"},"check_ct":{"type":"string","title":"Check Ct"},"rotate":{"type":"boolean","title":"Rotate","default":false},"rewrap":{"items":{"$ref":"#/components/schemas/Rewrap"},"type":"array","title":"Rewrap","default":[]}},"additionalProperties":false,"type":"object","required":["salt","kdf","check_nonce","check_ct"],"title":"KeyBody"},"LeaseBody":{"properties":{"takeover":{"type":"boolean","title":"Takeover","default":false}},"additionalProperties":false,"type":"object","title":"LeaseBody"},"LinkBody":{"properties":{"file":{"type":"string","title":"File"},"platform":{"type":"string","title":"Platform","default":"win-x64"}},"type":"object","required":["file"],"title":"LinkBody"},"LoginBody":{"properties":{"login":{"type":"string","title":"Login"},"password":{"type":"string","title":"Password"}},"type":"object","required":["login","password"],"title":"LoginBody"},"ManualAmountBody":{"properties":{"manual_amount":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Manual Amount"},"currency":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency"}},"type":"object","title":"ManualAmountBody"},"MemberBody":{"properties":{"display_name":{"type":"string","title":"Display Name"},"login_name":{"type":"string","title":"Login Name"},"password":{"type":"string","title":"Password"},"role":{"type":"string","enum":["owner","admin","operator","viewer"],"title":"Role"},"manager_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Manager Id"},"quota_identities":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quota Identities"}},"type":"object","required":["display_name","login_name","password","role"],"title":"MemberBody"},"MemberPatch":{"properties":{"role":{"anyOf":[{"type":"string","enum":["owner","admin","operator","viewer"]},{"type":"null"}],"title":"Role"},"manager_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Manager Id"},"quota_identities":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quota Identities"},"perm_overrides":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Perm Overrides"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"}},"type":"object","title":"MemberPatch"},"NoteBody":{"properties":{"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"contact":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contact"}},"type":"object","title":"NoteBody"},"OrderBody":{"properties":{"tenant_id":{"type":"integer","title":"Tenant Id"},"catalog_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Catalog Id"},"months":{"type":"integer","title":"Months"},"amount":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Amount"},"currency":{"type":"string","title":"Currency","default":"USD"},"channel":{"type":"string","enum":["alipay","wechat","bank","usdt","other"],"title":"Channel"},"reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"},"confirm_self":{"type":"boolean","title":"Confirm Self","default":false}},"type":"object","required":["tenant_id","months","amount","channel"],"title":"OrderBody"},"PasswordBody":{"properties":{"password":{"type":"string","title":"Password"}},"type":"object","required":["password"],"title":"PasswordBody"},"PasswordScope":{"properties":{"act":{"type":"string","title":"Act"},"pids":{"items":{"type":"string"},"type":"array","title":"Pids","default":[]},"mh":{"type":"string","title":"Mh"},"hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hours"},"password":{"type":"string","title":"Password"}},"type":"object","required":["act","mh","password"],"title":"PasswordScope"},"PaymentPart":{"properties":{"amount":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Amount"},"currency":{"type":"string","title":"Currency","default":"USD"},"channel":{"type":"string","enum":["alipay","wechat","bank","usdt","other"],"title":"Channel"},"reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference"},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note"}},"type":"object","required":["amount","channel"],"title":"PaymentPart"},"PlanBody":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"profile_limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Profile Limit"},"seats":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seats"},"catalog_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Catalog Id"},"reason":{"type":"string","title":"Reason","default":""}},"type":"object","title":"PlanBody"},"PromoterBody":{"properties":{"name":{"type":"string","title":"Name"},"login":{"type":"string","title":"Login"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},"type":"object","required":["name","login"],"title":"PromoterBody"},"PromoterPatch":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"disabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Disabled"}},"type":"object","title":"PromoterPatch"},"ReasonBody":{"properties":{"reason":{"type":"string","title":"Reason","default":""}},"type":"object","title":"ReasonBody"},"ReferralBody":{"properties":{"promoter_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Promoter Id"},"referrer_tenant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Referrer Tenant Id"},"reason":{"type":"string","title":"Reason","default":""}},"type":"object","title":"ReferralBody"},"RejectBody":{"properties":{"reason":{"type":"string","title":"Reason"}},"type":"object","required":["reason"],"title":"RejectBody"},"ReleaseBody":{"properties":{"pids":{"items":{"type":"string"},"type":"array","title":"Pids"}},"type":"object","required":["pids"],"title":"ReleaseBody"},"ReviewBody":{"properties":{"decision":{"type":"string","enum":["approve","reject"],"title":"Decision"},"note":{"type":"string","title":"Note","default":""},"referrer_tenant_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Referrer Tenant Id"}},"type":"object","required":["decision"],"title":"ReviewBody"},"Rewrap":{"properties":{"identity_id":{"type":"integer","title":"Identity Id"},"wrap_nonce":{"type":"string","title":"Wrap Nonce"},"wrapped_dek":{"type":"string","title":"Wrapped Dek"}},"additionalProperties":false,"type":"object","required":["identity_id","wrap_nonce","wrapped_dek"],"title":"Rewrap"},"Scope":{"properties":{"act":{"type":"string","title":"Act"},"pids":{"items":{"type":"string"},"type":"array","title":"Pids","default":[]},"mh":{"type":"string","title":"Mh"},"hours":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Hours"}},"type":"object","required":["act","mh"],"title":"Scope"},"SettingsBody":{"properties":{"notify_email":{"type":"string","title":"Notify Email"}},"type":"object","required":["notify_email"],"title":"SettingsBody"},"SignupBody":{"properties":{"email":{"type":"string","title":"Email"},"code":{"type":"string","title":"Code"},"password":{"type":"string","title":"Password"},"agree":{"type":"boolean","title":"Agree","default":false},"lang":{"type":"string","title":"Lang","default":"en"},"ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ref"},"ref_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ref Link"},"dl_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dl Token"},"gclid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gclid"},"gbraid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gbraid"},"wbraid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Wbraid"},"ads_landing":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ads Landing"},"ads_at":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Ads At"}},"type":"object","required":["email","code","password"],"title":"SignupBody"},"SignupCodeBody":{"properties":{"email":{"type":"string","title":"Email"},"lang":{"type":"string","title":"Lang","default":"en"}},"type":"object","required":["email"],"title":"SignupCodeBody"},"SignupStartBody":{"properties":{"email":{"type":"string","title":"Email"},"password":{"type":"string","title":"Password"},"product":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Product"},"ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ref"},"dl_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dl Token"}},"type":"object","required":["email","password"],"title":"SignupStartBody"},"SignupVerifyBody":{"properties":{"email":{"type":"string","title":"Email"},"code":{"type":"string","title":"Code"}},"type":"object","required":["email","code"],"title":"SignupVerifyBody"},"StatusBody":{"properties":{"status":{"type":"string","title":"Status"}},"type":"object","required":["status"],"title":"StatusBody"},"TicketLoginBody":{"properties":{"ticket":{"type":"string","title":"Ticket"}},"type":"object","required":["ticket"],"title":"TicketLoginBody"},"TiersBody":{"properties":{"tiers":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Tiers"}},"type":"object","required":["tiers"],"title":"TiersBody"},"TxidBody":{"properties":{"txid":{"type":"string","title":"Txid"}},"type":"object","required":["txid"],"title":"TxidBody"},"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"},"WithdrawBody":{"properties":{"amount":{"anyOf":[{"type":"string"},{"type":"number"}],"title":"Amount"},"network":{"type":"string","title":"Network"},"address":{"type":"string","title":"Address"},"lang":{"type":"string","title":"Lang","default":"zh"}},"type":"object","required":["amount","network","address"],"title":"WithdrawBody"},"adminweb__PwBody":{"properties":{"old":{"type":"string","title":"Old"},"new":{"type":"string","title":"New"}},"type":"object","required":["old","new"],"title":"PwBody"},"cookie_sync__AuditBody":{"properties":{"act":{"type":"string","title":"Act"},"name":{"type":"string","title":"Name"},"need":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Need"},"host_max":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Host Max"},"chose":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chose"}},"type":"object","required":["act","name"],"title":"AuditBody"},"launch_tickets__TicketBody":{"properties":{"profiles":{"items":{"$ref":"#/components/schemas/Item"},"type":"array","title":"Profiles","default":[]},"mh":{"type":"string","title":"Mh","default":""},"probe":{"type":"boolean","title":"Probe","default":false}},"type":"object","title":"TicketBody"},"portal__PwBody":{"properties":{"old":{"type":"string","title":"Old","default":""},"new":{"type":"string","title":"New"}},"type":"object","required":["new"],"title":"PwBody"},"portal__TicketBody":{"properties":{"ticket":{"type":"string","title":"Ticket"}},"type":"object","required":["ticket"],"title":"TicketBody"},"stepup_api__AuditBody":{"properties":{"act":{"type":"string","title":"Act"},"pids":{"items":{"type":"string"},"type":"array","title":"Pids"},"count":{"type":"integer","title":"Count","default":0},"ok":{"type":"boolean","title":"Ok"},"via":{"type":"string","title":"Via","default":""},"source":{"type":"string","title":"Source","default":""}},"type":"object","required":["act","pids","ok"],"title":"AuditBody"}}}}