Anda butuh token CAPTCHA yang valid supaya alur otomasi bisa lanjut, dan Anda ingin membuktikan CaptchaAI benar-benar bekerja sekarang — bukan setelah membaca dokumentasi satu jam. Panduan ini membawa Anda dari akun kosong ke satu token Cloudflare Turnstile yang benar-benar terselesaikan dalam sekitar lima menit, hanya dengan sekali submit dan satu loop polling.
Kabar baiknya: apa pun tipe CAPTCHA yang Anda tangani nanti, alurnya identik. Semua tipe yang didukung CaptchaAI mengikuti empat langkah yang sama:
- Submit — kirim detail CAPTCHA ke
in.php - Simpan task ID dari response
- Polling — cek
res.phpsetiap 5 detik sampai hasil siap - Pakai token — injeksikan token ke halaman atau request target
Kuasai loop ini sekali, dan menambah reCAPTCHA v2, GeeTest v3, atau OCR gambar nanti cuma soal mengganti beberapa parameter.
Langkah 0: siapkan API key
- Daftar di captchaai.com
- Buka dashboard API
- Salin API key sepanjang 32 karakter
Akun Anda perlu thread aktif untuk mengirim task. Jika masih tahap evaluasi, hubungi support untuk thread trial. Plan berbayar dimulai dari BASIC ($15/bulan, 5 thread) dengan solve tak terbatas per thread — model biaya tetap ini pas untuk tim scraping yang volumenya naik-turun, karena tagihan tidak ikut naik seiring jumlah solve.
Langkah 1: kirim CAPTCHA pertama
Contoh di bawah menyelesaikan Cloudflare Turnstile, salah satu tipe yang paling sering muncul di form login dan pendaftaran. Anda cuma perlu dua nilai dari halaman target:
- sitekey — kunci publik widget Turnstile (ada di atribut
data-sitekeyatau parameter script Turnstile, selalu diawali0x) - pageurl — URL lengkap halaman tempat widget dimuat
Pilih salah satu bahasa di bawah; payload-nya sama persis, hanya sintaksnya yang berbeda.
cURL
curl -X POST "https://ocr.captchaai.com/in.php" \
-d "key=YOUR_API_KEY" \
-d "method=turnstile" \
-d "sitekey=0x4AAAAAAAC3DHQFLr1GavNl" \
-d "pageurl=https://staging.example.com/qa-login" \
-d "json=1"
Python
import requests
response = requests.post("https://ocr.captchaai.com/in.php", data={
"key": "YOUR_API_KEY",
"method": "turnstile",
"sitekey": "0x4AAAAAAAC3DHQFLr1GavNl",
"pageurl": "https://staging.example.com/qa-login",
"json": 1,
})
print(response.json())
Node.js
const response = await fetch("https://ocr.captchaai.com/in.php", {
method: "POST",
headers: { "Content-Type": "application/x-www-form-urlencoded" },
body: new URLSearchParams({
key: "YOUR_API_KEY",
method: "turnstile",
sitekey: "0x4AAAAAAAC3DHQFLr1GavNl",
pageurl: "https://staging.example.com/qa-login",
json: "1",
}),
});
console.log(await response.json());
PHP
<?php
$response = file_get_contents("https://ocr.captchaai.com/in.php?" . http_build_query([
"key" => "YOUR_API_KEY",
"method" => "turnstile",
"sitekey" => "0x4AAAAAAAC3DHQFLr1GavNl",
"pageurl" => "https://staging.example.com/qa-login",
"json" => 1,
]));
echo $response;
Langkah 2: simpan task ID
Response yang sukses berbentuk seperti ini:
{
"status": 1,
"request": "71823469"
}
Field request berisi task ID Anda — simpan, karena nilai inilah yang dipakai untuk mengambil hasil.
Kalau status bernilai 0, ada yang salah dan kode error muncul di field request. Lima error yang paling sering menghadang di panggilan pertama:
| Error | Arti | Solusi |
|---|---|---|
ERROR_WRONG_USER_KEY |
Format API key salah | Cek 32 karakter |
ERROR_KEY_DOES_NOT_EXIST |
API key tidak ditemukan | Cocokkan dengan dashboard |
ERROR_ZERO_BALANCE |
Tidak ada thread tersedia | Top up atau tunggu thread bebas |
ERROR_PAGEURL |
Parameter pageurl hilang |
Tambahkan URL lengkap |
ERROR_WRONG_GOOGLEKEY |
sitekey kosong atau salah | Ekstrak ulang sitekey (Turnstile diawali 0x) |
Langkah 3: polling hasil
Jangan langsung polling. Beri jeda 15 detik dulu supaya token sempat diproses, baru cek res.php setiap 5 detik sampai hasil keluar. Selama masih diproses, API membalas CAPCHA_NOT_READY; teruskan loop sampai status bernilai 1.
Python
import time
time.sleep(15)
while True:
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": "YOUR_API_KEY",
"action": "get",
"id": "71823469",
"json": 1,
}).json()
if result.get("request") == "CAPCHA_NOT_READY":
time.sleep(5)
continue
if result.get("status") == 1:
token = result["request"]
print(f"Solved! Token: {token[:60]}...")
break
raise RuntimeError(result)
Node.js
await new Promise((r) => setTimeout(r, 15000));
while (true) {
const r = await fetch(
`https://ocr.captchaai.com/res.php?key=YOUR_API_KEY&action=get&id=71823469&json=1`,
);
const data = await r.json();
if (data.request === "CAPCHA_NOT_READY") {
await new Promise((r) => setTimeout(r, 5000));
continue;
}
if (data.status === 1) {
console.log("Solved:", data.request.slice(0, 60));
break;
}
throw new Error(JSON.stringify(data));
}
Begitu selesai, field request berganti dari CAPCHA_NOT_READY menjadi token CAPTCHA yang siap dipakai.
Langkah 4: pakai token
Cara memasang token tergantung tipe CAPTCHA-nya:
- Turnstile / reCAPTCHA — tulis token ke field
cf-turnstile-responseataug-recaptcha-response, atau panggil callback halaman. - OCR gambar — masukkan teks hasil ke kolom jawaban.
- GeeTest v3 — rangkai beberapa field hasil sesuai yang diminta situs.
Untuk Turnstile, injeksi paling ringkas langsung di browser:
document.querySelector('[name="cf-turnstile-response"]').value = token;
document.querySelector("form").submit();
Setelah field terisi, submit form seperti biasa. Ingat: token Turnstile dan reCAPTCHA bersifat sekali pakai dan hanya berlaku sekitar 120 detik — pakai segera, jangan di-cache.
Kesalahan umum di panggilan pertama
Hal-hal kecil ini menjegal hampir semua orang di hari pertama. Cek satu per satu sebelum membuka tiket support:
- Ada spasi ikut tersalin di API key. Hapus spasi di awal dan akhir sebelum memakainya.
- Protokol hilang di
pageurl. Nilai wajib diawalihttps://..., bukan sekadar nama domain. - Polling terlalu dini. Mengecek di detik ke-0 cuma menghasilkan
CAPCHA_NOT_READYberulang dan membuang satu slot thread. Tunggu 15 detik dulu. - Polling terlalu sering. Interval 5 detik sudah cukup; lebih rapat hanya menambah beban tanpa mempercepat hasil.
- Lupa
json=1tapi mem-parse sebagai JSON. Tanpajson=1, API membalas teks biasa sepertiOK|71823469, dan memanggil.json()langsung memicu error. - Thread habis. Kalau muncul
ERROR_ZERO_BALANCE, semua thread sedang terpakai — lihat daftar kode error API dan cek alokasi thread pada plan Anda.
Menjalankan dari region Indonesia
Kalau worker Anda deploy di AWS ap-southeast-3 (Jakarta) atau ap-southeast-1 (Singapura), jarak jaringan ke endpoint solver menambah beberapa puluh milidetik per request — kecil dibanding waktu penyelesaian, tapi terasa saat Anda menjalankan ratusan task paralel. Untuk menaikkan throughput, tambah jumlah thread, bukan frekuensi polling. Dan untuk pekerjaan scraping, patuhi UU Pelindungan Data Pribadi (UU 27/2022): ambil hanya data yang memang berhak Anda proses dan hindari data pribadi.
Pertanyaan umum
Berapa lama waktu penyelesaian Turnstile biasanya?
Umumnya belasan hingga puluhan detik. Karena itu contoh di atas menunggu 15 detik sebelum polling pertama, lalu mengecek tiap 5 detik. Kalau CAPCHA_NOT_READY bertahan lebih dari satu menit, kemungkinan task tersangkut — batalkan dan kirim ulang.
Apakah hCaptcha bisa diselesaikan lewat alur ini?
Belum. hCaptcha dan FunCaptcha (Arkose Labs) saat ini tidak didukung, jadi alur ini tidak akan menyelesaikannya. Yang tersedia mencakup reCAPTCHA v2/v3, Cloudflare Turnstile dan Challenge, GeeTest v3, serta OCR gambar dan grid.
Bisakah satu API key dipakai untuk banyak tipe CAPTCHA?
Bisa. API key Anda tidak terikat ke satu tipe — cukup ganti nilai method (misalnya userrecaptcha untuk reCAPTCHA atau post untuk OCR gambar) dan sesuaikan parameternya. Loop submit → polling → pakai token tetap sama persis.
Berapa thread yang saya perlukan untuk memulai?
Untuk belajar dan uji coba, thread trial sudah cukup menjalankan alur ini dari ujung ke ujung. Saat siap produksi, plan termurah BASIC ($15/bulan, 5 thread) memproses hingga 5 CAPTCHA sekaligus, dengan solve tak terbatas per thread. Tambah thread hanya ketika Anda benar-benar menjalankan banyak task paralel.