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.
Antes de leer el cuerpo
- 1Protección contra floods600 por minuto por IP, sumando todos los formularios429 rate_limited
- 2Búsqueda del formularioFormularios desconocidos, eliminados o desactivados404 not_found
- 3Límites del formularioEl preset del formulario, por visitante y por formulario429 rate_limited
- 4En pausaEl formulario está en pausa en el panel403 form_paused
Lectura del envío
- 5Lecturaurlencoded, multipart o JSON, UTF-8, límites de tamaño400, 413, 415 o 422
- 6Clave de APISolo si se envía una cabecera Authorization403 forbidden
- 7Dominios permitidosOrigin o Referer frente a los dominios del formularioSpam o 403
- 8Verificación humanaToken de Turnstile, si la verificación está activa403 o una página de verificación
Evaluación
- 9ValidaciónFrente a los campos publicados, si los hay422 validation_failed
- 10PuntuaciónHoneypot, tiempos, enlaces, palabras clave, duplicadosSpam desde 5
- 11IdempotenciaUna clave repetida devuelve la primera respuestaRepetición, 409 o 422
- 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:
- 1Accept incluye application/jsonJSON
- 2El cuerpo es JSONJSON
- 3Sec-Fetch-Mode: navigateRedirección o página
- 4Cualquier otro Sec-Fetch-Mode, como corsJSON
- 5Sin Sec-Fetch-Mode, Accept incluye text/htmlRedirección o página
- 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ándo | Detalles |
|---|---|---|
| Webhooks | Segundos después, con reintentos durante unos 3 días | Webhooks |
| Email de notificación | Segundos después, si las notificaciones están activas en el formulario | Máximo 50 emails por formulario por hora (10 en espacios de trabajo con menos de 7 días), luego un resumen por hora |
| Panel | Al instante, en vivo | El spam aparece en el filtro de spam |
| API REST | Al instante | API REST |
Ids
| Id | Formato | Notas |
|---|---|---|
| Formulario | frm_xxxxxxxxxxxxxxxx | frm_ más 16 caracteres aleatorios. Es público: está en la URL de action de tu formulario. |
| Envío | sub_01k7v2c9t3e8m5q4x6z0a1b2c3 | sub_ más 26 caracteres, ordenados por tiempo. |
| Entrega de webhook | dlv_... | Se envía como webhook-id; no cambia entre reintentos. |
| Petición | req_... | Cada respuesta tiene una cabecera X-Request-Id. Indícala cuando contactes con soporte. |
{ "ok": true, "id": "sub_01k7v2c9t3e8m5q4x6z0a1b2c3" }