Webhooks
Recevoir des notifications en temps réel sur les événements de votre compte
Webhooks API
Les webhooks vous permettent de recevoir des notifications HTTP en temps réel lorsque des événements se produisent dans votre compte NERP Suite (nouvelle commande, stock bas, etc.).
Fonctionnement
- Vous enregistrez une URL HTTPS et les événements qui vous intéressent
- Quand un événement se produit, NERP Suite envoie un
POSTà votre URL - Le payload est signé avec HMAC SHA-256 pour vérifier l'authenticité
Headers envoyés
| Header | Description |
|---|---|
Content-Type | application/json |
X-Webhook-Signature | Signature HMAC SHA-256 du body avec votre secret |
X-Webhook-Event | Type d'événement (ex: order.created) |
Vérification de la signature
const crypto = require('crypto');
function verifyWebhook(body, signature, secret) {
const expected = crypto
.createHmac('sha256', secret)
.update(body)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
);
}
Événements disponibles
GET /v1/public-api/webhooks/events
Scope requis: read:webhooks
Événements supportés
| Événement | Description |
|---|---|
stock.low-alert | Stock en dessous du seuil minimum |
stock.movement-created | Nouveau mouvement de stock |
order.created | Nouvelle commande client créée |
supplier-order.created | Nouvelle commande fournisseur créée |
supplier-order.updated | Commande fournisseur mise à jour |
supplier-order.status-changed | Statut de commande fournisseur modifié |
product.created | Nouveau produit créé |
product.updated | Produit mis à jour |
product.deleted | Produit supprimé |
customer.created | Nouveau client créé |
customer.updated | Client mis à jour |
batch.expiring-alert | Lot proche de la date d'expiration |
batch.expired | Lot expiré |
Lister les webhooks
GET /v1/public-api/webhooks
Scope requis: read:webhooks
Paramètres de requête
| Paramètre | Type | Description |
|---|---|---|
page | number | Numéro de page (défaut: 1) |
limit | number | Éléments par page (défaut: 20, max: 100) |
Exemple de requête
curl -X GET "https://api.nerpsuite.com/v1/public-api/webhooks" \
-H "X-API-Key: sk_live_xxx"
Réponse
{
"data": [
{
"id": "wh_001",
"url": "https://example.com/webhooks/nerpsuite",
"events": ["order.created", "stock.low-alert"],
"isActive": true,
"description": "Notifications commandes et stock",
"lastTriggeredAt": "2024-01-25T14:30:00Z",
"lastStatusCode": 200,
"failureCount": 0,
"createdAt": "2024-01-01T10:00:00Z"
}
],
"total": 3,
"page": 1,
"limit": 20,
"totalPages": 1
}
Obtenir un webhook
GET /v1/public-api/webhooks/:id
Scope requis: read:webhooks
Consulter les logs de livraison
GET /v1/public-api/webhooks/:id/logs
Scope requis: read:webhooks
Paramètres de requête
| Paramètre | Type | Description |
|---|---|---|
page | number | Numéro de page (défaut: 1) |
limit | number | Éléments par page (défaut: 20, max: 100) |
Réponse
{
"data": [
{
"id": "whl_001",
"event": "order.created",
"statusCode": 200,
"success": true,
"error": null,
"duration": 145,
"createdAt": "2024-01-25T14:30:00Z"
},
{
"id": "whl_002",
"event": "stock.low-alert",
"statusCode": 500,
"success": false,
"error": "HTTP 500",
"duration": 2034,
"createdAt": "2024-01-25T12:15:00Z"
}
],
"total": 50,
"page": 1,
"limit": 20,
"totalPages": 3
}
Créer un webhook
POST /v1/public-api/webhooks
Scope requis: write:webhooks
Corps de la requête
| Champ | Type | Requis | Description |
|---|---|---|---|
url | string | Oui | URL HTTPS de destination |
events | string[] | Oui | Liste des événements à écouter |
description | string | Non | Description du webhook |
Exemple de requête
curl -X POST "https://api.nerpsuite.com/v1/public-api/webhooks" \
-H "X-API-Key: sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"url": "https://example.com/webhooks/nerpsuite",
"events": ["order.created", "stock.low-alert", "supplier-order.status-changed"],
"description": "Notifications pour mon ERP"
}'
Réponse
{
"id": "wh_001",
"url": "https://example.com/webhooks/nerpsuite",
"events": ["order.created", "stock.low-alert", "supplier-order.status-changed"],
"isActive": true,
"description": "Notifications pour mon ERP",
"secret": "a1b2c3d4e5f6...your_webhook_secret",
"failureCount": 0,
"createdAt": "2024-01-25T10:00:00Z"
}
Important : Le
secretn'est retourné qu'une seule fois lors de la création. Conservez-le précieusement pour vérifier les signatures.
Mettre à jour un webhook
PATCH /v1/public-api/webhooks/:id
Scope requis: write:webhooks
Corps de la requête
Tous les champs sont optionnels.
| Champ | Type | Description |
|---|---|---|
url | string | Nouvelle URL HTTPS |
events | string[] | Nouvelle liste d'événements |
description | string | Description |
isActive | boolean | Activer/désactiver le webhook |
Exemple : Désactiver un webhook
curl -X PATCH "https://api.nerpsuite.com/v1/public-api/webhooks/wh_001" \
-H "X-API-Key: sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{ "isActive": false }'
Supprimer un webhook
DELETE /v1/public-api/webhooks/:id
Scope requis: write:webhooks
Exemple de requête
curl -X DELETE "https://api.nerpsuite.com/v1/public-api/webhooks/wh_001" \
-H "X-API-Key: sk_live_xxx"
Retourne 204 No Content en cas de succès.
Champs de réponse
Webhook
| Champ | Type | Description |
|---|---|---|
id | string | Identifiant unique |
url | string | URL de destination |
events | string[] | Événements souscrits |
isActive | boolean | Webhook actif ou non |
description | string | Description |
lastTriggeredAt | string | Dernier déclenchement (ISO 8601) |
lastStatusCode | number | Dernier code HTTP reçu |
failureCount | number | Nombre d'échecs consécutifs |
createdAt | string | Date de création (ISO 8601) |
Log de livraison
| Champ | Type | Description |
|---|---|---|
id | string | Identifiant unique |
event | string | Type d'événement |
statusCode | number | Code HTTP de la réponse |
success | boolean | Livraison réussie |
error | string | Message d'erreur (si échec) |
duration | number | Durée en millisecondes |
createdAt | string | Date du log (ISO 8601) |
Payload d'un webhook
Chaque appel webhook envoie un body JSON avec cette structure :
{
"event": "order.created",
"timestamp": "2024-01-25T14:30:00.000Z",
"data": {
"companyId": "comp_001",
"order": {
"id": "ord_123",
"orderNumber": "ORD-2024-000456"
}
}
}
Le contenu de data varie selon l'événement.
Cas d'usage
Notification Slack sur stock bas
// Votre serveur reçoit le webhook
app.post('/webhooks/nerpsuite', (req, res) => {
const { event, data } = req.body;
if (event === 'stock.low-alert') {
slack.send({
text: `Alerte stock bas : ${data.productName} (${data.quantity} restants)`
});
}
res.sendStatus(200);
});
Synchronisation ERP sur nouvelles commandes
app.post('/webhooks/nerpsuite', async (req, res) => {
const { event, data } = req.body;
if (event === 'order.created') {
await erp.createSalesOrder({
reference: data.order.orderNumber,
customer: data.order.customerId,
items: data.order.items
});
}
res.sendStatus(200);
});