# Webhooks

Los Webhooks (o callbacks) son retornos de llamada de HTTP definidos por el usuario, que son accionados por eventos específicos. Siempre que ocurra un evento de acción, la API de Sinch recolectará los datos e inmediatamente enviará una notificación (solicitud HTTP) a la URL proporcionada por el cliente actualizando el estatus de los mensajes enviados o indicando cuándo recibirá un mensaje.

Cuando reciba un mensaje, la API de Sinch Messaging enviará una notificación de solicitud HTTP POST a la URL del **Webhook** con los detalles.

Es importante que su Webhook retorne una respuesta HTTPS 200 OK para las notificaciones (en un lapso de hasta 200 ms o de manera asíncrona). Caso contrario, la API de Sinch Messaging considerará esa notificación como una falla e intentará nuevamente.

**Importante: Indicar el webhook donde recibirá los mensajes, para que nuestro equipo de soporte pueda asociarlo a su cuenta de Whatsapp**

> Ejemplo

{% tabs %}
{% tab title="cURL" %}

```
{
  "total": 1,
  "data": [
    {
      "id": "8995c40f-1c3a-48d0-98ee-bbc603622a91",
      "correlationId": "...",
      "destination": "5411900000000",
      "origin": "5411900000000",
      "campaignId": 100,
      "campaignAlias": "...",
      "flowId": "...",
      "extraInfo": "...",
      "sent": true,
      "sentStatusCode": 1,
      "sentStatus": "sent status",
      "sentDate": "2017-12-18T17:09:31.891Z",
      "sentAt": 1513616971891,
      "delivered": true,
      "deliveredStatusCode": 1,
      "deliveredStatus": "delivered status",
      "deliveredDate": "2017-12-18T17:09:31.891Z",
      "deliveredAt": 1513616971891,
      "read": true,
      "readDate": "2017-12-18T17:09:31.891Z",
      "readAt": 1513616971891,
      "updatedDate": "2017-12-18T17:09:31.891Z",
      "updatedAt": 1513616971891,
      "type": "MESSAGE"
    }
  ],
  "clientInfo": {
      "customerId": 42,
      "subAccountId": 1291,
      "userId": 1
  }
}
```

{% endtab %}

{% tab title="Ruby" %}

```
{
  "total": 1,
  "data": [
    {
      "id": "8995c40f-1c3a-48d0-98ee-bbc603622a91",
      "correlationId": "...",
      "destination": "5411900000000",
      "origin": "5411900000000",
      "campaignId": 100,
      "campaignAlias": "...",
      "flowId": "...",
      "extraInfo": "...",
      "sent": true,
      "sentStatusCode": 1,
      "sentStatus": "sent status",
      "sentDate": "2017-12-18T17:09:31.891Z",
      "sentAt": 1513616971891,
      "delivered": true,
      "deliveredStatusCode": 1,
      "deliveredStatus": "delivered status",
      "deliveredDate": "2017-12-18T17:09:31.891Z",
      "deliveredAt": 1513616971891,
      "read": true,
      "readDate": "2017-12-18T17:09:31.891Z",
      "readAt": 1513616971891,
      "updatedDate": "2017-12-18T17:09:31.891Z",
      "updatedAt": 1513616971891,
      "type": "MESSAGE"
    }
  ],
  "clientInfo": {
      "customerId": 42,
      "subAccountId": 1291,
      "userId": 1
  }
}
```

{% endtab %}

{% tab title="Python" %}

```
{
  "total": 1,
  "data": [
    {
      "id": "8995c40f-1c3a-48d0-98ee-bbc603622a91",
      "correlationId": "...",
      "destination": "5411900000000",
      "origin": "5411900000000",
      "campaignId": 100,
      "campaignAlias": "...",
      "flowId": "...",
      "extraInfo": "...",
      "sent": true,
      "sentStatusCode": 1,
      "sentStatus": "sent status",
      "sentDate": "2017-12-18T17:09:31.891Z",
      "sentAt": 1513616971891,
      "delivered": true,
      "deliveredStatusCode": 1,
      "deliveredStatus": "delivered status",
      "deliveredDate": "2017-12-18T17:09:31.891Z",
      "deliveredAt": 1513616971891,
      "read": true,
      "readDate": "2017-12-18T17:09:31.891Z",
      "readAt": 1513616971891,
      "updatedDate": "2017-12-18T17:09:31.891Z",
      "updatedAt": 1513616971891,
      "type": "MESSAGE"
    }
  ],
  "clientInfo": {
      "customerId": 42,
      "subAccountId": 1291,
      "userId": 1
  }
}
```

{% endtab %}

{% tab title="PHP" %}

```
{
  "total": 1,
  "data": [
    {
      "id": "8995c40f-1c3a-48d0-98ee-bbc603622a91",
      "correlationId": "...",
      "destination": "5411900000000",
      "origin": "5411900000000",
      "campaignId": 100,
      "campaignAlias": "...",
      "flowId": "...",
      "extraInfo": "...",
      "sent": true,
      "sentStatusCode": 1,
      "sentStatus": "sent status",
      "sentDate": "2017-12-18T17:09:31.891Z",
      "sentAt": 1513616971891,
      "delivered": true,
      "deliveredStatusCode": 1,
      "deliveredStatus": "delivered status",
      "deliveredDate": "2017-12-18T17:09:31.891Z",
      "deliveredAt": 1513616971891,
      "read": true,
      "readDate": "2017-12-18T17:09:31.891Z",
      "readAt": 1513616971891,
      "updatedDate": "2017-12-18T17:09:31.891Z",
      "updatedAt": 1513616971891,
      "type": "MESSAGE"
    }
  ],
  "clientInfo": {
      "customerId": 42,
      "subAccountId": 1291,
      "userId": 1
  }
}
```

{% endtab %}

{% tab title="Java" %}

```
{
  "total": 1,
  "data": [
    {
      "id": "8995c40f-1c3a-48d0-98ee-bbc603622a91",
      "correlationId": "...",
      "destination": "5411900000000",
      "origin": "5411900000000",
      "campaignId": 100,
      "campaignAlias": "...",
      "flowId": "...",
      "extraInfo": "...",
      "sent": true,
      "sentStatusCode": 1,
      "sentStatus": "sent status",
      "sentDate": "2017-12-18T17:09:31.891Z",
      "sentAt": 1513616971891,
      "delivered": true,
      "deliveredStatusCode": 1,
      "deliveredStatus": "delivered status",
      "deliveredDate": "2017-12-18T17:09:31.891Z",
      "deliveredAt": 1513616971891,
      "read": true,
      "readDate": "2017-12-18T17:09:31.891Z",
      "readAt": 1513616971891,
      "updatedDate": "2017-12-18T17:09:31.891Z",
      "updatedAt": 1513616971891,
      "type": "MESSAGE"
    }
  ],
  "clientInfo": {
      "customerId": 42,
      "subAccountId": 1291,
      "userId": 1
  }
}
```

{% endtab %}
{% endtabs %}

{% hint style="danger" %}
**Importante: Indicar el webhook donde recibirá los mensajes, para que nuestro equipo de soporte pueda asociarlo a su cuenta de Whatsapp**
{% endhint %}

| Campo          | Detalles                           | Tipo       |
| -------------- | ---------------------------------- | ---------- |
| total          | Número de callbacks en la llamada. | String     |
| data           | Lista de callbacks.                | Data\[]    |
| clientInfo     | Información del cliente            | ClientInfo |
| ConversationID |                                    | String     |

#### data: <a href="#data" id="data"></a>

| Campo               | Detalles                                                                                                                                                                                        | Tipo    |
| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
| id                  | ID del último mensaje                                                                                                                                                                           | String  |
| correlationId       | Un ID único configurado por usted para coincidir con el estado del mensaje (callback y DLR). Este parámetro es opcional y puede usar el ID generado por Sinch Messaging para esta coincidencia. | String  |
| destination         | Teléfono al que se envió el mensaje (incluido el código de país). Ejemplo: 5411900000000.                                                                                                       | String  |
| origin              | Teléfono que identifica la cuenta de WhatsApp (incluido el código de país). Ejemplo: 5411900000000.                                                                                             | String  |
| campaignId          | ID de campaña previamente definido.                                                                                                                                                             | String  |
| campaignAlias       | Alias de campaña previamente definido.                                                                                                                                                          | String  |
| extraInfo           | Información adicional enviada con el mensaje original.                                                                                                                                          | String  |
| sent                | Indica si el mensaje fue enviado.                                                                                                                                                               | Boolean |
| sentStatusCode      | Código de estado generado por Sinch Messaging para un mensaje que indica el estado de envío.                                                                                                    | Number  |
| sentStatus          | Descripción del estado enviado.                                                                                                                                                                 | Boolean |
| sentDate            | Fecha en que se envió el mensaje. Formato: yyyy-MM-dd’T'HH:mm:ssZ.                                                                                                                              | String  |
| sentAt              | Hora en que se envió el mensaje, utilizando el formato Unix\_time                                                                                                                               | Number  |
| delivered           | Indica si el mensaje fue entregado al destino.                                                                                                                                                  | Boolean |
| deliveredStatusCode | Código de estado generado por Sinch Messaging para indicar que el mensaje fue entregado.                                                                                                        | Number  |
| deliveredStatus     | Descripción del estado de entrega                                                                                                                                                               | String  |
| deliveredDate       | Fecha en que se entregó el mensaje. Formato: yyyy-MM-dd’T'HH:mm:ssZ                                                                                                                             | String  |
| deliveredAt         | Hora en que se entregó el mensaje, utilizando el formato Unix\_time                                                                                                                             | Number  |
| read                | Indica si el mensaje fue leído por el destinatario.                                                                                                                                             | Boolean |
| readDate            | Fecha en que se leyó el mensaje. Formato: yyyy-MM-dd’T'HH:mm:ssZ                                                                                                                                | String  |
| readAt              | Hora en que se leyó el mensaje, utilizando el formato Unix\_time                                                                                                                                | String  |
| updatedDate         | Fecha en que se actualizó el estado del mensaje. Formato: yyyy-MM-dd’T'HH:mm:ssZ                                                                                                                | String  |
| updatedAt           | Fecha en que se actualizó el estado del mensaje, utilizando el formato Unix\_time                                                                                                               | String  |
| type                | El tipo de entidad del que trata este objeto de estado. Actualmente, la única opción disponible es “mensaje”.                                                                                   | String  |

#### clientInfo <a href="#clientinfo" id="clientinfo"></a>

| Campo        | Detalles                        | Tipo   |
| ------------ | ------------------------------- | ------ |
| customerId   | Identificación del cliente.     | Number |
| subAccountId | Identificación de la subcuenta. | Number |
| userId       | Identificación del usuario.     | Number |

#### Status <a href="#status" id="status"></a>

Descripción del Status que nosotros podemos enviar en la devolución de llamada:

| Status             | Descripción                               | Equivalente en WhatsApp para dispositivos móveis |
| ------------------ | ----------------------------------------- | ------------------------------------------------ |
| SENT\_SUCCESS      | Mensaje recibido por servidor de WhatsApp | Una marca de verificación                        |
| DELIVERED\_SUCCESS | Mensaje de entrega para el destinatario   | Dos marcas de verificación                       |
| READ\_SUCCESS      | Mensaje leído por el destinatario         | Dos marcas de verificación azules                |

#### Otros Status <a href="#otros-status" id="otros-status"></a>

Estos son los códigos devueltos en los campos sentStatusCode y deliveryStatusCode.

<table><thead><tr><th>Código de envio</th><th width="176">Código de entrega</th><th>Status</th><th>Significado</th></tr></thead><tbody><tr><td>102</td><td></td><td>CARRIER COMMUNICATION ERROR</td><td>Error al cargar multimedia para WhatsApp.</td></tr><tr><td>103</td><td></td><td>REJECTED_BY_CARRIER</td><td>Se produjo un error en la base de datos.</td></tr><tr><td>2</td><td>101</td><td>EXPIRED</td><td>Mensaje expirado.</td></tr><tr><td>2</td><td>104</td><td>NOT_DELIVERED</td><td>Posibles Causas:Límite alcanzado: se han intentado demasiados mensajes enviados,o no envía un mensaje porque el número de teléfono de destino no existe,o la estructura de la plantilla no existe,o no pudo enviar un mensaje porque el número de destino está fuera del tiempo de sesión abierta de 24 horas para recibir mensajes libremente. o hubo un error de carga de medios (error desconocido), o no envía un mensaje porque su cuenta no es elegible en Facebook Business Manager,o hubo un error de carga temporal. Intentar nuevamente más tarde.</td></tr><tr><td>202</td><td></td><td>EXPIREDINVALID_DESTINATION_NUMBER</td><td>Contacto de WhatsApp inválido.</td></tr><tr><td>204</td><td></td><td>DESTINATION_BLOCKED_BY_OPTOUT</td><td>Destino bloqueado por Opt-Out.</td></tr><tr><td>207</td><td></td><td>INVALID_MESSAGE_TEXT</td><td>El valor del parámetro no es válido.</td></tr><tr><td>209</td><td></td><td>INVALID_CONTENT</td><td>Tipo de mensaje UNKNOWN inválido.</td></tr><tr><td>210</td><td></td><td>INVALID_SESSION</td><td>La sesión no está abierta o ninguna plantilla de fallback está configurada.</td></tr><tr><td>301</td><td></td><td>INTERNAL_ERROR</td><td>No es posible verificar contactos desde la API de WhatsApp.</td></tr><tr><td></td><td></td><td></td><td></td></tr></tbody></table>

#### Errores <a href="#errores" id="errores"></a>

<table data-header-hidden><thead><tr><th width="193"></th><th></th></tr></thead><tbody><tr><td><strong>HTTP Code</strong></td><td><strong>Description</strong></td></tr><tr><td>2xx</td><td>Success</td></tr><tr><td>200</td><td>Success (OK)</td></tr><tr><td>201</td><td>Successfully created (For POST requests)</td></tr><tr><td>302</td><td>Found</td></tr><tr><td>4xx</td><td>Client Errors</td></tr><tr><td>400</td><td>Request was invalid</td></tr><tr><td>401</td><td>Unauthorized</td></tr><tr><td>403</td><td>Forbidden</td></tr><tr><td>404</td><td>Not found</td></tr><tr><td>405</td><td>Method not allowed</td></tr><tr><td>412</td><td>Precondition failed</td></tr><tr><td>429</td><td>Too many requests</td></tr><tr><td>5xx</td><td>Server Errors</td></tr><tr><td>500</td><td>Internal server error</td></tr><tr><td>504</td><td>Timeout</td></tr></tbody></table>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs-es.sinch.com/documentaciontecnicawhatsapp/sinch-messaging-whatsapp-api/webhooks.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
