Présentation
Méthodes JSON
Tâches à token
- reCAPTCHA v2
- reCAPTCHA v2 Enterprise
- reCAPTCHA v3
- Cloudflare Turnstile
- GeeTest v3 / v4
- FunCaptcha (Arkose Labs)
- Amazon AWS WAF
- MTCaptcha
- Friendly Captcha
- Lemin Cropped Captcha
- DataDome
- KeyCaptcha
- Capy Puzzle
- Page Cloudflare Challenge
- Cutcaptcha
- CyberSiARA
- atbCAPTCHA
- Tencent Captcha
- Prosopo Procaptcha
- CaptchaFox
- Altcha
- NetEase Yidun
- Yandex SmartCaptcha
- VK Captcha
- Binance Captcha
- Tâche personnalisée (Imperva, Temu et autres)
Documentation de UNLOCK API
Envoyez un CAPTCHA sous forme de tâche, puis récupérez la réponse. L'API utilise les mêmes noms de méthodes, noms de tâches et codes d'erreur que les autres API de résolution, donc la plupart du code existant fonctionne une fois l'hôte et la clé changés.
Fonctionnement d'une requête
- 1
createTaskCréer une tâche
Envoyez POST /createTask avec votre clé et un objet tâche. Vous recevez un taskId. Le prix est prélevé sur le solde à ce moment.
- 2
getTaskResultVérifier le résultat
Attendez environ 5 secondes, puis envoyez POST /getTaskResult toutes les 5 secondes jusqu'à ce que status soit ready.
- 3
solutionUtiliser la réponse
Placez le token ou le texte de solution dans le formulaire de la page. Si la tâche échoue, le montant revient sur le solde.
L'essentiel
- URL de base
https://unlock-api.com- Clé API
- 32 caractères, sur votre page de compte. Envoyez-la comme clientKey (JSON) ou key (in.php, res.php).
- Format
- Méthodes JSON : POST avec un corps JSON. in.php et res.php : champs de formulaire en GET ou POST ; ajoutez json=1 pour des réponses JSON.
- Limites
- 1,200 requêtes par minute et par compte, vérifications de résultat comprises. Attendez environ 5 secondes après la création d'une tâche, puis vérifiez toutes les 5 secondes.
- Délai maximum
- Une tâche non résolue en 5 minutes échoue avec ERROR_CAPTCHA_UNSOLVABLE et son montant revient sur le solde.
- Facturation
- Le prix de la tâche est prélevé à sa création. Les tâches échouées sont remboursées automatiquement.
Démarrage rapide
Résolvez un reCAPTCHA v2 avec les méthodes JSON. Remplacez YOUR_API_KEY par votre clé.
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"])
for _ in range(60): # 60 x 5 s = the 5 minute task limit
time.sleep(5)
r = requests.post(f"{API}/getTaskResult", json={"clientKey": KEY, "taskId": task["taskId"]}).json()
if r["errorId"]:
raise SystemExit(f"{r['errorCode']}: {r.get('errorDescription', '')}") # failed tasks are refunded
if r["status"] == "ready":
print(r["solution"]["gRecaptchaResponse"])
break
else:
raise SystemExit("timed out")const API = "https://unlock-api.com";
const KEY = "YOUR_API_KEY";
const post = (path, body) => fetch(API + path, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify(body) }).then((r) => r.json());
const task = await post("/createTask", {
clientKey: KEY,
task: {
"type": "RecaptchaV2TaskProxyless",
"websiteURL": "https://example.com/login",
"websiteKey": "6LcR_RsTAAAAAFJR_5ZdbQd0SMxL7yIDmSXH1-lo"
},
});
if (task.errorId) throw new Error(task.errorCode);
let solution = null;
for (let n = 0; n < 60 && !solution; n++) { // 60 x 5 s = the 5 minute task limit
await new Promise((r) => setTimeout(r, 5000));
const r = await post("/getTaskResult", { clientKey: KEY, taskId: task.taskId });
if (r.errorId) throw new Error(r.errorCode + ": " + r.errorDescription); // failed tasks are refunded
if (r.status === "ready") solution = r.solution;
}
if (!solution) throw new Error("timed out");
console.log(solution.gRecaptchaResponse);<?php
$api = "https://unlock-api.com";
$key = "YOUR_API_KEY";
function post($url, $body) {
$c = curl_init($url);
curl_setopt_array($c, [CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Content-Type: application/json"], CURLOPT_POSTFIELDS => json_encode($body)]);
return json_decode(curl_exec($c), true);
}
$task = post("$api/createTask", ["clientKey" => $key, "task" => json_decode('{"type":"RecaptchaV2TaskProxyless","websiteURL":"https://example.com/login","websiteKey":"6LcR_RsTAAAAAFJR_5ZdbQd0SMxL7yIDmSXH1-lo"}', true)]);
if ($task["errorId"]) exit($task["errorCode"]);
for ($n = 0; $n < 60; $n++) { // 60 x 5 s = the 5 minute task limit
sleep(5);
$r = post("$api/getTaskResult", ["clientKey" => $key, "taskId" => $task["taskId"]]);
if ($r["errorId"]) exit($r["errorCode"] . ": " . $r["errorDescription"]); // failed tasks are refunded
if ($r["status"] === "ready") break;
}
if ($r["status"] !== "ready") exit("timed out");
print_r($r["solution"]["gRecaptchaResponse"]);package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"time"
)
const api = "https://unlock-api.com"
const key = "YOUR_API_KEY"
func post(method string, body map[string]any) map[string]any {
b, _ := json.Marshal(body)
res, err := http.Post(api+"/"+method, "application/json", bytes.NewReader(b))
if err != nil {
panic(err)
}
defer res.Body.Close()
var out map[string]any
json.NewDecoder(res.Body).Decode(&out)
return out
}
func main() {
task := post("createTask", map[string]any{
"clientKey": key,
"task": map[string]any{
"type": "RecaptchaV2TaskProxyless",
"websiteURL": "https://example.com/login",
"websiteKey": "6LcR_RsTAAAAAFJR_5ZdbQd0SMxL7yIDmSXH1-lo",
},
})
if task["errorId"].(float64) != 0 {
panic(task["errorCode"])
}
for n := 0; n < 60; n++ { // 60 x 5 s = the 5 minute task limit
time.Sleep(5 * time.Second)
r := post("getTaskResult", map[string]any{"clientKey": key, "taskId": task["taskId"]})
if r["errorId"].(float64) != 0 {
panic(r["errorCode"]) // failed tasks are refunded
}
if r["status"] == "ready" {
fmt.Println(r["solution"])
return
}
}
panic("timed out")
}import java.net.URI;
import java.net.http.*;
import java.util.regex.*;
public class Solve {
static final String API = "https://unlock-api.com", KEY = "YOUR_API_KEY";
static final HttpClient HTTP = HttpClient.newHttpClient();
static String post(String method, String json) throws Exception {
var req = HttpRequest.newBuilder(URI.create(API + "/" + method))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(json)).build();
return HTTP.send(req, HttpResponse.BodyHandlers.ofString()).body();
}
public static void main(String[] args) throws Exception {
String task = "{\"type\":\"RecaptchaV2TaskProxyless\",\"websiteURL\":\"https://example.com/login\",\"websiteKey\":\"6LcR_RsTAAAAAFJR_5ZdbQd0SMxL7yIDmSXH1-lo\"}";
String created = post("createTask", "{\"clientKey\":\"" + KEY + "\",\"task\":" + task + "}");
Matcher id = Pattern.compile("\"taskId\":(\\d+)").matcher(created);
if (!id.find()) throw new RuntimeException(created);
for (int n = 0; n < 60; n++) { // 60 x 5 s = the 5 minute task limit
Thread.sleep(5000);
String r = post("getTaskResult", "{\"clientKey\":\"" + KEY + "\",\"taskId\":" + id.group(1) + "}");
if (r.contains("\"errorId\":1")) throw new RuntimeException(r); // failed tasks are refunded
if (r.contains("\"status\":\"ready\"")) { System.out.println(r); return; }
}
throw new RuntimeException("timed out");
}
}using System.Net.Http.Json;
using System.Text.Json;
const string Api = "https://unlock-api.com";
const string Key = "YOUR_API_KEY";
var http = new HttpClient();
async Task<JsonElement> Post(string method, object body) =>
await (await http.PostAsJsonAsync($"{Api}/{method}", body)).Content.ReadFromJsonAsync<JsonElement>();
var task = await Post("createTask", new {
clientKey = Key,
task = JsonSerializer.Deserialize<JsonElement>("""
{"type":"RecaptchaV2TaskProxyless","websiteURL":"https://example.com/login","websiteKey":"6LcR_RsTAAAAAFJR_5ZdbQd0SMxL7yIDmSXH1-lo"}
""")
});
if (task.GetProperty("errorId").GetInt32() != 0) throw new Exception(task.GetProperty("errorCode").GetString());
for (var n = 0; n < 60; n++) { // 60 x 5 s = the 5 minute task limit
await Task.Delay(5000);
var r = await Post("getTaskResult", new { clientKey = Key, taskId = task.GetProperty("taskId").GetInt64() });
if (r.GetProperty("errorId").GetInt32() != 0) throw new Exception(r.GetProperty("errorCode").GetString()); // failed tasks are refunded
if (r.GetProperty("status").GetString() == "ready") { Console.WriteLine(r.GetProperty("solution")); return; }
}
throw new Exception("timed out");curl -s https://unlock-api.com/createTask \
-H "Content-Type: application/json" \
-d '{"clientKey":"YOUR_API_KEY","task":{"type":"RecaptchaV2TaskProxyless","websiteURL":"https://example.com/login","websiteKey":"6LcR_RsTAAAAAFJR_5ZdbQd0SMxL7yIDmSXH1-lo"}}'
# {"errorId":0,"taskId":1001}
curl -s https://unlock-api.com/getTaskResult \
-H "Content-Type: application/json" \
-d '{"clientKey":"YOUR_API_KEY","taskId":1001}'
# {"errorId":0,"status":"processing"} then {"errorId":0,"status":"ready","solution":{...},"cost":"0.001"}Méthodes
createTaskCrée une tâche et renvoie son id. Le prix du type de tâche est prélevé sur le solde quand la tâche est acceptée, et rendu si la tâche échoue.getTaskResultRenvoie l'état d'une tâche. Pendant la résolution, status vaut processing. Une fois terminée, status vaut ready et solution contient la réponse. Une tâche échouée renvoie errorId 1 avec la raison, et son montant est déjà revenu sur le solde.getBalanceRenvoie le solde du compte en dollars américains.getTokenCrée une tâche et attend la réponse dans la même requête, jusqu'à 50 secondes. Si la tâche n'est pas terminée à ce moment, la réponse est status processing avec le taskId ; continuez à la vérifier avec getTaskResult. Les callbacks de résultat ne sont pas envoyés pour les tâches getToken.getQueueStatsRenvoie la file actuelle : tâches en attente, tâches en cours de résolution et temps moyen de résolution sur la dernière heure. Les chiffres viennent de tâches réelles, pas d'estimations.getSpendingStatsRenvoie vos dépenses pour un jour UTC, heure par heure : nombre de tâches et montant dépensé. Les tâches échouées et remboursées ne sont pas comptées.reportCorrect, reportIncorrectSignale une réponse correcte ou incorrecte. Ces appels sont acceptés pour que les bibliothèques existantes continuent de fonctionner ; un signalement ne modifie pas le montant facturé.testÉcho pour le débogage. Renvoie le corps JSON reçu, sans clientKey. Pas de vérification de clé, pas de facturation.
Guides
- Clés API et sécuritéComment envoyer votre clé, utiliser plusieurs clés et n'autoriser que vos serveurs.
- Limites, délais et facturationLimites de requêtes, fréquence de vérification des résultats, délai maximum et moment de la facturation.
- Codes d'erreurTous les codes d'erreur, leur sens, que faire et si vous êtes facturé.
- Utiliser un proxyQuand résoudre via votre propre proxy et comment l'envoyer.
- Callbacks de résultatRecevez le résultat sur votre serveur au lieu de le vérifier.
- API formulaire : in.php et res.phpLes requêtes classiques in.php et res.php, pour le code écrit pour d'anciennes API de résolution.
Types de tâches
Chaque type a sa propre page avec tous les paramètres, l'objet solution et des exemples.
Tâches à token
- reCAPTCHA v2
RecaptchaV2TaskProxylessuserrecaptcha - reCAPTCHA v2 Enterprise
RecaptchaV2EnterpriseTaskProxylessuserrecaptcha, enterprise=1 - reCAPTCHA v3
RecaptchaV3TaskProxylessuserrecaptcha, version=v3 - Cloudflare Turnstile
TurnstileTaskProxylessturnstile - GeeTest v3 / v4
GeeTestTaskProxylessgeetest, geetest_v4 - FunCaptcha (Arkose Labs)
FunCaptchaTaskProxylessfuncaptcha - Amazon AWS WAF
AmazonTaskProxylessamazon_waf - MTCaptcha
MtCaptchaTaskProxylessmt_captcha - Friendly Captcha
FriendlyCaptchaTaskProxylessfriendly_captcha - Lemin Cropped Captcha
LeminTaskProxylesslemin - DataDome
DataDomeSliderTaskdatadome - KeyCaptcha
KeyCaptchaTaskProxylesskeycaptcha - Capy Puzzle
CapyTaskProxylesscapy - Page Cloudflare Challenge
AntiCloudflareTaskcloudflare_challenge - Cutcaptcha
CutCaptchaTaskProxylesscutcaptcha - CyberSiARA
AntiCyberSiAraTaskProxylesscybersiara - atbCAPTCHA
AtbCaptchaTaskProxylessatb_captcha - Tencent Captcha
TencentTaskProxylesstencent - Prosopo Procaptcha
ProsopoTaskProxylessprosopo - CaptchaFox
CaptchaFoxTaskProxylesscaptchafox - Altcha
AltchaTaskProxylessaltcha - NetEase Yidun
YidunTaskProxylessyidun - Yandex SmartCaptcha
YandexSmartCaptchaTaskProxylessyandex - VK Captcha
VKCaptchaTaskProxylessvkcaptcha - Binance Captcha
BinanceTaskProxylessbinance - Tâche personnalisée (Imperva, Temu et autres)
CustomTaskincapsula, temuimage, hunt, tspd, basilisk
Tâches image et audio
- Image vers texte
ImageToTextTaskpost, base64 - Question texte
TextCaptchaTasktextcaptcha - Grille d'images
GridTaskpost, recaptcha=1 - Coordonnées de clic
CoordinatesTaskpost, coordinatescaptcha=1 - Rotation
RotateTaskrotatecaptcha - Audio
AudioTaskaudio - Cadre de délimitation
BoundingBoxTaskbounding_box - Tracer un contour
DrawAroundTaskpost, canvas=1 - Glisser-déposer
DragAndDropTask- - Tâche d'image complexe
ComplexImageTask-