Webhooks

Envíe cada respuesta a una dirección propia, en JSON, en el momento en que llega.

Un POST por respuesta

Se envía en cuanto la respuesta queda guardada, sin hacer esperar a quien la ha enviado.

Una estructura JSON estable

Nombres de tipo públicos e ID de campo permanentes, así que renombrar una pregunta nunca rompe su código.

10 segundos, un intento

Fillio espera diez segundos a su endpoint y después no vuelve a intentarlo.

Activar un webhook

Abra el formulario, vaya a la pestaña Configuración y active Webhook. Pegue la dirección que debe recibir los envíos; Fillio la guarda poco después de que deje de escribir y lo confirma en pantalla. Cada formulario lleva una sola dirección, y volver a desactivar el interruptor la borra.

La dirección tiene que ser HTTPS

Fillio solo llama a direcciones que empiezan por https://. El campo de configuración acepta una dirección http:// pero nunca la llama, así que un webhook que parece guardado no entregará nada, en silencio.

También se rechazan las direcciones que apuntan al interior de una red privada: cualquier host en 10.x, 127.x, 169.254.x, 172.16-31.x o 192.168.x, cualquier dirección IPv6 y cualquier nombre que sea localhost o termine en .local o .internal. Su endpoint tiene que ser accesible desde la internet pública.

La petición

Un POST con un cuerpo JSON. Lo acompañan cuatro cabeceras.

CabeceraDescripción
Content-Type: application/jsonEl cuerpo siempre es JSON.
User-Agent: Fillio Webhooks/1.0Identifica a quien llama como Fillio, algo útil cuando un mismo endpoint escucha a varios servicios.
X-Fillio-Event: FORM_RESPONSEEl nombre del evento. FORM_RESPONSE es el único valor que Fillio envía hoy.
X-Fillio-Event-IdUn UUID nuevo para esta entrega, repetido como eventId en el cuerpo.

El payload

Un sobre que describe el evento y un objeto data que describe la respuesta.

{
  "eventId": "8f2c1d7a-4b09-4e5c-9a13-6d0f8b2e77c4",
  "eventType": "FORM_RESPONSE",
  "createdAt": "2026-08-26T09:14:22.481Z",
  "data": {
    "responseId": "Qh3Rk9wZm1sVtY7cN2xP",
    "formId": "7bTn4Kq2Wx",
    "formName": "Workshop signup",
    "createdAt": "2026-08-26T09:14:22.481Z",
    "fields": [
      {
        "key": "V1StGXR8_Z5jdHi6B-myT",
        "label": "Full name",
        "type": "INPUT_TEXT",
        "value": "Mira Kaya"
      },
      {
        "key": "kM4pQz7LxAe2Rn0BsTvUw",
        "label": "Which session?",
        "type": "MULTIPLE_CHOICE",
        "value": "c9XbNf3JdQ",
        "options": [
          { "id": "c9XbNf3JdQ", "text": "Morning" },
          { "id": "eR2mYt8KpL", "text": "Afternoon" }
        ]
      },
      {
        "key": "zA6cWn1FyH4tXd9QrLbEs",
        "label": "How likely are you to recommend us?",
        "type": "LINEAR_SCALE",
        "value": 9
      }
    ]
  }
}
PropiedadDescripción
eventIdUn ID único para esta entrega.
eventTypeSiempre FORM_RESPONSE.
createdAtCuándo se envió la respuesta, como marca de tiempo ISO 8601 en UTC.
data.responseIdEl ID de la respuesta guardada.
data.formIdEl ID del formulario, el mismo que aparece en su enlace público.
data.formNameEl título del formulario como texto plano, sin ningún formato.
data.fieldsUna entrada por cada pregunta contestada.

Dentro de fields

Cada entrada lleva cuatro propiedades, y una pregunta con opciones lleva una quinta.

PropiedadDescripción
keyEl ID permanente de la pregunta. Sobrevive a cualquier cambio en el enunciado, así que haga la correspondencia por este valor y no por la etiqueta.
labelLa pregunta tal como está escrita en el editor.
typeEl tipo de pregunta, tomado de la lista de abajo.
valueLa respuesta, con la forma en que esa pregunta la guarda.
optionsSolo en preguntas con opciones: el ID y el texto de cada opción, para que pueda convertir una respuesta de vuelta en una etiqueta.

Solo llegan las preguntas contestadas

Una pregunta que la persona no tocó no aparece en el array, en lugar de enviarse con un valor vacío, y una pregunta oculta por la lógica condicional no aparece nunca. Busque cada respuesta por su key en lugar de fiarse de la posición o de un número fijo de entradas.

Las respuestas de opción llevan ID, no etiquetas

La respuesta de un desplegable o de una opción múltiple es el ID de la opción elegida, y la de casillas, selección múltiple o clasificación es un array de ID de opción. Resuélvalos con la lista options de la misma entrada. Una respuesta de clasificación conserva el orden en que la persona colocó los elementos.

La opción Otro

Cuando alguien escribe en una casilla Otro, el valor no es un ID de opción sino el texto __OTHER__: seguido de lo que haya escrito. Quite ese prefijo para leer la respuesta.

"value": "__OTHER__:Heard about it from a friend"

Archivos y firmas

La respuesta de una subida de archivo es un enlace de descarga al archivo en el almacenamiento de Fillio. La respuesta de una firma es una data URL PNG en base64, que puede guardar o mostrar directamente.

Tipos de campo

El tipo es un nombre público estable, así que un cambio interno en Fillio nunca llega a su integración. Todo lo que Fillio no pueda mapear llega como INPUT_TEXT.

TipoPreguntaValor
INPUT_TEXTRespuesta cortaTexto
TEXTAREARespuesta largaTexto
INPUT_EMAILCorreo electrónicoTexto
INPUT_PHONE_NUMBERNúmero de teléfonoTexto
INPUT_NUMBERNúmeroEl número como texto, exactamente como se escribió
INPUT_LINKEnlaceTexto
INPUT_DATEFechaUna fecha, como YYYY-MM-DD
INPUT_TIMEHoraUna hora, como HH:MM en formato de 24 horas
DROPDOWNDesplegableUn ID de opción
MULTIPLE_CHOICEBotones de opciónUn ID de opción
CHECKBOXESCasilla de verificaciónUn array de ID de opción
MULTI_SELECTSelección múltipleUn array de ID de opción
RATINGValoración con estrellasUn número
LINEAR_SCALEEscala linealUn número
RANKINGClasificaciónUn array de ID de opción, en el orden de quien responde
FILE_UPLOADSubir archivoUn enlace de descarga
SIGNATUREFirmaUna data URL PNG en base64

Si su endpoint no responde

Fillio espera diez segundos. Un tiempo de espera agotado, un error de conexión o cualquier estado fuera del rango 2xx cuenta como entrega fallida, y ahí acaba todo: no hay reintento ni cola desde la que reproducirla.

La respuesta en sí nunca se ve afectada. Se guarda antes de hacer la petición y permanece en su panel haga lo que haga su endpoint, así que el panel sigue siendo el registro completo aunque se pierda una entrega.

No hay firma

Fillio no firma la petición ni envía ningún secreto compartido, así que el cuerpo por sí solo no demuestra de dónde viene. Si su endpoint necesita estar seguro, dele una dirección que solo usted conozca: una ruta o cadena de consulta larga e imposible de adivinar. Y trate como no fiable cualquier cosa que llegue a otro sitio.

Cada entrega lleva su propio ID de evento, tanto en la cabecera X-Fillio-Event-Id como en el cuerpo. Registrar los que ya ha procesado es la forma más sencilla de que su endpoint pueda recibir dos llamadas sin problema.

Consejo

Apunte el webhook a cualquier endpoint de inspección de peticiones y envíe su propio formulario una vez. Verá el payload exacto que produce, con sus propios ID de campo dentro: la forma más rápida de escribir la correspondencia en su lado.