Référence API
Endpoints webhook
Un endpoint webhook est une de tes URL qui reçoit les événements de Gemlead au moment où ils se produisent. Tu peux en avoir 10 par compte. Lis Webhooks pour les événements, leurs payloads et la vérification des signatures.
L'objet endpoint webhook
Une de tes URL à laquelle Gemlead envoie des événements. Voir Webhooks pour les événements et leur vérification.
Attributs
- idstringIdentifiant unique de l'endpoint.
- objectstringToujours
webhook_endpoint. - urlstringL'URL HTTPS à laquelle les événements sont envoyés.
- descriptionstring ou nullTa note sur l'endpoint.
- eventstableau de stringsLes types d'événements qui lui sont envoyés.
lead.createdlead.hotreply.receivedreaction.receivedsam.suggestion.readysam.reply.sentsam.handoff - statusstringSi des événements lui sont envoyés.
enableddisabled - filtersobjectLes événements qu'il reçoit, selon le persona du lead. Ces filtres s'appliquent à tous les types d'événements.
- disabled_reasonstring ou nullPourquoi il est désactivé.
manualquand tu l'as désactivé,failingquand Gemlead l'a fait après 3 jours d'échecs de suite et au moins 8 tentatives ratées.nulltant qu'il est activé.manualfailing - secretstringLe secret de signature,
whsec_suivi de 32 caractères. Seulement dans les réponses à la création et au renouvellement du secret. - created_atstringDate de création de l'endpoint, en ISO 8601.
- updated_atstringDate de la dernière modification de l'endpoint, en ISO 8601.
{
"id": "wh3LpX9dKe",
"object": "webhook_endpoint",
"url": "https://example.com/webhooks/gemlead",
"description": "CRM sync",
"events": ["lead.hot", "reply.received"],
"status": "enabled",
"filters": {
"persona_ids": ["lvWBPnytpS"]
},
"disabled_reason": null,
"created_at": "2026-09-14T09:21:05.300Z",
"updated_at": "2026-11-06T07:45:12.904Z"
}Lister les endpoints webhook
readRenvoie tes endpoints webhook, sans leurs secrets.
Paramètres de requête
- limitintegerNombre d'objets à renvoyer, de 1 à 100. 25 par défaut.
- cursorstringLe
next_cursorde la page précédente, pour obtenir la suivante. Voir Pagination.
Renvoie
Une liste d'objets endpoint webhook.
curl https://gemlead.ai/api/v1/webhook_endpoints \
-H "Authorization: Bearer $GEMLEAD_API_KEY"{
"object": "list",
"data": [
{
"id": "wh3LpX9dKe",
"object": "webhook_endpoint",
"url": "https://example.com/webhooks/gemlead",
"description": "CRM sync",
"events": ["lead.hot", "reply.received"],
"status": "enabled",
"filters": {
"persona_ids": ["lvWBPnytpS"]
},
"disabled_reason": null,
"created_at": "2026-09-14T09:21:05.300Z",
"updated_at": "2026-11-06T07:45:12.904Z"
}
],
"has_more": false,
"next_cursor": null
}Créer un endpoint webhook
writeEnregistre une URL pour un ou plusieurs types d'événements. Garde le secret de la réponse, c'est la seule fois que tu le vois.
Paramètres du corps
- urlstringObligatoireUne URL HTTPS joignable depuis Internet.
- eventstableau de stringsObligatoireLes types d'événements à envoyer.
lead.createdlead.hotreply.receivedreaction.receivedsam.suggestion.readysam.reply.sentsam.handoff - descriptionstringUne note pour toi.
- filtersobjectLes événements à envoyer, selon le persona du lead.
Renvoie
Le nouvel objet endpoint webhook avec son secret.
Erreurs
- Il manque un paramètre obligatoire.
paramindique lequel. - Un paramètre a une valeur que l'API n'accepte pas.
paramindique lequel. - Le corps contient un champ que cet endpoint n'accepte pas.
- 400url_invalidL'URL n'est pas en HTTPS, contient des identifiants ou pointe vers une adresse privée.
- Le compte a déjà 10 endpoints.
curl -X POST https://gemlead.ai/api/v1/webhook_endpoints \
-H "Authorization: Bearer $GEMLEAD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/webhooks/gemlead",
"events": ["lead.hot", "reply.received"],
"description": "CRM sync",
"filters": {
"persona_ids": ["lvWBPnytpS"]
}
}'{
"id": "wh3LpX9dKe",
"object": "webhook_endpoint",
"url": "https://example.com/webhooks/gemlead",
"description": "CRM sync",
"events": ["lead.hot", "reply.received"],
"status": "enabled",
"filters": {
"persona_ids": ["lvWBPnytpS"]
},
"disabled_reason": null,
"created_at": "2026-09-14T09:21:05.300Z",
"updated_at": "2026-11-06T07:45:12.904Z",
"secret": "whsec_4QeX7nP2kR9tLm3Vb8YzC1dF6hJ0sWuA"
}Récupérer un endpoint webhook
readRenvoie un endpoint webhook, sans son secret.
Paramètres de chemin
- idstringObligatoireL'ID de l'endpoint webhook.
Renvoie
Erreurs
- Aucun endpoint webhook avec cet ID sur le compte de la clé.
curl https://gemlead.ai/api/v1/webhook_endpoints/wh3LpX9dKe \
-H "Authorization: Bearer $GEMLEAD_API_KEY"{
"id": "wh3LpX9dKe",
"object": "webhook_endpoint",
"url": "https://example.com/webhooks/gemlead",
"description": "CRM sync",
"events": ["lead.hot", "reply.received"],
"status": "enabled",
"filters": {
"persona_ids": ["lvWBPnytpS"]
},
"disabled_reason": null,
"created_at": "2026-09-14T09:21:05.300Z",
"updated_at": "2026-11-06T07:45:12.904Z"
}Modifier un endpoint webhook
writeModifie un endpoint. Mets status à enabled pour réactiver un endpoint que Gemlead a désactivé. Le réactiver ou lui donner une nouvelle url remet son compteur d'échecs à zéro.
Paramètres de chemin
- idstringObligatoireL'ID de l'endpoint webhook.
Paramètres du corps
- urlstringUne nouvelle URL HTTPS.
- eventstableau de stringsLes types d'événements à envoyer.
lead.createdlead.hotreply.receivedreaction.receivedsam.suggestion.readysam.reply.sentsam.handoff - descriptionstringUne note pour toi.
- statusstringActiver ou désactiver l'endpoint.
enableddisabled - filtersobjectLes événements à envoyer, selon le persona du lead.
Renvoie
L'objet endpoint webhook à jour.
Erreurs
- Aucun endpoint webhook avec cet ID sur le compte de la clé.
- Un paramètre a une valeur que l'API n'accepte pas.
paramindique lequel. - Le corps contient un champ que cet endpoint n'accepte pas.
- 400url_invalidL'URL n'est pas en HTTPS, contient des identifiants ou pointe vers une adresse privée.
curl -X PATCH \
https://gemlead.ai/api/v1/webhook_endpoints/wh3LpX9dKe \
-H "Authorization: Bearer $GEMLEAD_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"status": "enabled"
}'{
"id": "wh3LpX9dKe",
"object": "webhook_endpoint",
"url": "https://example.com/webhooks/gemlead",
"description": "CRM sync",
"events": ["lead.hot", "reply.received"],
"status": "enabled",
"filters": {
"persona_ids": ["lvWBPnytpS"]
},
"disabled_reason": null,
"created_at": "2026-09-14T09:21:05.300Z",
"updated_at": "2026-11-06T07:45:12.904Z"
}Supprimer un endpoint webhook
writeSupprime un endpoint. Les envois qui attendent encore une nouvelle tentative sont abandonnés.
Paramètres de chemin
- idstringObligatoireL'ID de l'endpoint webhook.
Renvoie
Un objet avec l'id de l'endpoint et deleted à true.
Erreurs
- Aucun endpoint webhook avec cet ID sur le compte de la clé.
curl -X DELETE \
https://gemlead.ai/api/v1/webhook_endpoints/wh3LpX9dKe \
-H "Authorization: Bearer $GEMLEAD_API_KEY"{
"id": "wh3LpX9dKe",
"object": "webhook_endpoint",
"deleted": true
}Renouveler le secret de signature
writeRemplace aussitôt le secret de l'endpoint, et l'ancien ne fonctionne plus. Les envois qui échouent entre-temps sont renvoyés, signés avec le nouveau secret.
Paramètres de chemin
- idstringObligatoireL'ID de l'endpoint webhook.
Renvoie
L'objet endpoint webhook avec son nouveau secret.
Erreurs
- Aucun endpoint webhook avec cet ID sur le compte de la clé.
curl -X POST \
https://gemlead.ai/api/v1/webhook_endpoints/wh3LpX9dKe/roll_secret \
-H "Authorization: Bearer $GEMLEAD_API_KEY"{
"id": "wh3LpX9dKe",
"object": "webhook_endpoint",
"url": "https://example.com/webhooks/gemlead",
"description": "CRM sync",
"events": ["lead.hot", "reply.received"],
"status": "enabled",
"filters": {
"persona_ids": ["lvWBPnytpS"]
},
"disabled_reason": null,
"created_at": "2026-09-14T09:21:05.300Z",
"updated_at": "2026-11-06T07:45:12.904Z",
"secret": "whsec_4QeX7nP2kR9tLm3Vb8YzC1dF6hJ0sWuA"
}Envoyer un événement test
writeEnvoie un événement d'exemple du premier type d'événement de l'endpoint, avec data.test à true et des ID qui commencent par test_. Un seul essai, sans nouvelle tentative.
Paramètres de chemin
- idstringObligatoireL'ID de l'endpoint webhook.
Renvoie
Un objet envoi de webhook avec le status et le status_code renvoyés par ton endpoint.
Erreurs
- Aucun endpoint webhook avec cet ID sur le compte de la clé.
curl -X POST \
https://gemlead.ai/api/v1/webhook_endpoints/wh3LpX9dKe/test \
-H "Authorization: Bearer $GEMLEAD_API_KEY"{
"id": "dL5qW1zXa8",
"object": "webhook_delivery",
"endpoint_id": "wh3LpX9dKe",
"event_id": "evt_8kQ2vXr4LmT9wPz1Hc6YbN3d",
"event_type": "lead.hot",
"status": "succeeded",
"attempts": 1,
"status_code": 200,
"error": null,
"test": true,
"next_attempt_at": null,
"last_attempt_at": "2026-11-06T07:45:12.904Z",
"created_at": "2026-11-06T07:45:12.904Z"
}L'objet envoi de webhook
Un événement envoyé à un endpoint, avec ses tentatives et la dernière réponse de ton serveur.
Attributs
- idstringIdentifiant unique de l'envoi.
- objectstringToujours
webhook_delivery. - endpoint_idstringL'endpoint destinataire.
- event_idstringL'événement envoyé, l'
idque ton serveur a reçu. - event_typestringLe type de l'événement.
lead.createdlead.hotreply.receivedreaction.receivedsam.suggestion.readysam.reply.sentsam.handoff - statusstring
pendingtant qu'il reste des tentatives, puissucceededoufailed.pendingsucceededfailed - attemptsintegerTentatives faites jusqu'ici, 8 au plus.
- status_codeinteger ou nullLe statut HTTP de ta dernière réponse.
nulls'il n'y en a pas eu, après un timeout ou une erreur de connexion. - errorstring ou nullCe qui n'a pas marché à la dernière tentative, comme le statut et le début de ta réponse, ou un timeout.
- testboolean
truepour un événement test. - next_attempt_atstring ou nullDate de la prochaine tentative, tant que le statut est
pending. - last_attempt_atstring ou nullDate de la dernière tentative.
- created_atstringDate de création de l'envoi, en ISO 8601.
{
"id": "dR7mK2pVn4",
"object": "webhook_delivery",
"endpoint_id": "wh3LpX9dKe",
"event_id": "evt_3Hn7QpW2xZk9LmR4tV8bYc1D",
"event_type": "reply.received",
"status": "pending",
"attempts": 2,
"status_code": 503,
"error": "HTTP 503: Service Unavailable",
"test": false,
"next_attempt_at": "2026-11-06T08:18:10.000Z",
"last_attempt_at": "2026-11-06T08:13:10.000Z",
"created_at": "2026-11-06T08:12:10.000Z"
}Lister les envois
readRenvoie les derniers envois de l'endpoint, du plus récent au plus ancien, événements test compris. Les envois sont conservés 30 jours.
Paramètres de chemin
- idstringObligatoireL'ID de l'endpoint webhook.
Paramètres de requête
- limitintegerNombre d'envois à renvoyer, de 1 à 100. 25 par défaut.
Renvoie
Une liste d'objets envoi de webhook. Cette liste n'a pas de next_cursor, augmente limit pour en voir plus.
Erreurs
- Aucun endpoint webhook avec cet ID sur le compte de la clé.
- Un paramètre a une valeur que l'API n'accepte pas.
paramindique lequel.
curl -G \
https://gemlead.ai/api/v1/webhook_endpoints/wh3LpX9dKe/deliveries \
-H "Authorization: Bearer $GEMLEAD_API_KEY" \
-d limit=10{
"object": "list",
"data": [
{
"id": "dR7mK2pVn4",
"object": "webhook_delivery",
"endpoint_id": "wh3LpX9dKe",
"event_id": "evt_3Hn7QpW2xZk9LmR4tV8bYc1D",
"event_type": "reply.received",
"status": "pending",
"attempts": 2,
"status_code": 503,
"error": "HTTP 503: Service Unavailable",
"test": false,
"next_attempt_at": "2026-11-06T08:18:10.000Z",
"last_attempt_at": "2026-11-06T08:13:10.000Z",
"created_at": "2026-11-06T08:12:10.000Z"
},
{
"id": "dL5qW1zXa8",
"object": "webhook_delivery",
"endpoint_id": "wh3LpX9dKe",
"event_id": "evt_8kQ2vXr4LmT9wPz1Hc6YbN3d",
"event_type": "lead.hot",
"status": "succeeded",
"attempts": 1,
"status_code": 200,
"error": null,
"test": true,
"next_attempt_at": null,
"last_attempt_at": "2026-11-06T07:45:12.904Z",
"created_at": "2026-11-06T07:45:12.904Z"
}
],
"has_more": false,
"next_cursor": null
}