ERROR_PAGEURL selalu turun ke satu akar masalah: nilai pageurl yang Anda kirim ke CaptchaAI tidak identik dengan URL yang tertera di address bar browser saat CAPTCHA tampil. Solver memvalidasi token terhadap domain asal itu — jadi selisih sekecil apa pun (protokol yang hilang, www yang beda, atau redirect yang belum diikuti) sudah cukup membuat request ditolak. Berikut cara mendiagnosis dan memperbaikinya, termasuk dua kasus yang paling sering bikin tim otomasi bingung: SPA dan iframe lintas domain.
Kenapa ERROR_PAGEURL Muncul: Penyebab yang Paling Sering Ditemukan
Dari pengalaman menangani tiket dukungan, enam pola ini menutup hampir semua kasus:
- Protokol tidak ada — mengirim
example.com, bukanhttps://example.com. - Domain salah —
www.example.comdikirim padahal situs memakaiexample.com(atau sebaliknya). - Redirect mengubah URL — form di
/logindiarahkan server ke/auth/loginsebelum CAPTCHA benar-benar tampil. - Route SPA tidak cocok — route sisi klien seperti
/app/loginberbeda dari URL yang divalidasi server. - URL encoding bermasalah — spasi atau karakter khusus di URL tidak di-encode dengan benar.
- iframe dari domain lain — widget CAPTCHA dimuat dari subdomain terpisah, tapi
pageurlyang dikirim ikut subdomain itu, bukan domain halaman utama.
Diagnosis Cepat: Cocokkan Gejala dengan Solusi
Sebelum menelusuri lebih jauh, cek tiga hal ini secara berurutan — sebagian besar kasus ERROR_PAGEURL selesai di salah satu dari ketiganya:
- Bandingkan
pageurldi kode Anda karakter demi karakter dengan URL di address bar — termasukwww, protokol, dan trailing slash. - Cek apakah halaman melakukan redirect antara saat CAPTCHA dimuat dan saat form disubmit. Jika ya,
pageurlharus memakai URL tujuan akhir, bukan URL awal. - Kalau situsnya SPA atau CAPTCHA berada dalam iframe, pastikan
pageurlyang dikirim adalah URL halaman yang terlihat di browser, bukan endpoint API atausrciframe.
Kalau ketiganya sudah beres tapi error masih muncul, tabel berikut memetakan gejala ke penyebab yang lebih spesifik:
| Gejala | Penyebab | Perbaikan |
|---|---|---|
| Error meski URL terlihat benar | Mismatch www vs non-www |
Periksa address bar dengan teliti, karakter demi karakter |
| Kadang berhasil, kadang gagal | Halaman punya varian URL A/B testing | Tangkap URL tepat pada saat solve, jangan hardcode |
| Token berhasil di-solve tapi ditolak situs | Domain pageurl tidak cocok dengan domain situs |
Domain token harus sama persis dengan domain situs |
| Berhasil manual di browser, gagal lewat skrip | Redirect tidak diikuti dalam kode | Pakai get_final_url() sebelum submit |
| URL punya query parameter | Parameter tersebut mungkin dibutuhkan situs | Sertakan query parameter yang relevan, buang yang sekadar tracking |
Menentukan pageurl yang Tepat dari Address Bar
Aturan intinya sederhana: gunakan persis URL yang tampil di address bar browser saat CAPTCHA terlihat — bukan URL yang menurut Anda "seharusnya" benar.
# WRONG — incomplete URL
pageurl = "staging.example.com/qa-login"
# WRONG — wrong protocol
pageurl = "https://staging.example.com/qa-login"
# CORRECT — full URL with protocol
pageurl = "https://staging.example.com/qa-login"
# CORRECT — with www if that's what the page uses
pageurl = "https://www.staging.example.com/qa-login"
Validasi URL Sebelum Dikirim ke API
Daripada menemukan kesalahan setelah task ditolak, validasi pageurl di sisi klien terlebih dahulu. Helper berikut menolak URL tanpa protokol atau domain sebelum request keluar, dan otomatis membuang fragment (#...) yang memang tidak pernah dikirim ke server:
from urllib.parse import urlparse
def validate_pageurl(url):
"""Validate pageurl before API submission."""
parsed = urlparse(url)
if not parsed.scheme:
raise ValueError(f"Missing protocol: {url}. Use https://")
if parsed.scheme not in ("http", "https"):
raise ValueError(f"Invalid protocol: {parsed.scheme}")
if not parsed.netloc:
raise ValueError(f"Missing domain: {url}")
# Remove fragment (hash) — not sent to server
clean = f"{parsed.scheme}://{parsed.netloc}{parsed.path}"
if parsed.query:
clean += f"?{parsed.query}"
return clean
# Usage
url = validate_pageurl("https://staging.example.com/qa-login#section")
# Returns: "https://staging.example.com/qa-login"
Redirect: Kenapa URL Awal Sering Meleset
Kalau form login Anda diredirect sebelum CAPTCHA benar-benar tampil, pageurl yang dikirim harus URL tujuan akhir — bukan URL yang pertama kali Anda buka. Ini penyebab paling sering di balik "URL sudah benar tapi tetap error" pada skrip otomatisasi, karena mata Anda melihat URL akhir di browser sementara skrip masih memakai URL awal.
import requests
def get_final_url(url):
"""Follow redirects to get the actual page URL."""
resp = requests.get(url, allow_redirects=True, timeout=15)
return resp.url
# If the login page redirects
original = "https://staging.example.com/qa-login"
final = get_final_url(original)
print(f"Final URL: {final}")
# Use final URL as pageurl
SPA (Single Page Application): Next.js, React, dan Framework Sejenis
Ini kasus yang paling sering menjebak tim otomasi Indonesia yang mengerjakan proyek price-monitoring atau data scraping untuk platform e-commerce dan travel lokal, karena target situsnya hampir selalu SPA berbasis React atau Next.js. SPA mengganti URL lewat JavaScript tanpa memuat ulang halaman penuh, sehingga developer sering salah kirim endpoint API tempat form disubmit, padahal yang divalidasi solver adalah domain halaman yang terlihat di browser.
# For SPAs, use the domain root + the route shown in the address bar
# NOT the API endpoint that the form submits to
# WRONG — API endpoint
pageurl = "https://api.example.com/v1/auth/login"
# CORRECT — the page URL shown in browser
pageurl = "https://staging.example.com/qa-login"
Kalau skrip Anda dijalankan dari server di region seperti AWS ap-southeast-1 (Singapura) atau GCP asia-southeast2 (Jakarta), latensi ke situs target bisa membuat state SPA berubah sebelum pageurl sempat ditangkap — ambil URL persis pada momen CAPTCHA muncul, bukan setelah beberapa detik berikutnya.
Kalau
pageurlini datang dari hasil scraping otomatis, ingat bahwa validasi URL hanya menyelesaikan masalah teknis — pastikan Anda tetap hanya memproses data yang memang berwenang Anda akses, sesuai UU Pelindungan Data Pribadi (UU 27/2022).
CAPTCHA yang Dimuat dalam iframe Lintas Domain
Saat CAPTCHA dimuat di dalam iframe dari domain yang berbeda dari halaman utama, pageurl tetap mengacu ke halaman utama — bukan ke src iframe tempat widget CAPTCHA sebenarnya berada:
# If the CAPTCHA is on the MAIN page
pageurl = "https://example.com/register" # Main page URL
# If the CAPTCHA is in an IFRAME with a different domain
# Still use the main page URL, not the iframe src
pageurl = "https://example.com/register"
# NOT: "https://captcha-frame.example.com/challenge"
Contoh Submit yang Benar
Alur akhirnya tetap mengikuti pola standar CaptchaAI — kirim → simpan task ID → polling → pakai token — hanya dengan satu langkah tambahan di depan:
- Validasi
pageurldenganvalidate_pageurl()sebelum apa pun dikirim. - Kirim task ke
in.phpmemakaipageurlyang sudah bersih. - Simpan
task IDdari respons, lalu pollingres.phpseperti biasa sampai token siap.
Dengan urutan ini, pageurl yang salah tertangkap sebelum kredit thread Anda ikut terpakai untuk task yang pasti gagal:
import requests
# Validasi URL terlebih dahulu
pageurl = validate_pageurl("https://staging.example.com/qa-login")
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"googlekey": "SITE_KEY",
"pageurl": pageurl,
"json": 1,
})
result = resp.json()
if result.get("status") == 1:
print(f"Task ID: {result['request']}")
else:
print(f"Error: {result.get('request')}")
Pertanyaan yang Sering Diajukan
Apakah ERROR_PAGEURL menandakan API key atau saldo saya bermasalah?
Tidak. ERROR_PAGEURL murni soal parameter yang dikirim, bukan soal akun. Kalau API key atau saldo bermasalah, CaptchaAI mengembalikan kode error yang berbeda (misalnya terkait autentikasi atau saldo habis), bukan ERROR_PAGEURL.
Apakah aturan pageurl sama untuk reCAPTCHA v2/v3 dan Cloudflare Turnstile?
Ya, prinsipnya sama: pageurl harus persis sama dengan URL halaman tempat widget dimuat, terlepas dari jenis CAPTCHA-nya. Yang berbeda hanya parameter lain di request, seperti googlekey untuk reCAPTCHA.
Bagaimana menentukan pageurl untuk SPA berbasis Next.js atau React?
Ambil URL dari window.location.href (atau state router Anda) tepat pada saat CAPTCHA muncul, bukan endpoint API yang dipanggil form. Ekstrak URL ini secara dinamis dalam skrip otomatisasi Anda — jangan hardcode URL yang berisi session ID atau token yang berubah tiap sesi.
Apakah task yang gagal karena ERROR_PAGEURL tetap memakai kuota thread saya?
Task yang gagal validasi karena pageurl salah tidak akan sampai ke tahap penyelesaian CAPTCHA. Justru karena itu, memvalidasi pageurl di sisi klien sebelum submit — seperti helper di atas — membuat thread Anda lebih efisien dipakai untuk task yang benar-benar bisa selesai.
Panduan Terkait
Validasi pageurl Anda dan selesaikan CAPTCHA dengan CaptchaAI.