# Envoyer les événements à ton application (webhooks)

Un webhook envoie les événements de ton espace à une de tes applications : une facture payée, un document signé, un nouveau prospect. Ton application reçoit un message JSON signé, qu’elle peut vérifier.

**Avant de commencer** : être propriétaire ou admin de l’espace, et avoir l’adresse https de ton application qui recevra les messages.

1. **Ajoute le webhook**

   Dans le menu de l’espace, **Webhooks**, puis **Ajouter un webhook**. Colle l’adresse, donne une description si tu veux, et coche les événements.

2. **Copie le secret**

   Portal affiche le secret (`whsec_…`) une seule fois. Copie-le dans ton application : elle s’en sert pour vérifier chaque message.

3. **Vérifie la réception**

   Après un premier événement, ouvre **Journal des livraisons** depuis le menu du webhook : chaque message, son contenu, ses essais et la réponse de ton application.

## Ce que ton application reçoit

Un `POST` JSON au format [Standard Webhooks](https://www.standardwebhooks.com/) :

```json
{
  "type": "invoice.paid",
  "timestamp": "2026-10-18T09:12:00.000Z",
  "data": { "workspace": "mon-atelier", "invoice_id": "…", "number": "2026-0012", "total": 125000, "currency": "CHF", "online": true }
}
```

Les montants sont en centimes. La liste des événements et de leurs champs est dans [Événements des webhooks](/portal/docs/reference/evenements-webhooks/).

## Vérifier la signature

Trois en-têtes accompagnent chaque message : `webhook-id`, `webhook-timestamp` et `webhook-signature`. La signature est un HMAC-SHA256 de `<webhook-id>.<webhook-timestamp>.<corps>`, avec la clé obtenue en décodant la partie base64 du secret. Les bibliothèques Standard Webhooks (JavaScript, Python, PHP, Go…) le font pour toi. Refuse un message dont l’horodatage a plus de 5 minutes.

Un même message peut arriver deux fois (reprise, renvoi) : garde les `webhook-id` déjà traités.

## Si ton application ne répond pas

Portal attend une réponse 2xx en moins de 10 secondes. Sinon, il réessaie 8 fois en tout, pendant environ 28 heures. Une redirection compte comme un échec : indique l’adresse finale. Depuis le journal, **Renvoyer** relance un message.

**Mettre en pause** arrête les envois sans supprimer le webhook. Le journal est gardé 30 jours.
