Die Migration von NextCaptcha zu CaptchaAI ist vor allem eine Umstellung der API-Form – nicht Ihrer CAPTCHA-Logik. NextCaptcha arbeitet mit einer JSON-Task-API über /createTask und /getTaskResult; CaptchaAI nutzt das etablierte in.php/res.php-Schema mit Formularparametern. Ihre reCAPTCHA-, Turnstile- oder Bild-CAPTCHA-Abläufe bleiben inhaltlich identisch – Sie ändern nur, wie Anfrage und Antwort aufgebaut sind. Dieser Leitfaden zeigt das exakte Mapping: Endpunkte, Parameter, Aufgabentypen, Code in Python und JavaScript sowie einen risikoarmen Parallel-Test vor der endgültigen Umstellung.
Was sich ändert – und was gleich bleibt
Bevor Sie eine einzige Zeile anfassen, hilft eine klare Trennung zwischen dem, was Sie übernehmen, und dem, was Sie umbauen:
- Gleich bleibt: Ihre Sitekeys, die
pageurlder Zielseite, die grundsätzliche Polling-Schleife und die unterstützten reCAPTCHA-Varianten. - Ändern müssen Sie den Transport: Der JSON-Body wird zu einer flachen Liste aus Formularparametern.
- Ändern müssen Sie die Abfrage: Das Polling wechselt von
POSTaufGETmit Query-Parametern. - Ändern müssen Sie das Parsing: Aus
errorId === 0wirdstatus === 1, austaskIdwirdrequest.
Wer diese vier Achsen im Kopf hat, kann jede bestehende NextCaptcha-Integration weitgehend mechanisch übertragen.
Praxisbeispiel: schrittweise Umstellung im laufenden Betrieb
Ein Data-Team in Berlin betreibt eine Preisüberwachung über mehrere Händlerportale und stößt dabei regelmäßig auf reCAPTCHA v2 und Cloudflare Turnstile. Statt hart umzuschalten, legt das Team einen Feature-Flag in seiner GitLab-CI-Pipeline an: Für 10 % der Läufe geht die Anfrage an CaptchaAI, der Rest weiter an NextCaptcha. Über eine Woche werden Erfolgsquote, Lösungszeit und Fehlercodes beider Wege in denselben Dashboards verglichen. Erst wenn die CaptchaAI-Werte stabil sind, steigt der Anteil schrittweise auf 100 %. Der Parallelbetrieb kostet wenig Aufwand, weil sich nur die Solver-Funktion unterscheidet.
Hinweis: IP-Adressen gelten in der DSGVO als personenbezogene Daten. Prüfen Sie unabhängig vom eingesetzten Solver Ihre Rechtsgrundlage und Ihre Datenflüsse, bevor Sie Scraping- oder Monitoring-Workflows in Produktion nehmen.
Endpunkt-Mapping
| Aktion | NextCaptcha | CaptchaAI |
|---|---|---|
| Aufgabe übermitteln | POST /createTask |
POST https://ocr.captchaai.com/in.php |
| Ergebnis abrufen | POST /getTaskResult |
GET https://ocr.captchaai.com/res.php |
| Kontostand prüfen | POST /getBalance |
GET res.php?action=getbalance&key=KEY |
Statt zweier JSON-Endpunkte sprechen Sie bei CaptchaAI dieselbe Basis-URL mit unterschiedlichen Methoden und Query-Parametern an. Das vereinfacht den Client-Code, weil keine verschachtelten Task-Objekte mehr serialisiert werden.
Aufbau der Anfrage im Vergleich
Der deutlichste Unterschied liegt in der Übermittlung. Kurz zusammengefasst:
- NextCaptcha erwartet ein JSON-Objekt mit einem verschachtelten
task-Block. - CaptchaAI erwartet eine flache Liste aus Formularparametern an
in.php. - Der Sitekey heißt bei CaptchaAI
googlekey(odersitekey), die Zielseitepageurl.
NextCaptcha: Übermittlung als JSON-Body
{
"clientKey": "next_captcha_key",
"task": {
"type": "RecaptchaV2TaskProxyless",
"websiteURL": "https://example.com",
"websiteKey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"
}
}
CaptchaAI: Übermittlung als Formularparameter
POST https://ocr.captchaai.com/in.php
key=YOUR_API_KEY&method=userrecaptcha&googlekey=6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-&pageurl=https://example.com&json=1
Parameter-Mapping
Die meisten Felder haben ein direktes Gegenstück. Die folgende Tabelle deckt die gängigen Token-CAPTCHA-Parameter ab:
| NextCaptcha-Feld | CaptchaAI-Feld | Hinweis |
|---|---|---|
clientKey |
key |
API-Schlüssel |
task.type |
method |
siehe Typzuordnung unten |
task.websiteURL |
pageurl |
URL der Zielseite |
task.websiteKey |
googlekey oder sitekey |
Sitekey für Token-CAPTCHAs |
task.recaptchaDataSValue |
data-s |
reCAPTCHA-data-s-Parameter |
task.isInvisible |
invisible=1 |
Flag für unsichtbares reCAPTCHA |
task.pageAction |
action |
reCAPTCHA-v3-Aktion |
taskId |
id |
Task-/Captcha-ID fürs Polling |
Aufgabentypen zuordnen
Der type-String von NextCaptcha wird bei CaptchaAI zu einem method-Wert:
| NextCaptcha-Typ | CaptchaAI-Methode + Parameter |
|---|---|
RecaptchaV2TaskProxyless |
method=userrecaptcha |
RecaptchaV2Task |
method=userrecaptcha + proxy, proxytype |
HCaptchaTaskProxyless |
nicht unterstützt (hCaptcha) |
HCaptchaTask |
nicht unterstützt (hCaptcha) |
ImageToTextTask |
method=base64 + body |
TurnstileTaskProxyless |
method=turnstile |
Wichtig: CaptchaAI unterstützt hCaptcha und FunCaptcha nicht. Setzen Ihre Zielseiten auf diese Typen, prüfen Sie vor der Migration, ob sich der betroffene Traffic anders abbilden lässt.
Antwortformate im Vergleich
Bevor Sie den Code umbauen, sollten Sie das Antwort-Parsing kennen. NextCaptcha signalisiert Erfolg über eine numerische errorId, CaptchaAI über ein status-Feld. Passen Sie beide Prüfstellen – Übermittlung und Polling – gemeinsam an.
Antwort bei der Übermittlung
| Feld | NextCaptcha | CaptchaAI |
|---|---|---|
| Erfolgsprüfung | errorId === 0 |
status === 1 |
| Task-ID | taskId (Ganzzahl) |
request (Zeichenkette) |
| Fehlermeldung | errorDescription |
request (Fehlercode als String) |
Antwort beim Polling
| Feld | NextCaptcha | CaptchaAI |
|---|---|---|
| Bereit-Prüfung | status === "ready" |
status === 1 |
| Noch nicht bereit | status === "processing" |
request === "CAPCHA_NOT_READY" |
| Lösung | solution.gRecaptchaResponse |
request |
| Fehler | errorDescription |
request (Fehlercode) |
Code-Migration in Python und JavaScript
Mit dem Mapping im Rücken betreffen die Codeänderungen genau zwei Stellen pro Solver-Funktion: die Übermittlung und das Polling. Die folgenden Vorher-/Nachher-Paare zeigen eine typische reCAPTCHA-v2-Funktion.
Python – vorher (NextCaptcha)
import requests
import time
CLIENT_KEY = "your_nextcaptcha_key"
BASE_URL = "https://api.nextcaptcha.com"
def solve_recaptcha_v2(sitekey, pageurl):
# Submit
resp = requests.post(f"{BASE_URL}/createTask", json={
"clientKey": CLIENT_KEY,
"task": {
"type": "RecaptchaV2TaskProxyless",
"websiteURL": pageurl,
"websiteKey": sitekey
}
})
data = resp.json()
if data.get("errorId") != 0:
return {"error": data.get("errorDescription")}
task_id = data["taskId"]
# Poll
for _ in range(60):
time.sleep(5)
result = requests.post(f"{BASE_URL}/getTaskResult", json={
"clientKey": CLIENT_KEY,
"taskId": task_id
}).json()
if result.get("status") == "ready":
return {"solution": result["solution"]["gRecaptchaResponse"]}
if result.get("errorId") != 0:
return {"error": result.get("errorDescription")}
return {"error": "TIMEOUT"}
Python – nachher (CaptchaAI)
import os
import time
import requests
API_KEY = os.environ["CAPTCHAAI_API_KEY"]
def solve_recaptcha_v2(sitekey, pageurl):
# Submit — different endpoint and format
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": pageurl,
"json": 1
})
data = resp.json()
if data.get("status") != 1:
return {"error": data.get("request")}
captcha_id = data["request"]
# Poll — GET instead of POST, different response format
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": captcha_id,
"json": 1
}).json()
if result.get("status") == 1:
return {"solution": result["request"]}
if result.get("request") != "CAPCHA_NOT_READY":
return {"error": result.get("request")}
return {"error": "TIMEOUT"}
JavaScript – vorher (NextCaptcha)
const axios = require("axios");
const CLIENT_KEY = "your_nextcaptcha_key";
const BASE_URL = "https://api.nextcaptcha.com";
async function solveRecaptchaV2(sitekey, pageurl) {
const submit = await axios.post(`${BASE_URL}/createTask`, {
clientKey: CLIENT_KEY,
task: {
type: "RecaptchaV2TaskProxyless",
websiteURL: pageurl,
websiteKey: sitekey,
},
});
if (submit.data.errorId !== 0) return { error: submit.data.errorDescription };
const taskId = submit.data.taskId;
for (let i = 0; i < 60; i++) {
await new Promise((r) => setTimeout(r, 5000));
const poll = await axios.post(`${BASE_URL}/getTaskResult`, {
clientKey: CLIENT_KEY,
taskId,
});
if (poll.data.status === "ready") return { solution: poll.data.solution.gRecaptchaResponse };
if (poll.data.errorId !== 0) return { error: poll.data.errorDescription };
}
return { error: "TIMEOUT" };
}
JavaScript – nachher (CaptchaAI)
const axios = require("axios");
const API_KEY = process.env.CAPTCHAAI_API_KEY;
async function solveRecaptchaV2(sitekey, pageurl) {
const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
params: { key: API_KEY, method: "userrecaptcha", googlekey: sitekey, pageurl, json: 1 },
});
if (submit.data.status !== 1) return { error: submit.data.request };
const captchaId = submit.data.request;
for (let i = 0; i < 60; i++) {
await new Promise((r) => setTimeout(r, 5000));
const poll = await axios.get("https://ocr.captchaai.com/res.php", {
params: { key: API_KEY, action: "get", id: captchaId, json: 1 },
});
if (poll.data.status === 1) return { solution: poll.data.request };
if (poll.data.request !== "CAPCHA_NOT_READY") return { error: poll.data.request };
}
return { error: "TIMEOUT" };
}
Migrations-Checkliste
Arbeiten Sie die Schritte in dieser Reihenfolge ab – jeder baut auf dem vorigen auf. Die Umstellung des Produktionsverkehrs steht bewusst am Ende, nach dem Parallel-Test.
| Schritt | Status |
|---|---|
| CaptchaAI-Konto anlegen und Guthaben aufladen | ☐ |
Alle createTask-Typen den CaptchaAI-Methoden zuordnen |
☐ |
clientKey durch den CaptchaAI-API-Schlüssel ersetzen |
☐ |
| Übermittlung vom JSON-Body-POST auf Formular-POST umstellen | ☐ |
| Polling von POST auf GET mit Query-Parametern umstellen | ☐ |
Antwort-Parsing auf das status/request-Format anpassen |
☐ |
| Parallelen Vergleichstest gegen beide Dienste fahren | ☐ |
| Produktionsverkehr auf CaptchaAI umstellen | ☐ |
Fehlerbehebung
| Problem | Ursache | Lösung |
|---|---|---|
ERROR_KEY_DOES_NOT_EXIST |
es wird noch der NextCaptcha-clientKey gesendet |
durch den CaptchaAI-API-Schlüssel ersetzen |
| Antwort-Parsing bricht ab | die JSON-Struktur unterscheidet sich | auf status (Ganzzahl) und request prüfen statt auf errorId/solution |
ERROR_WRONG_USER_KEY |
Schlüssel ist fehlerhaft formatiert | Format im CaptchaAI-Dashboard verifizieren |
| Aufgabentyp wird nicht erkannt | es werden noch NextCaptcha-Typnamen verwendet | auf die method-Werte aus der Tabelle oben mappen |
Häufige Fragen
Kann ich NextCaptcha und CaptchaAI parallel betreiben?
Ja. Genau das ist der empfohlene Weg: Beide Solver laufen eine Weile nebeneinander, Sie leiten einen kleinen Traffic-Anteil an CaptchaAI und vergleichen Erfolgsquote und Lösungszeit, bevor Sie vollständig umstellen. So bleibt jederzeit ein Fallback erhalten.
Muss ich meine reCAPTCHA-Sitekeys oder Ziel-URLs ändern?
Nein. Sitekey und pageurl beziehen sich auf die Zielseite, nicht auf den Solver. Sie übergeben dieselben Werte – lediglich unter den CaptchaAI-Feldnamen googlekey/sitekey und pageurl statt websiteKey und websiteURL.
Unterstützt CaptchaAI dieselben CAPTCHA-Typen wie NextCaptcha?
Für die gängigen Typen ja: reCAPTCHA v2 und v3, Cloudflare Turnstile und Cloudflare Challenge, GeeTest v3 sowie Bild-/OCR- und Rasterbild-CAPTCHAs. hCaptcha und FunCaptcha unterstützt CaptchaAI nicht – prüfen Sie vor der Migration, ob Ihre Zielseiten darauf setzen.
Wie unterscheidet sich die Abrechnung von NextCaptcha?
CaptchaAI rechnet pro gleichzeitigem Thread ab, nicht pro Lösung – jeder Plan enthält unbegrenzte Lösungen pro Thread im Abrechnungsmonat. Der Einstieg ist BASIC ab 15 $/Monat mit 5 Threads; STANDARD (30 $/Monat, 15 Threads) und höhere Tarife skalieren die Parallelität. Für konstant hohe Volumen ist das oft besser kalkulierbar als eine Abrechnung pro Solve.