LidmeoDevelopers

Webhooks

Recevez les événements de votre compte sur votre serveur, signés, en général dans la minute.

Un webhook envoie chaque événement de votre compte (une invitation acceptée, une réponse, une étape posée…) à une adresse HTTPS de votre choix, en POST, signé au standard Standard Webhooks.

Créer une adresse de réception

Dans Lidmeo : Intégrations, rubrique Webhooks, Ajouter une adresse de réception. Choisissez les événements ; le secret de signature (whsec_…) s'affiche une seule fois. L'écran ne montre que les adresses du compte réel.

Par l'API, avec le droit webhooks:manage :

curl https://api.lidmeo.com/v1/webhook_endpoints \
  -H "Authorization: Bearer $LIDMEO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://exemple.fr/webhooks/lidmeo",
    "enabled_events": ["invitation.accepted", "prospect.replied"],
    "description": "Vers le CRM"
  }'
  • L'adresse : HTTPS sur le port 443, un nom de domaine public (jamais une adresse IP, localhost ou un nom interne), sans identifiants dedans. Une redirection n'est pas suivie.
  • Les événements : une liste de types, ou ["*"] pour tous. Voir le catalogue.
  • Les droits de qui crée l'adresse y sont figés : sans conversations:read, pas d'abonnement aux événements message.* ; sans contacts:read, les coordonnées des prospects sont retirées des envois. Une adresse ajoutée dans Lidmeo reçoit tout ce que votre compte lit, coordonnées et texte des messages compris ; pour la restreindre, créez-la par l'API avec une clé aux seuls droits utiles.
  • Changer l'adresse (url) d'une adresse existante demande tous les droits de lecture figés sur elle : sinon 403 insufficient_scope, qui nomme ceux qui manquent.
  • Une adresse créée par une connexion OAuth vit avec elle : quand la connexion est révoquée (ou quand la personne perd son accès), l'adresse est désactivée avec disabled_reason: "revoked" et ne reçoit plus rien. Elle ne se réactive pas telle quelle (409 conflict) : seulement avec une nouvelle URL, et elle appartient alors à qui l'a donnée.
  • disabled_reason dit pourquoi une adresse est désactivée : manual (par vous), failing (trop d'échecs, voir les reprises) ou revoked.
  • Un compte a au plus 16 adresses de réception. Celles du compte de test se créent avec une clé de test.

Ce que vous recevez

POST /webhooks/lidmeo HTTP/1.1
Host: exemple.fr
Content-Type: application/json
User-Agent: Lidmeo-Webhooks/1.0
webhook-id: evt_1Z8nR4yTu6Qe
webhook-timestamp: 1790845951
webhook-signature: v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4=
{
  "id": "evt_1Z8nR4yTu6Qe",
  "object": "event",
  "type": "invitation.accepted",
  "timestamp": "2026-10-01T09:12:31.000Z",
  "api_version": "2026-10-01",
  "livemode": true,
  "account": "acct_1J4kQ8sLr2Xw",
  "data": {
    "object": {
      "id": "pros_1Hq3ZtV9kWmA",
      "object": "prospect",
      "livemode": true,
      "account": "acct_1J4kQ8sLr2Xw",
      "campaign": "cmp_1T7pLx2Nq8Rv",
      "created_at": "2026-09-25T09:12:31.000Z",
      "updated_at": "2026-10-01T09:12:31.000Z",
      "origin": "lidmeo",
      "first_name": "Camille",
      "last_name": "Exemple",
      "full_name": "Camille Exemple",
      "headline": "Directrice commerciale chez Exemple SAS",
      "title": "Directrice commerciale",
      "company": { "name": "Exemple SAS", "size": "51-200", "industry": "Logiciels" },
      "location": { "label": "Lyon, Auvergne-Rhône-Alpes, France", "country": "FR", "department": "69" },
      "linkedin_url": "https://www.linkedin.com/in/camille-exemple",
      "photo_url": null,
      "why_him": null,
      "activity": null,
      "shared_connections_count": null,
      "pipeline_stage": "connected",
      "crm_stage": null,
      "reminder_on": null,
      "lists": [],
      "invitation": { "sent_at": "2026-09-26T09:12:31.000Z", "accepted_at": "2026-10-01T09:12:31.000Z" },
      "first_message_sent_at": null,
      "replied_at": null,
      "last_activity_at": "2026-10-01T09:12:31.000Z",
      "conversation": "conv_1Ab3Cd5Ef7Gh9Ij1Kl3Mn5o",
      "external_ids": {}
    }
  }
}
  • data.object : l'objet dont parle l'événement, tel qu'il était quand l'événement a été enregistré (un prospect, un message, une campagne…).
  • data.previous_attributes : les valeurs d'avant, quand l'événement est un changement (une étape retirée, une campagne mise en pause).
  • webhook-id est l'identifiant de l'événement, le même à chaque tentative.

La plupart des événements sont enregistrés dans la minute où Lidmeo apprend le fait ; ceux d'une action faite par l'API, en général tout de suite après elle. timestamp reste l'heure du fait.

Les listes, les notes, « traité » et la pose d'un rappel ne produisent aucun événement (seul le jour du rappel produit prospect.reminder_due) : relisez le prospect. prospect.updated dit seulement que des coordonnées ont été trouvées, ou que le prospect a été lié à un objet de vos outils.

Répondre

Répondez un code 2xx en moins de 15 secondes. Faites le travail ensuite (une file, une tâche de fond) : un traitement long fait échouer la livraison, qui est alors reprise. Tout autre code est un échec : voir les reprises.

Avant tout traitement, vérifiez la signature : voir vérifier une signature.

Essayer

Pour voir la forme exacte d'un type, appelez POST /v1/webhook_endpoints/{id}/test avec { "type": "…" } ; le bouton Envoyer un essai de Lidmeo envoie un prospect.created. Chaque essai est une charge d'exemple, avec des valeurs fictives, data.test: true et un identifiant evt_test_…. Une seule tentative, hors du journal des événements. Le résultat (code, durée, extrait de la réponse) est dans la livraison rendue.

Rattraper

Le journal des événements de votre compte démarre à sa première requête à l'API ou à sa première adresse de réception : rien de plus ancien n'est rejoué. Il garde 30 jours : GET /v1/events relit ce que vous auriez manqué, avec les mêmes objets que les webhooks, du plus récent au plus ancien. Relisez-le jusqu'au dernier id traité, puis traitez dans l'ordre inverse.

Sur cette page