Aller au contenu
FantomHunt
Se connecter

29 événements de prospection, signés et relancés.

Chaque événement coché part en POST JSON signé vers votre adresse https : une réponse LinkedIn, un rendez-vous pris, un statut qui change. Si votre serveur ne répond pas par un code 2xx en 10 secondes, la livraison est relancée jusqu’à cinq fois, sur près de trois heures.

  • Signature HMAC-SHA256 horodatée
  • 5 relances sur près de 3 heures
  • Jusqu’à 10 webhooks par compte

Compte gratuit (sans CB) · Webhooks dès Essentiel, 29 € par mois · Déjà client : Paramètres › API

Mis à jour le

Un webhook en place, en quatre gestes.

Un webhook FantomHunt envoie un POST JSON signé à l’adresse https de votre choix, pour chaque événement coché. Il se crée dans Paramètres › API, sans clé API, et il est inclus dès Essentiel, 29 € par mois. La section reste visible, verrouillée, avec un compte gratuit.

Créer le webhook, puis l’essayer

  1. Dans Paramètres › API, bloc Webhooks, cliquez sur Ajouter un webhook et collez l’adresse de votre serveur, ou celle d’un déclencheur Zapier, Make ou n8n. Elle doit être en https, sur le port 443, et publique.
  2. Cochez vos événements : « Réponse reçue » et « Rendez-vous pris » le sont d’office. Pour n’en recevoir qu’une partie, réglez Seulement pour.
  3. Cliquez sur Envoyer un test : votre adresse reçoit test.ping, signé comme une vraie livraison, et l’écran affiche « Test reçu » avec le code renvoyé par votre serveur. Les champs de la fiche arrivent avec le premier vrai événement.
  4. Cliquez sur Secret sous votre webhook et copiez la valeur (whsec_…), puis vérifiez la signature de chaque livraison.

Pas de connecteur à installer : Zapier, Make ou n8n reçoivent la livraison comme n’importe quel webhook. Voir la recette pas à pas pour Zapier et ce qui se branche, outil par outil.

Ce que reçoit votre adresse au test
{
  "evenement": "test.ping",
  "cree_le": "2026-09-22T07:58:00.000Z",
  "donnees": { "message": "Bonjour de FantomHunt : votre webhook fonctionne." }
}

Ce qu’il faut pour recevoir vos événements

  • Une offre payanteEssentiel ou Croissance : les webhooks n’ont pas besoin de clé API.
    • Essentiel : 29 € par mois, sans engagement
    • Jusqu’à 10 webhooks par compte
    • Section visible, verrouillée, en Découverte
    Comparer les offres en détail
  • L’extension, pour LinkedIn et WhatsAppRéponses, invitations acceptées et messages LinkedIn ou WhatsApp remontent par l’extension, navigateur ouvert.
    • Votre session, sans mot de passe à confier
    • Les emails, eux, sont lus par nos serveurs
    • Les livraisons partent toujours de nos serveurs
    L’extension, dans votre navigateur

Ce que reçoit votre serveur, champ par champ.

L’enveloppe et les en-têtes

Chaque livraison est un objet JSON à trois clés : evenement (le code), cree_le (le moment de l’événement, en UTC) et donnees. Trois en-têtes l’accompagnent : Content-Type: application/json, User-Agent: FantomHunt-Webhooks/1.0 et X-Fantomhunt-Signature. L’ordre des clés n’est pas celui de nos exemples : lisez-les par leur nom.

Une réponse reçue sur LinkedIn (exemple fictif)
{
  "evenement": "reponse.recue",
  "cree_le": "2026-09-30T09:13:58.000Z",
  "donnees": {
    "canal": "linkedin",
    "prospect": {
      "id": "3f6c2a10-8b4e-4d2a-9c1f-5e7a9b0d1c22",
      "nom": "Camille Roussel",
      "entreprise": "Skova",
      "poste": "Directrice commerciale",
      "url_linkedin": "https://www.linkedin.com/in/…",
      "localisation": "Lyon, France",
      "email": "camille.roussel@skova.fr",
      "email_score": null,
      "telephone": null,
      "statut": "replied",
      "score": 92,
      "source": "extension",
      "recherche_id": "4a7e…",
      "offre_id": "9c1d…",
      "offre": { "id": "9c1d…", "nom": "Pilotage de la performance B2B" },
      "cree_le": "2026-09-22T08:10:00.000Z",
      "modifie_le": "2026-09-30T09:13:58.000Z",
      "contacte_le": "2026-09-23T09:00:00.000Z",
      "connecte_le": "2026-09-24T16:20:00.000Z",
      "repondu_le": "2026-09-30T09:13:58.000Z",
      "rdv_le": null,
      "etiquettes": ["Chaud"],
      "campagnes": [{ "id": "b3f0…", "nom": "Directeurs commerciaux" }]
    }
  }
}
Les en-têtes
Content-Type: application/json
User-Agent: FantomHunt-Webhooks/1.0
X-Fantomhunt-Signature: t=1790759640,v1=0a5df15b006908b98c9fcbe714012b372ac71e178ee74a9238b7cac6e0bc7076

La fiche d’un prospect LinkedIn

Ce sont les mêmes fiches que l’API, avec deux différences : les étiquettes y sont des noms, et la note n’y figure jamais. La fiche est lue quand la livraison est préparée, au plus une minute après l’événement, puis figée : une relance renvoie la même.

Les champs de la fiche d’un prospect
ChampCe que vous recevez
idL’identifiant stable de la fiche : gardez-le pour éviter les doublons.
nom, entreprise, poste, url_linkedin, localisationLa personne et son profil.
email, telephoneQuand ils ont été trouvés ou débloqués par votre compte ou votre équipe ; sinon null.
email_scoreUn indice de fiabilité de l’email, le plus souvent vide (null).
statutLe statut en code (les valeurs sont dans la référence de l’API).
score✦ Le Score IA, de 0 à 100, quand le profil est noté ; sinon null.
source, recherche_idD’où vient la fiche.
offre_id, offre, etiquettes, campagnesL’offre, vos étiquettes (en noms) et les campagnes en cours.
cree_le, modifie_le, contacte_le, connecte_le, repondu_le, rdv_leLa date de chaque étape, ou null.

La fiche d’un contact WhatsApp ou email

Un contact arrive sous contact, avec une fiche courte : id, nom, telephone (WhatsApp) ou email, prospect_id (la fiche LinkedIn liée, ou null), statut, offre, repondu_le, rdv_le, derniere_activite_le, cree_le, etiquettes et campagnes (celles de la fiche LinkedIn liée). Ni entreprise, ni poste, ni Score IA.

Un statut changé sur un contact WhatsApp (exemple fictif)
{
  "evenement": "statut.change",
  "cree_le": "2026-09-24T10:12:44.000Z",
  "donnees": {
    "canal": "whatsapp",
    "statut": "rdv",
    "statut_precedent": "actif",
    "contact": {
      "id": "8a1c…",
      "nom": "Julie Fontaine",
      "telephone": "+33 6 11 22 33 44",
      "prospect_id": "5d0e…",
      "statut": "rdv",
      "offre": { "id": "9c1d…", "nom": "Pilotage de la performance B2B" },
      "repondu_le": "2026-09-23T17:40:00.000Z",
      "rdv_le": "2026-09-26T09:00:00.000Z",
      "derniere_activite_le": "2026-09-24T10:12:00.000Z",
      "cree_le": "2026-09-20T08:00:00.000Z",
      "etiquettes": ["Chaud"],
      "campagnes": [{ "id": "b3f0…", "nom": "Directeurs commerciaux" }]
    }
  }
}

Le texte des réponses reçues

Cochez Joindre le texte des réponses reçues sur un webhook (décochée par défaut) : reponse.recue porte alors message, avec objet pour un email, texte coupé à 5 000 caractères et recu_le. Chaque webhook reçoit sa propre version. Sans cette case, seule la fiche part ; les événements message.envoye, invitation.envoyee (sa note) et reponse_ia.a_valider portent, eux, leur texte.

Le champ message, quand le texte est joint
{
  "message": {
    "objet": "Re: votre offre",
    "texte": "Oui, appelons-nous jeudi.",
    "recu_le": "2026-09-30T09:13:58.000Z"
  }
}

Doublons et ordre d’arrivée

Une même livraison peut arriver deux fois : si votre serveur répond après 10 secondes alors qu’il a déjà traité l’événement, ou si le nôtre redémarre pendant l’envoi. Une relance renvoie exactement le même corps, avec une signature neuve. FantomHunt n’envoie pas d’identifiant de livraison : dédoublonnez sur evenement, cree_le et l’identifiant de la fiche, jamais sur la signature. L’ordre d’arrivée n’est pas garanti : triez sur cree_le, et traitez chaque événement de façon idempotente (sans effet s’il est rejoué).

Vérifiez la signature, avant de lire le corps.

Chaque livraison porte l’en-tête X-Fantomhunt-Signature: t=<horodatage>,v1=<signature>. v1 est le HMAC-SHA256, en hexadécimal, de la chaîne t, un point, puis le corps brut, calculé avec le secret de votre webhook.

La vérification, pas à pas

  1. Lisez le corps brut, avant tout analyseur JSON (avec Express : express.raw({ type: 'application/json' })). Un corps relu puis réécrit change d’octets, et la signature ne correspond plus.
  2. Séparez t et v1 dans l’en-tête.
  3. Recalculez le HMAC-SHA256 de t.corps avec le secret (whsec_…, dans Paramètres › API, bouton Secret) et comparez-le à v1 en temps constant.
  4. Refusez un horodatage trop éloigné de votre heure : nous conseillons 5 minutes. t est l’heure de l’envoi, pas celle de l’événement : une relance arrive avec un horodatage frais.
Node.js
const crypto = require('crypto');

// corpsBrut : le corps reçu tel quel (chaîne ou Buffer), avant tout JSON.parse.
function verifier(enteteSignature, corpsBrut, secret, maintenant = Date.now() / 1000) {
  const m = /^t=(\d+),v1=([0-9a-f]{64})$/.exec(enteteSignature || '');
  if (!m) return false;
  const [, t, v1] = m;
  if (Math.abs(maintenant - Number(t)) > 300) return false; // tolérance : 5 minutes
  const attendu = crypto.createHmac('sha256', secret)
    .update(t + '.' + corpsBrut)
    .digest('hex');
  return crypto.timingSafeEqual(Buffer.from(v1), Buffer.from(attendu));
}

Le vecteur de test

Ce que reçoit votre serveur
Signature HMAC-SHA256 de chaque livraison : whsec_4f1c9e2a…
En-têteX-Fantomhunt-Signature: t=1790759640,v1=0a5df15b006908b98c9fcbe714012b372ac71e178ee74a9238b7cac6e0bc7076
Corps brut{"cree_le":"2026-09-30T09:13:58.000Z","donnees":{"canal":"linkedin","prospect":{"id":"3f6c2a10-8b4e-4d2a-9c1f-5e7a9b0d1c22","nom":"Camille Roussel","score":92,"statut":"replied","entreprise":"Skova"}},"evenement":"reponse.recue"}
Reçu à1790759642 (2 secondes après l’envoi)
Ce que calcule votre serveur
Chaîne signée : t, un point, le corps brut1790759640.{"cree_le":"2026-09-30T09:13:58.000Z","donnees":…
HMAC-SHA256 attendu0a5df15b006908b98c9fcbe714012b372ac71e178ee74a9238b7cac6e0bc7076
Écart d’horodatage2 s ≤ 300 s
Signature valide : la livraison vient de FantomHunt, vous pouvez lire le corps.
Exemple fictif, corps abrégé : une vraie livraison porte la fiche complète. Calculé dans votre navigateur avec un secret d’exemple : rien n’est envoyé.

Vecteur de test : avec le secret whsec_4f1c9e2a7b3d8e6f0a5c1b9d2e7f3a8c6b0d4e1f9a2c7b5e, l’en-tête t=1790759640,v1=0a5df15b006908b98c9fcbe714012b372ac71e178ee74a9238b7cac6e0bc7076 et le corps brut de l’exemple ci-dessus, votre code doit répondre vrai en passant l’heure 1790759642, et faux si un seul caractère du corps change.

Si votre outil sans code ne vérifie pas la signature, gardez son adresse de réception pour vous seul : c’est elle qui protège le circuit. Un serveur à vous vérifie toujours. Le secret est stocké chiffré et reste consultable dans Paramètres › API : comment vos secrets et vos clés sont gardés.

Si votre serveur tombe, vous êtes prévenu.

Répondez par un code 2xx en moins de 10 secondes, puis traitez l’événement de votre côté. Tout autre code, une redirection ou un délai dépassé compte comme un échec.

Relances, échec définitif et pause

https://exemple.fr/webhooks/fantomhunt En panne
Réponse reçueRendez-vous prisRéactiver
  1. Essai 10 s
  2. Essai 230 s
  3. Essai 32 min 30 s
  4. Essai 412 min 30 s
  5. Essai 542 min 30 s
  6. Essai 62 h 42 min 30 s
Journal des livraisons
Réponse reçueéchec définitif · HTTP 50030/09 09:14
Livraisons d’affilée en échec définitif : 3 sur 3
Votre webhook FantomHunt est en pauseEmail envoyé à l’adresse de votre compte

Six essais sur près de trois heures, puis l’échec définitif. À la troisième livraison d’affilée en échec définitif, le webhook se met en pause et un email vous prévient.

Exemple fictif : la rangée, la ligne du journal et l’état « En panne » sont ceux de Paramètres › API. Heures au plus tôt : chaque relance part à la relève suivante de la file, chaque minute.
  • Une livraison en échec est relancée après 30 secondes, 2 minutes, 10 minutes, 30 minutes, puis 2 heures. Après ce sixième essai, elle passe en échec définitif.
  • Après trois échecs définitifs d’affilée, le webhook se met en pause : les livraisons en attente sont abandonnées, vous recevez l’email « Votre webhook FantomHunt est en pause » et Paramètres › API affiche « En panne ». Une livraison réussie remet le compteur à zéro.
  • Corrigez votre serveur, puis cliquez sur Réactiver : les nouveaux événements repartent ; ceux de la pause ne sont pas rejoués.
  • Votre adresse est revérifiée à chaque envoi : https, port 443, adresse publique, aucune redirection suivie.

Ce que dit le journal des livraisons

Paramètres › API garde les 50 dernières livraisons de chaque webhook, 14 jours : « reçue (HTTP 200) », « en attente de relance (essai 2) » ou « échec définitif », avec le code et l’erreur.

Un webhook par client, grâce aux filtres.

Avec une offre par client et un webhook par client, réglé sur « Seulement pour » cette offre, les réponses et les rendez-vous d’un client n’arrivent que dans l’outil de ce client.

  • Un webhook peut se limiter à des canaux (LinkedIn, WhatsApp, email), à une campagne, à une offre ou à une étiquette. Vide, un filtre laisse tout passer.
  • Un filtre ne trie que les événements qui portent sa donnée : le canal sur tout événement qui en a un (une recherche compte pour LinkedIn), la campagne, l’offre et l’étiquette sur les événements d’une personne, l’offre aussi sur les recherches.
  • Les autres, comme « Crédits IA bas » ou « Affaire créée », partent toujours, puisque vous les avez cochés.
  • La campagne d’un contact WhatsApp ou email est celle de sa fiche LinkedIn liée.
  • Un webhook se modifie (événements, filtres, texte des réponses) sans changer d’adresse ni de secret.
  • En équipe, chaque membre a ses propres webhooks : un événement part vers ceux de la personne à qui il appartient.

Pour les agences : un webhook par client, pour les agences.

Recettes sans code, prêtes à brancher.

Pour recevoir les événements FantomHunt dans Zapier, Make ou n8n, créez-y un déclencheur par webhook, copiez son adresse de réception, puis collez-la dans Paramètres, onglet API, section Webhooks, et cochez vos événements. Le bouton « Envoyer un test » confirme la connexion. Chaque événement sur un prospect LinkedIn livre sa fiche complète : nom, entreprise, poste, lien LinkedIn, email, statut et Score IA.

Aucune application FantomHunt à installer dans ces outils : une simple adresse suffit. Avec Zapier, ce déclencheur demande une offre Zapier payante, selon l’aide de Zapier sur le déclencheur par webhook (relue le 1er octobre 2026) ; Make et n8n reçoivent les mêmes webhooks. Voir aussi tous les outils que FantomHunt relie, et par quel chemin.

Remplir HubSpot ou Pipedrive dès qu’un prospect répond

Vers votre outilDès EssentielRéponse reçueRendez-vous pris
  1. Dans Zapier, créez un Zap dont le déclencheur est « Webhooks by Zapier », événement « Catch Hook ». Copiez l’adresse fournie.
  2. Dans FantomHunt, ouvrez Paramètres › API, section Webhooks, « Ajouter un webhook » : collez l’adresse et cochez vos événements, par exemple « Réponse reçue » et « Rendez-vous pris ».
  3. Cliquez sur « Envoyer un test » : Zapier reçoit un message de bienvenue, preuve que la connexion marche. Pour que Zapier découvre les champs de la fiche, déclenchez ensuite un vrai événement (par exemple, changez le statut d’un prospect si vous avez coché « Statut changé »), puis rechargez l’exemple dans Zapier.
  4. Ajoutez l’action de votre outil (créer ou mettre à jour un contact) et faites correspondre les champs : chaque livraison de ces événements contient la fiche complète, avec le nom, l’entreprise, le poste, l’adresse LinkedIn, l’email et, quand il est connu, son indice de fiabilité, le téléphone, le statut, le Score IA quand il est noté, l’offre, les étiquettes et les campagnes en cours. Un événement WhatsApp ou email porte, sous contact, une fiche plus courte : nom, numéro ou email, statut, offre, étiquettes et campagnes.
  5. Activez le Zap. Votre outil se remplit tout seul, à chaque événement coché.

Exemple fictif : la ligne du journal des livraisons de Paramètres › API, quand Zapier a bien reçu l’événement.

Prévenir votre équipe dans Slack

Vers votre outilDès EssentielRéponse reçue

Même déclencheur « Catch Hook », avec l’événement « Réponse reçue » coché, puis l’action Slack qui publie un message dans un canal : « Camille Roussel (Skova) a répondu sur LinkedIn ». L’équipe est prévenue dès qu’un prospect répond, sans ouvrir FantomHunt.

Un registre Google Sheets qui se tient à jour

Vers votre outilDès EssentielProspect ajouté

Cochez « Prospect ajouté » et branchez l’action Google Sheets qui ajoute une ligne : chaque nouvelle fiche devient une ligne, quelle que soit la façon dont elle est arrivée ; pour un prospect LinkedIn, avec son entreprise, sa source et son Score IA s’il est déjà noté. Pour un rapport hebdomadaire, interrogez plutôt GET /v1/stats depuis le tableur.

Une affaire gagnée dans votre outil, gagnée dans FantomHunt

Vers FantomHuntDès EssentielAffaire créée

Déclencheur « affaire gagnée » de votre outil, puis une action « Webhooks by Zapier », événement « Custom Request », méthode PATCH : PATCH /v1/affaires/:id avec { "statut": "gagnee" }, sous une clé qui a le droit « Modifier le CRM ». L’affaire passe en gagnée, comme dans l’application ; une affaire perdue demande aussi motif_de_perte. Gardez l’identifiant de l’affaire dans votre outil dès sa création : l’événement « Affaire créée » vous le livre, et GET /v1/affaires les liste.

Requête
curl -X PATCH "https://api.fantomhunt.com/v1/affaires/:id" \
  -H "Authorization: Bearer fh_live_VOTRE_CLE" \
  -H "Content-Type: application/json" \
  -d '{ "statut": "gagnee" }'

29 événements, rangés comme dans l’application.

Les six familles et les libellés sont ceux que vous cochez dans Paramètres › API. Chaque événement ci-dessous donne le code reçu dans evenement, le moment où il part et le contenu de donnees.

Quatre événements partent dès que FantomHunt les voit : reponse.recue, invitation.acceptee, prospect.extrait et coordonnee.trouvee. Un statut ou un rendez-vous changé à la main sur une fiche part aussi tout de suite. Les autres passent par une file relevée chaque minute. Ce qui se passe sur LinkedIn ou WhatsApp (réponse, invitation acceptée, message envoyé) remonte par l’extension, navigateur ouvert. Les emails sont lus par nos serveurs, sans navigateur : aussitôt si vous avez utilisé FantomHunt dans les 7 derniers jours, sinon toutes les 15 minutes.

« Aussitôt » : la livraison part dès que FantomHunt voit l’événement ; « file » : elle part à la relève suivante, chaque minute ; « aussitôt si changé à la main » : quand le changement est fait à la main sur la fiche.

Prospects

prospect.ajoute

Prospect ajoutéfile

Quand il part : Une fiche entre, quelle que soit la source : extraction, import, ajout par son lien LinkedIn (une fois la fiche lue), nouveau contact WhatsApp ou email. Un contact WhatsApp ou email déjà rattaché à un prospect LinkedIn ne le déclenche pas.

Contenu de donnees : canal, et prospect (LinkedIn) ou contact (WhatsApp, email)

Livraison d’exemple
{
  "evenement": "prospect.ajoute",
  "cree_le": "2026-09-22T08:10:00.000Z",
  "donnees": {
    "canal": "linkedin",
    "prospect": {
      "id": "3f6c2a10-8b4e-4d2a-9c1f-5e7a9b0d1c22",
      "nom": "Camille Roussel",
      "entreprise": "Skova",
      "poste": "Directrice commerciale",
      "url_linkedin": "https://www.linkedin.com/in/…",
      "localisation": "Lyon, France",
      "email": null,
      "email_score": null,
      "telephone": null,
      "statut": "nouveau",
      "score": null,
      "source": "extension",
      "recherche_id": "4a7e…",
      "offre_id": "9c1d…",
      "offre": { "id": "9c1d…", "nom": "Pilotage de la performance B2B" },
      "cree_le": "2026-09-22T08:10:00.000Z",
      "modifie_le": "2026-09-22T08:10:00.000Z",
      "contacte_le": null,
      "connecte_le": null,
      "repondu_le": null,
      "rdv_le": null,
      "etiquettes": [],
      "campagnes": []
    }
  }
}

prospect.extrait

Prospect extraitaussitôt

Quand il part : Un prospect entre par une extraction ou un import de l’extension.

Contenu de donnees : prospect

Livraison d’exemple
{
  "evenement": "prospect.extrait",
  "cree_le": "2026-09-22T08:10:00.000Z",
  "donnees": {
    "prospect": {
      "id": "3f6c2a10-8b4e-4d2a-9c1f-5e7a9b0d1c22",
      "nom": "Camille Roussel",
      "entreprise": "Skova",
      "poste": "Directrice commerciale",
      "url_linkedin": "https://www.linkedin.com/in/…",
      "localisation": "Lyon, France",
      "email": null,
      "email_score": null,
      "telephone": null,
      "statut": "nouveau",
      "score": null,
      "source": "extension",
      "recherche_id": "4a7e…",
      "offre_id": "9c1d…",
      "offre": { "id": "9c1d…", "nom": "Pilotage de la performance B2B" },
      "cree_le": "2026-09-22T08:10:00.000Z",
      "modifie_le": "2026-09-22T08:10:00.000Z",
      "contacte_le": null,
      "connecte_le": null,
      "repondu_le": null,
      "rdv_le": null,
      "etiquettes": [],
      "campagnes": []
    }
  }
}

statut.change

Statut changéfileaussitôt si changé à la main

Quand il part : Le statut d’une fiche change, quel que soit le chemin : à la main, par une campagne, par l’extension ou par une action groupée.

Contenu de donnees : statut, statut_precedent, canal, et prospect (LinkedIn) ou contact (WhatsApp, email)

Livraison d’exemple
{
  "evenement": "statut.change",
  "cree_le": "2026-09-30T10:02:00.000Z",
  "donnees": {
    "canal": "linkedin",
    "statut": "rdv",
    "statut_precedent": "replied",
    "prospect": {
      "id": "3f6c2a10-8b4e-4d2a-9c1f-5e7a9b0d1c22",
      "nom": "Camille Roussel",
      "entreprise": "Skova",
      "poste": "Directrice commerciale",
      "url_linkedin": "https://www.linkedin.com/in/…",
      "localisation": "Lyon, France",
      "email": "camille.roussel@skova.fr",
      "email_score": null,
      "telephone": null,
      "statut": "rdv",
      "score": 92,
      "source": "extension",
      "recherche_id": "4a7e…",
      "offre_id": "9c1d…",
      "offre": { "id": "9c1d…", "nom": "Pilotage de la performance B2B" },
      "cree_le": "2026-09-22T08:10:00.000Z",
      "modifie_le": "2026-09-30T10:02:00.000Z",
      "contacte_le": "2026-09-23T09:00:00.000Z",
      "connecte_le": "2026-09-24T16:20:00.000Z",
      "repondu_le": "2026-09-30T09:13:58.000Z",
      "rdv_le": "2026-10-01T12:00:00.000Z",
      "etiquettes": ["Chaud"],
      "campagnes": []
    }
  }
}

coordonnee.trouvee

Email ou téléphone trouvéaussitôt

Quand il part : Un email ou un téléphone est trouvé pour un prospect LinkedIn : par l’enrichissement, ou un email lu par l’extension dans ses coordonnées LinkedIn.

Contenu de donnees : type (email ou telephone), valeur, prospect

Livraison d’exemple
{
  "evenement": "coordonnee.trouvee",
  "cree_le": "2026-09-22T08:12:31.000Z",
  "donnees": {
    "type": "email",
    "valeur": "camille.roussel@skova.fr",
    "prospect": {
      "id": "3f6c2a10-8b4e-4d2a-9c1f-5e7a9b0d1c22",
      "nom": "Camille Roussel",
      "entreprise": "Skova",
      "poste": "Directrice commerciale",
      "url_linkedin": "https://www.linkedin.com/in/…",
      "localisation": "Lyon, France",
      "email": "camille.roussel@skova.fr",
      "email_score": null,
      "telephone": null,
      "statut": "nouveau",
      "score": 92,
      "source": "extension",
      "recherche_id": "4a7e…",
      "offre_id": "9c1d…",
      "offre": { "id": "9c1d…", "nom": "Pilotage de la performance B2B" },
      "cree_le": "2026-09-22T08:10:00.000Z",
      "modifie_le": "2026-09-22T08:12:31.000Z",
      "contacte_le": null,
      "connecte_le": null,
      "repondu_le": null,
      "rdv_le": null,
      "etiquettes": [],
      "campagnes": []
    }
  }
}

poste.change

Changement de postefile

Quand il part : Un changement de poste est détecté sur un prospect suivi.

Contenu de donnees : canal, changement (type : promotion ou nouveau_poste, ancien_poste, ancienne_entreprise, nouveau_poste, nouvelle_entreprise, detecte_le), prospect

Livraison d’exemple
{
  "evenement": "poste.change",
  "cree_le": "2026-10-02T06:00:00.000Z",
  "donnees": {
    "canal": "linkedin",
    "changement": {
      "type": "promotion",
      "ancien_poste": "Directrice commerciale",
      "ancienne_entreprise": "Skova",
      "nouveau_poste": "Directrice générale adjointe",
      "nouvelle_entreprise": "Skova",
      "detecte_le": "2026-10-02T06:00:00.000Z"
    },
    "prospect": {
      "id": "3f6c2a10-8b4e-4d2a-9c1f-5e7a9b0d1c22",
      "nom": "Camille Roussel",
      "entreprise": "Skova",
      "poste": "Directrice commerciale",
      "url_linkedin": "https://www.linkedin.com/in/…",
      "localisation": "Lyon, France",
      "email": "camille.roussel@skova.fr",
      "email_score": null,
      "telephone": null,
      "statut": "rdv",
      "score": 92,
      "source": "extension",
      "recherche_id": "4a7e…",
      "offre_id": "9c1d…",
      "offre": { "id": "9c1d…", "nom": "Pilotage de la performance B2B" },
      "cree_le": "2026-09-22T08:10:00.000Z",
      "modifie_le": "2026-10-02T09:10:00.000Z",
      "contacte_le": "2026-09-23T09:00:00.000Z",
      "connecte_le": "2026-09-24T16:20:00.000Z",
      "repondu_le": "2026-09-30T09:13:58.000Z",
      "rdv_le": "2026-10-02T08:00:00.000Z",
      "etiquettes": ["Chaud"],
      "campagnes": []
    }
  }
}

Échanges

message.envoye

Message envoyéfile

Quand il part : LinkedIn quand l’extension l’a réellement envoyé ; WhatsApp et email à l’envoi. Un historique resynchronisé ne déclenche rien.

Contenu de donnees : canal, message (texte, objet pour un email, envoye_le), et prospect (LinkedIn) ou contact (WhatsApp, email)

Livraison d’exemple
{
  "evenement": "message.envoye",
  "cree_le": "2026-09-29T08:30:00.000Z",
  "donnees": {
    "canal": "linkedin",
    "message": {
      "texte": "Bonjour Camille, je vois que vous pilotez les ventes chez Skova…",
      "envoye_le": "2026-09-29T08:30:00.000Z"
    },
    "prospect": {
      "id": "3f6c2a10-8b4e-4d2a-9c1f-5e7a9b0d1c22",
      "nom": "Camille Roussel",
      "entreprise": "Skova",
      "poste": "Directrice commerciale",
      "url_linkedin": "https://www.linkedin.com/in/…",
      "localisation": "Lyon, France",
      "email": "camille.roussel@skova.fr",
      "email_score": null,
      "telephone": null,
      "statut": "contacted",
      "score": 92,
      "source": "extension",
      "recherche_id": "4a7e…",
      "offre_id": "9c1d…",
      "offre": { "id": "9c1d…", "nom": "Pilotage de la performance B2B" },
      "cree_le": "2026-09-22T08:10:00.000Z",
      "modifie_le": "2026-09-29T08:30:00.000Z",
      "contacte_le": "2026-09-23T09:00:00.000Z",
      "connecte_le": "2026-09-24T16:20:00.000Z",
      "repondu_le": null,
      "rdv_le": null,
      "etiquettes": [],
      "campagnes": [{ "id": "b3f0…", "nom": "Directeurs commerciaux" }]
    }
  }
}

invitation.envoyee

Invitation envoyéefile

Quand il part : L’extension a envoyé l’invitation LinkedIn.

Contenu de donnees : canal, invitation (note, envoyee_le), prospect

Livraison d’exemple
{
  "evenement": "invitation.envoyee",
  "cree_le": "2026-09-23T09:00:00.000Z",
  "donnees": {
    "canal": "linkedin",
    "invitation": {
      "note": "Ravi d’échanger avec vous sur le pilotage commercial.",
      "envoyee_le": "2026-09-23T09:00:00.000Z"
    },
    "prospect": {
      "id": "3f6c2a10-8b4e-4d2a-9c1f-5e7a9b0d1c22",
      "nom": "Camille Roussel",
      "entreprise": "Skova",
      "poste": "Directrice commerciale",
      "url_linkedin": "https://www.linkedin.com/in/…",
      "localisation": "Lyon, France",
      "email": "camille.roussel@skova.fr",
      "email_score": null,
      "telephone": null,
      "statut": "pending_connection",
      "score": 92,
      "source": "extension",
      "recherche_id": "4a7e…",
      "offre_id": "9c1d…",
      "offre": { "id": "9c1d…", "nom": "Pilotage de la performance B2B" },
      "cree_le": "2026-09-22T08:10:00.000Z",
      "modifie_le": "2026-09-23T09:00:00.000Z",
      "contacte_le": "2026-09-23T09:00:00.000Z",
      "connecte_le": null,
      "repondu_le": null,
      "rdv_le": null,
      "etiquettes": [],
      "campagnes": [{ "id": "b3f0…", "nom": "Directeurs commerciaux" }]
    }
  }
}

invitation.acceptee

Invitation acceptéeaussitôt

Quand il part : Le prospect passe en « Connecté » : l’extension a vu l’invitation acceptée, ou vous avez posé ce statut à la main. Un profil ajouté par son lien et déjà dans vos relations le déclenche aussi.

Contenu de donnees : prospect

Livraison d’exemple
{
  "evenement": "invitation.acceptee",
  "cree_le": "2026-09-24T16:20:00.000Z",
  "donnees": {
    "prospect": {
      "id": "3f6c2a10-8b4e-4d2a-9c1f-5e7a9b0d1c22",
      "nom": "Camille Roussel",
      "entreprise": "Skova",
      "poste": "Directrice commerciale",
      "url_linkedin": "https://www.linkedin.com/in/…",
      "localisation": "Lyon, France",
      "email": "camille.roussel@skova.fr",
      "email_score": null,
      "telephone": null,
      "statut": "connected",
      "score": 92,
      "source": "extension",
      "recherche_id": "4a7e…",
      "offre_id": "9c1d…",
      "offre": { "id": "9c1d…", "nom": "Pilotage de la performance B2B" },
      "cree_le": "2026-09-22T08:10:00.000Z",
      "modifie_le": "2026-09-24T16:20:00.000Z",
      "contacte_le": "2026-09-23T09:00:00.000Z",
      "connecte_le": "2026-09-24T16:20:00.000Z",
      "repondu_le": null,
      "rdv_le": null,
      "etiquettes": [],
      "campagnes": [{ "id": "b3f0…", "nom": "Directeurs commerciaux" }]
    }
  }
}

reponse.recue

Réponse reçueaussitôt

Quand il part : LinkedIn : la réponse qui fait passer le prospect en « En discussion » (rien s’il y est déjà, ou s’il est en relance, en rendez-vous ou client). WhatsApp et email : chaque réponse, sauf les réponses automatiques reconnues (absence, congés) et les emails dont l’expéditeur n’a pas pu être authentifié.

Contenu de donnees : canal, et prospect (LinkedIn) ou contact (WhatsApp, email) ; plus message (objet, texte, recu_le) si le webhook joint le texte

Livraison d’exemple
{
  "evenement": "reponse.recue",
  "cree_le": "2026-09-30T09:13:58.000Z",
  "donnees": {
    "canal": "linkedin",
    "prospect": {
      "id": "3f6c2a10-8b4e-4d2a-9c1f-5e7a9b0d1c22",
      "nom": "Camille Roussel",
      "entreprise": "Skova",
      "poste": "Directrice commerciale",
      "url_linkedin": "https://www.linkedin.com/in/…",
      "localisation": "Lyon, France",
      "email": "camille.roussel@skova.fr",
      "email_score": null,
      "telephone": null,
      "statut": "replied",
      "score": 92,
      "source": "extension",
      "recherche_id": "4a7e…",
      "offre_id": "9c1d…",
      "offre": { "id": "9c1d…", "nom": "Pilotage de la performance B2B" },
      "cree_le": "2026-09-22T08:10:00.000Z",
      "modifie_le": "2026-09-30T09:13:58.000Z",
      "contacte_le": "2026-09-23T09:00:00.000Z",
      "connecte_le": "2026-09-24T16:20:00.000Z",
      "repondu_le": "2026-09-30T09:13:58.000Z",
      "rdv_le": null,
      "etiquettes": ["Chaud"],
      "campagnes": [{ "id": "b3f0…", "nom": "Directeurs commerciaux" }]
    }
  }
}

reponse_ia.a_valider

Réponse IA à valider ✦file

Quand il part : L’IA propose une réponse LinkedIn qui attend votre validation.

Contenu de donnees : canal, suggestion (texte, campagne ou null), prospect

Livraison d’exemple
{
  "evenement": "reponse_ia.a_valider",
  "cree_le": "2026-09-30T09:15:00.000Z",
  "donnees": {
    "canal": "linkedin",
    "suggestion": {
      "texte": "Avec plaisir, Camille. Jeudi 14 h vous convient-il ?",
      "campagne": { "id": "b3f0…", "nom": "Directeurs commerciaux" }
    },
    "prospect": {
      "id": "3f6c2a10-8b4e-4d2a-9c1f-5e7a9b0d1c22",
      "nom": "Camille Roussel",
      "entreprise": "Skova",
      "poste": "Directrice commerciale",
      "url_linkedin": "https://www.linkedin.com/in/…",
      "localisation": "Lyon, France",
      "email": "camille.roussel@skova.fr",
      "email_score": null,
      "telephone": null,
      "statut": "replied",
      "score": 92,
      "source": "extension",
      "recherche_id": "4a7e…",
      "offre_id": "9c1d…",
      "offre": { "id": "9c1d…", "nom": "Pilotage de la performance B2B" },
      "cree_le": "2026-09-22T08:10:00.000Z",
      "modifie_le": "2026-09-30T09:13:58.000Z",
      "contacte_le": "2026-09-23T09:00:00.000Z",
      "connecte_le": "2026-09-24T16:20:00.000Z",
      "repondu_le": "2026-09-30T09:13:58.000Z",
      "rdv_le": null,
      "etiquettes": ["Chaud"],
      "campagnes": [{ "id": "b3f0…", "nom": "Directeurs commerciaux" }]
    }
  }
}

Rendez-vous

rdv.pris

Rendez-vous prisfileaussitôt si changé à la main

Quand il part : Un rendez-vous est posé sur une fiche qui n’en avait pas à venir.

Contenu de donnees : rdv_le, canal, et prospect (LinkedIn) ou contact (WhatsApp, email)

Livraison d’exemple
{
  "evenement": "rdv.pris",
  "cree_le": "2026-09-30T10:02:00.000Z",
  "donnees": {
    "canal": "linkedin",
    "rdv_le": "2026-10-01T12:00:00.000Z",
    "prospect": {
      "id": "3f6c2a10-8b4e-4d2a-9c1f-5e7a9b0d1c22",
      "nom": "Camille Roussel",
      "entreprise": "Skova",
      "poste": "Directrice commerciale",
      "url_linkedin": "https://www.linkedin.com/in/…",
      "localisation": "Lyon, France",
      "email": "camille.roussel@skova.fr",
      "email_score": null,
      "telephone": null,
      "statut": "rdv",
      "score": 92,
      "source": "extension",
      "recherche_id": "4a7e…",
      "offre_id": "9c1d…",
      "offre": { "id": "9c1d…", "nom": "Pilotage de la performance B2B" },
      "cree_le": "2026-09-22T08:10:00.000Z",
      "modifie_le": "2026-09-30T10:02:00.000Z",
      "contacte_le": "2026-09-23T09:00:00.000Z",
      "connecte_le": "2026-09-24T16:20:00.000Z",
      "repondu_le": "2026-09-30T09:13:58.000Z",
      "rdv_le": "2026-10-01T12:00:00.000Z",
      "etiquettes": ["Chaud"],
      "campagnes": []
    }
  }
}

rdv.deplace

Rendez-vous déplacéfileaussitôt si changé à la main

Quand il part : Un rendez-vous à venir change de date.

Contenu de donnees : rdv_le, ancien_rdv_le, canal, et prospect (LinkedIn) ou contact (WhatsApp, email)

Livraison d’exemple
{
  "evenement": "rdv.deplace",
  "cree_le": "2026-09-30T16:40:00.000Z",
  "donnees": {
    "canal": "linkedin",
    "rdv_le": "2026-10-02T08:00:00.000Z",
    "ancien_rdv_le": "2026-10-01T12:00:00.000Z",
    "prospect": {
      "id": "3f6c2a10-8b4e-4d2a-9c1f-5e7a9b0d1c22",
      "nom": "Camille Roussel",
      "entreprise": "Skova",
      "poste": "Directrice commerciale",
      "url_linkedin": "https://www.linkedin.com/in/…",
      "localisation": "Lyon, France",
      "email": "camille.roussel@skova.fr",
      "email_score": null,
      "telephone": null,
      "statut": "rdv",
      "score": 92,
      "source": "extension",
      "recherche_id": "4a7e…",
      "offre_id": "9c1d…",
      "offre": { "id": "9c1d…", "nom": "Pilotage de la performance B2B" },
      "cree_le": "2026-09-22T08:10:00.000Z",
      "modifie_le": "2026-09-30T16:40:00.000Z",
      "contacte_le": "2026-09-23T09:00:00.000Z",
      "connecte_le": "2026-09-24T16:20:00.000Z",
      "repondu_le": "2026-09-30T09:13:58.000Z",
      "rdv_le": "2026-10-02T08:00:00.000Z",
      "etiquettes": ["Chaud"],
      "campagnes": []
    }
  }
}

rdv.debriefe

Rendez-vous débrieféfileaussitôt si changé à la main

Quand il part : Le compte rendu du rendez-vous est enregistré.

Contenu de donnees : rdv_le, canal, et prospect (LinkedIn) ou contact (WhatsApp, email)

Livraison d’exemple
{
  "evenement": "rdv.debriefe",
  "cree_le": "2026-10-02T09:10:00.000Z",
  "donnees": {
    "canal": "linkedin",
    "rdv_le": "2026-10-02T08:00:00.000Z",
    "prospect": {
      "id": "3f6c2a10-8b4e-4d2a-9c1f-5e7a9b0d1c22",
      "nom": "Camille Roussel",
      "entreprise": "Skova",
      "poste": "Directrice commerciale",
      "url_linkedin": "https://www.linkedin.com/in/…",
      "localisation": "Lyon, France",
      "email": "camille.roussel@skova.fr",
      "email_score": null,
      "telephone": null,
      "statut": "rdv",
      "score": 92,
      "source": "extension",
      "recherche_id": "4a7e…",
      "offre_id": "9c1d…",
      "offre": { "id": "9c1d…", "nom": "Pilotage de la performance B2B" },
      "cree_le": "2026-09-22T08:10:00.000Z",
      "modifie_le": "2026-10-02T09:10:00.000Z",
      "contacte_le": "2026-09-23T09:00:00.000Z",
      "connecte_le": "2026-09-24T16:20:00.000Z",
      "repondu_le": "2026-09-30T09:13:58.000Z",
      "rdv_le": "2026-10-02T08:00:00.000Z",
      "etiquettes": ["Chaud"],
      "campagnes": []
    }
  }
}

Campagnes et recherches

campagne.prospect_inscrit

Inscrit en campagnefile

Quand il part : Un prospect entre dans une campagne.

Contenu de donnees : canal, campagne (id, nom), prospect

Livraison d’exemple
{
  "evenement": "campagne.prospect_inscrit",
  "cree_le": "2026-09-23T08:55:00.000Z",
  "donnees": {
    "canal": "linkedin",
    "campagne": { "id": "b3f0…", "nom": "Directeurs commerciaux" },
    "prospect": {
      "id": "3f6c2a10-8b4e-4d2a-9c1f-5e7a9b0d1c22",
      "nom": "Camille Roussel",
      "entreprise": "Skova",
      "poste": "Directrice commerciale",
      "url_linkedin": "https://www.linkedin.com/in/…",
      "localisation": "Lyon, France",
      "email": "camille.roussel@skova.fr",
      "email_score": null,
      "telephone": null,
      "statut": "nouveau",
      "score": 92,
      "source": "extension",
      "recherche_id": "4a7e…",
      "offre_id": "9c1d…",
      "offre": { "id": "9c1d…", "nom": "Pilotage de la performance B2B" },
      "cree_le": "2026-09-22T08:10:00.000Z",
      "modifie_le": "2026-09-23T08:55:00.000Z",
      "contacte_le": null,
      "connecte_le": null,
      "repondu_le": null,
      "rdv_le": null,
      "etiquettes": [],
      "campagnes": [{ "id": "b3f0…", "nom": "Directeurs commerciaux" }]
    }
  }
}

campagne.prospect_sorti

Sorti de campagnefile

Quand il part : Un prospect quitte une campagne.

Contenu de donnees : canal, campagne, raison (termine, a_repondu, ou la raison de l’arrêt), prospect

Livraison d’exemple
{
  "evenement": "campagne.prospect_sorti",
  "cree_le": "2026-09-30T09:14:02.000Z",
  "donnees": {
    "canal": "linkedin",
    "campagne": { "id": "b3f0…", "nom": "Directeurs commerciaux" },
    "raison": "a_repondu",
    "prospect": {
      "id": "3f6c2a10-8b4e-4d2a-9c1f-5e7a9b0d1c22",
      "nom": "Camille Roussel",
      "entreprise": "Skova",
      "poste": "Directrice commerciale",
      "url_linkedin": "https://www.linkedin.com/in/…",
      "localisation": "Lyon, France",
      "email": "camille.roussel@skova.fr",
      "email_score": null,
      "telephone": null,
      "statut": "replied",
      "score": 92,
      "source": "extension",
      "recherche_id": "4a7e…",
      "offre_id": "9c1d…",
      "offre": { "id": "9c1d…", "nom": "Pilotage de la performance B2B" },
      "cree_le": "2026-09-22T08:10:00.000Z",
      "modifie_le": "2026-09-30T09:14:02.000Z",
      "contacte_le": "2026-09-23T09:00:00.000Z",
      "connecte_le": "2026-09-24T16:20:00.000Z",
      "repondu_le": "2026-09-30T09:13:58.000Z",
      "rdv_le": null,
      "etiquettes": ["Chaud"],
      "campagnes": []
    }
  }
}

recherche.terminee

Recherche terminéefile

Quand il part : Une recherche de prospects se termine.

Contenu de donnees : recherche (id, cible, pays, volume, statut, prospects_trouves, secteurs, offre_id, erreur, cree_le, demarree_le, terminee_le)

Livraison d’exemple
{
  "evenement": "recherche.terminee",
  "cree_le": "2026-09-22T08:24:00.000Z",
  "donnees": {
    "recherche": {
      "id": "4a7e…",
      "cible": "Directeur commercial",
      "pays": "France",
      "volume": 50,
      "statut": "done",
      "prospects_trouves": 48,
      "secteurs": null,
      "offre_id": "9c1d…",
      "erreur": null,
      "cree_le": "2026-09-22T08:02:00.000Z",
      "demarree_le": "2026-09-22T08:03:00.000Z",
      "terminee_le": "2026-09-22T08:24:00.000Z"
    }
  }
}

recherche.echouee

Recherche en échecfile

Quand il part : Une recherche s’arrête sur une erreur.

Contenu de donnees : recherche, avec erreur renseignée

Livraison d’exemple
{
  "evenement": "recherche.echouee",
  "cree_le": "2026-09-25T14:31:00.000Z",
  "donnees": {
    "recherche": {
      "id": "7d2b…",
      "cible": "Responsable des achats",
      "pays": "France",
      "volume": 50,
      "statut": "error",
      "prospects_trouves": 12,
      "secteurs": null,
      "offre_id": "9c1d…",
      "erreur": "Erreur extension",
      "cree_le": "2026-09-25T14:05:00.000Z",
      "demarree_le": "2026-09-25T14:06:00.000Z",
      "terminee_le": "2026-09-25T14:31:00.000Z"
    }
  }
}

Tâches et affaires

tache.creee

Tâche crééefile

Quand il part : Une tâche est créée.

Contenu de donnees : tache (id, titre, echeance_le, faite_le, cree_le, en_retard, canal, prospect_id, contact_whatsapp_id, contact_email_id, personne)

Livraison d’exemple
{
  "evenement": "tache.creee",
  "cree_le": "2026-10-01T10:02:11.000Z",
  "donnees": {
    "tache": {
      "id": "c84e…",
      "titre": "Rappeler Camille Roussel",
      "echeance_le": "2026-10-05T09:00:00.000Z",
      "faite_le": null,
      "cree_le": "2026-10-01T10:02:11.000Z",
      "en_retard": false,
      "canal": "linkedin",
      "prospect_id": "3f6c2a10-8b4e-4d2a-9c1f-5e7a9b0d1c22",
      "contact_whatsapp_id": null,
      "contact_email_id": null,
      "personne": "Camille Roussel"
    }
  }
}

tache.echue

Tâche échuefile

Quand il part : L’échéance d’une tâche non faite vient de passer : une seule fois par tâche, à la relève suivante.

Contenu de donnees : tache

Livraison d’exemple
{
  "evenement": "tache.echue",
  "cree_le": "2026-10-05T09:01:00.000Z",
  "donnees": {
    "tache": {
      "id": "c84e…",
      "titre": "Rappeler Camille Roussel",
      "echeance_le": "2026-10-05T09:00:00.000Z",
      "faite_le": null,
      "cree_le": "2026-10-01T10:02:11.000Z",
      "en_retard": true,
      "canal": "linkedin",
      "prospect_id": "3f6c2a10-8b4e-4d2a-9c1f-5e7a9b0d1c22",
      "contact_whatsapp_id": null,
      "contact_email_id": null,
      "personne": "Camille Roussel"
    }
  }
}

tache.faite

Tâche faitefile

Quand il part : Une tâche est marquée faite.

Contenu de donnees : tache

Livraison d’exemple
{
  "evenement": "tache.faite",
  "cree_le": "2026-10-05T10:15:00.000Z",
  "donnees": {
    "tache": {
      "id": "c84e…",
      "titre": "Rappeler Camille Roussel",
      "echeance_le": "2026-10-05T09:00:00.000Z",
      "faite_le": "2026-10-05T10:15:00.000Z",
      "cree_le": "2026-10-01T10:02:11.000Z",
      "en_retard": false,
      "canal": "linkedin",
      "prospect_id": "3f6c2a10-8b4e-4d2a-9c1f-5e7a9b0d1c22",
      "contact_whatsapp_id": null,
      "contact_email_id": null,
      "personne": "Camille Roussel"
    }
  }
}

affaire.creee

Affaire crééefile

Quand il part : Une affaire est créée.

Contenu de donnees : affaire (id, nom, statut : en_cours, gagnee ou perdue, montant_centimes, debut_le, echeance_le, cloturee_le, motif_de_perte, cree_le, colonne, personnes)

Livraison d’exemple
{
  "evenement": "affaire.creee",
  "cree_le": "2026-10-02T09:20:00.000Z",
  "donnees": {
    "affaire": {
      "id": "f2a8…",
      "nom": "Skova, pilotage commercial",
      "statut": "en_cours",
      "montant_centimes": 480000,
      "debut_le": null,
      "echeance_le": null,
      "cloturee_le": null,
      "motif_de_perte": null,
      "cree_le": "2026-10-02T09:20:00.000Z",
      "colonne": { "id": "1c4d…", "nom": "Négociation" },
      "personnes": [
        {
          "prospect_id": "3f6c2a10-8b4e-4d2a-9c1f-5e7a9b0d1c22",
          "contact_whatsapp_id": null,
          "contact_email_id": null,
          "importance": 3,
          "nom": "Camille Roussel"
        }
      ]
    }
  }
}

affaire.gagnee

Affaire gagnéefile

Quand il part : Une affaire passe en gagnée.

Contenu de donnees : affaire

Livraison d’exemple
{
  "evenement": "affaire.gagnee",
  "cree_le": "2026-10-02T15:00:00.000Z",
  "donnees": {
    "affaire": {
      "id": "f2a8…",
      "nom": "Skova, pilotage commercial",
      "statut": "gagnee",
      "montant_centimes": 480000,
      "debut_le": null,
      "echeance_le": null,
      "cloturee_le": "2026-10-02T15:00:00.000Z",
      "motif_de_perte": null,
      "cree_le": "2026-10-02T09:20:00.000Z",
      "colonne": { "id": "1c4d…", "nom": "Négociation" },
      "personnes": [
        {
          "prospect_id": "3f6c2a10-8b4e-4d2a-9c1f-5e7a9b0d1c22",
          "contact_whatsapp_id": null,
          "contact_email_id": null,
          "importance": 3,
          "nom": "Camille Roussel"
        }
      ]
    }
  }
}

affaire.perdue

Affaire perduefile

Quand il part : Une affaire passe en perdue.

Contenu de donnees : affaire, avec motif_de_perte

Livraison d’exemple
{
  "evenement": "affaire.perdue",
  "cree_le": "2026-10-02T15:05:00.000Z",
  "donnees": {
    "affaire": {
      "id": "6e91…",
      "nom": "Skova, formation des managers",
      "statut": "perdue",
      "montant_centimes": 150000,
      "debut_le": null,
      "echeance_le": null,
      "cloturee_le": "2026-10-02T15:05:00.000Z",
      "motif_de_perte": "Budget reporté à 2027",
      "cree_le": "2026-09-25T10:00:00.000Z",
      "colonne": { "id": "1c4d…", "nom": "Négociation" },
      "personnes": [
        {
          "prospect_id": "3f6c2a10-8b4e-4d2a-9c1f-5e7a9b0d1c22",
          "contact_whatsapp_id": null,
          "contact_email_id": null,
          "importance": 3,
          "nom": "Camille Roussel"
        }
      ]
    }
  }
}

Compte

canal.deconnecte

Canal déconnectéfile

Quand il part : LinkedIn se déconnecte, ou une boîte email est à reconnecter.

Contenu de donnees : canal (linkedin ou email), etat, etat_precedent ; raison (LinkedIn) ou adresse (email)

Livraison d’exemple
{
  "evenement": "canal.deconnecte",
  "cree_le": "2026-09-27T07:45:00.000Z",
  "donnees": {
    "canal": "linkedin",
    "etat": "auth_error",
    "etat_precedent": "ok",
    "raison": "identite_non_confirmee"
  }
}

canal.reconnecte

Canal reconnectéfile

Quand il part : Le canal refonctionne.

Contenu de donnees : canal, etat, etat_precedent ; adresse pour un email

Livraison d’exemple
{
  "evenement": "canal.reconnecte",
  "cree_le": "2026-09-27T08:05:00.000Z",
  "donnees": { "canal": "linkedin", "etat": "ok", "etat_precedent": "auth_error" }
}

prospection.en_pause

Prospection en pausefile

Quand il part : La prospection est mise en pause.

Contenu de donnees : en_pause_depuis

Livraison d’exemple
{
  "evenement": "prospection.en_pause",
  "cree_le": "2026-09-26T18:00:00.000Z",
  "donnees": { "en_pause_depuis": "2026-09-26T18:00:00.000Z" }
}

prospection.reprise

Prospection reprisefile

Quand il part : La prospection reprend.

Contenu de donnees : etait_en_pause_depuis

Livraison d’exemple
{
  "evenement": "prospection.reprise",
  "cree_le": "2026-09-28T07:00:00.000Z",
  "donnees": { "etait_en_pause_depuis": "2026-09-26T18:00:00.000Z" }
}

linkedin.freinee

Frein LinkedInfile

Quand il part : FantomHunt suspend un temps les invitations ou les envois LinkedIn pour protéger votre compte, jusqu’à l’heure donnée par jusqua.

Contenu de donnees : jusqua, refus_d_affilee, raison

Livraison d’exemple
{
  "evenement": "linkedin.freinee",
  "cree_le": "2026-09-25T15:20:00.000Z",
  "donnees": {
    "jusqua": "2026-09-26T07:00:00.000Z",
    "refus_d_affilee": 3,
    "raison": null
  }
}

credits.bas

Crédits IA basfile

Quand il part : Vos crédits IA descendent à 10 % du forfait mensuel ou moins : 40 sur Essentiel, 100 sur Croissance.

Contenu de donnees : credits_ia (restants, par_mois)

Livraison d’exemple
{
  "evenement": "credits.bas",
  "cree_le": "2026-09-29T11:00:00.000Z",
  "donnees": { "credits_ia": { "restants": 38, "par_mois": 400 } }
}

Les limites à connaître, avant de brancher.

Les webhooks sont-ils dans l’offre gratuite ?

Non. Ils sont inclus dès Essentiel, 29 € par mois (19 € par mois avec engagement d’un an), et dans Croissance, 69 € par mois (49 € par mois avec engagement d’un an). Si l’abonnement s’arrête, vos webhooks se mettent en pause, sans être supprimés : ils reprennent au paiement suivant, sans les événements survenus entre-temps.

Faut-il savoir coder ?

Non pour Zapier (offre Zapier payante), Make ou n8n : vous collez l’adresse de leur déclencheur, FantomHunt y envoie chaque événement coché, avec la fiche de la personne quand il en concerne une, sans appel à l’API. Pour un serveur à vous, comptez une route qui vérifie la signature et répond par un code 2xx.

Mon navigateur doit-il rester ouvert ?

Pour LinkedIn et WhatsApp, oui : leurs événements remontent par l’extension, dans votre navigateur. Les emails sont lus par nos serveurs, sans navigateur : aussitôt si vous avez utilisé FantomHunt dans les 7 derniers jours, sinon toutes les 15 minutes. Ce que vous faites dans l’application (statut, rendez-vous, tâche) ne dépend pas du navigateur. L’envoi des livraisons, lui, part toujours de nos serveurs.

Comment éviter les doublons ?

Une même livraison peut arriver deux fois : si votre serveur répond après 10 secondes alors qu’il a déjà traité l’événement, ou si le nôtre redémarre pendant l’envoi. Il n’y a pas d’identifiant de livraison : dédoublonnez sur evenement, cree_le et l’identifiant de la fiche, jamais sur la signature, qui change à chaque envoi.

Puis-je rejouer une livraison, ou changer l’adresse ou le secret ?

Pas de rejeu manuel. L’adresse et le secret sont fixes : pour les changer, supprimez le webhook et créez-en un autre, qui reçoit un nouveau secret. Les événements, les filtres et le texte des réponses se modifient à tout moment.

Combien de webhooks, et quelles limites ?

Jusqu’à 10 webhooks par compte, 20 créations par heure, 10 envois de test par quart d’heure. Votre serveur a 10 secondes pour répondre.

En équipe, chacun a-t-il ses webhooks ?

Oui. Chaque membre règle les siens dans ses Paramètres, et un événement part vers les webhooks de la personne à qui appartient la fiche, la tâche ou l’affaire.

Puis-je créer un webhook par l’API, ou envoyer des ordres à FantomHunt par webhook ?

Non. Les webhooks se gèrent dans Paramètres › API, et FantomHunt ne reçoit pas de webhook. Pour agir depuis vos outils, passez par l’API ; pour interroger votre prospection depuis Claude Code, par le serveur MCP.

Quelles données partent vers mon outil ?

Seulement les événements cochés, vers la seule adresse choisie, en https et signés. La fiche ne contient jamais la note. Le texte des réponses reçues ne part que si vous cochez l’option ; les événements « Message envoyé », « Invitation envoyée » (sa note) et « Réponse IA à valider » portent, eux, leur texte.

Pour aller plus loin : comparer les offres en détail · l’extension, dans votre navigateur · agir par l’API · interroger votre prospection depuis Claude Code

Votre premier événement, dans votre outil.

Commencer gratuitement
  • Compte gratuit (sans CB)
  • Webhooks dès Essentiel, 29 € par mois
  • Signés et relancés