2F账号安全台ACCOUNT SECURITY
返回账号安全台

开发者接入 / API v1

API 文档

提交账号、密码和当前 2FA 长期密钥可异步更换验证器;也可使用 Access Token 查询套餐、换绑邮箱或设置/修改密码。

无需申请 API Key

快速开始

接口地址:

  1. 生成并保存一个 UUID 作为 request_id,然后提交一个账号。
  2. 保存响应中的 task_token。它是读取这次任务结果的凭证,有效期 30 天。
  3. 每 2 秒查询一次任务;只有 status=succeeded 且 verified=true 时,才使用 result.totp_secret。

调用接口即表示你确认有权管理该账号并执行换绑。请求超时请沿用原 request_id 和相同输入重试,不能换编号重新提交。任务凭证不要放进 URL 或分享给他人。

API 供服务端脚本调用,不依赖浏览器 Cookie。请求和结果使用 HTTPS;请勿把账号密码、密钥或任务凭证写入公开日志。

POST/api/v1/rotations

每次一个账号,使用 JSON 请求体。以下两种输入方式任选一种:

独立字段

{
  "request_id": "1b123456-1234-4234-9234-123456789012",
  "email": "your-account@example.com",
  "password": "你的账号密码",
  "totp_secret": "你的当前2FA长期密钥"
}

账号行

{
  "request_id": "1b123456-1234-4234-9234-123456789012",
  "text": "your-account@example.com----密码----当前2FA长期密钥"
}

text 同时支持 账号--密码--2FA;2FA 必须是 Base32 长期密钥,不能填六位验证码。上面的 UUID 仅作示例,每个新任务请自行生成新的 UUID。

响应:202 Accepted

{
  "request_id": "你提交的UUID",
  "task_token": "本次任务的私密凭证",
  "status": "queued",
  "poll_after_seconds": 2
}

202 只表示任务已接收,不代表换绑成功。同一编号、相同内容重复提交会返回原任务;同一编号改换内容返回 409。

curl

先将 JSON 保存为仅自己可读的 request.json,避免把密码直接写入命令历史。

GET/api/v1/rotations/{request_id}

请求头:X-Task-Token: 提交时收到的task_token。无需其他密码或 API Key。

已验证成功的响应结构

{
  "request_id": "你提交的UUID",
  "status": "succeeded",
  "phase": "complete",
  "message": "",
  "verified": true,
  "result": {
    "email": "your-account@example.com",
    "password": "原密码,不变",
    "totp_secret": "已核对的新2FA长期密钥",
    "text": "账号----密码----新2FA长期密钥"
  },
  "recovery": null
}

排队或处理中,result 为 null。失败或结果不确定时,recovery 包含账号、原密码、original_secret 和可能取得的 candidate_secret。候选密钥未经核对,不能当作成功结果;请妥善保存供恢复。

POST/api/v1/rotations/{request_id}/verify

使用同一 X-Task-Token 请求头,无需请求体。仅适用于已保存候选新密钥的失败或不确定任务;只核对已保存密钥,不再次申请或启用新密钥。响应 202 后继续查询原任务。

若没有候选密钥或任务已在运行,返回 409。无法完成额外登录验证时,需要在官方账号安全设置中处理。

Access Token 账号操作

以下接口供管理台页面调用,使用浏览器访客会话和 X-CSRF-Token 请求头,不属于无需 Cookie 的 v1 服务端 API。所有接口都需要 JSON 请求体中的 access_token。

POST/api/account/login/otp/start

{"email":"account@example.com"}

向账号邮箱发送验证码,返回有效期约 10 分钟的 flow_id。

POST/api/account/login/otp/complete

{"flow_id":"流程编号","code":"123456"}

验证码通过后返回 access_token 和 session_token。流程编号只允许创建它的访客使用,且只能使用一次。

POST/api/account/login/password

{"email":"account@example.com","password":"账号密码"}

使用邮箱和密码登录并返回 Token。仅适用于未开启 2FA 的账号;已开启 2FA 时会返回明确提示。

POST/api/account/plan

{"access_token":"ChatGPT accessToken"}

返回套餐类型、套餐名称、订阅计划、订阅是否有效和试用状态。

POST/api/account/email/begin

{"access_token":"ChatGPT accessToken","new_email":"new@example.com"}

向新邮箱发送验证码。拿到验证码后调用下一步,第二步不会再次发送验证码。

POST/api/account/email/complete

{"access_token":"ChatGPT accessToken","new_email":"new@example.com","code":"240456"}

成功后会完成邮箱换绑,原登录会话可能退出。

POST/api/account/password/start

{"access_token":"ChatGPT accessToken"}

通过 reauthenticate 流程向当前账号邮箱发送验证码,返回有效期约 10 分钟的 flow_id。

POST/api/account/password/complete

{"flow_id":"流程编号","code":"123456","new_password":"GoodPass123!"}

新密码需为 12–128 位并同时包含大小写字母、数字和符号。流程编号只允许创建它的访客使用,且只能使用一次。

Access Token、验证码和新密码都属于敏感凭证。请勿写入日志、导出文件或分享给他人。服务不会把 Access Token 保存到数据库。

Python 示例

下载示例

Python 3 标准库即可运行,无需额外依赖。运行后输入账号、密码和长期 2FA 密钥;程序先保存提交编号,再提交任务,并把结果写入本地文件。示例保留相同编号供中断后继续查询。处理另一个账号时请在新目录运行,保留原任务文件以便恢复。

正在加载示例…

状态与限制

status含义 / 下一步
queued / running排队 / 处理中,每 2 秒查询。
succeeded新密钥有效、旧密钥已失效,可使用 result。
failed未完成;阅读 message 和 recovery,不要自动创建新任务。
partial / unknown结果待确认;保存恢复资料,可对原任务调用 verify。
cancelled本次操作尚未开始,已停止;核对任务已有的恢复资料仍保留。

全站最多两路处理、30 个排队或运行中的账号;同一 IP 每 15 分钟最多提交或核对 6 次。相同任务的提交重试不新增排队,不重复换绑。网页每批最多 10 个,API 每次 1 个。

常见 HTTP 状态:400 输入错误;401 任务凭证无效或过期;403 来源不允许;404 任务不存在;409 编号冲突、账号正在处理或不适合核对;429 提交频繁;503 服务更新中。错误响应格式为 {"detail":"具体说明"}。

查询暂时失败并不代表换绑失败,请保存原编号和凭证后继续查询。不要盲目换编号重做。耗时与成功率受 OpenAI 登录流程及额外验证影响,不保证固定秒数。