> ## Documentation Index
> Fetch the complete documentation index at: https://docs.outkept.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhooks

> Envoyez les événements de hameçonnage en temps réel vers votre propre endpoint.

Les webhooks permettent à la plateforme d'envoyer en temps réel des notifications
d'événements vers un système de votre choix. Chaque fois qu'un événement pertinent se produit,
par exemple un utilisateur qui clique sur un lien de simulation ou qui signale une simulation,
nous envoyons une requête HTTP POST contenant des données structurées vers une URL que vous
configurez.

Cela vous permet d'intégrer la plateforme à vos propres outils, comme un SIEM, un système RH,
un outil de ticketing ou un tableau de bord maison, sans interroger une API en boucle.

## Événements pris en charge

| Type d'événement | Quand il se déclenche |
| - | - |
| `phishing.opened` | Un utilisateur a ouvert un e-mail de simulation |
| `phishing.clicked` | Un utilisateur a cliqué sur le lien de hameçonnage d'un e-mail de simulation |
| `phishing.attachment_opened` | Un utilisateur a ouvert une pièce jointe d'un e-mail de simulation |
| `phishing.data_submitted` | Un utilisateur a soumis des données sur une page de destination de hameçonnage |
| `phishing.replied` | Un utilisateur a répondu à un e-mail de simulation |
| `phishing.reported` | Un utilisateur a signalé l'e-mail de simulation via le bouton signaler |

Tous ces événements sont envoyés à votre endpoint. Vous ne pouvez pas vous abonner à une
partie d'entre eux seulement.

<Note>
  Seule la première occurrence d'un événement est envoyée. Si un utilisateur clique deux fois
  sur la même simulation, vous recevez un seul événement `phishing.clicked`. Les événements de
  robots ne sont jamais envoyés.
</Note>

## Avant de commencer

Il vous faut :

* Un accès à la plateforme avec le rôle **Administrator** ou **Partner**
* Un endpoint HTTPS accessible publiquement, capable de recevoir des requêtes POST

<Warning>
  Les endpoints sans TLS ne sont pas pris en charge. L'URL doit être en `https://`.
</Warning>

## Ajouter un webhook

<Steps>
  <Step title="Ouvrez les paramètres des webhooks">
    Allez dans **Settings**, puis **Integrations**, puis **Webhooks**.
  </Step>

  <Step title="Ajoutez le webhook">
    Cliquez sur **Add webhook** et saisissez l'URL de votre endpoint. Ce doit être une URL
    `https://` valide et accessible publiquement.
  </Step>

  <Step title="Confirmez">
    Cliquez sur **Add webhook** pour enregistrer.
  </Step>

  <Step title="Copiez la clé de signature">
    Une clé de signature s'affiche. Copiez-la immédiatement, puis cliquez sur **I've copied the
    secret**.
  </Step>
</Steps>

<Warning>
  La clé de signature n'est affichée qu'une seule fois et ne peut pas être récupérée par la
  suite. Conservez-la en lieu sûr avant de fermer la fenêtre.
</Warning>

Pour tester l'intégration, envoyez un e-mail de test sous **Emails** puis **Tests**, et
interagissez avec.

## Contenu de l'événement

Les événements sont livrés en JSON dans le corps d'une requête HTTP POST.

| En-tête | Valeur |
| - | - |
| `Content-Type` | `application/json` |
| `X-Signature` | Signature HMAC-SHA256 du contenu, voir [Vérifier l'authenticité](#vérifier-lauthenticité) |
| `X-Signature-Timestamp` | Horodatage du moment où la requête a été signée |

Exemple de contenu :

```json theme={null}
{
  "event_type": "phishing.clicked",
  "email": "test@outkept.com",
  "source": "OutKept",
  "timestamp": "2026-06-09T14:30:45.123Z",
  "nonce": "f47ac10b-58cc-4372-a567-0e02b2c3d479"
}
```

| Champ | Ce qu'il contient |
| - | - |
| `event_type` | Le type d'événement, tiré du tableau ci-dessus |
| `email` | Adresse e-mail de la personne qui a effectué l'action |
| `source` | Toujours `OutKept` |
| `timestamp` | Date au format ISO 8601 du moment où l'événement s'est produit |
| `nonce` | UUID aléatoire, à utiliser pour dédoublonner les requêtes entrantes |

## Vérifier l'authenticité

Chaque requête contient un en-tête `X-Signature`. Il s'agit d'une signature HMAC-SHA256
calculée sur le corps brut de la requête, avec votre clé de signature comme clé.

<Steps>
  <Step title="Lisez le corps brut">
    Prenez le corps brut de la requête, avant d'analyser le JSON.
  </Step>

  <Step title="Calculez la signature">
    Calculez le HMAC-SHA256 sur le corps brut avec votre clé de signature.
  </Step>

  <Step title="Comparez">
    Comparez votre résultat à la valeur de l'en-tête `X-Signature`.
  </Step>

  <Step title="Acceptez ou rejetez">
    S'ils correspondent, la requête est authentique et vous pouvez la traiter. Sinon,
    rejetez-la avec une réponse 401.
  </Step>
</Steps>

<Warning>
  Utilisez toujours une fonction de comparaison à temps constant. Une simple comparaison de
  chaînes laisse fuir de l'information par son temps d'exécution et peut servir à falsifier une
  signature.
</Warning>

## Nouvelles tentatives

Si votre endpoint ne renvoie pas de réponse HTTP 2xx dans les 10 secondes, la livraison est
réessayée automatiquement. Après 5 tentatives infructueuses, la livraison est marquée
**Failed**.

## Supprimer un webhook

<Steps>
  <Step title="Ouvrez les paramètres des webhooks">
    Allez dans **Settings**, puis **Integrations**, puis **Webhooks**.
  </Step>

  <Step title="Supprimez-le">
    Cliquez sur **Delete webhook**, puis confirmez dans la fenêtre.
  </Step>
</Steps>

Supprimer un webhook met fin à toutes les livraisons futures. Les événements qui surviennent
alors qu'aucun webhook n'est actif ne sont pas mis en file d'attente et ne sont pas livrés
rétroactivement.

## Résolution des problèmes

| Problème | Solution |
| - | - |
| L'événement de test n'arrive pas | Vérifiez que l'endpoint est accessible publiquement en HTTPS et renvoie un statut 2xx |
| La vérification de signature échoue | Calculez le HMAC sur le corps brut, non analysé, plutôt que sur le JSON analysé |
| L'endpoint dépasse le délai | Répondez immédiatement 200 et traitez le contenu de façon asynchrone, pour rester sous les 10 secondes |
| Événements en double | Utilisez le `nonce` du corps pour dédoublonner les requêtes entrantes |

Pour tout ce qui n'est pas repris ici, contactez
[support@outkept.com](mailto:support@outkept.com) en indiquant le nom de votre organisation et
l'URL de votre endpoint.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.