Migrasi dari AZCaptcha ke CaptchaAI biasanya cuma soal dua baris: base URL dan API key. AZCaptcha dan CaptchaAI sama-sama memakai format API ala 2Captcha, jadi parameter request, struktur respons, dan alur polling-nya identik — tidak ada integrasi yang perlu ditulis ulang dari nol. Panduan ini merinci persis endpoint dan parameter yang berubah, contoh kode Python dan JavaScript sebelum-sesudah, plus checklist cutover supaya traffic produksi Anda tidak terganggu saat berpindah.
Kapan saatnya migrasi dari AZCaptcha
Tiga sinyal ini paling sering muncul di tim otomatisasi Indonesia — kontraktor scraping freelance (Upwork, Fastwork), agensi price-monitoring, dan tim data internal — sebelum mereka benar-benar pindah:
- Downtime atau insiden di AZCaptcha mulai mengganggu SLA ke klien
- Volume solve naik dan model harga per-solve jadi sulit diprediksi bulan ke bulan
- Butuh success rate yang lebih konsisten untuk reCAPTCHA, Turnstile, atau GeeTest v3 di volume produksi
Kalau salah satu di atas terasa familiar, langkah-langkah migrasinya cukup singkat — tidak sampai setengah jam untuk satu codebase.
Perbedaan endpoint: AZCaptcha vs CaptchaAI
Perubahan paling mendasar ada di base URL. Path dan action lainnya tidak berubah — cuma host-nya beda:
- Kirim task —
https://azcaptcha.com/in.phpmenjadihttps://ocr.captchaai.com/in.php - Ambil hasil —
https://azcaptcha.com/res.phpmenjadihttps://ocr.captchaai.com/res.php - Cek saldo — tetap
res.php?action=getbalancedi kedua provider - Lapor jawaban salah — tetap
res.php?action=reportbaddi kedua provider
Praktiknya, ini satu-satunya baris yang berubah di request Anda — semua path sesudah base URL identik.
Parameter mana yang perlu disesuaikan
Hampir semua parameter identik — cuma value key yang beda, karena itu kredensial akun Anda sendiri. Sisanya bisa disalin apa adanya:
| Parameter | AZCaptcha | CaptchaAI | Catatan |
|---|---|---|---|
key |
API key | API key | Kunci berbeda — ambil milik Anda di captchaai.com |
method |
userrecaptcha |
userrecaptcha |
Sama |
googlekey |
Site key | Site key | Sama |
pageurl |
URL halaman | URL halaman | Sama |
json |
1 |
1 |
Sama |
proxy |
user:pass@host:port |
user:pass@host:port |
Format sama |
proxytype |
HTTP/SOCKS5 |
HTTP/SOCKS5 |
Sama |
Kalau kode Anda sudah membangun
proxy/proxytypesecara dinamis dari config, bagian itu tidak perlu disentuh sama sekali — cumakeydan base URL yang berubah.
Cara migrasi ke CaptchaAI, langkah demi langkah
Langkah 1: buat akun dan ambil API key
- Daftar di captchaai.com
- Isi saldo akun Anda
- Salin API key dari dashboard
Simpan API key sebagai environment variable, bukan hardcode di source — kebiasaan ini juga yang dipakai contoh kode di bawah, jadi rotasi key nanti tidak perlu deploy ulang kode.
Langkah 2: ubah base URL dan cara API key disimpan
Cuma dua yang berubah antara versi lama dan baru: base URL, dan cara API key disimpan. Berikut Python dan JavaScript-nya, sebelum lalu sesudah:
Python — sebelum (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 — sesudah (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 — sebelum (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 — sesudah (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" };
}
Langkah 3: bungkus provider dengan wrapper (opsional, tapi disarankan)
Kalau Anda ingin bisa rollback dalam hitungan detik selama masa transisi, bungkus pemanggilan provider di satu class. Ganti provider jadi tinggal ganti satu argumen, bukan cari-ganti di puluhan file:
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"]
)
Langkah 4: jalankan uji paralel sebelum cutover penuh
Jalankan AZCaptcha dan CaptchaAI berdampingan dulu, minimal 10 solve, sebelum full cutover. Kalau server Anda deploy di region Asia Tenggara — AWS ap-southeast-1 (Singapura), ap-southeast-3 (Jakarta), atau GCP asia-southeast2 (Jakarta) — jalankan uji dari region yang sama juga, supaya angka waktu solve yang tercatat mencerminkan kondisi produksi sebenarnya, bukan latency tambahan dari lokasi test server:
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")
Bandingkan success rate dan rata-rata waktu solve dari output-nya sebelum memutuskan cutover penuh.
Error umum saat migrasi dan cara mengatasinya
Sebagian besar error saat migrasi jatuh ke empat pola ini — cek daftar ini lebih dulu sebelum menggali lebih dalam:
ERROR_KEY_DOES_NOT_EXIST— API key salah. Verifikasi API key CaptchaAI dari dashboard.ERROR_ZERO_BALANCE— Tidak ada saldo di akun baru. Isi saldo di captchaai.com.- Kode error terlihat berbeda — Ada perbedaan kecil pada penamaan kode error antar provider. Petakan kode error; sebagian besar tetap identik.
- Success rate terasa berbeda — Pool solver antar provider tidak sama. Jalankan 50+ solve uji supaya perbandingannya valid secara statistik, bukan cuma perkiraan dari beberapa kali coba.
Simpan pemetaan kode error ini di dokumentasi internal tim — berguna lagi kalau suatu saat Anda migrasi provider lain.
Checklist sebelum cutover penuh
Pakai checklist ini sebagai gerbang terakhir sebelum traffic produksi sepenuhnya pindah:
- [ ] Buat akun CaptchaAI dan isi saldo
- [ ] Ganti base URL di semua file
- [ ] Perbarui API key (pakai env var)
- [ ] Jalankan uji paralel (10+ solve)
- [ ] Bandingkan success rate
- [ ] Bandingkan waktu solve
- [ ] Perbarui monitoring/alerting untuk endpoint baru
- [ ] Pindahkan traffic produksi
- [ ] Pantau selama 24 jam
- [ ] Nonaktifkan API key AZCaptcha
Pertanyaan yang sering muncul soal migrasi ini
Bagian kode mana yang wajib diubah, dan mana yang aman dibiarkan?
Yang wajib diubah cuma base URL (azcaptcha.com → ocr.captchaai.com) dan API key. Nama parameter (method, googlekey, pageurl, json, proxy, proxytype), format respons, dan logic polling Anda tetap sama persis — tidak perlu disentuh.
Apakah model harga CaptchaAI beda dari AZCaptcha?
Ya, cukup berbeda. CaptchaAI pakai model thread: Anda bayar bulanan untuk sejumlah thread paralel — misalnya BASIC ($15/bulan, 5 thread) — dan solve di dalam thread itu tidak dibatasi jumlahnya. Banyak layanan berformat 2Captcha, termasuk AZCaptcha, menagih per solve. Untuk detail paket lain, cek halaman pricing di captchaai.com.
Bagaimana caranya supaya migrasi tidak mengganggu traffic produksi yang sedang berjalan?
Jangan matikan AZCaptcha dulu. Jalankan Langkah 3 dan 4 di atas — wrapper provider plus uji paralel — supaya Anda bisa rollback ke AZCaptcha cuma dengan mengganti satu argumen kalau ada masalah. Baru nonaktifkan API key AZCaptcha setelah 24 jam pemantauan di produksi CaptchaAI berjalan mulus.
Berapa lama proses migrasi ini biasanya makan waktu?
Untuk satu codebase, sekitar 15–30 menit. Sebagian besar waktunya habis untuk search-and-replace base URL, ditambah menjalankan uji paralel untuk verifikasi sebelum cutover.
Apakah semua kode error sama persis dengan AZCaptcha?
Hampir. Ada sedikit perbedaan penamaan kode error di kondisi tertentu, tapi mayoritas identik — ERROR_KEY_DOES_NOT_EXIST dan ERROR_ZERO_BALANCE contohnya sama persis.
Petakan dulu kode error yang dipakai monitoring/alerting Anda sebelum full cutover, supaya alert tidak salah bunyi di hari pertama pindah.
Mulai migrasi sekarang
Sebagian besar tim menyelesaikan migrasi ini dalam satu sesi kerja: ambil API key, ganti base URL, jalankan uji paralel, lalu pindahkan traffic secara bertahap.
Beralih ke solve CAPTCHA yang lebih cepat dan andal — dapatkan API key CaptchaAI Anda dan selesaikan migrasi dalam hitungan menit, bukan hari.
Panduan terkait:
- Pemetaan endpoint API CaptchaAI vs kompetitor
- Cara menjalankan uji paralel saat migrasi
- Kenapa tim memilih beralih penyedia CAPTCHA