Migrasi dari EndCaptcha ke CaptchaAI sebenarnya hanya soal menukar dua hal: endpoint dan cara autentikasi. Anda tidak perlu menulis ulang logika solver — cukup arahkan panggilan lama ke in.php/res.php dan ganti pasangan username/password menjadi satu API key. Panduan ini memetakan tiap panggilan EndCaptcha ke padanannya, dengan contoh Python dan JavaScript siap pakai.
Alur empat langkah CaptchaAI tetap sama seperti kebanyakan solver: kirim task → simpan task ID → polling → pakai token. Yang berubah hanya nama endpoint, parameter, dan bentuk respons — setelah tabel pemetaan, sisanya tinggal cari-ganti.
Perbedaan arsitektur API EndCaptcha vs CaptchaAI
EndCaptcha memakai API SOAP/XML dengan nama method khusus. CaptchaAI memakai REST API yang jauh lebih ringkas: satu endpoint kirim (in.php), satu ambil hasil (res.php), plus respons JSON standar.
| Aspek | EndCaptcha | CaptchaAI |
|---|---|---|
| Protokol | SOAP/XML atau HTTP POST | HTTP POST/GET (REST) |
| Submit | /Captcha/Upload atau WSDL |
https://ocr.captchaai.com/in.php |
| Hasil | /Captcha/GetText atau WSDL |
https://ocr.captchaai.com/res.php |
| Autentikasi | Username + password | API key |
| Respons | XML/custom | JSON (json=1) atau plain text |
Kenapa tim otomatisasi Indonesia mempertimbangkan pindah
Buat banyak pengembang scraping dan otomatisasi di Indonesia — apalagi yang menggarap proyek freelance atau price-monitoring dengan margin tipis — biaya jadi pertimbangan utama. CaptchaAI menagih per thread konkuren, bukan per solve: paket BASIC ($15/bulan, 5 thread) mencakup solve tak terbatas per thread selama sebulan, naik bertahap sampai VIP-3 ($7,500/bulan, 5.000 thread). Yang membatasi throughput jadi jumlah thread dan kecepatan solve per tipe, bukan kuota harian.
Soal latency, deploy worker dekat region aplikasi — AWS ap-southeast-3 (Jakarta) atau ap-southeast-1 (Singapura). Karena solve CAPTCHA sudah menambah jeda, jaga logika polling dan batas waktu seperti contoh di bawah agar retry tidak menumpuk saat jaringan padat.
Pemetaan parameter EndCaptcha ke CaptchaAI
Sebagian besar parameter punya padanan langsung. Bedanya yang terbesar: CaptchaAI membuang field password karena API key sudah mencakup autentikasi.
| Parameter EndCaptcha | Parameter CaptchaAI | Catatan |
|---|---|---|
username |
key |
CaptchaAI menggunakan API key tunggal |
password |
— | Tidak diperlukan; API key mencakup autentikasi |
captchaData (base64) |
body (base64) |
Data gambar base64 yang sama |
captchaType |
method |
Identifier tipe berbeda |
siteKey |
googlekey |
Untuk tipe reCAPTCHA |
pageUrl |
pageurl |
Konsep sama, casing berbeda |
captchaId |
id |
Task ID untuk polling |
Pemetaan tipe CAPTCHA
EndCaptcha memakai penomoran captchaType; CaptchaAI memakai nama method deskriptif. Berikut padanan untuk tipe yang paling sering dipakai.
| Tipe di EndCaptcha | Method CaptchaAI | Parameter CaptchaAI |
|---|---|---|
| Image / OCR CAPTCHA | method=base64 |
body={base64_image} |
| reCAPTCHA v2 | method=userrecaptcha |
googlekey, pageurl |
| Cloudflare Turnstile | method=turnstile |
sitekey, pageurl |
Cek dulu: tipe yang belum didukung sebelum migrasi
Sebelum menukar trafik, pastikan semua tipe yang Anda pakai di EndCaptcha tersedia di CaptchaAI. CaptchaAI menyelesaikan reCAPTCHA v2/v3 (termasuk Enterprise dan Invisible), Cloudflare Turnstile dan Challenge, GeeTest v3, image/OCR, grid, dan BLS — plus CaptchaFox (beta), Friendly Captcha (beta), serta Lemin (beta).
Ada tiga tipe yang perlu diperhatikan: hCaptcha dan FunCaptcha (Arkose Labs) belum didukung, dan GeeTest v4 masih berstatus segera hadir. Kalau alur Anda bergantung pada salah satunya, siapkan solusi terpisah sebelum mematikan EndCaptcha.
Migrasi kode: sebelum dan sesudah
Pola dasarnya tidak berubah — hanya endpoint, autentikasi, dan parsing respons.
Python — sebelum (EndCaptcha)
import requests
USERNAME = "your_endcaptcha_user"
PASSWORD = "your_endcaptcha_pass"
def solve_image_endcaptcha(image_base64):
# EndCaptcha image solve
resp = requests.post("https://api.endcaptcha.com/Captcha/Upload", data={
"username": USERNAME,
"password": PASSWORD,
"captchaData": image_base64,
"captchaType": "1"
})
result = resp.json()
captcha_id = result.get("captchaId")
import time
for _ in range(30):
time.sleep(5)
poll = requests.post("https://api.endcaptcha.com/Captcha/GetText", data={
"username": USERNAME,
"password": PASSWORD,
"captchaId": captcha_id
})
poll_result = poll.json()
if poll_result.get("text"):
return {"solution": poll_result["text"]}
if poll_result.get("error"):
return {"error": poll_result["error"]}
return {"error": "TIMEOUT"}
Python — setelah (CaptchaAI)
import os
import time
import requests
API_KEY = os.environ["CAPTCHAAI_API_KEY"]
def solve_image_captchaai(image_base64):
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "base64",
"body": image_base64,
"json": 1
})
data = resp.json()
if data.get("status") != 1:
return {"error": data.get("request")}
captcha_id = data["request"]
for _ in range(30):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY,
"action": "get",
"id": captcha_id,
"json": 1
}).json()
if result.get("status") == 1:
return {"solution": result["request"]}
if result.get("request") != "CAPCHA_NOT_READY":
return {"error": result.get("request")}
return {"error": "TIMEOUT"}
Dua hal berubah: kredensial kini dibaca dari environment variable (CAPTCHAAI_API_KEY), dan Anda memeriksa status == 1, bukan field text. Saat polling, respons CAPCHA_NOT_READY berarti task masih diproses.
Python — reCAPTCHA v2 (CaptchaAI)
def solve_recaptcha_v2(sitekey, pageurl):
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": pageurl,
"json": 1
})
data = resp.json()
if data.get("status") != 1:
return {"error": data.get("request")}
captcha_id = data["request"]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get",
"id": captcha_id, "json": 1
}).json()
if result.get("status") == 1:
return {"solution": result["request"]}
if result.get("request") != "CAPCHA_NOT_READY":
return {"error": result.get("request")}
return {"error": "TIMEOUT"}
Untuk CAPTCHA berbasis token seperti reCAPTCHA, perbesar jendela polling ke 60 iterasi (60 × 5 detik) karena penyelesaiannya lebih lama.
JavaScript — sebelum (EndCaptcha)
const axios = require("axios");
const USERNAME = "your_endcaptcha_user";
const PASSWORD = "your_endcaptcha_pass";
async function solveImageEndCaptcha(imageBase64) {
const submit = await axios.post("https://api.endcaptcha.com/Captcha/Upload", {
username: USERNAME,
password: PASSWORD,
captchaData: imageBase64,
captchaType: "1",
});
const captchaId = submit.data.captchaId;
for (let i = 0; i < 30; i++) {
await new Promise((r) => setTimeout(r, 5000));
const poll = await axios.post("https://api.endcaptcha.com/Captcha/GetText", {
username: USERNAME,
password: PASSWORD,
captchaId,
});
if (poll.data.text) return { solution: poll.data.text };
if (poll.data.error) return { error: poll.data.error };
}
return { error: "TIMEOUT" };
}
JavaScript — setelah (CaptchaAI)
const axios = require("axios");
const API_KEY = process.env.CAPTCHAAI_API_KEY;
async function solveImageCaptchaAI(imageBase64) {
const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
params: { key: API_KEY, method: "base64", body: imageBase64, json: 1 },
});
if (submit.data.status !== 1) return { error: submit.data.request };
const captchaId = submit.data.request;
for (let i = 0; i < 30; i++) {
await new Promise((r) => setTimeout(r, 5000));
const poll = await axios.get("https://ocr.captchaai.com/res.php", {
params: { key: API_KEY, action: "get", id: captchaId, json: 1 },
});
if (poll.data.status === 1) return { solution: poll.data.request };
if (poll.data.request !== "CAPCHA_NOT_READY") return { error: poll.data.request };
}
return { error: "TIMEOUT" };
}
Perbedaan penting yang perlu diperhatikan
Detail kecil berikut paling sering menyandung migrasi kalau tidak dicek lebih dulu.
| Area | EndCaptcha | CaptchaAI |
|---|---|---|
| Autentikasi | Username + password | API key tunggal |
| Format error | JSON custom dengan field error |
Field request standar dengan kode error |
| Polling | POST ke endpoint terpisah | GET ke res.php dengan query parameter |
| Cek saldo | Method SOAP terpisah | res.php?action=getbalance&key=KEY |
| Laporkan salah | Method terpisah | res.php?action=reportbad&id=ID&key=KEY |
Checklist migrasi langkah demi langkah
Kerjakan berurutan dari atas ke bawah. Uji paralel sengaja ditaruh sebelum penggantian trafik produksi supaya Anda punya data pembanding sebelum benar-benar pindah.
| Langkah | Status |
|---|---|
| Buat akun CaptchaAI | ☐ |
| Petakan semua panggilan EndCaptcha ke ekuivalen CaptchaAI | ☐ |
| Ganti autentikasi (username/password → API key) | ☐ |
Perbarui submit endpoint (/Captcha/Upload → /in.php) |
☐ |
Perbarui polling endpoint (/Captcha/GetText → /res.php) |
☐ |
| Perbarui parsing respons | ☐ |
| Jalankan uji paralel dengan kedua provider | ☐ |
| Ganti traffic produksi | ☐ |
| Hapus kredensial EndCaptcha | ☐ |
Uji paralel dulu sebelum ganti trafik produksi
Jangan langsung mematikan EndCaptcha begitu kode baru jadi. Jalankan kedua layanan berdampingan pada sebagian kecil trafik, lalu bandingkan tingkat keberhasilan dan waktu penyelesaian per tipe — ini menangkap perbedaan halus seperti field respons atau timeout yang perlu disetel ulang. Setelah data stabil beberapa hari, pindahkan sisa trafik dan hapus kredensial lama.
Mengatasi masalah umum
| Masalah | Penyebab | Solusi |
|---|---|---|
ERROR_KEY_DOES_NOT_EXIST |
Menggunakan username EndCaptcha alih-alih API key | Gunakan API key CaptchaAI dari dashboard |
| Parsing respons gagal | Struktur JSON berbeda | Perbarui untuk memeriksa field status dan request |
Parameter method tidak ada |
EndCaptcha menggunakan penomoran captchaType |
Petakan ke nama method CaptchaAI (base64, userrecaptcha, dll.) |
| Timeout pada reCAPTCHA | Default timeout berbeda | Set polling ke 60 iterasi × 5 detik untuk token CAPTCHA |
Pertanyaan umum
Berapa lama proses migrasi dari EndCaptcha biasanya?
Untuk integrasi standar, sebagian besar pekerjaan adalah cari-ganti endpoint dan parameter plus memperbarui parsing respons — sering selesai dalam satu sore. Yang memakan waktu biasanya fase uji paralel, bukan penulisan kode.
Apakah CaptchaAI mendukung semua tipe CAPTCHA yang saya pakai di EndCaptcha?
Tergantung tipenya. reCAPTCHA v2/v3, Cloudflare Turnstile dan Challenge, GeeTest v3, image/OCR, grid, dan BLS didukung penuh; CaptchaFox, Friendly Captcha, dan Lemin masih beta. Tapi hCaptcha dan FunCaptcha belum didukung dan GeeTest v4 masih segera hadir — siapkan alternatif untuk tipe itu.
Perlukah menjalankan kedua layanan secara paralel dulu?
Sangat disarankan. Uji paralel pada sebagian trafik memberi perbandingan tingkat keberhasilan dan waktu penyelesaian, sehingga penggantian trafik produksi berbasis data, bukan tebakan.
Bagaimana model penagihan CaptchaAI berbeda dari layanan per-solve?
CaptchaAI menagih per thread konkuren, bukan per solve; setiap paket mencakup solve tak terbatas per thread selama sebulan. Paket mulai dari BASIC ($15/bulan, 5 thread), jadi biaya ditentukan jumlah permintaan bersamaan.
Artikel terkait
Langkah selanjutnya
Sederhanakan solve CAPTCHA Anda dengan REST API CaptchaAI — ambil API key Anda dan mulai migrasi hari ini.