Migrate from Arkose FunCAPTCHA to CaptchaLa
Shed the SDK weight, end the enterprise contract, keep adaptive bot defense. The migration is one script swap and one verify endpoint change.
What the code change looks like
<script src="https://YOUR_PUBLIC_KEY.arkoselabs.com/v2/YOUR_PUBLIC_KEY/api.js" data-callback="onSuccess" async defer></script>
<script>
function onSuccess(token) {
document.getElementById('arkose-token').value = token
}
</script>
<input type="hidden" id="arkose-token" name="arkose-token" /><div class="captchala" data-app-key="YOUR_APP_KEY"></div>
<script src="https://cdn.captcha.la/v1/captchala.js" async defer></script>const res = await fetch('https://verify-api.arkoselabs.com/api/v4/verify/', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({
private_key: process.env.ARKOSE_PRIVATE_KEY,
session_token: req.body['arkose-token'],
}),
})
const data = await res.json()
if (data.session_details?.solved !== true) return res.status(400).json({ error: 'bot' })const res = await fetch('https://api.captcha.la/v1/verify', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
appSecret: process.env.CAPTCHALA_SECRET,
token: req.body['captchala-token'],
}),
})
const data = await res.json()
if (!data.success) return res.status(400).json({ error: 'bot' })Migration steps
- 1
Sign up & grab your App Key + Secret
Create a free CaptchaLa account. Unlike Arkose, there's no PoC and no procurement — pricing is published and self-serve. Free tier covers initial testing.
- 2
Remove the Arkose SDK & callback wiring
Delete the Arkose script tag, the callback function, and the hidden input you populate from the callback. CaptchaLa uses a simple div placeholder — no callback wiring.
- 3
Add the CaptchaLa widget
Drop in our div and script tag where the Arkose widget was. The hidden token field is auto-populated as captchala-token; you don't manage it manually.
- 4
Update the server verify
Replace Arkose's session_details.solved check with our success boolean. Endpoint changes to api.captcha.la/v1/verify. Body becomes JSON instead of form-urlencoded.
- 5
Plan the contract wind-down
Arkose contracts are usually annual with auto-renewal. Note the cancellation window in your contract and give legal/procurement notice. Most teams run both for 30 days in parallel during the wind-down.
Frequently asked questions
Will I lose bot detection accuracy by switching?
For most workloads, no measurable difference. Arkose's challenges are intentionally harder than ours by default, but the bot population they catch and the bot population we catch overlap heavily for typical product traffic. If you're at Roblox / Microsoft scale with named adversaries, the answer is more nuanced — talk to us first.
How do I handle the contract overlap?
Run both side-by-side during the wind-down. Form A keeps Arkose; Form B switches to CaptchaLa. Compare conversion + bot rate. Most teams find the bot rate stays flat and the user-friction rate drops. Then decommission Arkose at contract renewal.
What about Arkose's risk telemetry / analytics dashboards?
CaptchaLa has its own dashboard with comparable telemetry — challenge rate, success rate, risk score distribution, geo breakdown. The shape is familiar if you're coming from Arkose Insights.