> ## Documentation Index
> Fetch the complete documentation index at: https://docs.volubile.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhook

> Les webhooks fournissent des notifications instantanées lorsque vos appels téléphoniques sont terminés.

## Configurer le webhook

Fournissez l'`URL de Webhook` où vous souhaitez que Volubile envoie les notifications dans les [Paramètres d'intégration Webhook](https://eu.volubile.ai/integrations/webhooks)

## Webhook payload

Une fois un appel terminé ou échoué, une requête `POST` sera envoyée à votre `URL de Webhook` avec les détails de l'appel. Identique à l'endpoint [*Get a call*](/api-reference/calls/get).

```json theme={null}
{
   "id":"3c90c3cc-0d44-4b50-8888-8dd25736052a",
   "agentId":"3c90c3cc-0d44-4b50-8888-8dd25736052a",
   "phone":"+33612345678",
   "type":"INBOUND",
   "duration":360,
   "startTime":"2024-07-30T14:35:00Z",
   "endTime":"2024-07-30T14:41:00Z",
   "anonymous":false,
   "status":"COMPLETED",
   "extractors":[
      {
         "name":"customer",
         "value":[
            {
               "name":"firstname",
               "value":[
                  "John"
               ]
            },
            {
               "name":"lastname",
               "value":[
                  "Doe"
               ]
            },
            {
               "name":"address",
               "value":[
                  "123 Main St"
               ]
            }
         ]
      },
      {
         "name":"example",
         "value":[
            "example1",
            "example2"
         ]
      }
   ],
   "extractedData":{
      "customer":{
         "firstname":"John",
         "lastname":"Doe",
         "address":"123 Main St"
      },
      "example":"example1"
   },
   "classifiers":[
      {
         "name":"Customer's request",
         "value":"Refund"
      },
      {
         "name":"Sentiment",
         "value":"Positive"
      }
   ],
   "classificationData":{
      "Customer's request":"Refund",
      "Sentiment":"Positive"
   },
   "context":{
      "firstName":"firstname",
      "lastName":"lastname",
      "commandNumber":"5HZ99FRT",
      "system.phone":"+33612345678"
   },
   "recorded":true,
   "summary":"Discussed project requirements and next steps.",
   "created":"2024-07-30T14:45:00Z"
}
```

## Sécuriser le webhook

Vous pouvez choisir d'activer la sécurité pour les webhooks en générant un secret dans les [Paramètres d'intégration Webhook](https://eu.volubile.ai/integrations/webhooks).

Lorsqu'elle est activée, nous inclurons un `X-Webhook-Signature` dans les en-têtes de requête vers votre `URL de Webhook`, vous permettant de vérifier que la payload provient de Volubile.

Voici un exemple de code démontrant comment vérifier la `signature HMAC` :

<CodeGroup>
  ```java Java theme={null}
  import org.apache.commons.codec.binary.Hex;
  import java.security.InvalidKeyException;
  import java.security.NoSuchAlgorithmException;
  import javax.crypto.Mac;
  import javax.crypto.spec.SecretKeySpec;
  import static java.nio.charset.StandardCharsets.UTF_8;
  ...

  final var SECRET_KEY = "{volubile - webhook - secret}";

  final var payload = """
  {
      "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
      "agentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
      "type": "INBOUND",
      ...
  }
  """;

  try {
  final var mac = Mac.getInstance("HmacSHA256");
  mac.init(new SecretKeySpec(SECRET_KEY.getBytes(UTF_8), "HmacSHA256"));
  final byte[] rawHmac = mac.doFinal(payload.getBytes());
  final byte[] hexBytes = new Hex().encode(rawHmac);

  final var signature = new String(hexBytes, UTF_8);
  ...
  } catch (final NoSuchAlgorithmException | InvalidKeyException e) {
  logger.error("Error occurred!");
  }
  ```

  ```typescript TypeScript theme={null}
  const crypto = require("crypto");

  const SECRET_KEY = "{volubile - webhook - secret}";

  const payload = JSON.stringify({
  "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
  "agentId": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
  "type": "INBOUND",
  ...
  });

  const signature = crypto
  .createHmac("sha256", SECRET_KEY)
  .update(payload, "utf-8")
  .digest("hex");

  ...
  ```
</CodeGroup>

## Retry des webhooks

Si votre serveur retourne une erreur 50x (code d'erreur 500 ou supérieur), nous rejouerons la requête jusqu'à 4 fois avec un délai incrémental de 1 seconde afin de ne pas surcharger vos serveurs.
