기본 정보
- 접속 주소
https://unlock-api.com- API 키
- 32자예요. 계정 화면에 있어요. JSON 방식은 clientKey, in.php와 res.php는 key로 보내요.
- 형식
- JSON 방식은 JSON 본문으로 POST해요. in.php와 res.php는 GET이나 POST 폼 항목으로 보내고, json=1을 붙이면 JSON으로 답해요.
- 한도
- 계정 하나당 1분에 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"])
breakJSON 방식
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과 오류 이름으로 답해요.
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. 답: 미국 달러 잔액.
{"clientKey":"YOUR_API_KEY"}
{"errorId":0,"balance":42.5}틀린 답 신고
reportIncorrectRecaptcha와 reportIncorrectImageCaptcha는 clientKey와 taskId를 받아 success로 답해요. 기존 라이브러리와 맞추려고 받아 두는 호출이고, 비용은 바뀌지 않아요.
폼 방식 (in.php, res.php)
작업 보내기: in.php
항목: key, method, 그리고 캡차 종류별 항목. 답: OK|번호, json=1이면 {"status":1,"request":"번호"}. 오류는 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=번호는 풀리면 OK|답, 푸는 중이면 CAPCHA_NOT_READY. action=get2는 비용도 함께 줘요. ids=번호1,번호2로 한 번에 100개까지 확인해요. action=getbalance는 잔액, 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와 같은 JSON에 taskId가 붙고, 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는 지금 대기 중·푸는 중인 작업 수와 최근 1시간 평균 풀이 시간을 줘요. getSpendingStats는 UTC 하루(date는 유닉스 시간) 동안 시간별 작업 수와 금액을 줘요. 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 같은 proxy 문자열 하나가 더 필요해요. 여기 없는 선택 항목은 보낸 그대로 풀이 쪽에 전달해요.
reCAPTCHA v2 Enterprise
자세히RecaptchaV2EnterpriseTaskProxylessRecaptchaV2EnterpriseTask
항목
websiteURL (필수)websiteKey (필수)
FunCaptcha (Arkose Labs)
자세히FunCaptchaTaskProxylessFunCaptchaTask
항목
websiteURL (필수)websitePublicKey (필수)
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 (필수)
Yandex SmartCaptcha
자세히YandexSmartCaptchaTaskProxylessYandexSmartCaptchaTask
항목
websiteURL (필수)websiteKey (필수)
오류
두 형식 모두 이름이 같아요. 오류로 거절된 요청은 비용이 빠지지 않아요.
| 오류 | 뜻과 해결 방법 |
|---|---|
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_GOOGLEKEY | in.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 | 내 계정에 그 번호의 작업이 없어요. |
CAPCHA_NOT_READY | in.php, res.php 전용: 아직 푸는 중이에요. 5초 뒤에 다시 확인하세요. |
ERROR_CAPTCHA_UNSOLVABLE | 시간 안에 못 풀었어요. 비용은 잔액으로 돌아왔어요. |
ERROR_TOO_MANY_REQUESTS | 요청이 너무 많아요. 결과 확인을 5초 간격으로 줄이세요. |
ERROR_IP_NOT_ALLOWED | 계정의 허용 목록에 없는 IP에서 온 요청이에요. 계정 화면에서 IP를 추가하세요. |