CDK 与复活 API 对接文档
并发检测,仅复活 401 或 Free,返回已验证的高级席 Sub2 成品。
CDK 查询下载 / 复活
客户统一入口:/redeem,同一页面切换“查询并下载”和“复活”。CDK 对应一次产出的一个账号;退出原空间后失效,同邮箱再次产出使用新 CDK。
查询下载:POST /api/cdk/redeem,请求 {"cdk":"你的兑换码","action":"download"},直接返回绑定的 JSON 和已保存的 2FA,无需轮询。CDK 默认有效,已记录移除或已作废的码不可使用。
复活:POST /api/cdk/tasks,请求 {"cdk":"你的兑换码","action":"revive"},成功返回 task_id。每 2 秒向 POST /api/cdk/tasks/poll 提交 {"cdk":"你的兑换码","task_id":"上一步的任务ID"}。旧版异步下载接口仍兼容,推荐使用上述直接下载接口。
排队或处理中返回 status=queued/running;完成后返回 result,必须检查 result.success。成功结果包含 sub2、filename、email、server_time 和 two_factor。若已保存密钥,two_factor.available=true,two_factor.secret 可用于标准 SHA-1 / 6 位 / 30 秒 TOTP。
批量直接兑换:POST /api/cdk/redeem/batch,请求 {"codes":"CDK1\nCDK2"} 或 {"codes":["CDK1","CDK2"]},每批最多 500 个。自动去重,直接返回一个合并的 sub2 和 filename,无需任务或轮询。available 为成功数量,failed 为失败数量,duplicates 为去重数量;items 的 item_no 对应输入序号。有效码继续兑换,失效码单独提示;全失效时 accounts 为空。此接口不进行第三方检测或复活。
首次查询或复活成功会标记对应成品已导出,重复使用不会重复扣数。仅导出 CDK 清单不改变待导出成品数。CDK 与返回结果属于账号凭据,请只在 POST 请求体内提交,不放入 URL 或日志。请求及响应均禁止缓存。
接入约定
服务地址:https://team5x.wishtoapp.com
请求格式:Content-Type: application/json;返回 UTF-8 JSON。
- 当前接口免登录,无需 API Key。仅支持本站已产出的子号,包括本站导入密码及 2FA 原料后产出的账号。
- 修复前会确认账号仍是原工作区的高级席成员,并读取本站保存的原料。优先用 RT 刷新;没有可用 RT 时需要密码/2FA 重登。同批同空间共享一次成员检查。
- 使用 Codex 额度探测器的 Usage 接口检测成品 AT,确认实际套餐及空间。JSON 与 CDK 批量共享最多 20 个初检和 20 个复活处理并发;每个账号完成检测即可继续,不等待整批最慢项。可用账号保留原凭据;仅明确的 401 或 Free 才尝试复用服务器新版、RT 刷新及必要的密码/2FA 重登。其他套餐、空间不匹配、网络异常或证据缺失不会自动复活。
- 刚入席可能出现订阅权益延迟传播,原文件稍后可能自行恢复;短时显示 Free 不等于选错空间。新成品已保存但权益仍未通过复查时,返回失败和
retry_after=60,可稍后查询。 - 查询和下载没有请求冷却间隔。复活按来源 IP 每 30 秒允许提交 6 个任务(一个任务可含多个账号);同一账号同时只能有一个复活请求。限频响应含
retry_after(秒)。 - 下述接口供已有邮箱或 JSON 的客户端兼容使用;批量异步任务可每 1.5 秒查看进度。旧版单号和批量接口仍同步等待完成;调用旧接口可设置 600 秒超时。
- 上游返回 402 时标为“炸车”,不刷新子号令牌,并将对应母号状态更新为炸车。同空间后续账号直接返回无法复活;管理员恢复空间后,重新探测母号成功才会恢复正常状态。
- HTTP 200 仍需检查 JSON 的
success及逐项结果。请求体类型错误可能返回 HTTP 422。调用方应保存返回的sub2对象为 JSON 文件。
批量 CDK 复活
POST /api/cdk/batch/tasks 提交 {"codes":"CDK一\nCDK二"},也支持 codes 数组。每批最多 500 项,自动去重,单个无效码不会中断其他账号。立即返回随机 task_id;重复提交同一组正在处理的 CDK 会返回原任务。
每 2 秒向 POST /api/cdk/batch/tasks/poll 提交 {"task_id":"任务ID"},查看 task 中的 total、done、alive、revived、failed、items。每项含 item_no(去重后的序号)、email、status、stage、error。进度不包含兑换码或令牌。
向 POST /api/cdk/batch/tasks/result 提交同一 task_id,返回 sub2、available 和 unavailable。默认等待任务结束;正文增加 "partial":true 可提前下载已完成项,剩余账号继续处理。下载核对本地作废、退出及归属记录,不重复访问上游;已记录失效的码不会返回成品,重复下载不重复计数。
JSON 与 CDK 批量共用全局最多 20 个检测、20 个复活并发,每个账号检测完成即可继续,仅修复明确的 401 / Free。同账号串行、同批同空间复用成员读取。JSON/CDK 各有 4 个批次协调线程、各最多受理 8 批,超出容量返回忙碌。实际耗时取决于上游响应和是否需要重新登录。
任务 ID 是访问该批结果的凭据,须保密,只放 POST 正文;有效期为最后更新后 24 小时。刷新页面可恢复进度,服务重启保留成功项、未完成项标中断,不自动重复换令牌。本站不会在日志中记录 CDK,成功结果加密保存。
1. 单号检测与复活
推荐 POST /api/revive/jobs,传入 {"email":"[email protected]"},立即返回 task_id 和进度;使用下方批量任务的查询和结果接口。重复提交同一个正在处理的邮箱会返回原任务。旧 POST /api/revive 同步接口继续兼容。检测本站保存的最新成品;若手中某份文件显示 Free,可用批量接口上传该文件检测。
curl --max-time 600 https://team5x.wishtoapp.com/api/revive \
-H 'Content-Type: application/json' \
-d '{"email":"[email protected]"}'
成功响应的结构如下,sub2 此处省略具体令牌:
{
"success": true,
"email": "[email protected]",
"status": "revived",
"already_alive": false,
"reason": "free_plan",
"message": "复活成功,已生成并校验新的高级席成品。",
"sub2": {"type": "sub2api-data", "version": 1, "exported_at": "...", "proxies": [], "accounts": ["此处为完整账号对象"]}
}
already_alive=true 表示当前成品已验证可用,没有重新换令牌;false 表示已生成新的成品。
2. 批量检测与复活
推荐:异步任务与实时进度
POST /api/revive/batch/jobs,传入{"sub2": 原文件JSON对象}或{"text":"JSON文本"}。立即返回success、task_id和初始task。- 每 1–2 秒请求
GET /api/revive/batch/jobs/{task_id}。task包含status(queued/running/done/interrupted)、total、done、running、queued、alive、revived、failed、workspace_dead和逐号items。炸车计入 failed,workspace_dead 是其中的数量。 - 任务结束后请求
GET /api/revive/batch/jobs/{task_id}/result,得到结果和一个合并sub2,只包含本次修复成功的账号(含替换最新凭据),正常账号不重复导出。增加?partial=1可提前下载已修复项;返回partial=true表示仍有后台任务。提前下载不终止任务。
逐号 stage:queued 等待、checking 检测原文件、checking_current 检测最新成品、loading_source 读取原料、checking_seat 验证席位、refreshing 刷新/重登、verifying 复查、done 完成。进度响应不含 AT/RT。任务 ID 是访问该批结果的随机密钥,请妥善保存,不要公开分享。任务重启中断时保留已完成结果,未完成项标明中断,不会偷偷重复换令牌。
兼容:同步批量接口
POST /api/revive/batch。发送 {"sub2": 原文件JSON对象};也接受 {"sub2": accounts数组}、{"sub2": 多份Sub2文档数组} 或 {"text": "原文件JSON文本"}。文件内容通过 JSON 传输,不是 multipart 文件上传。
单次最多 200 个账号(去重前),按邮箱去重保留第一项。邮箱优先取 extra.email,兼容 credentials.email、顶层 email 或旧版邮箱形式的 name。
{
"success": true,
"total": 3,
"alive": 1,
"revived": 1,
"original_alive": 1,
"replaced": 0,
"downloadable": 1,
"output_mode": "repaired_only",
"failed": 1,
"results": [
{"email": "[email protected]", "status": "alive"},
{"email": "[email protected]", "status": "revived", "reason": "free_plan"},
{"email": "[email protected]", "status": "failed", "error": "缺密码/2FA,无法自助复活"}
],
"sub2": {"type": "sub2api-data", "version": 1, "exported_at": "...", "proxies": [], "accounts": ["仅 [email protected] 修复后的完整账号对象"]}
}
success=true 表示批处理完成,可能部分或全部失败。total = alive + revived + failed。JSON 批量返回 output_mode=repaired_only,合并文件仅包含修复成功的账号,downloadable = replaced + revived,正常账号全部跳过。全部正常时 sub2.accounts=[],无需下载。
alive 为兼容字段,包含原文件可用与替换凭据两种情况。original_alive 表示原文件通过检测,replaced 表示原文件 401 / Free、已替换为服务器最新可用凭据;alive = original_alive + replaced。异步进度及结果使用相同计数,历史批量结果下载也排除正常原文件。合并文件只用于更新已修复账号,请保留原文件中正常账号。单邮箱任务使用 output_mode=current,继续返回当前有效成品;CDK 领取不受此过滤影响。
3. 状态与失败处理
| status | 含义与处理 |
|---|---|
alive | 返回成品的实际高级套餐及空间已通过检查。reused_current=true 表示原文件未通过检测,返回服务器已有的新版本,必须下载替换;不代表原文件可用。 |
revived | 修复成功,保存新的成品替换旧文件。 |
not_ours | 本站找不到对应成品记录,确认邮箱和文件来源。 |
failed | error_code=workspace_deactivated 表示炸车,无法复活,对应母号状态同步更新。其他错误查看 error;检测暂不可用可稍后重试,原料或成员资格问题需管理员处理。 |
可选 probe 字段记录修复前检测结果:http_status、plan_type、account_id、state 与 reason。修复成功时其内容仍是修复前的证据。reason 常见值为 unauthorized、free_plan、plan_mismatch、workspace_mismatch;检测不明确时为 probe_unavailable、usage_incomplete 或 identity_mismatch。
replacement_probe 记录服务器已有新版本的检测结果,不覆盖原文件的 probe。新任务的逐号进度会保留这些检测元数据;历史任务可能没有检测详情,但仍可根据 reused_current 区分替换结果。
默认检测来源为 Codex 额度探测器,只发送 AT 与目标空间 ID,不发送 RT、密码或 2FA。provider=chixiaotao,provider_http_status 保留查询服务的 HTTP 状态;包装在错误响应中的明确 401 会按原始 401 分类。检测失败保持未确认,不直接刷新令牌。批量初检只在同一账号、同一空间、同一 AT 且不超过 60 秒时复用,超过时重新检测。
{"success": false, "error": "操作太频繁,请 30 秒后再试", "retry_after": 30}
4. Python:上传文件并保存成品
安装 requests 后运行。Windows 文件可使用绝对路径;示例文件名需替换成自己的。
import json
from pathlib import Path
import requests
document = json.loads(Path("input.sub2.json").read_text(encoding="utf-8-sig"))
response = requests.post(
"https://team5x.wishtoapp.com/api/revive/batch",
json={"sub2": document},
timeout=(15, 600),
)
response.raise_for_status()
result = response.json()
if not result.get("success"):
raise RuntimeError(result.get("error", "请求失败"))
Path("revived.sub2.json").write_text(
json.dumps(result["sub2"], ensure_ascii=False, indent=2),
encoding="utf-8",
)
print({key: result[key] for key in ("total", "alive", "revived", "failed")})
for item in result["results"]:
if item["status"] in ("failed", "not_ours"):
print(item["email"], item.get("error", ""))