v1.0

Documentación

Integración del captcha en cualquier web en 60 segundos.

Quickstart

  1. Crea una cuenta gratis.
  2. En el dashboard, registra tu dominio y copia tu sitekey y secret_key.
  3. Pega el snippet HTML donde quieras el captcha.
  4. En tu backend, valida el token con POST /siteverify.

Integración HTML

Pega esto en tu formulario, donde quieras que aparezca el captcha:

<script src="https://captcha.softwalabs.com/v1/api.js" async defer></script>

<form method="post" action="/login">
  <input name="email" type="email">
  <input name="password" type="password">

  <div class="softwacap" data-sitekey="TU_SITEKEY"></div>

  <button type="submit">Entrar</button>
</form>

El widget inyecta automáticamente un <textarea name="g-recaptcha-response"> en el formulario. Tu backend recibirá el token en ese campo.

Atributos de configuración

AtributoTipoDescripción
data-sitekeystringTu clave pública (obligatorio).
data-callbackstringNombre de función JS global a llamar al éxito (recibe el token).
data-expired-callbackstringNombre de función JS al expirar el token.
data-error-callbackstringNombre de función JS si falla la verificación.
data-response-field-namestringNombre del input hidden (default: g-recaptcha-response).

Verificación server-side

En tu backend, valida el token con una petición POST. Compatible drop-in con reCAPTCHA siteverify.

POST https://captcha.softwalabs.com/siteverify
Content-Type: application/x-www-form-urlencoded

secret=TU_SECRET_KEY&response=TOKEN_DEL_FORMULARIO&remoteip=IP_USUARIO

Respuesta:

{
  "success": true,
  "score": 0.85,
  "challenge_ts": "2026-04-26T10:30:00Z",
  "hostname": "midominio.com"
}

Si success es true, el usuario es humano. score va de 0 a 1; típicamente acepta > 0.5.

Migración desde reCAPTCHA

Si ya usas reCAPTCHA v2/v3, cambias 2 líneas:

1. Frontend

// Antes
<script src="https://www.google.com/recaptcha/api.js"></script>
<div class="g-recaptcha" data-sitekey="..."></div>

// Después — dos opciones

// Opción A: cambiar src y clase
<script src="https://captcha.softwalabs.com/v1/api.js"></script>
<div class="softwacap" data-sitekey="..."></div>

// Opción B: solo cambiar src (mantenemos g-recaptcha)
<script src="https://captcha.softwalabs.com/v1/api.js"></script>
<div class="g-recaptcha" data-sitekey="..."></div>

2. Backend

Cambia el endpoint:

// Antes
https://www.google.com/recaptcha/api/siteverify

// Después
https://captcha.softwalabs.com/siteverify

El formato de la petición y de la respuesta JSON es idéntico. Tu lógica de validación no cambia.

Referencia API JS

El widget expone una API global compatible con grecaptcha:

// Renderizar manualmente
var widgetId = softwacap.render('mi-div', {
  sitekey: 'pk_swl_...',
  callback: function (token) { console.log(token); }
});

// Obtener el token actual
var token = softwacap.getResponse(widgetId);

// Resetear (forzar nuevo challenge)
softwacap.reset(widgetId);

// Esperar a que esté listo
softwacap.ready(function () { /* widget cargado */ });

Ejemplos por lenguaje

PHP

$response = $_POST['g-recaptcha-response'] ?? '';

$ch = curl_init('https://captcha.softwalabs.com/siteverify');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POSTFIELDS => http_build_query([
        'secret'   => $_ENV['SOFTWACAP_SECRET'],
        'response' => $response,
        'remoteip' => $_SERVER['REMOTE_ADDR'] ?? '',
    ]),
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);

if (!empty($result['success']) && ($result['score'] ?? 0) > 0.5) {
    // Es humano — procesar el formulario
} else {
    // Bloquear o pedir verificación adicional
}

Node.js

const verify = async (token, ip) => {
  const r = await fetch('https://captcha.softwalabs.com/siteverify', {
    method: 'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    body: new URLSearchParams({
      secret: process.env.SOFTWACAP_SECRET,
      response: token,
      remoteip: ip,
    }),
  });
  const data = await r.json();
  return data.success && data.score > 0.5;
};

Python

import requests

r = requests.post('https://captcha.softwalabs.com/siteverify', data={
    'secret': os.environ['SOFTWACAP_SECRET'],
    'response': token,
    'remoteip': request.remote_addr,
})
data = r.json()
if data.get('success') and data.get('score', 0) > 0.5:
    pass  # humano

Códigos de error

CódigoSignificado
missing-input-secretNo se envió el parámetro secret.
invalid-input-secretEl secret no coincide con ningún sitio.
missing-input-responseNo se envió el parámetro response.
invalid-input-responseToken inválido, mal firmado o expirado.
timeout-or-duplicateToken ya usado (one-time-use).
quota-exceededHas superado tu cuota mensual.
rate-limitedDemasiadas peticiones desde tu IP.

MCP server Pro+

Opera SoftwaCAP desde Claude Desktop, Claude Code u otros clientes IA.

El servidor MCP está en https://captcha.softwalabs.com/mcp y habla JSON-RPC 2.0 sobre HTTP (Streamable transport). Soporta los métodos initialize, tools/list, tools/call, ping.

1. Crea una API key personal

En /dashboard/settings → API Keys (MCP) genera una key con scope read (y write si quieres operaciones de escritura). La key se muestra una sola vez; cópiala.

2. Configura Claude Desktop

Edita ~/.config/claude/claude_desktop_config.json (Linux/macOS) o %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "softwacap": {
      "url": "https://captcha.softwalabs.com/mcp",
      "headers": {
        "Authorization": "Bearer ak_swl_TU_API_KEY"
      }
    }
  }
}

Reinicia Claude Desktop. El asistente verá las tools de SoftwaCAP automáticamente.

3. Tools disponibles

Lectura (Pro+)

ToolDescripción
list_sitesLista todos tus sitios
get_siteDetalles de un sitio (incluye secret_key)
get_quotaUso actual del mes y límite del plan
get_statsEstadísticas agregadas (total, % éxito, scores)
recent_verificationsÚltimas verificaciones (filtrable por site / sólo fallos)
get_billing_infoPlan, ciclo, fecha de renovación

Escritura (Pro+, scope write)

ToolDescripción
create_siteCrea un sitio nuevo y devuelve sitekey + secret_key
update_siteModifica nombre, dominios, dificultad o estado activo
rotate_secretInvalida el secret_key actual y genera uno nuevo
delete_siteElimina un sitio definitivamente

Avanzadas Business+

ToolDescripción
simulate_verifySimula una verificación con perfil human / bot / borderline y devuelve el score
bulk_export_csvExporta hasta 50.000 verificaciones como CSV

4. Ejemplo de prompts

Tú: Lista mis sitios y dime cuáles tuvieron mayor tasa de fallo este mes.
Tú: Crea un sitio nuevo para midominio.com en dificultad easy con Adaptive Pace activado.
Tú: Simula una verificación con perfil bot y otra con perfil humano para ver la diferencia de scores.
Tú: Exporta a CSV las verificaciones fallidas de los últimos 7 días del sitio #3.

Adaptive Pace Pro+

Captcha que se ajusta solo al ritmo de tus humanos.

Por defecto un sitio tiene una dificultad fija (easy, normal o hard). Con Adaptive Pace activo, el motor recalcula los timings reales (velocidad de flash, pausa entre estrellas, longitud de la secuencia) en función de la tasa de éxito de las sesiones humanas en los últimos 7 días.

Cómo decide el ajuste

  • Sólo cuenta verificaciones con behavior_score ≥ 0.6 Y ai_score ≥ 0.5. Los bots no envenenan la métrica.
  • Necesita al menos 30 muestras humanas en los últimos 7 días. Mientras tanto usa el baseline.
  • Si la tasa de éxito humano < 60% → relaja: +20% al flash, +20% al gap, −1 a la secuencia (mínimo 3).
  • Si > 95% → endurece: −10% al flash, −10% al gap, +1 a la secuencia (máximo 5).
  • Recálculo cada 5 minutos. Cache en BD por sitio.

Cómo activarlo

En /dashboard/sites:

  • Al crear un sitio nuevo: marca el checkbox Adaptive Pace en el modal.
  • En sitios existentes: usa el botón Activar/Desactivar en la sección Adaptive Pace de cada sitio.

Alternativa MCP: update_site con adaptive_pace: true.

¿Algo no funciona? Escribe a hola@softwalabs.com o usa el chat de soporte cuando estés logueado.