UNLOCK API

验证码识别 API 参考

两种请求格式,一个账户。可以使用 JSON 方法(createTask、getTaskResult、getBalance),也可以使用经典表单方法(in.php、res.php)。两者都使用账户页面上的 API 密钥和同一余额。

基础

基础 URL
https://unlock-api.com
API 密钥
32 个字符,在账户页面上。以 clientKey(JSON)或 key(in.php、res.php)发送。
格式
JSON 方法:POST,请求体为 JSON。in.php 和 res.php:GET 或 POST 表单字段;加上 json=1 可获得 JSON 回复。
限制
每个账户每分钟 1,200 次请求,包含结果查询。创建任务后等待约 5 秒,然后每 5 秒查询一次。
时间限制
5 分钟内未完成的任务会以 ERROR_CAPTCHA_UNSOLVABLE 失败,费用退回余额。
计费
任务费用在创建任务时扣除。失败任务自动退款。

快速开始

用 JSON 方法识别一个 reCAPTCHA v2。把 YOUR_API_KEY 换成你的密钥。

import time, requests

API = "https://unlock-api.com"
KEY = "YOUR_API_KEY"

task = requests.post(f"{API}/createTask", json={
  "clientKey": KEY,
  "task": {
      "type": "RecaptchaV2TaskProxyless",
      "websiteURL": "https://example.com/login",
      "websiteKey": "6LcR_RsTAAAAAFJR_5ZdbQd0SMxL7yIDmSXH1-lo"
    }
}).json()
if task["errorId"]:
    raise SystemExit(task["errorCode"])

while True:
    time.sleep(5)
    r = requests.post(f"{API}/getTaskResult", json={"clientKey": KEY, "taskId": task["taskId"]}).json()
    if r["errorId"]:
        raise SystemExit(r["errorCode"])   # failed tasks are refunded
    if r["status"] == "ready":
        print(r["solution"]["gRecaptchaResponse"])
        break

JSON 方法

POST /createTask 创建任务

请求体:clientKey 和 task 对象。其他字段由任务类型决定,见“任务类型”。回复:errorId 0 和 taskId,或 errorId 1 和 errorCode。

POST https://unlock-api.com/createTask
{"clientKey":"YOUR_API_KEY","task":{"type":"TurnstileTaskProxyless","websiteURL":"https://example.com","websiteKey":"0x4AAAAAAAC3DHQFLr1GavRN"}}

{"errorId":0,"taskId":1001}
{"errorId":1,"errorCode":"ERROR_ZERO_BALANCE","errorDescription":"..."}

POST /getTaskResult 获取结果

请求体:clientKey 和 taskId。任务运行中:status 为 processing。完成后:status 为 ready,附带 solution 和 cost。失败的任务回复 errorId 1 和对应的 errorCode。

POST https://unlock-api.com/getTaskResult
{"clientKey":"YOUR_API_KEY","taskId":1001}

{"errorId":0,"status":"processing"}
{"errorId":0,"status":"ready","solution":{"token":"0.zrSnRHO7h0..."},"cost":"0.0012","createTime":1791640000,"endTime":1791640011,"solveCount":1}

POST /getBalance 查询余额

请求体:clientKey。回复:以美元计的 balance。

{"clientKey":"YOUR_API_KEY"}

{"errorId":0,"balance":42.5}

报告错误答案

reportIncorrectRecaptcha 和 reportIncorrectImageCaptcha 接受 clientKey 和 taskId,并回复 success。它们是为兼容现有库而保留的;报告不会改变扣费。

表单方法(in.php、res.php)

发送任务:in.php

字段:key、method 和该验证码类型的字段。回复:OK|ID,或加上 json=1 时为 {"status":1,"request":"ID"}。错误以其名称返回,例如 ERROR_ZERO_BALANCE。

POST https://unlock-api.com/in.php
key=YOUR_API_KEY&method=hcaptcha&sitekey=SITE_KEY&pageurl=https://example.com&json=1

OK|1001
{"status":1,"request":"1001"}

获取答案:res.php

action=get&id=ID 在识别完成时返回 OK|ANSWER,处理中返回 CAPCHA_NOT_READY。action=get2 会附带费用。ids=ID1,ID2 一次最多查询 100 个任务。action=getbalance 返回余额。也接受 action=reportbad 和 reportgood。

GET https://unlock-api.com/res.php?key=YOUR_API_KEY&action=get&id=1001
CAPCHA_NOT_READY
OK|P1_eyJ0eXAiOiJKV1Qi...

GET https://unlock-api.com/res.php?key=YOUR_API_KEY&action=getbalance
42.5

更多方法

POST /getToken 创建并等待:getToken

请求体与 createTask 相同。调用最多等待 50 秒,返回与 getTaskResult 相同的回复。如果任务仍在运行,回复为 status processing 及其 taskId;请继续轮询 getTaskResult。

POST https://unlock-api.com/getToken
{"clientKey":"YOUR_API_KEY","task":{"type":"TurnstileTaskProxyless","websiteURL":"https://example.com","websiteKey":"0x4AAAA..."}}

{"errorId":0,"taskId":1001,"status":"ready","solution":{"token":"0.zrSnRHO7h0..."},"cost":"0.000725"}

结果回调

在 createTask 中加入 callbackUrl(或在 in.php 中加入 pingback),任务完成时结果会发送到该地址:一个类似 getTaskResult 并带有 taskId 的 JSON 请求体,in.php 则为表单请求体 id=…&code=…。只会调用公网地址,调用一次,超时 5 秒;结果仍可通过轮询获取。

{"clientKey":"YOUR_API_KEY","callbackUrl":"https://your.server/captcha-result","task":{...}}

POST https://your.server/captcha-result
{"errorId":0,"taskId":1001,"status":"ready","solution":{...},"cost":"0.0005"}

统计

getQueueStats 返回当前等待中和识别中的任务数,以及最近一小时的平均识别时间。getSpendingStats 返回你在某个 UTC 日内每小时的任务量和金额(date 为 unix 时间)。test 会原样返回收到的请求体。

POST https://unlock-api.com/getQueueStats     {"clientKey":"..."}  ->  {"errorId":0,"waiting":3,"solving":12,"speed":6.4,"total":15}
POST https://unlock-api.com/getSpendingStats  {"clientKey":"...","date":1791590400}  ->  {"errorId":0,"data":[{"dateFrom":...,"volume":120,"money":0.06},...]}
POST https://unlock-api.com/test              {"anything":1}  ->  {"errorId":0,"received":{"anything":1}}

IP 白名单

如果你在账户页面设置了 IP 白名单,来自其他 IP 的请求会收到 ERROR_IP_NOT_ALLOWED。

任务类型

每种类型都有无代理名称和代理名称(去掉 Proxyless)。名称不区分大小写,也接受其他识别 API 使用的写法。代理任务还需要 proxyType(http、socks4、socks5)、proxyAddress 和 proxyPort,或一个代理字符串,例如 http://user:[email protected]:8080。此处未列出的可选字段会原样传给识别方。

reCAPTCHA v2

详情

RecaptchaV2TaskProxylessRecaptchaV2Task

字段

websiteURL (必填)websiteKey (必填)

reCAPTCHA v2 Enterprise

详情

RecaptchaV2EnterpriseTaskProxylessRecaptchaV2EnterpriseTask

字段

websiteURL (必填)websiteKey (必填)

reCAPTCHA v3

详情

RecaptchaV3TaskProxylessRecaptchaV3Task

字段

websiteURL (必填)websiteKey (必填)

Cloudflare Turnstile

详情

TurnstileTaskProxylessTurnstileTask

字段

websiteURL (必填)websiteKey (必填)

GeeTest v3 / v4

详情

GeeTestTaskProxylessGeeTestTask

字段

websiteURL (必填)

FunCaptcha (Arkose Labs)

详情

FunCaptchaTaskProxylessFunCaptchaTask

字段

websiteURL (必填)websitePublicKey (必填)

Amazon AWS WAF

详情

AmazonTaskProxylessAmazonTask

字段

websiteURL (必填)websiteKey (必填)

MTCaptcha

详情

MtCaptchaTaskProxylessMtCaptchaTask

字段

websiteURL (必填)websiteKey (必填)

Friendly Captcha

详情

FriendlyCaptchaTaskProxylessFriendlyCaptchaTask

字段

websiteURL (必填)websiteKey (必填)

Lemin Cropped Captcha

详情

LeminTaskProxylessLeminTask

字段

websiteURL (必填)captchaId (必填)divId (必填)

DataDome

详情

DataDomeSliderTask

字段

websiteURL (必填)captchaUrl (必填)userAgent (必填)

KeyCaptcha

详情

KeyCaptchaTaskProxylessKeyCaptchaTask

字段

websiteURL (必填)s_s_c_user_id (必填)s_s_c_session_id (必填)s_s_c_web_server_sign (必填)s_s_c_web_server_sign2 (必填)

Capy Puzzle

详情

CapyTaskProxylessCapyTask

字段

websiteURL (必填)websiteKey (必填)

Cloudflare Challenge 验证页

详情

AntiCloudflareTask

字段

websiteURL (必填)

Cutcaptcha

详情

CutCaptchaTaskProxylessCutCaptchaTask

字段

websiteURL (必填)

CyberSiARA

详情

AntiCyberSiAraTaskProxylessAntiCyberSiAraTask

字段

websiteURL (必填)

atbCAPTCHA

详情

AtbCaptchaTaskProxylessAtbCaptchaTask

字段

websiteURL (必填)

Tencent Captcha

详情

TencentTaskProxylessTencentTask

字段

websiteURL (必填)

Prosopo Procaptcha

详情

ProsopoTaskProxylessProsopoTask

字段

websiteURL (必填)websiteKey (必填)

CaptchaFox

详情

CaptchaFoxTaskProxylessCaptchaFoxTask

字段

websiteURL (必填)websiteKey (必填)

Altcha

详情

AltchaTaskProxylessAltchaTask

字段

websiteURL (必填)

NetEase Yidun

详情

YidunTaskProxylessYidunTask

字段

websiteURL (必填)websiteKey (必填)

Yandex SmartCaptcha

详情

YandexSmartCaptchaTaskProxylessYandexSmartCaptchaTask

字段

websiteURL (必填)websiteKey (必填)

VK Captcha

详情

VKCaptchaTaskProxylessVKCaptchaTask

字段

websiteURL (必填)

Binance Captcha

详情

BinanceTaskProxylessBinanceTask

字段

websiteURL (必填)websiteKey (必填)

自定义任务(Imperva、Temu 等)

详情

CustomTask

字段

class (必填)

图片转文字

详情

ImageToTextTask

字段

body (必填)

文字问题

详情

TextCaptchaTask

字段

comment (必填)

图片网格

详情

GridTask

字段

body (必填)

点击坐标

详情

CoordinatesTask

字段

body (必填)

旋转

详情

RotateTask

字段

body (必填)

音频

详情

AudioTask

字段

body (必填)

框选对象

详情

BoundingBoxTask

字段

body (必填)

圈选轮廓

详情

DrawAroundTask

字段

body (必填)

拖放

详情

DragAndDropTask

字段

复杂图片任务

详情

ComplexImageTask

字段

class (必填)

错误

两种格式使用相同的错误名称。因错误被拒绝的请求不收费。

错误含义及处理方法
ERROR_KEY_DOES_NOT_EXIST密钥错误。请从账户页面重新复制。(in.php 和 res.php:ERROR_WRONG_USER_KEY)
ERROR_ZERO_BALANCE余额不足以支付该任务。请充值;本次未扣费。
ERROR_NO_SLOT_AVAILABLE当前请求过多,任务未被接受。请几秒后重试;本次未扣费。
ERROR_TASK_NOT_SUPPORTED任务类型未知或已关闭。请检查类型名称。
ERROR_BAD_PARAMETERS缺少必填字段或字段格式错误。
ERROR_PAGEURL缺少 websiteURL 或 pageurl,或不是完整的 http(s) 地址。
ERROR_GOOGLEKEYin.php 的 reCAPTCHA 请求缺少 googlekey。
ERROR_BAD_PROXY代理任务需要 proxyAddress 和 proxyPort。
ERROR_ZERO_CAPTCHA_FILESIZE图片缺失或太小。
ERROR_TOO_BIG_CAPTCHA_FILESIZE图片大于 100 KB。
ERROR_IMAGE_TYPE_NOT_SUPPORTED图片不是有效的 base64。
ERROR_WRONG_CAPTCHA_ID你的账户中没有该 ID 的任务。
CAPCHA_NOT_READY仅限 in.php 和 res.php:任务仍在运行。请 5 秒后再查询。
ERROR_CAPTCHA_UNSOLVABLE任务未能按时完成识别。费用已退回余额。
ERROR_TOO_MANY_REQUESTS请求过多。请把结果查询放慢到每 5 秒一次。
ERROR_IP_NOT_ALLOWED请求来自不在账户白名单中的 IP。请在账户页面添加该 IP。