SPAMADIN / DESARROLLADORES

Un camino claro del
mensaje a la decisión.

Conecta tu backend con Spamadin. Guarda tu clave API Spamadin en el servidor. Conserva los mensajes en tu sistema antes de solicitar una clasificación.

Crea con tu asistente de programación

Comparte con tu asistente la referencia de integración y la especificación OpenAPI para conectar tu sitio desde el servidor.

Referencia de integración · Especificación OpenAPI · Índice de documentación para IA

Plugin de WordPress

Instala Spamadin en WordPress y pega tu clave API de cuenta en Ajustes → Spamadin. Usa la misma clave en todos los sitios del plan. La conexión añade el sitio automáticamente dentro del límite y guarda la clave de forma segura en tu servidor WordPress.

Descargar el plugin de WordPress

Los comentarios y formularios compatibles se protegen de forma predeterminada. Se admiten Contact Form 7, WPForms, Gravity Forms, Fluent Forms y Elementor Pro. Puedes cambiar la protección y los datos opcionales del navegador en los ajustes del plugin.

Los comentarios spam quedan en la cola de spam de WordPress; los controles inciertos o no disponibles pasan a moderación. Los mensajes de formularios retenidos se guardan de forma privada en Ajustes → Spamadin hasta 30 días. Revísalos allí y contacta directamente con los remitentes legítimos; las acciones del formulario no se repiten. Las correcciones comparten solo la referencia del control y su etiqueta, nunca el cuerpo del mensaje.

Desconectar el plugin detiene los controles locales. Bloquea el sitio en Spamadin para detener sus solicitudes API y liberar su plaza. Reconectarlo no lo desbloquea. Renovar la clave requiere actualizar todas las integraciones.

1. Crea una cuenta y una clave

Verifica tu correo, elige una suscripción en el panel, y crea una clave API de cuenta. Reutilízala en todos tus sitios. Cada nombre de host permitido ocupa una plaza; example.com y www.example.com cuentan por separado. Las claves se muestran una sola vez y se almacenan con Argon2id.

Tu clave Spamadin autentica las solicitudes al servicio y es distinta de nuestras credenciales internas del proveedor de IA. Tu suscripción incluye la clasificación; no necesitas cuenta ni clave de OpenRouter.

2. Comprueba un mensaje

Describe tu sitio al conectarlo. Spamadin usa IA para categorizarlo e incluir ese contexto en los análisis posteriores. Deshabilita un sitio en el panel para detener sus solicitudes y liberar una plaza. Al cambiar a un plan inferior, permanecen activos los sitios habilitados más antiguos dentro del límite; deshabilita uno para habilitar otro.

POST /api/v1/check · Cuerpo JSON · Authorization: Bearer YOUR_SERVER_KEY

curl https://spamadin.com/api/v1/check \
  -H 'Authorization: Bearer YOUR_SERVER_KEY' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 45573012-1f18-4eaf-97a1-29702376ea21' \
  -d '{
    "type": "contact",
    "siteUrl": "https://example.com",
    "content": "¿Podéis enviarnos un presupuesto para nuestro nuevo sitio?",
    "context": { "title": "Website design", "language": "en" },
    "signals": { "elapsedMs": 8500, "honeypotFilled": false }
  }'

Análisis por lotes

Envía hasta 20 mensajes a POST /api/v1/check/bulk con tu clave API de cuenta. Pueden pertenecer a distintos sitios de tu cuenta. Cada elemento necesita un ID UUID único y un objeto submission. Las respuestas mantienen el orden e incluyen estado y resultado. Reintenta con el mismo ID y los mismos datos. Los límites de sitios, bloqueos y cuota mensual compartida se aplican a cada elemento.

{
  "checks": [
    {
      "id": "45573012-1f18-4eaf-97a1-29702376ea21",
      "submission": {
        "type": "contact",
        "siteUrl": "https://example.com",
        "content": "¿Podéis enviar un presupuesto?"
      }
    }
  ]
}

Contexto específico del formulario

Crea un perfil de formulario en tu panel con su objetivo, etiquetas de campos y texto público relevante. Revisa y guarda el resumen sugerido, y luego incluye su formId en comprobaciones individuales o por lotes. Usa perfiles reader_comment para comentarios y otros perfiles para formularios de contacto. Los perfiles aportan contexto, no permiso automático para enviar mensajes promocionales.

{
  "formId": "d495b23a-cf83-4c3d-bd63-6973297ec401",
  "type": "contact",
  "siteUrl": "https://example.com",
  "content": "¿Podéis enviar un presupuesto?"
}

Usa un UUID Idempotency-Key nuevo para cada mensaje. Tras errores de red, reintenta el mismo contenido con la misma clave. Si ya se completó, se devuelve la decisión existente sin consumir otra comprobación. Las claves se guardan con los metadatos 30 días; no reintentes mensajes más antiguos.

CampoFinalidadLímite
contentTexto original del mensaje; obligatorio1–12.000 caracteres
typecontact o comment; obligatorioValor exacto de enumeración
siteUrlURL del sitio obligatoria. Los nuevos sitios se registran automáticamente dentro del límite del plan.HTTP(S), 2.048 caracteres
context.title / descriptionContexto relevante de la página proporcionado por tu servidor200 / 1.000 caracteres
context.language / tagsIdioma del sitio y hasta diez etiquetas temáticas35 / 50 caracteres
signals.elapsedMsTiempo entre mostrar el formulario y enviarlo0–86.400.000 ms
signals.honeypotFilledIndica si se rellenó un campo ocultoBooleano
signals.userAgent / userIpMetadatos opcionales; no se envían a los modelos512 caracteres / IP válida

Deriva contexto y comportamiento en el servidor. Las marcas de tiempo del navegador pueden falsificarse. Para futuros plugins CMS, firma la hora de presentación y valídala al enviar, usa un honeypot accesible y los hooks del ciclo de vida servidor de formularios y comentarios. No envíes cookies, cabeceras de autorización, contraseñas, variables de entorno completas ni otros secretos.

3. Conserva los casos inciertos

{
  "id": "c18dd105-5d52-4939-a63e-0d52b2c0606d",
  "verdict": "allow",
  "score": 0,
  "reasons": ["clear_legitimate_context"],
  "degraded": false,
  "latencyMs": 420,
  "charged": true
}

Esta respuesta es ilustrativa, no una garantía de latencia. La puntuación es un indicador ordinal de riesgo: 0 (permitir), 50 (revisar) o 100 (fuerte acuerdo sobre spam). No es una probabilidad calibrada.

La clasificación automática comienza en modo de observación hasta que el operador habilite una política de bloqueo evaluada. Si falla la llamada o devuelve un estado distinto de 2xx, guarda el mensaje para revisión en vez de descartarlo o reintentar indefinidamente.

4. Informa de una corrección

POST /api/v1/feedback con la misma clave API Bearer y el JSON {"id":"CHECK_UUID","label":"legitimate"} o la etiqueta spam. Solo se aceptan correcciones de comprobaciones creadas por esa clave. Se registran para evaluación; no modifican un entrenamiento compartido ni autorizan inmediatamente al remitente.

También puedes registrar una corrección en tu panel y contactar con soporte usando la referencia de la comprobación. Podemos ajustar el contexto y la precaución para tu sitio. No envíes por correo contenido privado, contraseñas ni claves API. Las referencias permanecen disponibles durante 30 días.

Límites y gestión de errores

Notificar un error de clasificación

Notifica un mensaje legítimo marcado como spam a POST /api/v1/reports/false-positive, o spam no detectado a POST /api/v1/reports/missed-spam. Envía solo el ID devuelto con tu clave API de cuenta. No se comparte contenido ni se consumen controles. Prevalece la última corrección; los informes no reentrenan un modelo al instante.

{
  "id": "c18dd105-5d52-4939-a63e-0d52b2c0606d"
}

Privacidad por defecto

Las comprobaciones habituales conservan metadatos y una huella de entrada con clave durante 30 días, sin guardar el contenido de los mensajes. Se ocultan los formatos habituales de correo y teléfono antes del procesamiento de IA; es minimización, no anonimización completa. Los ejemplos compartidos voluntariamente se almacenan por separado según la política de privacidad.

Comprobaciones invisibles opcionales de formularios

Llama a POST /api/v1/form-token desde tu servidor con siteUrl, type y, opcionalmente, un formId guardado. Los tokens caducan a los 30 minutos. Su emisión no consume una comprobación antispam y requiere acceso activo al sitio.

Envía el token recibido en signals.formToken y utiliza el idempotencyKey recibido como cabecera Idempotency-Key. En las comprobaciones por lotes, úsalo como id del elemento. Los reintentos deben conservar exactamente la solicitud original. Utiliza un token nuevo para cada envío nuevo.

Carga /spamadin-behavior.js en tu sitio y vincúlalo al formulario. Tu endpoint de tokens, del mismo origen, llama a Spamadin desde tu servidor y devuelve únicamente la respuesta pública del token del formulario. Nunca expongas tu clave API ni incluyas tokens compartidos en páginas almacenadas en caché.

SpamadinBehavior.attach(document.querySelector("#contact-form"), {
  tokenEndpoint: "/form-evidence/token"
});

El script añade un campo oculto spamadin_evidence con token, idempotencyKey y los datos de comportamiento del navegador. Valida este campo en tu servidor, asigna browser a signals.browser y transmite token como signals.formToken. Los datos usan version 1, jsExecuted, focusCount, editCount, pasteCount, keyboardUsed, pointerUsed y, opcionalmente, firstInteractionMs. Tu servidor también puede enviar honeypotFilled y la IP del visitante.

Estas señales apoyan la clasificación; nunca bastan por sí solas para identificar spam. Pegar texto, el autocompletado, la ausencia de JavaScript y las tecnologías de asistencia pueden ser legítimos. El tiempo mide el intervalo desde la emisión del token, sin demostrar actividad humana. Los tokens ausentes o caducados no rechazan automáticamente los mensajes.

El script no registra texto escrito, contenido del portapapeles, movimientos del ratón ni cookies. Los tokens y los resúmenes de interacción no se guardan en el historial de comprobaciones ni se envían como credenciales a los proveedores de IA. Las comprobaciones con datos del navegador siempre ejecutan la clasificación sin reutilizar un resultado en caché.

Reconocimiento de repeticiones

El reconocimiento de repeticiones es independiente por sitio. Las huellas caducan tras 24 horas y no contienen texto guardado. Las frases similares ayudan a clasificar, pero no determinan spam por sí solas. Desactiva la función en los ajustes del sitio para borrar su historial y señales de campañas aprobadas. Bloquear un sitio o notificar una corrección también borra su historial reciente.

Las comprobaciones idénticas aptas pueden reutilizar un veredicto reciente de mensaje legítimo solo si la función se ha evaluado y activado. La reutilización se limita a cinco minutos y exige que no cambien los datos enviados, los ajustes del sitio y formulario, la configuración de modelos ni la política de detección. Las coincidencias aproximadas nunca omiten la IA. Cada comprobación completada cuenta una vez para tu límite, incluido un veredicto reutilizado; los fallos del proveedor no se descuentan.

Compartir un ejemplo de entrenamiento corregido

Envía POST /api/v1/training con la clave original, checkId, etiqueta corregida, objeto original del envío sin cambios y ambas confirmaciones de autorización en true. La comprobación debe estar completada y tener menos de 30 días. Compartir es opcional, no consume una comprobación ni vuelve a entrenar un modelo de inmediato. Haz la solicitud desde tu backend y proporciona los avisos requeridos y la autoridad legal antes de compartir contenido de visitantes.

{
  "checkId": "c18dd105-5d52-4939-a63e-0d52b2c0606d",
  "label": "legitimate",
  "submission": {
    "type": "contact",
    "siteUrl": "https://example.com",
    "content": "¿Podéis enviar un presupuesto?"
  },
  "consent": {
    "authorizedToShare": true,
    "useForSpamImprovement": true
  }
}

GET /api/v1/training lista las referencias de los ejemplos compartidos por tu cuenta. Usa ?after=EXAMPLE_UUID para la siguiente página o ?id=EXAMPLE_UUID para obtener un ejemplo reducido. DELETE en el mismo endpoint con el ID del ejemplo lo retira. También puedes retirarlos en el panel tras revocar la clave.

Los ejemplos caducan a los 90 días. Límites: 500 ejemplos o 2 MiB de datos cifrados por cuenta, 16 KiB de texto original por ejemplo y 24 KiB de contenido y contexto minimizados antes de comprimir. Las solicitudes siguen limitadas a 32 KiB. Una cuenta llena devuelve 429; capacidad temporalmente no disponible o falta de cifrado devuelve 503. No se guarda ningún ejemplo cuando un límite rechaza la solicitud. No reintentes indefinidamente ni envíes adjuntos privados. La ocultación se hace en la medida de lo posible; no es anonimización.

La API nunca visita las URL enviadas. Las IP opcionales ayudan a detectar ráfagas temporales de envíos por sitio; los agentes de usuario no afectan a la clasificación. Ninguno se envía a los modelos. Usa nuestro plugin de WordPress o conecta otros CMS mediante la API de servidor.

Crea tu cuenta ↗