Principe des webhooks
Au lieu de interroger l’API régulièrement (polling), les webhooks permettent à KennHosting de pousser des notifications vers votre application dès qu’un événement se produit.
Événement KennHosting → POST vers votre URL → Votre app traite l'événement
Espace client → Mon compte → API → Webhooks → Ajouter
Ou via l’API :
POST /v1/webhooks
Content-Type: application/json
{
"url": "https://votre-app.com/webhooks/kennhosting",
"events": [
"service.activated",
"payment.completed",
"domain.registered"
]
}
| Champ | Description |
|---|
url | URL HTTPS publique de votre endpoint (HTTP non accepté) |
events | Liste des événements autorisés (pas de wildcard *) |
La clé secret est générée côté serveur et renvoyée dans la réponse de création.
Structure d’un payload (exemple)
{
"event": "service.activated",
"created_at": "2026-04-13T10:30:00+00:00",
"data": {
"message": "payload dépendant de l'événement"
}
}
Vérification de signature
Chaque webhook est signé avec votre secret. Vérifiez toujours la signature avant de traiter le payload pour éviter les requêtes malveillantes.
L’en-tête X-KennHosting-Signature contient la signature HMAC-SHA256 du body :
X-KennHosting-Signature: sha256=abc123def456...
Vérification en PHP (Laravel)
use Illuminate\Http\Request;
public function handle(Request $request): JsonResponse
{
$signature = $request->header('X-KennHosting-Signature');
$secret = config('services.kennhosting.webhook_secret');
$expected = 'sha256=' . hash_hmac('sha256', $request->getContent(), $secret);
if (!hash_equals($expected, $signature)) {
return response()->json(['error' => 'Signature invalide'], 401);
}
$event = $request->json('event');
$data = $request->json('data');
match ($event) {
'service.activated' => $this->handleServiceActivated($data),
'payment.completed' => $this->handlePaymentCompleted($data),
'domain.registered' => $this->handleDomainRegistered($data),
default => null,
};
return response()->json(['received' => true]);
}
Vérification en Node.js
const crypto = require('crypto');
function verifySignature(payload, signature, secret) {
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(expected),
Buffer.from(signature)
);
}
app.post('/webhooks/kennhosting', (req, res) => {
const sig = req.headers['x-kennhosting-signature'];
if (!verifySignature(req.rawBody, sig, process.env.WEBHOOK_SECRET)) {
return res.status(401).json({ error: 'Signature invalide' });
}
const { event, data } = req.body;
// Traiter l'événement...
res.json({ received: true });
});
Votre endpoint doit répondre avec un code HTTP 2xx dans les 5 secondes. Au-delà, KennHosting considère la livraison comme échouée et retente jusqu’à 3 fois avec un délai exponentiel (1 min, 10 min, 1 heure).
Événements autorisés
| Événement |
|---|
service.activated |
service.suspended |
service.cancelled |
payment.completed |
payment.failed |
domain.registered |
domain.renewed |
ticket.created |
ticket.replied |
Tester vos webhooks
Depuis votre espace client, vous pouvez envoyer un événement de test :
Mon compte → API → Webhooks → [votre webhook] → Envoyer un test
Ou via l’API :
POST /v1/webhooks/{id}/test
Content-Type: application/json
Historique des livraisons
GET /v1/webhooks/{id}/deliveries
{
"data": [
{
"delivery_id": "del_01HXYZ001",
"event": "service.activated",
"status": "success",
"http_status": 200,
"duration_ms": 245,
"attempted_at": "2024-06-15T10:30:00Z"
},
{
"delivery_id": "del_01HXYZ002",
"event": "payment.completed",
"status": "failed",
"http_status": 500,
"error": "Connection timeout",
"retries": 3,
"attempted_at": "2024-06-15T11:00:00Z"
}
]
}