Troubleshooting

Kesalahan dan Perbaikan Umum reCAPTCHA v2 Enterprise

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=1 belum 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:

  1. Cek dulu jenis implementasinya — cari enterprise.js di tag skrip sebelum menyalahkan API
  2. Tambahkan enterprise=1 ke setiap request CaptchaAI untuk widget Enterprise
  3. Periksa atribut data-s di halaman — sertakan dalam request kalau ada
  4. Submit token secepatnya — token Enterprise tetap kedaluwarsa setelah ~2 menit, sama seperti v2 standar
  5. 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-s sama sekali — mengirim field kosong bisa ikut memicu ERROR_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-s ada 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.php Anda

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

Komentar dinonaktifkan untuk artikel ini.