> ## Knowledge Base Index
> Fetch the complete knowledge base index at: https://docs.flokzu.com/sitemap.xml
> Use this file to discover available pages before exploring further.
> Pure-Markdown content can be obtained by appending a '.md' suffix to the content URLs listed in the sitemap (without the trailing slash).

# Webhooks

En Flokzu puedes compartir la información contenida en tus formularios con sistemas externos a través de webhooks. 
Los webhooks proporcionan un mecanismo para notificar a tu aplicación cuando se produzca un determinado evento y así poder tomar acciones y mantener una traza completa de lo que ocurre en la instancia. 

Los eventos pueden ser de cuatro tipos:

### Webhook de tipo *Save*
Un webhook configurado para el evento *save* será ejecutado al momento de que se realice alguna de las siguientes acciones:

* Crear una nueva instancia (ya sea ejecutada por un usuario logueado, desde un formulario público o desde la API de Flokzu)
* Al ejecutarse el auto guardado y el guardado explícito siempre que se hayan realizado cambios en el formulario.

#### Webhook de tipo *Task Completed*
Será enviado al momento de completar una tarea ya sea de forma manual, o al ejecutarse un timer o evento condicional **interruptivos**.
Recuerda que los timers o eventos condicionales **no-interruptivos**, generan flujos adicionales sin completar la tarea en curso.

### Webhook de tipo *Delete*
Permite notificar a sistemas externos cuando una instancia es eliminada de Flokzu. 

### Webhook de tipo *Event Triggered*
Este webhook es enviado al ejecutarse timers o eventos condicionales **no-interruptivos**. Este tipo de eventos genera un movimiento de la instancia a través de un camino adicional del flujo de trabajo, sin completar la Tarea de Usuario activa. 


# Configurar webhooks

Los webhooks podrán ser habilitados y configurados para cada proceso. Para ello dirígete a la pestaña *Configuración* del proceso en cuestión y en la sección *Webhooks* podrás habilitarlo.

![](https://storage.crisp.chat/users/helpdesk/website/-/c/c/c/3/ccc3fbb5dc442800/image_1g3osbx.png)


Allí podrás configurar las URLs que serán invocadas al ocurrir los diferentes tipo de eventos así como generar un token para agregar seguridad.


### Formato general del mensaje enviado a los webhooks.

```javascript
{ 
  "Timestamp": "Fecha de realizado el evento en formato UTC",
  "Type": "save ,task_complete, event_triggered o delete",
  "Payload": "JSON de acuerdo al evento"
}
```



||| Cada webhook incluye un `timestamp` que indica la fecha y hora en que ocurrió el evento. Es responsabilidad del sistema receptor utilizar este valor para validar el orden de los eventos y garantizar la integridad de los datos. Esto es especialmente importante ante posibles retrasos en la entrega, ya que un webhook correspondiente a un evento anterior podría llegar después de otro más reciente y, si se procesa sin validar el timestamp, sobrescribir información más actualizada.


### Formato del mensaje para un webhook de tipo *Save*

En la propiedad *Payload* del *json* se enviará el documento completo que fue modificado.

El formato será el siguiente:

```javascript
{
  "tenantName": "nombre del tenant",
  "reference": "referencia del doc",
  "documentCreator": "creador del doc",
  "dateCreated": "fecha de creación del documento en formato ISO 8601",
  "info": " resumen del documento",
  "tags": ["tags del documento separados por coma"],
  "downloadKey": "id documento",
  "fields": [
                   {"campo 1": "valor 1"},
                   {"campo 2": "valor 2"}	
   ]
}
```


En la propiedad *fields* estarán todos los campos definidos por el usuario y los valores de estos se verán de la siguiente manera:    

* **Email, texto una línea, texto multilínea, link, entero, decimal, auto-calculado, fecha y hora**: muestran el valor tal cual el documento.
* **Combo y  radio button**: muestran el valor de la opción seleccionada
* **Combo multiselección y checklist**: muestran un array con las opciones seleccionadas con las comillas escapadas
* **Tabla**: muestra el nombre de la tabla y luego para cada fila, las columnas y sus valores.
* **Adjunto**: El archivo no es enviado, solamente se muestra información del mismo, nombre, attachment id, fecha de creación y más. 
* **Si/No**: muestran *true* si la opción seleccionada es SI, en otro caso muestra false
* **Rich text**: muestra el contenido del campo con los tags que corresponda para generar el mismo contenido que se ve en el documento en Flokzu.
* **Firma**: la firma no es soportada.

###### Ejemplo:

A continuación se muestra el ejemplo del *json* enviado para un formulario con los siguientes campos y valores:

Nombre del campo | Tipo de dato | Valor |
* Email | email | nombre@mail.com |
* Nombre | Texto una línea | Juan Pérez |
* Descripción | Texto multi línea | Solicitud de insumos de papelería para oficinas|
* Cantidad de artículos | Número entero | 2 |
* Monto total | Número decimal | 3505.5 |
* Fecha | Fecha | 06/08/2019 |
* Hora | Hora | 15:30:00 |
* Ciudad| Combo de opciones | Madrid |
* Forma de pago | Radio Button | Contado |
* Proveedores | Combo Multiselección | Bolimax, Rollerpen, TodoUSB  |
* Categorías | Checklist | Papelería, Informática |
* Pedido | Tabla |Producto: Bolígrafo, Cantidad:150, Precio:750; Producto: Pendrive, Cantidad:11, \*Precio:2755.5| 
* Detalle del pedido | Archivo adjunto |  |
* Cuenta activa | Si/No | Si |
* Web | Link | www.flokzu.com |
* Cantidad de ítems | Autocalculado | 3 |
* Observaciones | Texto Rico | Realizar envío a Calle 1234 de 08 a 18 hs.|

###### json enviado:

```javascript
{
   "tenantName": "Flokzu",
   "reference": "PED-14",
   "documentCreator": "leandro@flokzu.com",
   "dateCreated": "2019-08-06T17:17:10.223Z",
   "info": "",
   "tags": [""],
   "downloadKey": "b45602d6467856c5b2a45973c49a99e2",
   "fields": [
                {"Email": "nombre@gmail.com"},
                {"Nombre": "Juan Pérez"},
                {"Descripción": "Solicitud de insumos de papelería para oficinas"},
                {"Cantidad de artículos": "2"},
                {"Monto total": "3505.5"},
                {"Fecha": "06/08/2019"},
                {"Hora": "15:30:00"},
                {"Ciudad": "Madrid"},
                {"Forma de pago": "Contado"},
                {"Proveedores": "[\"Bolimax\",\"Rollerpen\",\"TodoUSB\"]"},
                {"Categoría": "[\"Papelería\",\"Informática\"]"}, 
                {"Pedido": [
                            {"Producto": "Bolígrafo",
                             "Cantidad": "150"
                             "Precio": "750"}, 
                            {"Producto": "Pendrive",
                             "Cantidad": "11"
                             "Precio": "2755.5"}
                           ]},
                {"Detalle del pedido": {
                                "attachmentId": "badbf0e134604c54907ac960a5f862c9",
                                "name": "detalle.pdf",
                                "mimeType": 50,
                                "superType": 0,
                                "creationTime": "2019-08-06T17:16:08.479Z",
                                "size": 47939,
                                "lastEditedUtc": "", 
                                "url": ""
                                    }},
                {"Cuenta activa": "true"},
                {"Web": "www.flokzu.com"},
                {"Cantidad de items": "161"},
                {"Observaciones": "<p style=\"text-align: center;\"><strong>Observaciones:</strong></p>\r\n<p style=\"text-align: center;\">&nbsp;</p>\r\n<p style=\"text-align: left;\">Realizar envío a Calle 1234 de 08 a 18 hs..</p>"}
              ]
}
```


### Formato del mensaje para un webhook de tipo *Task Completed*

En la propiedad *Payload* del *json* se enviará los datos de la Tarea de Usuario realizada y su traza asociada.
El formato será el siguiente:

```javascript
{
  "task_name": "nombre de la tarea completada",
  "last_participant": "usuario que completó la tarea",
  "last_action": "decisión tomada (botón) para que la tarea se complete",
  "reference": "referencia del doc",
  "start_date": "fecha en que se creó la tarea en UTC",
  "end_date": "fecha en que se completó la tarea en UTC"
}
```


### Formato del mensaje para un webhook de tipo *Event Triggered*

En la propiedad Payload del json se enviará la información relacionada con el evento no-interruptivo que se haya ejecutado.

```javascript
{
  "event_name": "nombre del evento activado",
  "reference": "referencia del doc",
  "triggered_date": "fecha en que se ejecutó el evento en UTC"
}
```


### Formato del mensaje para un webhook de tipo *Delete*            

En la propiedad Payload del json se enviará la información relacionada con el documento eliminado,

```javascript
{
  "tenantName": "nombre del tenant",
  "reference": "referencia del doc",
  "documentCreator": "creador del doc",
  "dateCreated": "fecha creacion del documento",
  "info": "resumen del documento",
  "tags": ["tags del documento separados por coma"],
  "downloadKey": "id documento",
  "fields":  [
               {"campo 1": "valor 1"},
               {"campo 2": "valor 2"}	
  ]
}
```

 
### Probar los webhooks

Para probar como funcionan los webhooks puedes ingresar a [https://webhook.site/](https://webhook.site/). Este sitio te brindará una URL para tus pruebas que podrás configurar en Flokzu y visualizar el formato del mensaje enviado directamente desde la plataforma.


