API ACCESS GUIDE
API 接入指南
开放 API 用于第三方系统提交和管理自动化任务。接口采用 action 分发方式,统一使用 JSON 请求和返回。
接口基准地址
所有请求均使用 POST 请求,Content-Type 为 application/json,并且必须携带 cdkey 参数。开放 API 面向第三方后端服务调用,请不要在浏览器前端、公开仓库、网页源码中保存 CDK、账号密码或 2FA。
日志和监控必须脱敏:不得记录 CDK、账号密码、2FA、未脱敏的 Google 邮箱、完整请求体或未脱敏的
offer_url;反向代理访问日志、应用日志、APM、错误追踪和告警内容同样适用。邮箱只能掩码展示(例如 u***@example.com);排障时只记录 action、task_id、HTTP 状态码和脱敏后的错误摘要。
POST
查询卡密余额
提交任务前检查 CDK 剩余可用次数。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
action | string | 是 | 固定值 get_balance |
cdkey | string | 是 | 有效卡密,最长 64 个字符 |
请求 JSON
{
"action": "get_balance",
"cdkey": "YOUR_CDK"
}
成功返回
{
"success": true,
"remaining_uses": 10.0
}
POST
提交任务
提交 Google 账号自动化任务,全流程扣除 1 次额度,仅提取扣除 0.5 次额度。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
action | string | 是 | 固定值 submit_task |
cdkey | string | 是 | 有效卡密,最长 64 个字符 |
email | string | 是 | 完整 Google 邮箱,最长 254 个字符;服务端会去除首尾空格并转为小写 |
password | string | 是 | Google 账号密码,最长 1024 个字符 |
twofa | string | 是 | 身份验证器密钥,不是当前 6 位验证码,最长 512 个字符 |
task_type | string | 否 | 不传时默认为 full 全流程;传 extract 时为仅提取 Offer 链接。 |
请求 JSON
{
"action": "submit_task",
"cdkey": "YOUR_CDK",
"email": "YOUR_GOOGLE_EMAIL",
"password": "YOUR_GOOGLE_PASSWORD",
"twofa": "YOUR_TOTP_SECRET",
"task_type": "full"
}
仅提取请求 JSON
{
"action": "submit_task",
"cdkey": "YOUR_CDK",
"email": "YOUR_GOOGLE_EMAIL",
"password": "YOUR_GOOGLE_PASSWORD",
"twofa": "YOUR_TOTP_SECRET",
"task_type": "extract"
}
成功返回
{
"success": true,
"message": "任务提交成功",
"task_id": 168,
"remaining_uses": 9.0,
"queue_paused": false
}
queue_paused 是本次提交事务读取到的全局暂停分配快照,仅供界面提示;任务底层状态仍为 pending,请通过 get_my_tasks 获取后续队列状态。
仅提取任务会执行提取链接;成功后可在
get_status 或 get_my_tasks 返回的 offer_url 字段读取链接。完整 Offer 链接属于敏感数据,不得写入公开页面、聊天记录、分析平台或未脱敏日志。
开放 API 没有辅助邮箱字段。
twofa 只能填写身份验证器密钥;如果原始账号数据包含辅助邮箱,调用方必须在提交前自行识别并跳过,不能把辅助邮箱作为 twofa 提交。
重复提交说明:
submit_task 当前不接受客户端幂等键。同一邮箱已有排队或处理中的任务时会返回 409,但这不是所有超时场景下的幂等保证。提交请求超时或连接中断时,不要自动原样重发;应先等待原请求结束,再按照轮询间隔通过 get_my_tasks 核对最新任务的 task_id、created_at 和状态。无法确认是否已创建任务时不要自动重提。此流程只是客户端防重复指引,不等同于服务端幂等机制。
POST
查询任务状态
task_id 和 email 至少提供一个;同时提供时优先使用任务 ID 查询,否则按邮箱查询当前 CDK 下最新任务。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
action | string | 是 | 固定值 get_status |
cdkey | string | 是 | 提交任务时使用的卡密 |
task_id | integer | 至少一个 | 取值范围为 1–2147483647;与 email 同时提供时优先使用此字段 |
email | string | 至少一个 | 账号邮箱;未提供 task_id 时,查询当前 CDK 下该邮箱的最新任务;查询时会去除首尾空格并转为小写 |
请求 JSON
{
"action": "get_status",
"cdkey": "YOUR_CDK",
"task_id": 168
}
返回示例
{
"success": true,
"data": {
"task_id": 168,
"email": "account@example.invalid",
"status": "running",
"display_status": "running",
"message": "正在执行",
"error_type": null,
"completed_at": null,
"offer_url": null,
"task_type": "full",
"retry_count": 0,
"max_retries": 2,
"requeue_count": 0,
"max_requeues": 2,
"system_recovery_state": "none",
"last_requeue_reason": null,
"last_requeued_at": null,
"queue_duration_seconds": 12
}
}
仅提取成功返回
{
"success": true,
"data": {
"task_id": 169,
"email": "account@example.invalid",
"status": "success",
"display_status": "success",
"message": "已提取Offer链接",
"error_type": null,
"completed_at": "2026-07-02T10:00:00",
"offer_url": "https://one.google.com/offer/REDACTED",
"task_type": "extract",
"retry_count": 0,
"max_retries": 2,
"requeue_count": 0,
"max_requeues": 2,
"system_recovery_state": "none",
"last_requeue_reason": null,
"last_requeued_at": null,
"queue_duration_seconds": 4
}
}
get_status 适合单个任务快速查询,并返回业务重试、系统自愈、本轮排队和 error_type。需要任务列表、队列摘要或 queue_position 时,请使用 get_my_tasks。
轮询建议:同一任务的
get_status 请求至少间隔 3 秒,同一 CDK 的 get_my_tasks 请求至少间隔 10 秒;任一时刻只保留一个未完成的轮询请求。当返回的 data.status 进入 success、failed 或 cancelled 后立即停止轮询。收到 429、5xx 或网络错误时,应使用带随机抖动的指数退避,不要并发或立即重复请求。
POST
取消排队任务
仅当前 CDK 下仍在排队的任务可以取消,取消成功后自动退还本次额度;task_id 取值范围为 1–2147483647。任务不存在、不属于当前 CDK、已经开始或已经结束等所有不可取消情况,接口统一返回 HTTP 200、success: false 和通用提示“任务正在处理中”。
请求 JSON
{
"action": "cancel_task",
"cdkey": "YOUR_CDK",
"task_id": 168
}
成功返回
{
"success": true,
"message": "任务已取消并退款"
}
无法取消返回
{
"success": false,
"message": "任务正在处理中"
}
POST
查询我的任务
返回当前 CDK 最近 50 条任务,按任务 ID 倒序排列;队列摘要和排队位置都只统计当前 CDK,不包含其他 CDK 的任务。
get_my_tasks 适合列表轮询和队列展示,会返回当前 CDK 的队列摘要、最近任务、失败类型、排队位置、创建时间和完成时间。
请求 JSON
{
"action": "get_my_tasks",
"cdkey": "YOUR_CDK"
}
成功返回
{
"success": true,
"queue": {
"paused": false,
"total_pending": 1,
"my_pending": 1,
"my_first_position": 1,
"my_first_task_id": 168
},
"data": [
{
"task_id": 168,
"email": "account@example.invalid",
"status": "pending",
"display_status": "abnormal",
"message": "登录页面加载异常,请稍后重新提交 | 将自动重试 (1/2)",
"error_type": "account_check_error",
"task_type": "full",
"offer_url": null,
"retry_count": 1,
"max_retries": 2,
"requeue_count": 0,
"max_requeues": 2,
"system_recovery_state": "none",
"last_requeue_reason": null,
"last_requeued_at": null,
"queue_duration_seconds": 38,
"queue_position": 1,
"created_at": "2026-06-26T10:00:00Z",
"completed_at": null
},
{
"task_id": 167,
"email": "extract@example.invalid",
"status": "success",
"display_status": "success",
"message": "已提取Offer链接",
"error_type": null,
"task_type": "extract",
"offer_url": "https://one.google.com/offer/REDACTED",
"retry_count": 0,
"max_retries": 2,
"requeue_count": 1,
"max_requeues": 2,
"system_recovery_state": "recovered",
"last_requeue_reason": "system_lease_expired",
"last_requeued_at": "2026-06-26T09:55:00Z",
"queue_duration_seconds": 15,
"queue_position": null,
"created_at": "2026-06-26T09:50:00Z",
"completed_at": "2026-06-26T10:05:00Z"
}
]
}
| 字段 | 说明 |
|---|---|
queue.paused | 全局暂停分配开关的当前值。为 true 时任务底层状态仍为 pending;既有排队超时和取消规则不变。 |
queue.total_pending | 兼容字段,表示当前 CDK 下正在排队的任务数;与 queue.my_pending 相同,不包含其他 CDK。 |
queue.my_pending | 当前 CDK 下状态为 pending 的任务数;任务进入 running 后不再计入。 |
queue.my_first_position | 当前 CDK 最靠前排队任务在本 CDK 队列中的位置;有排队任务时为 1,否则为 null。 |
queue.my_first_task_id | 当前 CDK 最靠前排队任务的任务 ID;没有排队任务时为 null。 |
data[].task_id | 任务 ID。 |
data[].email | 提交任务时使用的 Google 邮箱。 |
data[].status | 任务底层状态,只会是 pending、running、success、failed 或 cancelled;自动重试期间仍为 pending。 |
data[].display_status | 任务展示状态;通常与 status 相同,自动重试或异常恢复处理中可能为 abnormal。页面展示可使用此字段,业务终态仍以 status 为准。 |
data[].message | 字符串或 null,仅供展示;可能随任务进度变化并附加自动重试或退款信息。程序判断请使用 status、display_status 和 error_type。 |
data[].error_type | 失败、自动重试或异常类型;等待自动重试的 pending 任务也可能保留该值,普通非失败任务通常为 null。 |
data[].task_type | 任务类型,full 为全流程,extract 为仅提取。 |
data[].offer_url | 仅提取任务成功后为 Offer 链接;其他任务或未提取成功时通常为 null。 |
data[].retry_count | 业务自动重试次数。 |
data[].max_retries | 业务自动重试次数上限。 |
data[].requeue_count | 系统恢复导致的重新排队次数,与业务重试次数相互独立。 |
data[].max_requeues | 系统恢复重新排队次数上限。 |
data[].system_recovery_state | 系统恢复状态,当前可能为 none、queued、running、recovered、ended 或 exhausted;调用方仍应兼容未来新增值。 |
data[].last_requeue_reason | 最近一次系统恢复原因代码;用于展示或诊断,调用方应兼容未知值。 |
data[].last_requeued_at | 最近一次重新进入队列的 UTC 时间;从未重排时为 null。 |
data[].queue_duration_seconds | 本轮排队秒数;重新排队后从 last_requeued_at 重新计算,不是任务历史总时长。 |
data[].queue_position | 单条任务在当前 CDK 队列中的位置;仅 pending 任务通常会有值。 |
data[].created_at | 任务创建时间。 |
data[].completed_at | 任务完成、失败或取消时间;未结束时为 null。 |
| status / display_status 状态值 | 说明 |
|---|---|
pending | 排队中,任务已提交或正在等待继续处理。 |
abnormal | 仅可能出现在 display_status;表示异常处理中,系统可能自动恢复。 |
running | 处理中,设备正在执行任务。 |
success | 成功,任务已完成。 |
failed | 失败,任务未完成,详情可查看 message 和 error_type。 |
cancelled | 已取消,任务不再执行。 |
| 常见任务级 error_type(非完整列表) | 说明 |
|---|---|
account_check_error | 账号登录或前置检查页面异常,系统可能自动重试。 |
network_error | 网络或页面加载异常,系统可能自动重试。 |
active_membership | 账号已有未过期会员;任务失败并自动退还额度,请更换账号。 |
controller_disconnected | 执行端连接异常,系统将按恢复策略处理。 |
device_disconnected | 执行设备连接异常,系统将按恢复策略处理。 |
system_no_progress | 任务在预期时间内没有有效进展,系统将按恢复策略处理。 |
system_run_timeout | 单轮执行超出允许时长,系统将按恢复策略处理。 |
system_start_timeout | 任务未能在允许时间内开始,系统将按恢复策略处理。 |
system_lease_expired | 运行状态未能按时续期,系统将按恢复策略处理。 |
system_device_busy | 执行设备仍被其他运行占用,系统将等待或按恢复策略处理。 |
system_recovery_exhausted | 系统恢复次数达到上限,任务终止并自动退还额度。 |
system_recovery_timeout | 恢复任务等待重新调度超时,任务终止并自动退还额度。 |
offer_link_extract_failed | 仅提取任务未能提取 Offer 链接,任务会失败并自动退还额度;可稍后重新提交。 |
subscription_purchase_blocked | Google Play 明确提示账号无法购买目标商品;任务失败,请更换账号。 |
发生业务自动重试时,服务端会复用原
task_id 并将底层 status 重新设为 pending;调用方应继续轮询原任务,不要重复调用 submit_task。重试次数耗尽后任务才会进入 failed,并按结算规则自动退还额度。
CODE
服务端调用示例
示例中的
YOUR_*、REDACTED 和 example.invalid 均为不可直接使用的占位值。真实 CDK 和账号凭据应由服务端密钥管理或环境变量注入,不要写入源代码,也不要关闭 TLS 证书校验。
Python
import os
import requests
cdkey = os.getenv("CLAIM_FARM_CDK")
if not cdkey:
raise RuntimeError("缺少 CLAIM_FARM_CDK 环境变量")
try:
response = requests.post(
"{{API_ENDPOINT}}",
json={
"action": "get_balance",
"cdkey": cdkey,
},
timeout=(5, 30),
)
response.raise_for_status()
result = response.json()
except (requests.RequestException, ValueError) as exc:
raise RuntimeError("API 请求失败,请检查网络、状态码和返回格式") from exc
# 仅输出需要的非敏感字段,不要打印完整响应。
print({
"success": result.get("success"),
"remaining_uses": result.get("remaining_uses"),
})
PHP
<?php
$cdkey = getenv("CLAIM_FARM_CDK");
if (!$cdkey) {
throw new RuntimeException("缺少 CLAIM_FARM_CDK 环境变量");
}
$payload = json_encode([
"action" => "get_balance",
"cdkey" => $cdkey
], JSON_THROW_ON_ERROR);
$ch = curl_init("{{API_ENDPOINT}}");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 5,
CURLOPT_TIMEOUT => 30,
CURLOPT_SSL_VERIFYPEER => true,
CURLOPT_SSL_VERIFYHOST => 2,
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_POSTFIELDS => $payload,
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curlError = curl_errno($ch);
curl_close($ch);
if ($body === false || $curlError !== 0 || $status < 200 || $status >= 300) {
throw new RuntimeException("API 请求失败,HTTP 状态码:" . $status);
}
$result = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
echo json_encode([
"success" => $result["success"] ?? false,
"remaining_uses" => $result["remaining_uses"] ?? null
], JSON_UNESCAPED_UNICODE);
HTTP
错误处理
| 状态码 | 场景 | 建议 |
|---|---|---|
| 400 | CDK 无效或已停用 | 检查 cdkey 是否正确、是否仍处于启用状态。 |
| 400 | 额度不足 | 更换有可用额度的 CDK 后重试。 |
| 400 | 邮箱格式不正确 | email 必须且只能包含一个 @,并提交完整 Google 邮箱。 |
| 400 | 缺少 2FA 双重密钥 | 必须传递 twofa 字段,且它是身份验证器密钥,不是当前 6 位动态验证码。 |
| 400 | 缺少操作所需参数 | submit_task 必须提供邮箱和密码;get_status 必须提供 task_id 或邮箱;cancel_task 必须提供 task_id。 |
| 400 | 不支持的任务类型 | task_type 只能为 full 或 extract。 |
| 404 | 任务不存在或不属于当前 CDK | 检查 task_id、email 和 cdkey 是否对应。 |
| 409 | 同一邮箱已有任务正在排队或处理中 | 等待原任务完成、失败或取消后再提交。 |
| 409 | 账号处于冷却或黑名单保护 | 根据返回的 detail 等待冷却结束、更换账号,或联系管理员确认账号保护设置。 |
| 413 | 请求体过大 | 缩小请求 JSON;开放 API 每次只提交一个任务,并遵守各字段长度限制。 |
| 429 | 请求频率超限 | 降低调用频率,并使用延迟递增的退避策略稍后重试。 |
| 200 | 任务不可取消 | cancel_task 对任务不存在、不属于当前 CDK、已经开始或已经结束等情况统一返回 success: false 和通用提示“任务正在处理中”。 |
| 422 | 动作不支持、字段类型错误或超过长度限制 | 按照参数表重新构造 JSON,确认 action 拼写、字段类型和长度。 |
| 503 | 服务暂时不可用 | 请按退避策略稍后重试;不要立即高频重复请求。 |
多数参数校验或权限错误会返回 HTTP 状态码和
detail 字段;少量业务状态会返回 HTTP 200,但 success 为 false,调用方需要同时判断 HTTP 状态码和 JSON 内容。
参数或权限错误
{
"detail": "Invalid or inactive CDK"
}
业务状态失败
{
"success": false,
"message": "任务正在处理中"
}