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

# Webhook de fin de conversation

> Webhook envoyé après la fin d’une conversation de chat, contenant la transcription, les variables extraites et les données client

<Warning>
  **API Famulor 1.0 (héritée).** Cette page concerne uniquement Famulor 1.0 (`app.famulor.de`) et est conservée pour la compatibilité. Pour la plateforme actuelle, consultez la [référence API Famulor 2.0](/fr/api-reference/introduction).
</Warning>

> Webhook envoyé après la fin d’une conversation de chat, contenant la transcription, les variables extraites et les données client

Le webhook de fin de conversation est automatiquement envoyé à l’URL de webhook que vous avez spécifiée une fois qu’une conversation de chat (WhatsApp ou widget Web) se termine. Ce webhook contient la transcription complète, les variables extraites, les informations client et les détails de l’expéditeur.

## Configuration du webhook

Pour activer les webhooks de fin de conversation :

1. Utilisez le point de terminaison API [Activer le webhook de fin de conversation](/fr/api-v1/assistants/enable-conversation-ended-webhook)
2. Fournissez l’URL de webhook où les notifications seront envoyées
3. Configurez éventuellement des variables post-appel sur votre assistant pour extraire des données structurées des conversations

## Format de la requête

Le webhook est envoyé sous forme de requête POST à l’URL que vous avez configurée, avec le payload JSON suivant :

### Structure du payload

<ResponseField name="id" type="integer">
  Identifiant numérique de la conversation (le même `id` affiché dans l’URL de conversation du tableau de bord). Utilisez `conversation_id` (UUID) lors des appels à l’API.
</ResponseField>

<ResponseField name="conversation_id" type="string">
  Identifiant unique (UUID) de la conversation
</ResponseField>

<ResponseField name="assistant_id" type="string">
  Identifiant unique (UUID) de l’assistant ayant traité la conversation
</ResponseField>

<ResponseField name="type" type="string">
  Le type de conversation. Valeurs possibles : `widget`, `whatsapp`
</ResponseField>

<ResponseField name="message_count" type="integer">
  Nombre total de messages échangés dans la conversation
</ResponseField>

<ResponseField name="status" type="string">
  Statut de la conversation. Valeur : `ended`
</ResponseField>

<ResponseField name="extracted_variables" type="object">
  Variables extraites par l’IA en fonction de la configuration du schéma post-appel de votre assistant

  <Expandable title="Exemple de variables extraites">
    <ResponseField name="status" type="boolean">
      Indique si l’objectif de la conversation a été atteint
    </ResponseField>

    <ResponseField name="summary" type="string">
      Résumé de la conversation
    </ResponseField>

    <ResponseField name="custom_variable" type="string|number|boolean">
      Toute variable personnalisée que vous avez définie dans la configuration de l’assistant
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="input_variables" type="object">
  Variables transmises à l’assistant au début de la conversation (par ex., depuis les champs du formulaire pré-chat ou des flux d’automatisation)
</ResponseField>

<ResponseField name="transcript" type="array">
  Tableau d’objets message représentant la conversation complète, du plus ancien au plus récent

  <Expandable title="Propriétés du message">
    <ResponseField name="role" type="string">
      Le rôle de l’expéditeur : `user`, `assistant` ou `system` (les messages `system` marquent des événements tels qu’une prise en charge de la conversation par un agent humain)
    </ResponseField>

    <ResponseField name="content" type="string">
      Le texte du message. Pour les messages média, il s’agit de la légende ou d’un court espace réservé (par ex. `[Image]`) ; les notes audio contiennent le texte transcrit
    </ResponseField>

    <ResponseField name="timestamp" type="string">
      Horodatage ISO 8601 du message individuel, dans le fuseau horaire configuré de l’utilisateur. Permet d’ordonner les messages et de voir la durée d’une conversation (utile pour les chats s’étalant sur plusieurs jours)
    </ResponseField>

    <ResponseField name="timestamp_unix" type="integer">
      Horodatage Unix (secondes depuis l’epoch) du message individuel. Pratique pour les calculs — par ex. calculer l’écart entre deux messages sans analyser la chaîne ISO
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="formatted_transcript" type="string">
  Transcription formatée lisible par un humain avec les préfixes `AI:` et `Customer:`
</ResponseField>

<ResponseField name="attachments" type="array">
  Fichiers média (images, vidéos, documents) partagés pendant la conversation. Chaque entrée inclut une URL directe que vous pouvez transmettre à des services externes (par exemple, analyse d’image ou de vidéo). Il s’agit d’un tableau vide lorsqu’aucun média n’a été partagé — les médias sont généralement présents sur les conversations WhatsApp.

  <Expandable title="Propriétés de la pièce jointe">
    <ResponseField name="type" type="string">
      La catégorie de média. Valeurs possibles : `image`, `video`, `audio`, `document`
    </ResponseField>

    <ResponseField name="url" type="string">
      URL directe pour télécharger le fichier média
    </ResponseField>

    <ResponseField name="filename" type="string">
      Nom de fichier d’origine du média
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="customer_phone" type="string">
  Numéro de téléphone du client (disponible pour les conversations WhatsApp, `null` pour les conversations widget)
</ResponseField>

<ResponseField name="customer_name" type="string">
  Nom du client si fourni (par ex., depuis un formulaire pré-chat), ou `null`
</ResponseField>

<ResponseField name="sender" type="object">
  Informations sur l’expéditeur WhatsApp (présentes uniquement pour les conversations WhatsApp, `null` pour le widget)

  <Expandable title="Propriétés de l’expéditeur">
    <ResponseField name="phone_number" type="string">
      Le numéro de téléphone de l’expéditeur WhatsApp
    </ResponseField>

    <ResponseField name="display_name" type="string">
      Le nom d’affichage de l’expéditeur WhatsApp
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="created_at" type="string">
  Horodatage ISO 8601 du début de la conversation (dans le fuseau horaire configuré de l’utilisateur)
</ResponseField>

<ResponseField name="ended_at" type="string">
  Horodatage ISO 8601 de la fin de la conversation (dans le fuseau horaire configuré de l’utilisateur)
</ResponseField>

<ResponseExample>
  ```json Conversation Ended Webhook Payload theme={null} theme={null}
  {
    "id": 1042,
    "conversation_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "assistant_id": "f9e8d7c6-b5a4-3210-fedc-ba9876543210",
    "type": "widget",
    "message_count": 8,
    "status": "ended",
    "extracted_variables": {
      "status": true,
      "summary": "Customer asked about pricing plans and was interested in the Pro plan"
    },
    "input_variables": {
      "name": "John Doe",
      "email": "john@example.com"
    },
    "transcript": [
      {
        "role": "assistant",
        "content": "Hi! How can I help you today?",
        "timestamp": "2026-02-23T09:30:00+01:00",
        "timestamp_unix": 1740299400
      },
      {
        "role": "user",
        "content": "I have a question about your service.",
        "timestamp": "2026-02-23T09:31:12+01:00",
        "timestamp_unix": 1740299472
      },
      {
        "role": "assistant",
        "content": "Of course! I'd be happy to help. What would you like to know?",
        "timestamp": "2026-02-23T09:31:18+01:00",
        "timestamp_unix": 1740299478
      },
      {
        "role": "user",
        "content": "What are your pricing plans?",
        "timestamp": "2026-02-23T09:32:05+01:00",
        "timestamp_unix": 1740299525
      }
    ],
    "formatted_transcript": "AI: Hi! How can I help you today?\nCustomer: I have a question about your service.\nAI: Of course! I'd be happy to help. What would you like to know?\nCustomer: What are your pricing plans?",
    "attachments": [],
    "customer_phone": null,
    "customer_name": "John Doe",
    "sender": null,
    "created_at": "2026-02-23T09:30:00+01:00",
    "ended_at": "2026-02-23T10:00:00+01:00"
  }
  ```

  ```json WhatsApp Conversation Ended Webhook theme={null} theme={null}
  {
    "id": 1043,
    "conversation_id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
    "assistant_id": "f9e8d7c6-b5a4-3210-fedc-ba9876543210",
    "type": "whatsapp",
    "message_count": 12,
    "status": "ended",
    "extracted_variables": {
      "status": true,
      "summary": "Customer scheduled an appointment for next week"
    },
    "input_variables": {},
    "transcript": [
      {
        "role": "user",
        "content": "Hello, I'd like to book an appointment",
        "timestamp": "2026-02-23T14:00:00+01:00",
        "timestamp_unix": 1740315600
      },
      {
        "role": "assistant",
        "content": "Hi! I'd be happy to help you book an appointment. What date works best for you?",
        "timestamp": "2026-02-23T14:00:08+01:00",
        "timestamp_unix": 1740315608
      },
      {
        "role": "user",
        "content": "[Image]",
        "timestamp": "2026-02-23T14:05:30+01:00",
        "timestamp_unix": 1740315930
      }
    ],
    "formatted_transcript": "Customer: Hello, I'd like to book an appointment\nAI: Hi! I'd be happy to help you book an appointment. What date works best for you?\nCustomer: [Image]",
    "attachments": [
      {
        "type": "image",
        "url": "https://storage.famulor.de/conversations/attachments/abc123.jpg",
        "filename": "appointment-form.jpg"
      }
    ],
    "customer_phone": "+1234567890",
    "customer_name": null,
    "sender": {
      "phone_number": "+19876543210",
      "display_name": "My Business"
    },
    "created_at": "2026-02-23T14:00:00+01:00",
    "ended_at": "2026-02-23T14:25:00+01:00"
  }
  ```
</ResponseExample>

## Comportement de nouvelle tentative

Si votre point de terminaison de webhook renvoie un code de statut non-2xx ou si la requête échoue, le système réessaiera :

| Tentative              | Délai        |
| ---------------------- | ------------ |
| 1re nouvelle tentative | 30 secondes  |
| 2e nouvelle tentative  | 60 secondes  |
| 3e nouvelle tentative  | 120 secondes |

Après 3 tentatives infructueuses, la livraison du webhook est marquée comme échouée et aucune nouvelle tentative n’est effectuée.

## Remarques importantes

* Les champs `conversation_id` et `assistant_id` sont des UUID, et non des identifiants entiers
* Le champ `sender` n’est renseigné que pour les conversations WhatsApp ; il vaut `null` pour les conversations widget Web
* Le champ `customer_phone` n’est disponible que pour les conversations WhatsApp
* Le champ `customer_name` provient des données du formulaire pré-chat ou du contexte de la conversation
* Les horodatages utilisent le fuseau horaire configuré de l’utilisateur (format ISO 8601)
* Les `extracted_variables` sont renseignées à partir de l’évaluation du schéma post-appel de votre assistant
* Les `input_variables` contiennent des données provenant des formulaires pré-chat (widget Web) ou des flux d’automatisation
* Le tableau `attachments` liste les médias (images, vidéos, documents) partagés pendant la conversation, chacun avec une `url` téléchargeable — utile pour transmettre à des outils d’analyse externes. Il s’agit d’un tableau vide lorsqu’aucun média n’a été partagé (le plus souvent sur les conversations widget Web)
