8. Intégrations — Webhooks sortants
Les webhooks sortants permettent à NoviaMind de notifier vos propres systèmes dès que vos données CRM changent — sans avoir à interroger l'API en continu. Usages typiques : déclencher un workflow n8n / Make / Zapier à la capture d'un nouveau prospect, ou maintenir un outil interne synchronisé.
Accédez-y depuis Intégrations → Webhooks sortants dans la section CRM.
8.9 Événements disponibles
| Événement | Envoyé quand |
|---|---|
lead.created | Un prospect est créé |
lead.updated | Un prospect est mis à jour |
property.created | Un bien est créé |
property.updated | Un bien est mis à jour |
realtor.created | Un agent est créé |
realtor.updated | Un agent est mis à jour |
Un webhook s'abonne à un ou plusieurs événements — seuls ceux-ci déclenchent une livraison vers votre URL.
8.10 Créer un webhook
- Allez dans Intégrations → Webhooks sortants
- Cliquez sur « Ajouter un webhook »
- Saisissez votre URL de rappel (obligatoirement en
https://en production ;http://n'est accepté que pour les tests locaux, par ex. un tunnel ngrok) - Ajoutez éventuellement une description (ex. « workflow n8n production »)
- Sélectionnez les événements auxquels vous abonner
- Cliquez sur « Enregistrer »
⚠️ Enregistrez immédiatement le secret de signature. Après la création, NoviaMind affiche le secret (
whsec_...) une seule et unique fois. Toute consultation ultérieure le montre masqué. En cas de perte, supprimez le webhook et créez-en un nouveau.
💡 Les URL pointant vers des adresses réseau privées ou internes sont rejetées pour des raisons de sécurité.
8.11 Ce que reçoit votre point de terminaison
Chaque livraison est une requête HTTP POST avec un corps JSON :
Et ces en-têtes :
| En-tête | Contenu |
|---|---|
X-Webhook-Id | Identifiant unique de la livraison (aussi le id du corps) |
X-Webhook-Event | Nom de l'événement (ex. lead.created) |
X-Webhook-Signature | sha256=<hex> — signature HMAC-SHA256 du corps brut |
Format de data par entité
data n'est pas un DTO de réponse trié sur le volet — c'est la ligne prospect/bien/agent complète telle qu'elle est stockée. Elle peut donc contenir plus de champs que ceux documentés ci-dessous (traitez les champs inconnus comme compatibles avec les évolutions futures, ne les rejetez pas), et tout champ nullable que vous n'utilisez pas vaut simplement null.
lead.created / lead.updated — data est le prospect. Capture réelle (issue d'un appel avec l'agent IA, secrets/données personnelles raccourcis, notes et les blocs de collecte de données IA dans custom_fields / raw_data tronqués par souci de concision — en pratique notes contient le résumé complet de l'appel et custom_fields.* une entrée par champ de collecte configuré) :
💡 Les identifiants internes de suivi d'appel sont retirés avant que la charge utile ne quitte NoviaMind — vous ne verrez jamais de champ
conversation_ids, même s'il s'agit d'une vraie colonne de l'enregistrement sous-jacent.💡
custom_fieldsetraw_data.data_collection_resultsproviennent tous deux de l'extraction de champs par l'IA et se recoupent largement (raw_dataest l'extraction telle que capturée à l'origine ;custom_fieldsest ce qui est réellement persisté sur le prospect). Chaque entrée porte unvalue, unrationale(pourquoi l'IA a extrait cette valeur) et undata_collection_id— certaines entrées portent aussi un blocjson_schemadécrivant le type/l'énumération attendus du champ.valuevaut fréquemmentnulllorsque l'IA n'a rien trouvé à extraire pour ce champ lors de l'appel.
property.created / property.updated — data est le bien :
realtor.created / realtor.updated — data est l'agent :
💡 Les livraisons
webhook.test(via le bouton « Envoyer un test ») ne correspondent à aucune des formes ci-dessus —datavaut simplement{ "message": "This is a test webhook delivery from NoviaMind." }.
Vérifier la signature
Calculez un HMAC-SHA256 des octets bruts du corps de la requête (et non de l'objet re-sérialisé/parsé — une différence d'ordre des clés ou d'espaces suffit à faire échouer la comparaison) avec votre secret de signature, puis comparez le résultat à l'en-tête X-Webhook-Signature avec une comparaison à temps constant. Exemple Node/Express, en supposant que la route a accès au corps brut (par ex. express.raw({ type: 'application/json' }) monté uniquement sur cette route, avant tout parseur de corps JSON) :
💡 Dans n8n, le nœud Webhook vous donne accès au corps brut via son option de données binaires/brutes — vérifiez-le dans un nœud Code avec la même logique avant de faire confiance à
event.data, ou gardez simplement l'URL secrète si la vérification de signature n'est pas nécessaire pour votre usage.
Votre point de terminaison doit répondre avec un statut 2xx en moins de 10 secondes. Toute autre réponse compte comme un échec.
8.12 Tester un webhook
Cliquez sur « Envoyer un test » sur la ligne d'un webhook. NoviaMind envoie un événement synthétique webhook.test, signé exactement comme une livraison réelle, et vous affiche le statut HTTP renvoyé par votre point de terminaison — idéal pour valider votre workflow n8n ou votre vérification de signature avant la mise en production.
8.13 Nouvelles tentatives, échecs et désactivation automatique
- Chaque événement est livré avec jusqu'à 5 tentatives et un backoff exponentiel.
- La ligne du webhook affiche le statut de la dernière livraison et le nombre d'échecs consécutifs.
- Après 20 échecs consécutifs, le webhook est désactivé automatiquement afin qu'une URL morte cesse de consommer des tentatives de livraison. Corrigez votre point de terminaison, puis cliquez sur « Réactiver ».
- Toute livraison réussie remet le compteur d'échecs à zéro.
Historique des livraisons
Cliquez sur « Historique » pour consulter les dernières livraisons (jusqu'à 50, conservées 30 jours) : horodatage, événement, statut HTTP et numéro de tentative. Seules les métadonnées de résultat sont conservées — jamais le contenu de la charge utile.
8.14 Gérer les webhooks
| Action | Qui peut le faire |
|---|---|
| Consulter les webhooks et l'historique | Tous les membres de l'équipe |
| Créer, modifier, tester, activer/désactiver | Administrateurs et membres réguliers |
| Supprimer | Administrateurs uniquement |
- Activer / Désactiver : suspendez les livraisons sans perdre la configuration (interrupteur sur chaque ligne).
- Modifier : changez à tout moment l'URL, la description ou les événements abonnés. Le secret de signature ne change jamais.
- Renouveler le secret : supprimez le webhook et créez-en un nouveau.
💡 Les développeurs trouveront la référence API complète (points de terminaison, schémas, détails de signature) dans la documentation API accessible depuis la fenêtre des webhooks.