# Migrate from reCAPTCHA

This guide walks through swapping Google reCAPTCHA for ALTCHA — updating the widget on your forms and the verification call on your server.

## Why switch

| | reCAPTCHA | ALTCHA |
| --- | --- | --- |
| No cookies or tracking scripts | No | Yes |
| Verifies locally, no remote API call | No | Yes |
| Self-hosting option | No | Yes |
| Open-source, auditable code | No | Yes |
| Data residency control | No | Yes |

The "no remote API call" difference is a practical one, not just a privacy one: reCAPTCHA requires your server to call Google's `siteverify` endpoint on every submission, adding a network round-trip and an external dependency to your request path. ALTCHA's libraries verify the payload cryptographically, in-process — see [Server Verification](/docs/integration/server/#server-verification).

## Pick how you'll host it

- **Just want it running today, for free** — use the open-source widget with your own server. See [Quick Start](/docs/integration/quick-start/).
- **Don't want to run any infrastructure** — use [ALTCHA Cloud](/docs/cloud/), fully managed and hosted in the EU.
- **Need the full adaptive-protection platform on your own infrastructure** — use [ALTCHA Sentinel](/docs/sentinel/).

All three use the same `<altcha-widget>` element and the same verification libraries — you can start with the open-source core and move to Cloud or Sentinel later without changing your integration.

## Update your widget

**Before (reCAPTCHA):**

```html
<script src="https://www.google.com/recaptcha/api.js" async defer></script>

<form action="/submit" method="POST">
<div class="g-recaptcha" data-sitekey="YOUR_SITE_KEY"></div>
<button type="submit">Submit</button>
</form>
```

**After (ALTCHA):**

```html
<script async defer src="https://cdn.jsdelivr.net/gh/altcha-org/altcha/dist/main/altcha.min.js" type="module"></script>

<form action="/submit" method="POST">
<altcha-widget challenge="https://your-challenge-url"></altcha-widget>
<button type="submit">Submit</button>
</form>
```

See [Widget Integration](/docs/integration/widget/) for npm installs and framework-specific setup (React, Vue, Svelte, and others).

## Update server-side verification

Replace the call to Google's `siteverify` endpoint with a local, cryptographic check using an [official library](/docs/integration/server/):

- Using your own server → `verifySolution`
- Using Cloud or Sentinel → `verifyServerSignature`

## Migration checklist

1. Remove the reCAPTCHA script tag, `data-sitekey`, and secret key.
2. Add the `<altcha-widget>` element in its place.
3. Point `challenge` at your chosen setup — your own server, Cloud, or Sentinel.
4. Swap the `siteverify` call for a local verification call.
5. Test: submit without solving (should be rejected), then submit normally (should succeed).

## Next steps

- **[Quick Start](/docs/integration/quick-start/)** — full integration walkthrough
- **[Widget Integration](/docs/integration/widget/)** — configuration and framework installs
- **[Server Integration](/docs/integration/server/)** — verification libraries
