Référence des événements webhook
Formats des charges utiles, en-têtes et définitions des champs pour chaque événement webhook.
Pourquoi c’est important
Chaque livraison de webhook encapsule les données propres à l’événement dans une même enveloppe. Cette référence documente le format exact de la charge utile pour chaque événement, afin que vous puissiez les analyser et les traiter en toute confiance.
Enveloppe de la charge utile
{
"event": "application.submitted",
"created_at": "2025-01-15T14:30:00Z",
"data": { }
}
| Champ | Type | Description |
|---|---|---|
event |
string | Le type d’événement qui a déclenché cette livraison |
created_at |
string | Horodatage ISO 8601 du moment où l’événement s’est produit |
data |
object | Charge utile propre à l’événement (varie selon le type d’événement) |
En-têtes de requête
Chaque requête webhook inclut les en-têtes suivants :
| En-tête | Exemple | Description |
|---|---|---|
Content-Type |
application/json |
Toujours JSON |
X-Webhook-Event |
application.submitted |
Le type d’événement |
X-Webhook-Signature |
a1b2c3d4... |
Condensé hexadécimal HMAC-SHA256 |
X-Webhook-Timestamp |
2025-01-15T14:30:00Z |
Horodatage ISO 8601 utilisé dans la signature |
User-Agent |
Kit-Webhooks/1.0 |
Identifie Kit comme l’expéditeur |
Consultez Sécurité et livraison des webhooks pour les détails de la vérification de signature.
Événements de candidature
Événements : application.submitted, application.rejected, application.rejection_reverted, application.advanced, application.stage_returned, application.withdrawn, application.offer_extended
application.stage_returned est émis lorsqu’un membre de l’équipe ramène une candidature à une étape antérieure. Il reprend la même charge utile que les autres événements de candidature.
{
"event": "application.submitted",
"created_at": "2025-01-15T14:30:00Z",
"data": {
"id": 42,
"candidate": {
"id": 7,
"name": "Jane Smith",
"email": "[email protected]"
},
"job_posting": {
"id": 3,
"title": "Senior Engineer"
},
"current_stage": "Applied",
"submitted_at": "2025-01-15T14:30:00Z",
"rejected": false,
"withdrawn": false,
"offered": false
}
}
| Champ | Type | Description |
|---|---|---|
id |
integer | Identifiant de la candidature |
candidate.id |
integer | Identifiant du candidat |
candidate.name |
string | Nom complet du candidat |
candidate.email |
string | Adresse e-mail du candidat |
job_posting.id |
integer | Identifiant de l’offre d’emploi |
job_posting.title |
string | Intitulé de l’offre d’emploi |
current_stage |
string | Nom de l’étape actuelle du pipeline |
submitted_at |
string | null | Horodatage ISO 8601 de la soumission |
rejected |
boolean | Indique si la candidature a été rejetée |
withdrawn |
boolean | Indique si le candidat s’est retiré |
offered |
boolean | Indique si une offre a été proposée |
Événements d’offre
Événements : offer.accepted, offer.declined
-
offer.accepted/offer.declined: déclenchés lorsqu’un administrateur accepte ou décline une offre
{
"event": "offer.accepted",
"created_at": "2025-01-20T10:00:00Z",
"data": {
"id": 15,
"status": "accepted",
"details": "Senior Engineer — $150k base",
"extended_at": "2025-01-18T09:00:00Z",
"expires_at": "2025-01-25T23:59:59Z",
"accepted_at": null,
"declined_at": null,
"candidate": {
"id": 7,
"name": "Jane Smith",
"email": "[email protected]"
},
"job_posting": {
"id": 3,
"title": "Senior Engineer"
}
}
}
| Champ | Type | Description |
|---|---|---|
id |
integer | Identifiant de l’offre |
status |
string | L’une des valeurs suivantes : pending, accepted, declined, candidate_accepted, candidate_declined, expired
|
details |
string | null | Texte détaillant l’offre |
extended_at |
string | null | Date à laquelle l’offre a été proposée |
expires_at |
string | null | Date d’expiration de l’offre |
accepted_at |
string | null | Date à laquelle l’offre a été acceptée par un administrateur |
declined_at |
string | null | Date à laquelle l’offre a été déclinée par un administrateur |
candidate |
object | Détails du candidat (même format que les événements de candidature) |
job_posting |
object | Détails de l’offre d’emploi (même format que les événements de candidature) |
Événements d’entretien
Événements : interview.scheduled, interview.confirmed, interview.completed, interview.cancelled, interview.no_show, interview.no_show_reverted, interview.rebooked
interview.no_show_reverted est émis lorsque l’absence est annulée. interview.rebooked est émis après la clôture de l’ancien entretien et l’invitation du candidat à réserver un nouveau créneau. Les deux utilisent la charge utile d’entretien ci-dessous.
{
"event": "interview.scheduled",
"created_at": "2025-01-16T09:00:00Z",
"data": {
"id": 28,
"status": "pending",
"scheduled_at": "2025-01-20T14:00:00Z",
"duration_minutes": 60,
"candidate": {
"id": 7,
"name": "Jane Smith",
"email": "[email protected]"
},
"job_posting": {
"id": 3,
"title": "Senior Engineer"
}
}
}
| Champ | Type | Description |
|---|---|---|
id |
integer | Identifiant de l’entretien |
status |
string | Statut de l’entretien (pending, confirmed, completed, cancelled, no_show) |
scheduled_at |
string | null | Horodatage ISO 8601 de l’heure prévue |
duration_minutes |
integer | Durée de l’entretien en minutes |
candidate |
object | Détails du candidat |
job_posting |
object | Détails de l’offre d’emploi |
Événements d’exercice de code
Événements : code_assignment.submitted, code_assignment.auto_submitted
{
"event": "code_assignment.submitted",
"created_at": "2025-01-22T16:45:00Z",
"data": {
"id": 11,
"repo_url": "https://github.com/org/assignment-jane-smith",
"submitted_at": "2025-01-22T16:45:00Z",
"submitted_by": null,
"deadline_at": "2025-01-25T23:59:59Z",
"candidate": {
"id": 7,
"name": "Jane Smith",
"email": "[email protected]"
},
"job_posting": {
"id": 3,
"title": "Senior Engineer"
}
}
}
| Champ | Type | Description |
|---|---|---|
id |
integer | Identifiant de la soumission de code |
repo_url |
string | URL du dépôt GitHub |
submitted_at |
string | null | Date de soumission de l’exercice |
submitted_by |
object | null | Membre de l’équipe (id, name) ayant marqué l’exercice comme soumis à la place du candidat ; null si le candidat a soumis lui-même ou si la date limite a déclenché la soumission automatique |
deadline_at |
string | null | Date limite de l’exercice |
candidate |
object | Détails du candidat |
job_posting |
object | Détails de l’offre d’emploi |
Événements de revue
Événements : review.submitted
{
"event": "review.submitted",
"created_at": "2025-01-23T11:00:00Z",
"data": {
"id": 9,
"recommendation": "strong_yes",
"reviewer": "Alex Johnson",
"origin": "web",
"candidate": {
"id": 7,
"name": "Jane Smith",
"email": "[email protected]"
},
"job_posting": {
"id": 3,
"title": "Senior Engineer"
},
"stage": "Technical Interview"
}
}
| Champ | Type | Description |
|---|---|---|
id |
integer | Identifiant de la revue |
recommendation |
string | Recommandation de l’évaluateur |
reviewer |
string | Nom de l’évaluateur |
origin |
string | Mode de soumission de la revue : web (dans Kit) ou mcp (déposée par un outil d’IA via hiring_submit_review au nom de l’évaluateur, après sa confirmation) |
candidate |
object | Détails du candidat |
job_posting |
object | Détails de l’offre d’emploi |
stage |
string | Nom de l’étape du pipeline où la revue a été soumise |
Événements d’offre d’emploi
Événements : job_posting.published, job_posting.paused, job_posting.closed, job_posting.reopened
{
"event": "job_posting.published",
"created_at": "2025-01-10T08:00:00Z",
"data": {
"id": 3,
"title": "Senior Engineer",
"status": "published",
"location": "Remote",
"department": "Engineering",
"employment_type": "full_time",
"published_at": "2025-01-10T08:00:00Z",
"closed_at": null,
"public_url": "https://careers.example.com/senior-engineer"
}
}
| Champ | Type | Description |
|---|---|---|
id |
integer | Identifiant de l’offre d’emploi |
title |
string | Intitulé du poste |
status |
string | Statut actuel (published, paused, closed) |
location |
string | Lieu du poste |
department |
string | Nom du département |
employment_type |
string | Forme de collaboration (full_time, part_time, b2b, contract ou internship) |
published_at |
string | null | Date de publication de l’offre |
closed_at |
string | null | Date de clôture de l’offre |
public_url |
string | URL publique de cette offre sur le portail carrière |
Événements de rapport CSIRT
Événements : csirt.report.submitted, csirt.report.triaged, csirt.report.validated, csirt.report.resolved, csirt.report.fix_verified, csirt.report.dismissed, csirt.report.informative, csirt.report.assessed, csirt.report.assigned, csirt.report.bounty_approved, csirt.report.paid, csirt.report.sla_breached, csirt.report.escalation_requested
Ces événements nécessitent le module complémentaire CSIRT (programme de primes). Les événements effectivement transmis sont émis lorsque le statut du rapport change et utilisent la charge utile ci-dessous.
Warning
csirt.report.assessed, csirt.report.assigned et csirt.report.bounty_approved apparaissent dans les réglages d’abonnement, mais sont réservés et ne sont pas transmis actuellement. Ne créez aucune automatisation qui en dépend.
csirt.report.dismissed signifie que le rapport a été refusé. csirt.report.informative signifie qu’il était valide mais n’appelait aucune correction, et qu’un bonus discrétionnaire a pu lui être versé : ne fusionnez pas les deux cas dans une même branche « clôturé ».
Deux événements se déclenchent en dehors des changements de statut et utilisent la même charge utile :
-
csirt.report.sla_breachedse déclenche une fois, quand un rapport ouvert dépasse son délai d’accusé de réception (72 heures par défaut, réglable par programme). Un rapport fermé puis rouvert peut le déclencher à nouveau. Les rapports évalués comme Informatif ne le déclenchent pas. -
csirt.report.escalation_requestedse déclenche quand le chercheur utilise Demander un point d’avancement dans le portail chercheur. Sa note n’est jamais incluse.
{
"event": "csirt.report.submitted",
"created_at": "2026-03-12T10:00:00Z",
"data": {
"id": "rpt_abc123",
"vulnerability_type": "sql_injection",
"severity_tier": "critical",
"cvss_score": 9.8,
"status": "submitted",
"program_name": "Acme Security Program",
"submitted_at": "2026-03-12T10:00:00Z"
}
}
| Champ | Type | Description |
|---|---|---|
id |
string | Identifiant préfixé du rapport |
vulnerability_type |
string | Catégorie de vulnérabilité signalée |
severity_tier |
string | null | Niveau de sévérité évalué (présent une fois l’évaluation faite) |
cvss_score |
number | null | Score CVSS (présent une fois l’évaluation faite) |
status |
string | Statut du rapport au moment de l’événement |
program_name |
string | Nom du programme de primes |
submitted_at |
string | null | Date de soumission du rapport |
Remarque : le titre et la description du rapport sont exclus des charges utiles webhook (chiffrés au repos).
Événements Outreach
Événements : outreach.prospect.drafted, outreach.message.approved, outreach.message.sent, outreach.message.bounced, outreach.message.failed, outreach.message.deferred, outreach.message.delivery_unknown, outreach.message.confirmation_expired, outreach.message.delivery_resolved
Ces événements nécessitent le module complémentaire Outreach.
outreach.prospect.drafted
Déclenché lorsque l’IA termine la recherche sur un prospect et la rédaction d’un e-mail.
{
"event": "outreach.prospect.drafted",
"created_at": "2026-03-12T10:00:00Z",
"data": {
"id": "op_abc123",
"campaign_id": "oc_def456",
"company_name": "Acme Corp",
"display_name": "Jane Smith",
"status": "drafted"
}
}
| Champ | Type | Description |
|---|---|---|
id |
string | Identifiant préfixé du prospect |
campaign_id |
string | Identifiant préfixé de la campagne |
company_name |
string | Nom de l’entreprise du prospect |
display_name |
string | Nom d’affichage du prospect |
status |
string | Statut du prospect au moment de l’événement |
Remarque : l’adresse e-mail du prospect est exclue des charges utiles webhook (chiffrée au repos).
outreach.message.approved / sent / bounced / failed / deferred / delivery_unknown / confirmation_expired
Déclenché lorsqu’un message passe au statut approved, sent, bounced, failed, deferred, delivery_unknown ou confirmation_expired. failed indique un échec connu d’authentification, d’expéditeur, de contenu ou de politique et ouvre une vérification pour une nouvelle tentative après correction ou pour une clôture. deferred indique que les nouvelles tentatives sans risque ont été épuisées après un échec connu avant soumission. delivery_unknown indique que l’acceptation SMTP n’a pas pu être confirmée ; Kit arrête donc le renvoi automatique pour éviter un doublon. confirmation_expired indique que le destinataire, l’identité de l’expéditeur, l’objet ou le corps relu a changé avant le démarrage de SMTP. Aucune tentative d’envoi n’a commencé et le message actuel doit être relu et approuvé de nouveau.
{
"event": "outreach.message.sent",
"created_at": "2026-03-12T10:15:00Z",
"data": {
"id": "om_ghi789",
"campaign_id": "oc_def456",
"prospect_id": "op_abc123",
"step_number": 1,
"subject": "Quick question about Acme's hiring workflow",
"status": "sent",
"sent_at": "2026-03-12T10:15:00Z",
"approved_at": "2026-03-12T09:30:00Z",
"retry_count": 0,
"last_error_code": null
}
}
| Champ | Type | Description |
|---|---|---|
id |
string | Identifiant préfixé du message |
campaign_id |
string | Identifiant préfixé de la campagne |
prospect_id |
string | Identifiant préfixé du prospect |
step_number |
integer | Numéro de l’étape dans la séquence (1 = initial, 2+ = relances) |
subject |
string | Objet de l’e-mail |
status |
string | L’une des valeurs suivantes : approved, sent, bounced, failed, deferred, delivery_unknown, confirmation_expired
|
sent_at |
string | null | Date d’envoi de l’e-mail |
approved_at |
string | null | Date d’approbation du brouillon |
retry_count |
integer | Nombre de tentatives d’envoi effectuées |
last_error_code |
string | null | Code SMTP ou de statut d’envoi analysé, s’il est disponible ; null si aucune tentative n’a commencé |
Remarque : le corps de l’e-mail du message est exclu des charges utiles webhook (chiffré au repos).
outreach.message.delivery_resolved
Déclenché lorsqu’un membre autorisé à gérer la campagne consigne la décision immuable qui clôt une vérification delivery_unknown, deferred ou failed. Le résultat indique si Kit a enregistré un envoi incertain comme envoyé, programmé une tentative explicitement autorisée après preuve ou correction, ou clos la vérification sans envoyer. delivery_attempt_id désigne la tentative exacte dont les preuves ont été tranchées.
{
"event": "outreach.message.delivery_resolved",
"created_at": "2026-03-12T10:20:00Z",
"data": {
"id": 84,
"message_id": "om_ghi789",
"delivery_attempt_id": 312,
"campaign_id": "oc_def456",
"prospect_id": "op_abc123",
"outcome": "confirmed_not_sent",
"origin": "web",
"resolved_by_id": 17,
"resolved_at": "2026-03-12T10:20:00Z",
"sent_at": null
}
}
| Champ | Type | Description |
|---|---|---|
id |
integer | Identifiant du registre d’audit de la résolution |
message_id |
string | Identifiant préfixé du message |
delivery_attempt_id |
integer | Tentative d’envoi concernée par la décision |
campaign_id |
string | Identifiant préfixé de la campagne |
prospect_id |
string | Identifiant préfixé du prospect |
outcome |
string |
confirmed_sent, confirmed_not_sent, retry_authorized ou closed_without_delivery
|
origin |
string | Origine de la décision : web, mcp ou assistant
|
resolved_by_id |
integer | null | Utilisateur ayant confirmé la décision ; null si cet utilisateur a ensuite été effacé |
resolved_at |
string | Horodatage ISO 8601 de la décision |
sent_at |
string | null | Heure d’envoi confirmée, présente uniquement pour confirmed_sent
|
La note facultative de l’opérateur est chiffrée au repos et volontairement exclue, car elle peut contenir des coordonnées du destinataire copiées depuis la boîte de l’expéditeur.
Événements de test
Événements : test.ping
L’événement test.ping est envoyé lorsque vous cliquez sur Envoyer un ping de test dans les paramètres du webhook. Utilisez-le pour vérifier la connectivité de votre point de terminaison et la validation de la signature.
{
"event": "test.ping",
"created_at": "2025-01-15T14:30:00Z",
"data": {}
}