ID del formulario

Cómo funciona

Cada comprobación por la que pasa un envío, en orden, y lo que puede devolver cada una.

Cada envío a /f/<formId> pasa por el mismo pipeline. Las comprobaciones baratas van primero, así que un flood o un formulario desconocido no cuestan casi nada. La primera comprobación que falla decide la respuesta.

Las comprobaciones por las que pasa un envío, en orden

Antes de leer el cuerpo

  1. 1Protección contra floods600 por minuto por IP, sumando todos los formularios429 rate_limited
  2. 2Búsqueda del formularioFormularios desconocidos, eliminados o desactivados404 not_found
  3. 3Límites del formularioEl preset del formulario, por visitante y por formulario429 rate_limited
  4. 4En pausaEl formulario está en pausa en el panel403 form_paused

Lectura del envío

  1. 5Lecturaurlencoded, multipart o JSON, UTF-8, límites de tamaño400, 413, 415 o 422
  2. 6Clave de APISolo si se envía una cabecera Authorization403 forbidden
  3. 7Dominios permitidosOrigin o Referer frente a los dominios del formularioSpam o 403
  4. 8Verificación humanaToken de Turnstile, si la verificación está activa403 o una página de verificación

Evaluación

  1. 9ValidaciónFrente a los campos publicados, si los hay422 validation_failed
  2. 10PuntuaciónHoneypot, tiempos, enlaces, palabras clave, duplicadosSpam desde 5
  3. 11IdempotenciaUna clave repetida devuelve la primera respuestaRepetición, 409 o 422
  4. 12Uso mensualMuy por encima del límite del espacio de trabajo429 quota_exceeded

Guardado

Envío guardado

201 para código, 303 para navegadores

  • WebhooksFirmados, con reintentos durante unos 3 días
  • Email de notificaciónA los destinatarios del formulario
  • Panel y APIEn vivo, al instante

El spam también se guarda y recibe una respuesta de éxito, pero no envía nada.

Qué hace cada etapa

Los límites de frecuencia van antes que todo

Los límites de frecuencia se aplican antes de leer el cuerpo. La protección contra floods (600 por minuto por IP) se ejecuta incluso antes de buscar el formulario, así que un flood nunca llega a la base de datos. Las reglas propias del formulario se aplican justo después de la búsqueda. Las peticiones rechazadas no consumen el margen. Los números exactos están en Límites de frecuencia.

Lectura

El cuerpo se lee como urlencoded, multipart o JSON. El texto se decodifica como UTF-8, se normaliza a NFC, CRLF pasa a LF y se eliminan los caracteres de control. Los nombres que empiezan con _ son instrucciones reservadas, como _redirect y _subject, y nunca se guardan como respuestas. Consulta Formularios HTML.

Quién lo envió

La cabecera Authorization: Bearer es opcional. Una clave secreta (ik_sk_) con el permiso submissions:write se salta la comprobación de dominios permitidos y la verificación humana de Ikiform. Una clave publicable (ik_pub_) solo funciona desde los dominios indicados en la clave. Sin clave, el envío se evalúa por su Origin.

Spam

El spam nunca es un error. Un envío que no cumple la política de dominios permitidos en modo spam, o que puntúa 5 o más, se guarda con el estado spam y recibe la misma respuesta de éxito que uno real, así los bots no aprenden nada. El spam no envía webhooks ni emails y no cuenta para el uso. Consulta Protección antispam.

Guardado y entrega

El envío, sus entregas de webhook y su email de notificación se escriben en un solo lote de base de datos y luego pasan a una cola. La entrega de webhooks y el email nunca ralentizan la respuesta, y un envío nunca se guarda sin sus entregas.

JSON o una redirección

El mismo endpoint responde a los navegadores con páginas y al código con JSON. Ikiform decide en cada petición:

Cómo elige Ikiform entre una respuesta JSON o una redirección, de arriba abajo
  1. 1Accept incluye application/jsonJSON
  2. 2El cuerpo es JSONJSON
  3. 3Sec-Fetch-Mode: navigateRedirección o página
  4. 4Cualquier otro Sec-Fetch-Mode, como corsJSON
  5. 5Sin Sec-Fetch-Mode, Accept incluye text/htmlRedirección o página
  6. 6Cualquier otra cosa, como curlJSON

Gana la primera regla que coincida.

En modo JSON, el éxito es 201 { "ok": true, "id": "sub_..." }. En modo página, el éxito es una redirección 303, y los errores muestran una página de error alojada que enumera los problemas de cada campo por su etiqueta.

Después de guardar un envío

QuéCuándoDetalles
WebhooksSegundos después, con reintentos durante unos 3 díasWebhooks
Email de notificaciónSegundos después, si las notificaciones están activas en el formularioMáximo 50 emails por formulario por hora (10 en espacios de trabajo con menos de 7 días), luego un resumen por hora
PanelAl instante, en vivoEl spam aparece en el filtro de spam
API RESTAl instanteAPI REST
Los formularios cuyos envíos contienen nombres de campo del tipo contraseña, tarjeta o frase semilla se marcan y sus emails de notificación se retienen para revisión. No recojas credenciales con un backend de formularios.

Ids

IdFormatoNotas
Formulariofrm_xxxxxxxxxxxxxxxxfrm_ más 16 caracteres aleatorios. Es público: está en la URL de action de tu formulario.
Envíosub_01k7v2c9t3e8m5q4x6z0a1b2c3sub_ más 26 caracteres, ordenados por tiempo.
Entrega de webhookdlv_...Se envía como webhook-id; no cambia entre reintentos.
Peticiónreq_...Cada respuesta tiene una cabecera X-Request-Id. Indícala cuando contactes con soporte.
{ "ok": true, "id": "sub_01k7v2c9t3e8m5q4x6z0a1b2c3" }