# Alternativas a reCAPTCHA para formularios web

> Compara alternativas a reCAPTCHA para formularios, de Turnstile y hCaptcha a proof-of-work o ningún captcha, y cambia con un ajuste pequeño y seguro.

Publicado el 2026-10-25 · https://ikiform.com/es/guides/spam-protection/recaptcha-alternatives

Cloudflare Turnstile es el reemplazo más directo de reCAPTCHA: es casi siempre invisible, usa el mismo esquema de site key y secret key, y su comprobación en el servidor recibe los mismos parámetros. hCaptcha encaja en sitios que quieren desafíos de imágenes de alguien que no sea Google, y las herramientas de proof-of-work como ALTCHA funcionan sin ningún tercero. Para muchos formularios de contacto, un honeypot, la puntuación del contenido y un límite de frecuencia hacen innecesario un captcha.

## Por qué la gente deja reCAPTCHA

reCAPTCHA sigue funcionando. Los motivos para sustituirlo suelen tener que ver con lo que les cuesta a los visitantes y a ti. La versión 2 muestra rompecabezas de imágenes a algunos visitantes, lo que es lento en el móvil y difícil para quienes usan lectores de pantalla. La versión 3 es invisible pero devuelve una puntuación cuyo umbral tienes que fijar tú, sin un desafío al que recurrir. Y reCAPTCHA es ahora un producto de Google Cloud: la documentación de facturación de Google indica un cupo gratuito de 10.000 evaluaciones al mes, con niveles de pago por encima.

Algunos equipos también quieren menos scripts de terceros en sus páginas. Si eso importa para tus obligaciones de privacidad es una cuestión para tu propia revisión legal; esta página solo compara cómo funcionan las herramientas.

## Las alternativas, comparadas

| Opción | Qué ven los visitantes | Quién verifica | Conviene saber |
| --- | --- | --- | --- |
| reCAPTCHA v2 | Una casilla, a veces rompecabezas de imágenes | Tu servidor, con Google | Conocido. Los rompecabezas son la queja principal |
| reCAPTCHA v3 | Nada | Tu servidor, con Google | Devuelve una puntuación de 0.0 a 1.0. Tú eliges el corte y gestionas la zona gris |
| [Cloudflare Turnstile](https://ikiform.com/es/guides/spam-protection/cloudflare-turnstile.md) | Normalmente nada, a veces una casilla | Tu servidor, con Cloudflare | Sin rompecabezas de imágenes. Sin coste para hasta 20 widgets |
| hCaptcha | Una casilla, a veces rompecabezas de imágenes | Tu servidor, con hCaptcha | Parecido en forma a reCAPTCHA v2, de otra empresa. Un plan Basic gratuito, con planes Pro y Enterprise de pago |
| Friendly Captcha | Un pequeño widget que resuelve un rompecabezas en segundo plano | Tu servidor, con Friendly Captcha | Proof of work en lugar de señales de rastreo. Gratis para sitios pequeños no comerciales, planes de pago para todos los demás |
| ALTCHA | Un pequeño widget que resuelve un rompecabezas en segundo plano | Solo tu propio servidor | Open source y autoalojado, así que sin terceros. Tú lo ejecutas y lo mantienes |
| [No captcha](https://ikiform.com/es/guides/spam-protection/without-captcha.md) | Nada | Tu servidor | Honeypot, tiempo firmado, puntuación del contenido y límites de frecuencia. Frena la mayoría de los bots, no todos |

Todas las opciones salvo la última dependen igualmente de una comprobación en el servidor. Un widget por sí solo no frena nada, porque un bot puede enviar a tu endpoint sin cargar la página.

## Qué pide cada opción a las personas

Juzga cada opción por el visitante al que más le cuesta. Los rompecabezas de imágenes son lentos en el móvil y difíciles o imposibles para quien no ve bien; las alternativas de audio ayudan a algunas personas y frustran a otras. Las verificaciones invisibles, como el modo habitual de Turnstile, reCAPTCHA v3 y los widgets de proof-of-work, no piden nada a la mayoría de los visitantes, pero aun así pueden fallar con navegadores centrados en la privacidad, redes estrictas o dispositivos antiguos. Cuando eso pasa, la persona necesita una salida: una casilla visible, un mensaje claro o una dirección de email a la que escribir. Un formulario que falla en silencio pierde justo los mensajes de los que nunca te enteras.

## Elige con dos preguntas

Diagrama: Cómo elegir un reemplazo de reCAPTCHA con dos preguntas

1. Primero pregúntate si los bots superan las comprobaciones invisibles. Si no, sigue sin captcha con un honeypot, la puntuación y un límite de frecuencia.
2. Si las superan, pregúntate si puedes ejecutar código en un servidor. Si puedes, elige un widget como Turnstile, hCaptcha o ALTCHA y verifícalo en tu servidor.
3. Sin servidor, envía el formulario a un backend que verifique tus claves de Turnstile por ti, o usa una verificación gestionada que no necesita claves.

La mayoría de los formularios de contacto se quedan en la primera pregunta. Mide tu spam antes de añadir ningún widget.

## Cambia de reCAPTCHA a Turnstile

Son tan parecidos que el cambio son unas pocas líneas en cada lado. Crea un widget de Turnstile en el panel de Cloudflare para los mismos hostnames y luego cambia a la vez el markup y la comprobación en el servidor.

| Pieza | reCAPTCHA v2 | Turnstile |
| --- | --- | --- |
| Script | `https://www.google.com/recaptcha/api.js` | `https://challenges.cloudflare.com/turnstile/v0/api.js` |
| Elemento | `<div class="g-recaptcha" data-sitekey>` | `<div class="cf-turnstile" data-sitekey>` |
| Campo del token | `g-recaptcha-response` | `cf-turnstile-response` |
| URL de verificación | `https://www.google.com/recaptcha/api/siteverify` | `https://challenges.cloudflare.com/turnstile/v0/siteverify` |
| Parámetros de verificación | `secret`, `response`, `remoteip` | `secret`, `response`, `remoteip`, `idempotency_key` |

**Antes** (`contact.html`)

```html
<form action="/api/contact" method="POST">
  <input name="email" type="email" required />
  <textarea name="message" required></textarea>
  <div class="g-recaptcha" data-sitekey="RECAPTCHA_SITE_KEY"></div>
  <button>Send</button>
</form>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
```

**Después** (`contact.html`)

```html
<form action="/api/contact" method="POST">
  <input name="email" type="email" required />
  <textarea name="message" required></textarea>
  <div class="cf-turnstile" data-sitekey="TURNSTILE_SITE_KEY" data-action="contact"></div>
  <button>Send</button>
</form>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
```

**Antes** (`verify.ts`)

```ts
const form = await request.formData();
const body = new URLSearchParams({
  secret: process.env.RECAPTCHA_SECRET_KEY!,
  response: String(form.get("g-recaptcha-response") ?? ""),
});
const check = await fetch("https://www.google.com/recaptcha/api/siteverify", { method: "POST", body });
const { success } = (await check.json()) as { success: boolean };
```

**Después** (`verify.ts`)

```ts
const form = await request.formData();
const body = new URLSearchParams({
  secret: process.env.TURNSTILE_SECRET_KEY!,
  response: String(form.get("cf-turnstile-response") ?? ""),
});
const check = await fetch("https://challenges.cloudflare.com/turnstile/v0/siteverify", { method: "POST", body });
const { success, action } = (await check.json()) as { success: boolean; action?: string };
const human = success && action === "contact";
```

- Esto cubre las claves clásicas de reCAPTCHA, verificadas en `siteverify`. Las claves creadas en Google Cloud se comprueban en su lugar con la API de evaluaciones de reCAPTCHA Enterprise; la parte de Turnstile es la misma.
- Si usabas v3, quita tu umbral de puntuación. Turnstile responde pasa o no pasa; comprueba en su lugar `action` en su respuesta.
- Actualiza tu Content Security Policy: permite `https://challenges.cloudflare.com` en `script-src` y `frame-src`, y quita las entradas de Google cuando nada las use.
- Publica el markup y el cambio del servidor en un mismo despliegue. Una página con el nuevo widget que envía a un servidor que aún espera `g-recaptcha-response` hace fallar todos los envíos.

## Sustituir reCAPTCHA con Ikiform

Si tu formulario envía a Ikiform, quita por completo el widget de reCAPTCHA. Ikiform no verifica tokens de reCAPTCHA ni de hCaptcha. El valor sobrante `g-recaptcha-response` llegaría como un campo extra, o fallaría con `422 validation_failed` como campo desconocido si definiste los campos del formulario. Luego elige qué lo sustituye:

- **Nada más.** El honeypot, la puntuación del contenido y los límites de frecuencia se ejecutan en todos los formularios. Muchos formularios de contacto no necesitan más.
- **Spam check en Ikiform.** Cloudflare Turnstile, ejecutado por Ikiform, sin cuenta ni claves. Un envío HTML básico recibe una breve página de verificación; el código con `fetch` llama a `challenge()` de `@ikiform/sdk`.
- **Tus propias claves de Turnstile.** Mantén tu propio widget en la página, pega las claves en los ajustes del formulario e Ikiform verifica el token.

**HTML** (`contact.html`)

```html
<form action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="POST">
  <input name="email" type="email" required />
  <textarea name="message" required></textarea>
  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
  <button>Send</button>
</form>
```

Ese formulario no tiene ningún widget. Con **Spam check** en **Ikiform**, la verificación humana ocurre en ikiform.com después del envío, así que tu página no carga ningún script de captcha. La [documentación de spam](https://ikiform.com/es/docs/spam.md#human-check) cubre cada modo.

> Si a la vez dejas un servicio de formularios alojado, las páginas comparativas de [Formspree](https://ikiform.com/alternatives/formspree) y [Netlify Forms](https://ikiform.com/alternatives/netlify-forms) cubren qué más cambia.

## Comprueba que funciona

1. Envía el formulario después del cambio. El envío se acepta y como mucho viste una casilla.
2. Envía al endpoint con curl y sin token. Se rechaza, lo que demuestra que el servidor comprueba el nuevo token.
3. Busca en tus páginas `g-recaptcha` y `recaptcha/api.js`. No queda nada.
4. Abre **Submissions** en el panel. El nuevo envío está ahí con todos los campos que mandaste.
5. ¿No llegó nada? Cambia el filtro de estado del panel a **Spam**. El spam recibe la misma respuesta de éxito que un envío real.

## Trampas habituales

- **Ajustes del creador de sitios.** Los creadores de sitios con un ajuste de reCAPTCHA integrado pueden exigir el elemento en cada formulario mientras esté activado. Desactiva el ajuste antes de quitar los elementos.
- **Páginas en caché.** Los visitantes con una página antigua en caché siguen enviando `g-recaptcha-response` durante un tiempo después de desplegar. Cuenta con algunos fallos, o acepta ambos tokens durante un día.
- **Puntuaciones de v3 en informes.** Si hay paneles o alertas que leen la puntuación de reCAPTCHA, se quedarán mudos tras el cambio. Actualízalos.

## Preguntas

### ¿Cuál es la mejor alternativa a reCAPTCHA?

Para la mayoría de los formularios, Cloudflare Turnstile: suele ser invisible, no cuesta nada a pequeña escala y se verifica con los mismos parámetros secret y response. Si no quieres ningún tercero, funciona una herramienta de proof-of-work autoalojada como ALTCHA. Muchos formularios de contacto no necesitan captcha una vez que tienen un honeypot, puntuación y un límite de frecuencia.

### ¿reCAPTCHA sigue siendo gratis?

La documentación de facturación de Google indica un cupo gratuito de 10.000 evaluaciones al mes, con niveles de pago por encima. Consulta los precios actuales de Google antes de planificar en torno a eso.

### ¿Ikiform puede verificar tokens de reCAPTCHA o hCaptcha?

No. Ikiform solo verifica Cloudflare Turnstile, ya sea su propia verificación gestionada o tus propias claves de Turnstile. Quita otros widgets de captcha de los formularios que envían a Ikiform.

### ¿Cambiar de reCAPTCHA a Turnstile da mucho trabajo?

Normalmente no. Cambias la URL del script, la clase del elemento, el nombre del campo del token y la URL de verificación, y mantienes los mismos parámetros secret y response. Despliega a la vez la página y el cambio del servidor.

## Más guías

- [Frena el spam en formularios de contacto](https://ikiform.com/es/guides/spam-protection.md): Frena el spam en tu formulario de contacto con capas que no cuestan nada a las personas reales: honeypot, tiempo, puntuación del contenido, límites de frecuencia y verificación humana solo donde haga falta.
- [Cloudflare Turnstile](https://ikiform.com/es/guides/spam-protection/cloudflare-turnstile.md): Añade Cloudflare Turnstile a un formulario HTML básico: el widget, siteverify en el servidor, claves de prueba y una forma de usarlo sin claves ni servidor propios.
- [Sin captcha](https://ikiform.com/es/guides/spam-protection/without-captcha.md): Frena casi todo el spam de tus formularios sin ningún captcha: honeypot, hora de renderizado firmada, puntuación del contenido y límite de frecuencia, sumados en lugar de usarlos por separado.
- [Campo honeypot](https://ikiform.com/es/guides/spam-protection/honeypot.md): Añade a cualquier formulario un honeypot que atrape bots sin molestar a lectores de pantalla, teclado ni autocompletado, con la comprobación en el servidor para cada stack.
- [Límites de frecuencia](https://ikiform.com/es/guides/spam-protection/rate-limiting.md): Limita los envíos de un formulario por visitante con un almacén compartido, responde 429 con Retry-After y no bloquees oficinas que comparten una IP.
- [Sitios estáticos](https://ikiform.com/es/guides/spam-protection/static-site.md): Frena el spam en el formulario de un sitio estático aunque no pueda guardar secretos ni contar envíos, con un partial de honeypot, un script seguro y comprobaciones en el servidor.
