ID del formulario

Errores

Cada código de error que devuelve Ikiform, con su estado HTTP, su causa y su solución.

Los envíos de formularios y la API REST comparten un mismo formato de error. Las peticiones JSON lo reciben con el estado HTTP correspondiente; los envíos de formularios del navegador reciben una página de error alojada con el mismo mensaje y estado.

El formato de error

Error
{
  "ok": false,
  "error": {
    "code": "rate_limited",
    "message": "Too many requests. Please slow down."
  },
  "request_id": "req_01k7v2c9t3e8m5q4x6z0a1b2c3"
}
  • error.code es estable; usa ese valor para decidir. error.message es inglés sencillo pensado para personas y puede cambiar.
  • error.fields aparece en los errores de validación, indexado por id de campo, cada uno con una lista de mensajes. Los errores sobre el cuerpo completo usan la clave _form.
  • error.challenge_url aparece en challenge_required.
  • request_id coincide con la cabecera X-Request-Id que lleva cada respuesta.
  • Las respuestas con límite de frecuencia llevan Retry-After en segundos. Ambas cabeceras se pueden leer desde el código del navegador.

Códigos

400 invalid_body

MensajeThe request body could not be read.
CausaJSON o multipart mal formado, un array o una cadena JSON en lugar de un objeto, o una clave de idempotencia de más de 255 caracteres.
SoluciónEnvía un único objeto JSON, o deja que el navegador o FormData construyan el cuerpo.

400 invalid_request

MensajeThe request is invalid.
Causalimit, status, form_id o cursor no es válido. El mensaje indica el parámetro.
SoluciónUsa limit de 1 a 100, status received o spam, un id frm_ real y los cursores exactamente como se devolvieron.

401 unauthorized

MensajeA valid API key is required.
CausaNo hay cabecera Authorization, no es un token Bearer, o la clave es desconocida, está revocada o caducada.
SoluciónEnvía Authorization: Bearer ik_sk_... con una clave secreta activa.

402 plan_required

MensajeThis form isn't accepting submissions right now.
CausaEl espacio de trabajo no tiene un plan activo. Esto solo puede pasar cuando se active la facturación.
SoluciónElige un plan en el panel, en Settings.

403 forbidden

MensajeYou do not have access to this resource.
CausaLa clave de API está mal formada, pertenece a otro espacio de trabajo, es publicable en la API REST o le falta el permiso necesario.
SoluciónUsa una clave secreta de este espacio de trabajo con el permiso que indica el mensaje.

403 origin_not_allowed

MensajeThis form does not accept submissions from this site.
CausaEl envío vino de un sitio fuera de los dominios permitidos del formulario y el formulario rechaza las discrepancias, o se usó una clave publicable desde un dominio que no está en la clave.
SoluciónAñade el sitio a Allowed domains o a los dominios de la clave. Para envíos desde servidor, usa una clave secreta.

403 form_paused

MensajeThis form is not accepting submissions right now.
CausaEl formulario está en pausa en el panel.
SoluciónReanuda el formulario.

403 captcha_failed

MensajeThe captcha check failed. Please try again.
CausaEl token de Turnstile falta, caducó, ya se usó o no pasó la verificación.
SoluciónObtén un token nuevo en cada envío. Con tus propias claves, comprueba que la clave de sitio corresponde al secreto.

403 challenge_required

MensajeComplete the human check, then send the form again.
CausaEl formulario usa la verificación humana de Ikiform y llegó un envío JSON sin token.
SoluciónLlama a challenge(formId) del SDK y pasa el token, o usa error.challenge_url. Los envíos desde servidor pueden enviar una clave secreta en su lugar.

404 not_found

MensajeNot found.
CausaEl formulario no existe, se eliminó o se desactivó, o el id o la ruta son incorrectos. También se devuelve ante un GET a /f/<formId>.
SoluciónCopia el endpoint desde el resumen del formulario y envía a él en lugar de abrirlo en una pestaña.

405 method_not_allowed

MensajeThis method is not allowed here.
CausaUn preflight del navegador en la API REST, que es solo de servidor a servidor.
SoluciónLlama a /api/v1 desde tu backend.

409 idempotency_in_progress

MensajeA request with this idempotency key is still being processed.
CausaTodavía se está procesando una petición con esta clave de idempotencia.
SoluciónEspera un momento y reintenta con la misma clave; recibirás la primera respuesta.

413 payload_too_large

MensajeThe submission is too large.
CausaEl cuerpo, un nombre de campo, un valor o el número de campos supera su límite. El mensaje indica cuál.
SoluciónConsulta Límites. Reparte el texto largo entre varios campos, o guarda los archivos en otro lugar y envía un enlace.

415 unsupported_media_type

MensajeSend the form as urlencoded, multipart or JSON.
CausaEl Content-Type no es urlencoded, multipart ni JSON, o falta.
SoluciónDefine Content-Type: application/json cuando envíes JSON.

415 unsupported_charset

MensajeOnly UTF-8 is supported.
CausaEl cuerpo no es UTF-8, o declara otro charset.
SoluciónCodifica en UTF-8. Añade accept-charset="utf-8" a los formularios HTML antiguos.

422 validation_failed

MensajeSome fields are invalid.
CausaHay campos que no pasaron la validación. error.fields relaciona los ids de campo con los mensajes.
SoluciónMuestra los mensajes junto a los campos. Consulta Campos.

422 files_not_supported

MensajeFile uploads are not supported yet.
CausaEl envío contiene un archivo. La subida de archivos aún no existe.
SoluciónQuita los inputs de archivo, o sube los archivos a otro lugar y envía el enlace.

422 too_deep

MensajeThe JSON body is nested too deeply.
CausaEl cuerpo JSON tiene más de 3 niveles de anidamiento, contando el objeto principal.
SoluciónAplana los datos, por ejemplo { "address_city": "London" }.

422 idempotency_mismatch

MensajeThis idempotency key was already used with a different payload.
CausaEsta clave de idempotencia ya se usó en este formulario en las últimas 24 horas con campos distintos.
SoluciónUsa una clave nueva para datos nuevos. Mantén la misma clave solo para reintentos idénticos.

429 rate_limited

MensajeToo many requests. Please slow down.
CausaSe superó un límite de frecuencia. Retry-After indica cuántos segundos esperar.
SoluciónEspera y reintenta. Si les pasa a visitantes reales, cambia el límite de frecuencia del formulario.

429 quota_exceeded

MensajeThis form isn't accepting submissions right now.
CausaEl espacio de trabajo recibió este mes el doble de su límite mensual de envíos.
SoluciónMejora tu plan o espera al mes siguiente. Consulta Uso mensual.

500 server_error

MensajeSomething went wrong on our side.
CausaAlgo falló del lado de Ikiform.
SoluciónReintenta con backoff y una clave de idempotencia. Si sigue pasando, indica el request_id.

Lo que no son errores

  • El spam recibe el mismo 201 o la misma redirección que un envío real. Búscalo en el filtro de spam del panel.
  • Un _redirect no permitido se ignora y el navegador llega a la página de agradecimiento alojada.
  • Un _replyto que no es una única dirección de email válida se ignora.

Reintentos

  • Reintenta un 429 después de Retry-After, y los 500, 409 o errores de red con backoff. Envía una clave de idempotencia para que un reintento nunca cree un duplicado.
  • No reintentes otros errores 4xx sin cambios. Corrige antes la petición.