Token reCAPTCHA v2 Enterprise Anda kembali dengan status sukses dari API, tapi situs target tetap menolaknya? Penyebabnya hampir selalu satu hal: request dikirim tanpa flag enterprise=1, sehingga CaptchaAI menyelesaikannya sebagai v2 standar padahal backend memverifikasi lewat Enterprise API. Selain itu, error reCAPTCHA v2 Enterprise juga mewarisi semua penyebab lama dari v2 standar — sitekey salah, pageurl tidak sesuai, token kedaluwarsa sebelum sempat dikirim ke form.
Panduan ini membedah setiap error yang muncul saat solve reCAPTCHA v2 Enterprise lewat API CaptchaAI, dari yang khusus Enterprise sampai yang diwarisi dari v2 standar. Belum yakin situs yang Anda kerjakan pakai widget standar atau Enterprise? Cek dulu ciri-ciri reCAPTCHA Enterprise di halaman sebelum lanjut ke bagian troubleshooting di bawah.
Inti masalahnya, singkat saja: kalau API mengembalikan token sukses tapi situs tetap menolaknya, hampir selalu karena
enterprise=1belum ada di request Anda. Selebihnya adalah variasi dari itu.
reCAPTCHA v2 Enterprise vs standar: cara membedakannya
Sebelum menuduh API atau sitekey bermasalah, pastikan dulu Anda memang berhadapan dengan widget Enterprise. Bedanya ada di empat tempat ini:
| Fitur | Standar v2 | Enterprise v2 |
|---|---|---|
| URL skrip | google.com/recaptcha/api.js |
google.com/recaptcha/enterprise.js |
| Objek JS | grecaptcha |
grecaptcha.enterprise |
| Endpoint verifikasi | google.com/recaptcha/api/siteverify |
recaptchaenterprise.googleapis.com |
| Parameter CaptchaAI | method=userrecaptcha |
method=userrecaptcha + enterprise=1 |
Parameter data-s |
Tidak pernah ada | Kadang ada (token tambahan) |
Skenario yang sering muncul di kerja freelance:
- Tim automation/QA yang mengambil proyek lewat Upwork atau Fastwork biasanya mewarisi integrasi dari developer sebelumnya tanpa catatan jelas soal jenis widget-nya.
- Sitekey yang dipakai sering sudah benar — masalahnya murni salah tebak antara standar dan Enterprise.
- Sebelum menyalahkan API, cek dulu tag skrip di halaman staging klien; salah tebak di sini adalah penyebab paling sering token "sukses tapi ditolak situs".
Checklist cepat: perbaiki error reCAPTCHA v2 Enterprise
Kalau Anda buru-buru, jalankan lima langkah ini dulu sebelum membaca detail tiap error di bawah:
- Cek dulu jenis implementasinya — cari
enterprise.jsdi tag skrip sebelum menyalahkan API - Tambahkan
enterprise=1ke setiap request CaptchaAI untuk widget Enterprise - Periksa atribut
data-sdi halaman — sertakan dalam request kalau ada - Submit token secepatnya — token Enterprise tetap kedaluwarsa setelah ~2 menit, sama seperti v2 standar
- Baru curigai sitekey atau saldo kalau keempat langkah di atas sudah benar dan token masih ditolak
Dapatkan API key Anda di captchaai.com/api.php.
Error yang hanya muncul di reCAPTCHA v2 Enterprise
Lupa enterprise=1: penyebab token selalu ditolak
Gejala: API mengembalikan token dengan status sukses, tapi situs target tetap menolaknya saat form dikirim.
Penyebab: task dikirim tanpa enterprise=1. CaptchaAI menyelesaikannya sebagai v2 standar, tapi backend situs memverifikasi lewat Enterprise API — yang menolak token standar mentah-mentah.
Perbaikan: tambahkan enterprise=1 ke request Anda, seperti ini:
import requests
response = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": "6LcR_RsTAAAAAFJR-JhNbC6CC42wKCbR9Hq_kVCd",
"pageurl": "https://staging.example.com/qa-login",
"enterprise": 1,
"json": 1
})
data = response.json()
task_id = data["request"]
const params = new URLSearchParams({
key: "YOUR_API_KEY",
method: "userrecaptcha",
googlekey: "6LcR_RsTAAAAAFJR-JhNbC6CC42wKCbR9Hq_kVCd",
pageurl: "https://staging.example.com/qa-login",
enterprise: 1,
json: 1,
});
const res = await fetch(`https://ocr.captchaai.com/in.php?${params}`);
const data = await res.json();
const taskId = data.request;
Kapan Anda perlu menyertakan parameter data-s
Gejalanya ERROR_BAD_PARAMETERS, atau token ditolak situs walau enterprise=1 sudah benar. Penyebabnya, sebagian implementasi Enterprise menyematkan atribut data-s pada div reCAPTCHA — token sesi tambahan yang wajib disertakan kalau ada di halaman. Kalau Anda lewatkan, request dianggap tidak lengkap.
Yang perlu Anda lakukan:
- Buka source halaman, cari
<div class="g-recaptcha" ... data-s="..."> - Kalau atribut itu ada, salin nilainya dan sertakan di request
in.php - Kalau tidak ada di halaman, jangan kirim
data-ssama sekali — mengirim field kosong bisa ikut memicuERROR_BAD_PARAMETERS
# Look for: <div class="g-recaptcha" data-sitekey="..." data-s="..."></div>
response = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url,
"enterprise": 1,
"data-s": data_s_value, # Include if present on the page
"json": 1
})
Salah kenali skrip: standar dikira Enterprise (atau sebaliknya)
Token bekerja tidak konsisten, atau selalu ditolak tanpa pola yang jelas, padahal enterprise=1 dan data-s sudah sesuai instruksi di atas? Anda kemungkinan mengidentifikasi widget sebagai standar padahal Enterprise (atau sebaliknya), lalu mengirim parameter yang salah ke CaptchaAI sejak awal. Periksa sumber skrip di halaman HTML untuk memastikan:
// Enterprise uses enterprise.js
// <script src="https://www.google.com/recaptcha/enterprise.js?render=SITEKEY"></script>
// Standard uses api.js
// <script src="https://www.google.com/recaptcha/api.js"></script>
// Also check the JS object:
// Enterprise: grecaptcha.enterprise.render(...)
// Standard: grecaptcha.render(...)
Error umum yang juga berlaku di v2 standar
Enterprise tidak kebal dari error klasik v2 — tabel ini berlaku identik untuk keduanya:
Catatan: semua contoh kode di panduan ini memakai domain staging (
staging.example.com). Uji hanya di environment yang memang Anda punya izin aksesnya — praktik QA yang sehat sekaligus selaras dengan UU PDP.
| Kode Error | Penyebab | Perbaikan |
|---|---|---|
ERROR_WRONG_USER_KEY |
Format API key tidak valid | Verifikasi di captchaai.com/api.php |
ERROR_KEY_DOES_NOT_EXIST |
API key tidak ditemukan | Periksa spasi atau karakter yang hilang |
ERROR_ZERO_BALANCE |
Saldo habis | Isi ulang akun Anda |
ERROR_PAGEURL |
pageurl tidak ada |
Tambahkan URL halaman lengkap |
ERROR_GOOGLEKEY |
Sitekey salah | Ekstrak ulang dari data-sitekey |
ERROR_BAD_TOKEN_OR_PAGEURL |
Sitekey/URL tidak cocok | Periksa konteks iframe |
CAPCHA_NOT_READY |
Masih dalam proses solve | Tunggu 5 detik, polling lagi |
ERROR_CAPTCHA_UNSOLVABLE |
Tidak dapat di-solve | Submit task baru |
Contoh kode: alur solve Enterprise dengan retry dan error handling
Fungsi berikut menggabungkan submit, polling, dan penanganan error jadi satu alur siap pakai — termasuk enterprise=1 dan data-s opsional:
import requests
import time
def solve_recaptcha_v2_enterprise(api_key, sitekey, page_url, data_s=None):
params = {
"key": api_key,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": page_url,
"enterprise": 1,
"json": 1
}
if data_s:
params["data-s"] = data_s
response = requests.get("https://ocr.captchaai.com/in.php", params=params)
data = response.json()
if data.get("status") != 1:
raise RuntimeError(f"Submit failed: {data.get('request')}")
task_id = data["request"]
for _ in range(40):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": api_key, "action": "get", "id": task_id, "json": 1
}).json()
if result.get("status") == 1:
return result["request"]
if result.get("request") == "CAPCHA_NOT_READY":
continue
raise RuntimeError(f"Solve failed: {result.get('request')}")
raise TimeoutError("Solve timed out after 200 seconds")
token = solve_recaptcha_v2_enterprise("YOUR_API_KEY", "SITEKEY", "https://staging.example.com/qa-login")
async function solveRecaptchaV2Enterprise(apiKey, sitekey, pageUrl, dataS) {
const params = new URLSearchParams({
key: apiKey, method: "userrecaptcha", googlekey: sitekey,
pageurl: pageUrl, enterprise: 1, json: 1,
});
if (dataS) params.set("data-s", dataS);
const submitRes = await fetch(`https://ocr.captchaai.com/in.php?${params}`);
const submitData = await submitRes.json();
if (submitData.status !== 1) throw new Error(`Submit failed: ${submitData.request}`);
const taskId = submitData.request;
for (let i = 0; i < 40; i++) {
await new Promise(r => setTimeout(r, 5000));
const res = await fetch(`https://ocr.captchaai.com/res.php?${new URLSearchParams({
key: apiKey, action: "get", id: taskId, json: 1,
})}`);
const data = await res.json();
if (data.status === 1) return data.request;
if (data.request === "CAPCHA_NOT_READY") continue;
throw new Error(`Solve failed: ${data.request}`);
}
throw new Error("Timed out after 200s");
}
Pola timeout 200 detik (40 percobaan x 5 detik) ini juga cocok untuk koneksi mobile-first yang umum dipakai tim automation di Indonesia. Jeda ini cukup longgar untuk latensi jaringan, tapi tetap gagal cepat kalau task memang tidak bisa di-solve, jadi worker Anda tidak menggantung menunggu task yang sudah mati.
Pertanyaan umum soal reCAPTCHA v2 Enterprise
Beberapa pertanyaan lain yang sering muncul di grup Telegram dan forum automation seputar reCAPTCHA v2 Enterprise:
Apa yang terjadi kalau saya kirim enterprise=1 ke widget yang ternyata standar?
CaptchaAI tetap memprosesnya, tapi karena widget aslinya bukan Enterprise, token yang dihasilkan bisa jadi tidak cocok dengan endpoint verifikasi yang dipakai situs.
Identifikasi jenis widget dulu lewat tag skrip sebelum mengirim task — ini lebih cepat daripada coba-coba dua arah.
Apakah solve reCAPTCHA v2 Enterprise butuh plan CaptchaAI yang lebih mahal?
Tidak — CaptchaAI menagih per thread aktif, bukan per jenis CAPTCHA:
- BASIC ($15/bulan, 5 thread) sampai ENTERPRISE ($300/bulan, 200 thread) semuanya mencakup solve reCAPTCHA v2 Enterprise
- Tidak ada biaya tambahan khusus untuk widget Enterprise di plan mana pun
- Cocok untuk tim automation atau freelancer dengan volume kerja yang naik-turun tiap bulan
Kenapa ERROR_BAD_PARAMETERS masih muncul walau saya sudah pakai enterprise=1?
Cek tiga hal:
- Parameter
data-sada di halaman tapi belum Anda sertakan dalam request - Sitekey yang diekstrak tidak lengkap atau salah salin
- Ada parameter wajib lain yang hilang dari request
in.phpAnda
Bisakah kode Python/Node.js yang sama dipakai untuk v2 standar dan Enterprise, dan berapa lama saya boleh menunggu sebelum submit ulang task yang gagal?
Ya, kodenya bisa dipakai ulang — nama method, alur submit-polling, dan endpoint tetap sama, Anda hanya menambahkan enterprise=1 (dan data-s kalau ada) saat berpindah ke Enterprise.
Untuk retry, tunggu sampai polling mengembalikan status selain CAPCHA_NOT_READY, biasanya dalam 40 kali percobaan dengan jeda 5 detik (sekitar 200 detik total) sebelum dianggap timeout. Submit ulang lebih awal dari itu hanya menambah task yang tidak perlu.
Panduan terkait
- Cara solve reCAPTCHA v2 dengan API
- Standar vs Enterprise reCAPTCHA v2
- Referensi kode error CaptchaAI