Reference

Migrate from AZCaptcha to CaptchaAI: Complete Guide

AZCaptcha and CaptchaAI both use a 2Captcha-compatible API format, making migration straightforward. You'll mostly change the base URL and API key — the request format stays the same.

Endpoint Mapping

Action AZCaptcha CaptchaAI
Submit task https://azcaptcha.com/in.php https://ocr.captchaai.com/in.php
Get result https://azcaptcha.com/res.php https://ocr.captchaai.com/res.php
Check balance res.php?action=getbalance res.php?action=getbalance
Report incorrect res.php?action=reportbad res.php?action=reportbad

Parameter Compatibility

Most parameters are identical. Key differences:

Parameter AZCaptcha CaptchaAI Notes
key API key API key Different key — get yours at captchaai.com
method userrecaptcha userrecaptcha Same
googlekey Site key Site key Same
pageurl Page URL Page URL Same
json 1 1 Same
proxy user:pass@host:port user:pass@host:port Same format
proxytype HTTP/SOCKS5 HTTP/SOCKS5 Same

Migration Steps

Step 1: Get CaptchaAI API Key

  1. Sign up at captchaai.com
  2. Add funds to your account
  3. Copy your API key from the dashboard

Step 2: Update Your Code

Python — Before (AZCaptcha)

import requests

API_KEY = "your_azcaptcha_key"

def solve_recaptcha(sitekey, pageurl):
    # Submit
    resp = requests.post("https://azcaptcha.com/in.php", data={
        "key": API_KEY,
        "method": "userrecaptcha",
        "googlekey": sitekey,
        "pageurl": pageurl,
        "json": 1
    })
    data = resp.json()
    if data["status"] != 1:
        return {"error": data["request"]}

    captcha_id = data["request"]

    # Poll
    import time
    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://azcaptcha.com/res.php", params={
            "key": API_KEY, "action": "get", "id": captcha_id, "json": 1
        }).json()
        if result["status"] == 1:
            return {"solution": result["request"]}
        if result["request"] != "CAPCHA_NOT_READY":
            return {"error": result["request"]}

    return {"error": "TIMEOUT"}

Python — After (CaptchaAI)

import os
import time
import requests

API_KEY = os.environ["CAPTCHAAI_API_KEY"]  # Changed: use env var

def solve_recaptcha(sitekey, pageurl):
    # Submit — only URL changed
    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 — only URL changed
    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 — Before (AZCaptcha)

const axios = require("axios");
const API_KEY = "your_azcaptcha_key";

async function solveRecaptcha(sitekey, pageurl) {
  const submit = await axios.post("https://azcaptcha.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://azcaptcha.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" };
}

JavaScript — After (CaptchaAI)

const axios = require("axios");
const API_KEY = process.env.CAPTCHAAI_API_KEY;  // Changed: env var

async function solveRecaptcha(sitekey, pageurl) {
  // Only URLs changed
  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" };
}

Step 3: Abstract the Provider

For safer migration, create a provider-agnostic wrapper:

import os
import time
import requests


class CaptchaProvider:
    def __init__(self, base_url, api_key):
        self.submit_url = f"{base_url}/in.php"
        self.result_url = f"{base_url}/res.php"
        self.api_key = api_key
        self.session = requests.Session()

    def solve(self, sitekey, pageurl, method="userrecaptcha"):
        resp = self.session.post(self.submit_url, data={
            "key": self.api_key,
            "method": method,
            "googlekey": sitekey,
            "pageurl": pageurl,
            "json": 1
        })
        data = resp.json()
        if data.get("status") != 1:
            return {"error": data.get("request")}

        captcha_id = data["request"]
        for _ in range(60):
            time.sleep(5)
            result = self.session.get(self.result_url, params={
                "key": self.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"}


# Switch by changing one line:
# provider = CaptchaProvider("https://azcaptcha.com", "old_key")
provider = CaptchaProvider(
    "https://ocr.captchaai.com",
    os.environ["CAPTCHAAI_API_KEY"]
)

Step 4: Parallel Test

Run both providers simultaneously to compare:

def parallel_test(sitekey, pageurl, runs=10):
    azcaptcha = CaptchaProvider("https://azcaptcha.com", "old_key")
    captchaai = CaptchaProvider(
        "https://ocr.captchaai.com",
        os.environ["CAPTCHAAI_API_KEY"]
    )

    results = {"azcaptcha": [], "captchaai": []}

    for i in range(runs):
        start = time.time()
        az_result = azcaptcha.solve(sitekey, pageurl)
        results["azcaptcha"].append({
            "success": "solution" in az_result,
            "time": time.time() - start
        })

        start = time.time()
        cai_result = captchaai.solve(sitekey, pageurl)
        results["captchaai"].append({
            "success": "solution" in cai_result,
            "time": time.time() - start
        })

    for provider, data in results.items():
        successes = sum(1 for r in data if r["success"])
        avg_time = sum(r["time"] for r in data) / len(data)
        print(f"{provider}: {successes}/{runs} success, {avg_time:.1f}s avg")

Migration Checklist

Step Status
Create CaptchaAI account and fund it
Replace base URL in all files
Update API key (use env var)
Run parallel test (10+ solves)
Compare success rates
Compare solve times
Update monitoring/alerting for new endpoints
Switch production traffic
Monitor for 24 hours
Decommission AZCaptcha key

Troubleshooting

Issue Cause Fix
ERROR_KEY_DOES_NOT_EXIST Wrong API key Verify CaptchaAI API key from dashboard
ERROR_ZERO_BALANCE No funds in new account Add funds at captchaai.com
Different error codes Minor error code differences Map error codes; most are identical
Solve rate differs Different solver pools Run 50+ test solves for statistically valid comparison

FAQ

Is CaptchaAI a drop-in replacement for AZCaptcha?

Nearly. Both use the 2Captcha-compatible API format. Change the base URL and API key — parameters and response format are the same.

Will my existing proxy configuration work?

Yes. CaptchaAI uses the same proxy and proxytype parameters. No changes needed for proxy-based solving.

How long does migration take?

For a single codebase, 15–30 minutes. Most of that is updating the base URL with search-and-replace, plus running a parallel test to verify.

Next Steps

Switch to faster, more reliable CAPTCHA solving — get your CaptchaAI API key and migrate in minutes.

Related guides:

Discussions (0)

No comments yet.