Timeout production asal tebak punya dua risiko: terlalu ketat sehingga Anda retry padahal solve masih berjalan, atau terlalu longgar sehingga worker menganggur tanpa alasan. Kedua risiko hilang begitu Anda punya angka nyata: berapa detik CaptchaAI biasanya butuh per jenis CAPTCHA, dan seberapa jauh angka itu bisa melebar di kasus terburuk.
Panduan ini membagikan data tersebut — median, P90, P99 — plus skrip Python dan JavaScript untuk mengukur akun dan target Anda sendiri, bukan sekadar memercayai angka orang lain.
Metodologi: median berasal dari 100 percobaan berturut-turut per jenis, dari task dikirim hingga hasil diambil. "Batas SLA" adalah batas kontraktual CaptchaAI, bukan rata-rata — solve yang konsisten melewatinya layak dilaporkan ke support.
Data Waktu Penyelesaian per Jenis CAPTCHA
| Jenis CAPTCHA | Batas SLA | Median | P90 | P99 | Tingkat Keberhasilan |
|---|---|---|---|---|---|
| reCAPTCHA v2 | <60 detik | 12–18 detik | 25 detik | 40 detik | Tinggi |
| reCAPTCHA v2 Tak Terlihat | <30 detik | 10–15 detik | 20 detik | 28 detik | Tinggi |
| reCAPTCHA v3 | <4 detik | 1–3 detik | 3 detik | 4 detik | Tinggi |
| reCAPTCHA Enterprise | <60 detik | 15–25 detik | 35 detik | 50 detik | Tinggi |
| Cloudflare Turnstile | <10 detik | 4–8 detik | 9 detik | 10 detik | Tinggi |
| GeeTest v3 | <12 detik | 6–10 detik | 11 detik | 12 detik | Tinggi |
| Gambar/OCR | <0.5 detik | 0.2–0.4 detik | 0.5 detik | 0.8 detik | Tinggi |
| BLS CAPTCHA | <1 detik | 0.3–0.7 detik | 0.9 detik | 1 detik | Tinggi |
Waktu aktual bervariasi tergantung kualitas jaringan, beban server, dan kompleksitas CAPTCHA saat itu.
Cara Membaca Median, P90, dan P99
- Median — pengalaman tipikal, untuk perencanaan kapasitas.
- P90 — kasus buruk yang dialami 1 dari 10 penyelesaian. Dasar timeout standar.
- P99 — kasus ekstrem. Set timeout maksimum di atas angka ini.
Faktor yang Memengaruhi Waktu Penyelesaian CAPTCHA
Empat variabel ini paling menentukan cepat-lambatnya solve:
| Faktor | Dampak ke Waktu Solve |
|---|---|
| Latensi jaringan | RTT 200 md ≈ +1 detik total (kirim + 3–4 kali polling × 200 md) |
| Kualitas proxy | Egress jaringan yang diotorisasi biasanya lebih cepat dari proxy datacenter murah — lebih sedikit tantangan sekunder |
| Kompleksitas CAPTCHA | "Pilih semua lampu lalu lintas" dengan gambar buram lebih lama dari kotak centang sederhana |
| Strategi polling | Agresif (2 detik) mendeteksi lebih cepat tapi menambah panggilan API; konservatif (10 detik) sebaliknya |
Worker di region AWS ap-southeast-1/ap-southeast-3 atau GCP asia-southeast2 (Singapura/Jakarta) biasanya punya RTT jauh lebih rendah ke CaptchaAI dibanding region AS/Eropa — beda yang terasa di ribuan task per hari.
Skrip Benchmark: Python
Menjalankan satu jenis CAPTCHA berulang kali dan mencetak median, P90, min, maks — ganti method dan payload sesuai jenis yang diukur:
# benchmark_captchaai.py
import os
import time
import statistics
import requests
API_KEY = os.environ.get("CAPTCHAAI_KEY", "YOUR_API_KEY")
def benchmark_solve(method, params, runs=10):
"""Benchmark a CAPTCHA type over multiple runs."""
times = []
successes = 0
for i in range(runs):
start = time.time()
# Submit
submit_params = {"key": API_KEY, "json": "1", **params}
resp = requests.get("https://ocr.captchaai.com/in.php",
params=submit_params)
result = resp.json()
if result.get("status") != 1:
print(f" Run {i+1}: Submit failed - {result.get('request')}")
continue
task_id = result["request"]
# Poll
time.sleep(10)
solved = False
for _ in range(30):
poll = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get",
"id": task_id, "json": "1",
})
poll_result = poll.json()
if poll_result.get("status") == 1:
elapsed = time.time() - start
times.append(elapsed)
successes += 1
solved = True
print(f" Run {i+1}: {elapsed:.1f}s")
break
if poll_result.get("request") != "CAPCHA_NOT_READY":
print(f" Run {i+1}: Error - {poll_result.get('request')}")
break
time.sleep(5)
if not solved and poll_result.get("request") == "CAPCHA_NOT_READY":
print(f" Run {i+1}: Timeout")
if times:
return {
"runs": runs,
"successes": successes,
"success_rate": f"{successes/runs*100:.0f}%",
"median": f"{statistics.median(times):.1f}s",
"p90": f"{sorted(times)[int(len(times)*0.9)]:.1f}s" if len(times) >= 10 else "N/A",
"min": f"{min(times):.1f}s",
"max": f"{max(times):.1f}s",
}
return {"error": "No successful solves"}
# Benchmark reCAPTCHA v2
print("=== reCAPTCHA v2 ===")
recaptcha_v2 = benchmark_solve("userrecaptcha", {
"method": "userrecaptcha",
"googlekey": "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
"pageurl": "https://www.google.com/recaptcha/api2/demo",
})
print(recaptcha_v2)
# Benchmark Image/OCR
print("\n=== Image CAPTCHA ===")
# Submit a base64-encoded test image
import base64
# Use a test image for benchmarking
image_result = benchmark_solve("post", {
"method": "base64",
"body": "BASE64_ENCODED_CAPTCHA_IMAGE",
})
print(image_result)
Skrip Benchmark: JavaScript
Versi Node.js-nya: kirim, tunggu, polling, catat waktunya.
// benchmark_captchaai.js
const axios = require('axios');
const API_KEY = process.env.CAPTCHAAI_KEY || 'YOUR_API_KEY';
async function benchmarkSolve(params, runs = 10) {
const times = [];
let successes = 0;
for (let i = 0; i < runs; i++) {
const start = Date.now();
// Submit
const submit = await axios.get('https://ocr.captchaai.com/in.php', {
params: { key: API_KEY, json: '1', ...params },
});
if (submit.data.status !== 1) {
console.log(` Run ${i + 1}: Submit failed - ${submit.data.request}`);
continue;
}
// Poll
await new Promise(r => setTimeout(r, 10000));
let solved = false;
for (let j = 0; j < 30; j++) {
const poll = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: API_KEY, action: 'get', id: submit.data.request, json: '1' },
});
if (poll.data.status === 1) {
const elapsed = (Date.now() - start) / 1000;
times.push(elapsed);
successes++;
solved = true;
console.log(` Run ${i + 1}: ${elapsed.toFixed(1)}s`);
break;
}
if (poll.data.request !== 'CAPCHA_NOT_READY') {
console.log(` Run ${i + 1}: Error - ${poll.data.request}`);
break;
}
await new Promise(r => setTimeout(r, 5000));
}
if (!solved) console.log(` Run ${i + 1}: Timeout`);
}
if (times.length === 0) return { error: 'No successful solves' };
times.sort((a, b) => a - b);
return {
runs, successes,
successRate: `${((successes / runs) * 100).toFixed(0)}%`,
median: `${times[Math.floor(times.length / 2)].toFixed(1)}s`,
min: `${times[0].toFixed(1)}s`,
max: `${times[times.length - 1].toFixed(1)}s`,
};
}
(async () => {
console.log('=== reCAPTCHA v2 ===');
const v2 = await benchmarkSolve({
method: 'userrecaptcha',
googlekey: '6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-',
pageurl: 'https://www.google.com/recaptcha/api2/demo',
});
console.log(v2);
console.log('\n=== Cloudflare Turnstile ===');
const turnstile = await benchmarkSolve({
method: 'turnstile',
sitekey: 'YOUR_TURNSTILE_SITEKEY',
pageurl: 'https://example.com',
});
console.log(turnstile);
})();
Interval Polling yang Direkomendasikan
Jangan pakai satu konfigurasi generik untuk semua jenis:
| Jenis CAPTCHA | Tunggu Awal | Interval Polling | Upaya Maks |
|---|---|---|---|
| Gambar/OCR | 1 detik | 1 detik | 10 |
| BLS CAPTCHA | 1 detik | 1 detik | 10 |
| reCAPTCHA v3 | 2 detik | 1 detik | 10 |
| Cloudflare Turnstile | 4 detik | 2 detik | 10 |
| GeeTest v3 | 6 detik | 3 detik | 15 |
| reCAPTCHA v2 Tak Terlihat | 8 detik | 4 detik | 15 |
| reCAPTCHA v2 | 12 detik | 5 detik | 20 |
| reCAPTCHA Enterprise | 15 detik | 5 detik | 25 |
Mengatasi Waktu Solve yang Tidak Sesuai Ekspektasi
| Masalah | Penyebab | Solusi |
|---|---|---|
| Waktu solve lebih tinggi dari yang tercantum | Latensi jaringan/proxy | Uji dari region lebih dekat, mis. ap-southeast-1/asia-southeast2 |
| Hasil tidak konsisten antar eksekusi | Variasi kesulitan CAPTCHA | Perbesar sampel jadi 50+ eksekusi |
| Banyak timeout | Sitekey/URL halaman tidak valid | Verifikasi parameter dengan satu tes manual |
ERROR_ZERO_BALANCE saat benchmark |
Saldo tidak cukup | Isi ulang saldo sebelum benchmark besar |
Pertanyaan Umum tentang Benchmark CaptchaAI
Apakah latensi dari Indonesia ke server CaptchaAI berpengaruh besar terhadap hasil?
Cukup terasa. Region Asia Tenggara (AWS ap-southeast-1/ap-southeast-3, GCP asia-southeast2) biasanya punya RTT lebih rendah dari region AS/Eropa, langsung memangkas total waktu polling.
Berapa thread yang cukup untuk menjalankan benchmark ini tanpa mengganggu traffic produksi?
Untuk 100 percobaan per jenis, BASIC ($15/bulan, 5 thread) biasanya cukup — tidak perlu ADVANCE ($90/bulan, 50 thread) hanya untuk benchmark. Naikkan thread untuk menjalankan beberapa jenis paralel.
Apakah waktu penyelesaian berubah tergantung jam sibuk?
Ya. Jam kerja AS (malam–dini hari WIB) kadang sedikit lebih lambat karena permintaan lebih tinggi. Jalankan benchmark di jam berbeda untuk gambaran representatif.
Interval polling seperti apa yang paling hemat panggilan API tapi tetap responsif?
Samakan dengan median jenisnya — 1 detik untuk Gambar/OCR, 5 detik untuk reCAPTCHA v2. Tabel interval di atas adalah titik awal yang aman.
Bagaimana saya memastikan waktu solve yang lambat itu masalah jaringan saya, bukan CaptchaAI?
Bandingkan RTT murni ke https://ocr.captchaai.com dengan waktu solve end-to-end skrip benchmark. Selisih kecil berarti jaringan Anda; jauh lebih tinggi baru layak dilaporkan ke support.
Artikel Terkait
Langkah Selanjutnya
Jangan berhenti di angka artikel ini — jalankan skrip benchmark terhadap akun dan target Anda sendiri. Dapatkan kunci API CaptchaAI Anda dan mulai ukur dalam hitungan menit.