Solve rate anjlok mendadak hampir selalu karena tiga hal: sitekey berubah, token ditolak situs target, atau ada rate limiting baru. Diagram alir dan tiga langkah berikut menemukan penyebabnya dalam hitungan menit.
Contoh umum di tim automation Indonesia: job price monitoring dari server AWS ap-southeast-1 yang stabil di atas 95% tiba-tiba anjlok ke bawah 70% semalam tanpa perubahan kode — penyebabnya ada di salah satu cabang diagram alir berikut.
Ringkasan tiga penyebab tersebut:
- Sitekey berubah — situs target deploy ulang halaman dengan sitekey baru, token lama otomatis ditolak
- Token ditolak situs target — API CaptchaAI melapor sukses, tapi form di situs tetap menolak token saat submit
- Rate limiting baru — situs baru menerapkan pembatasan request, biasanya hanya kelihatan di jam-jam tertentu
Tingkat Keberhasilan Normal per Tipe CAPTCHA
Bandingkan angka Anda dengan kisaran normal berikut. Kalau cuma satu tipe yang turun, penyebabnya spesifik ke tipe itu, bukan ke seluruh pipeline.
Angka pada tabel ini bersumber dari pengamatan dan laporan pengguna CaptchaAI, bukan SLA tertulis. Hasil aktual dapat bervariasi tergantung region server, volume request, dan jam pengujian — pakai sebagai kisaran acuan, bukan patokan mutlak.
| Jenis CAPTCHA | Kisaran Normal | Ambang Peringatan |
|---|---|---|
| reCAPTCHA v2 | 95-99% | Di bawah 90% |
| reCAPTCHA v3 | 90-98% | Di bawah 85% |
| Cloudflare Turnstile | 99–100% | Di bawah 95% |
| GeeTest v3 | 99-100% | Di bawah 95% |
| BLS | 99-100% | Di bawah 95% |
| Gambar/OCR | 90-98% | Di bawah 85% |
Diagram Alir: Cari Akar Masalah dalam 4 Cabang
Ikuti cabang sesuai gejala Anda — jangan mulai dari pertengahan diagram, karena cabang "token digenerate tapi ditolak situs" sering terlihat mirip dengan gejala rate limiting padahal akar masalahnya beda.
Success rate dropped
│
├── Are tokens being generated?
│ ├── NO → Check API errors
│ │ ├── ERROR_WRONG_GOOGLEKEY → Sitekey changed. Re-extract.
│ │ ├── ERROR_BAD_PARAMETERS → Check required params
│ │ ├── ERROR_NO_SLOT → Retry with backoff
│ │ └── Other errors → See error decision tree
│ │
│ └── YES → Tokens generated but rejected by target site
│ │
│ ├── Token expired before use?
│ │ └── YES → Submit token faster (< 60-120s)
│ │
│ ├── Token used for wrong domain?
│ │ └── YES → Check pageurl matches submission domain
│ │
│ ├── reCAPTCHA v3 score too low?
│ │ └── YES → Check action parameter, attach cookies/UA/proxy
│ │
│ ├── Site changed CAPTCHA type?
│ │ └── YES → Re-detect CAPTCHA type
│ │
│ └── Site added additional checks?
│ └── YES → Check for sinyal browser, cookies, headers
Langkah 1: Ukur Solve Rate Anda Saat Ini
Kumpulkan angka pastinya dulu dengan class SuccessTracker berikut.
import requests
import time
from collections import defaultdict
class SuccessTracker:
"""Track solve success rates over time."""
def __init__(self):
self.stats = defaultdict(lambda: {"attempts": 0, "success": 0, "errors": defaultdict(int)})
def record(self, method, success, error_code=None):
self.stats[method]["attempts"] += 1
if success:
self.stats[method]["success"] += 1
elif error_code:
self.stats[method]["errors"][error_code] += 1
def report(self):
for method, data in self.stats.items():
rate = data["success"] / data["attempts"] * 100 if data["attempts"] > 0 else 0
print(f"\n{method}:")
print(f" Attempts: {data['attempts']}")
print(f" Success: {data['success']} ({rate:.1f}%)")
if data["errors"]:
print(" Errors:")
for err, count in sorted(data["errors"].items(), key=lambda x: -x[1]):
print(f" {err}: {count}")
tracker = SuccessTracker()
Langkah 2: Gagal di API atau Ditolak Situs?
Pisahkan dua skenario yang gejalanya mirip tapi solusinya beda.
Jalankan
diagnose_api_failures()dengan minimal 20 percobaan, bukan 2-3. Pola error baru kelihatan jelas di sampel yang cukup besar — dua kegagalan berturut-turut bisa saja kebetulan.
Kategori A: Kegagalan di Level API
API mengembalikan kesalahan, bukan token.
def diagnose_api_failures(api_key, method, params, attempts=10):
"""Run test solves and collect error patterns."""
errors = defaultdict(int)
successes = 0
for i in range(attempts):
try:
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": api_key, "method": method, "json": 1, **params,
}, timeout=30)
result = resp.json()
if result.get("status") != 1:
errors[result.get("request", "UNKNOWN")] += 1
continue
task_id = result["request"]
# Quick poll
time.sleep(15)
resp = requests.get("https://ocr.captchaai.com/res.php", params={
"key": api_key, "action": "get",
"id": task_id, "json": 1,
}, timeout=15)
data = resp.json()
if data.get("status") == 1:
successes += 1
else:
errors[data.get("request", "POLL_ERROR")] += 1
except Exception as e:
errors[f"EXCEPTION:{type(e).__name__}"] += 1
time.sleep(2)
print(f"\nResults: {successes}/{attempts} success")
for err, count in sorted(errors.items(), key=lambda x: -x[1]):
print(f" {err}: {count}")
Kategori B: Token Ditolak Situs Target
Token valid, tapi situs target menolaknya saat submit — API terlihat "sukses" padahal alurnya gagal.
| Penyebab | Yang Perlu Diperiksa |
|---|---|
| Token kedaluwarsa | Token dipakai lebih dari 120 detik setelah digenerate |
| Domain tidak cocok | pageurl berbeda dari domain tempat submit |
| Skor v3 terlalu rendah | Situs butuh skor 0.7+, solver hanya dapat 0.3 |
| Parameter action hilang | v3 memerlukan parameter action yang sesuai |
| Situs mengubah parameter | Sitekey atau struktur halaman berubah |
Langkah 3: Perbaiki Penyebab Paling Umum
Empat perbaikan ini menutup sebagian besar kasus di kategori B, diurutkan dari yang paling sering ditemui.
Perbaiki: Token Kedaluwarsa Sebelum Sempat Dipakai
Jangan simpan token — submit sedetik setelah CaptchaAI mengembalikannya.
def solve_and_use_immediately(api_key, sitekey, pageurl):
"""Solve and use token as fast as possible."""
# Submit
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": api_key,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": pageurl,
"json": 1,
}, timeout=30)
task_id = resp.json()["request"]
# Poll aggressively
for _ in range(24):
time.sleep(5)
resp = requests.get("https://ocr.captchaai.com/res.php", params={
"key": api_key, "action": "get",
"id": task_id, "json": 1,
}, timeout=15)
data = resp.json()
if data.get("status") == 1:
token = data["request"]
# USE IMMEDIATELY — don't store for later
submit_form(token)
return True
return False
Perbaiki: Sitekey yang Sudah Basi
Situs sering mengganti sitekey saat deploy ulang halaman. Ekstrak ulang kalau Anda curiga ini penyebabnya.
def solve_with_fresh_params(api_key, pageurl):
"""Re-extract sitekey before each solve."""
import re
resp = requests.get(pageurl, timeout=15)
match = re.search(r'data-sitekey="([^"]+)"', resp.text)
if not match:
raise RuntimeError("Could not find sitekey")
sitekey = match.group(1)
# Now solve with fresh sitekey
# ...
Perbaiki: Parameter Action untuk reCAPTCHA v3
v3 menilai skor dari parameter action. Kalau action tidak cocok dengan situs, skornya bisa anjlok walau token valid.
# Check what action the site uses
# Look for: grecaptcha.execute('sitekey', {action: 'submit'})
data = {
"key": api_key,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": pageurl,
"version": "v3",
"action": "submit", # Must match site's action
"json": 1,
}
Perbaiki: Rate Limiting yang Tidak Terdeteksi
Kalau solve rate turun hanya di jam-jam sibuk (misalnya jam kerja WIB) lalu pulih sendiri di malam hari, ini biasanya rate limiting di sisi situs target, bukan masalah di CaptchaAI. Dua langkah berikut biasanya cukup:
- Tambahkan jeda 2–5 detik antar submission pada jam puncak, bukan hanya saat error muncul
- Sebar job ke beberapa worker atau region server berbeda supaya beban tidak menumpuk di satu jam
Referensi Cepat
| Gejala | Penyebab | Perbaikan |
|---|---|---|
| Rate turun dari 98% ke 70% | Sitekey atau halaman berubah | Ekstrak ulang semua parameter |
| Token v3 semuanya ditolak | Parameter action salah | Sesuaikan action dari halaman |
| Token berfungsi tapi kedaluwarsa | Terlalu lambat dipakai | Submit dalam 60 detik |
| Rate berubah-ubah tergantung jam | Rate limiting server | Tambahkan delay antar submit |
Pertanyaan Umum Solve Rate CAPTCHA Turun
Berapa solve rate yang normal?
Tergantung tipe CAPTCHA — lihat tabel di atas. Konsisten di bawah ambangnya berarti ada masalah parameter atau timing.
Kenapa solve rate saya anjlok drastis dalam semalam?
Paling sering situs mengganti sitekey atau struktur halaman. Ekstrak ulang parameternya, lalu test ulang.
Kenapa token v3 saya ditolak padahal statusnya sukses di CaptchaAI?
Biasanya parameter action tidak cocok situs, jadi skornya rendah. Samakan dengan grecaptcha.execute() di source halaman.
Bisakah rate limiting bikin solve rate naik-turun sepanjang hari?
Bisa — penurunan hanya di jam tertentu adalah ciri khas rate limiting server. Tambahkan delay antar submission.
Perlukah saya melaporkan solve yang salah lewat reportbad?
Ya. Endpoint reportbad melaporkan hasil salah, dan CaptchaAI memakainya untuk perbaiki akurasi.
Panduan Terkait
Diagnosis akar masalahnya sekarang, jangan biarkan solve rate terus turun — coba CaptchaAI.