Les webhooks vous permettent de recevoir des notifications en temps réel lorsque des événements se produisent dans votre système Diamy, comme des appels entrants, des messages vocaux ou des changements de statut.
Au lieu de sonder régulièrement l'API pour détecter les changements, les webhooks envoient des notifications HTTP POST à une URL que vous spécifiez lorsqu'un événement se produit. Cela vous permet de créer des intégrations en temps réel avec votre système Diamy.
Système Diamy
Votre application
1. Un événement se produit dans Diamy (ex: appel entrant)
2. Diamy envoie une requête HTTP POST à votre URL de webhook
3. Votre application traite l'événement et répond avec un code 200
Pour configurer un webhook, vous devez spécifier une URL de destination et les types d'événements que vous souhaitez recevoir.
/v2/webhooks
Vous pouvez également créer des webhooks programmatiquement via l'API :
curl -X POST "https://api.diamy.fr/v2/webhooks" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "url": "https://votre-serveur.com/webhooks/diamy", "events": ["call.incoming", "call.ended", "voicemail.new"], "secret": "votre_secret_webhook", "description": "Webhook pour les événements d'appels" }'
Voici les principaux types d'événements que vous pouvez recevoir via les webhooks :
Événement | Description |
---|---|
call.incoming | Déclenché lorsqu'un nouvel appel entrant est reçu |
call.answered | Déclenché lorsqu'un appel est répondu |
call.missed | Déclenché lorsqu'un appel entrant n'est pas répondu |
call.ended | Déclenché lorsqu'un appel se termine |
call.transferred | Déclenché lorsqu'un appel est transféré |
voicemail.new | Déclenché lorsqu'un nouveau message vocal est reçu |
voicemail.read | Déclenché lorsqu'un message vocal est marqué comme lu |
message.new | Déclenché lorsqu'un nouveau message instantané est reçu |
user.presence_changed | Déclenché lorsque le statut de présence d'un utilisateur change |
contact.created | Déclenché lorsqu'un nouveau contact est créé |
contact.updated | Déclenché lorsqu'un contact est mis à jour |
Les notifications de webhook sont envoyées sous forme de requêtes HTTP POST avec un corps JSON contenant les détails de l'événement.
{ "id": "evt_123456789", "type": "call.incoming", "created_at": "2023-06-15T14:32:21Z", "data": { // Les données spécifiques à l'événement } }
Chaque notification contient :
{ "id": "evt_123456789", "type": "call.incoming", "created_at": "2023-06-15T14:32:21Z", "data": { "call": { "id": "call_123456", "direction": "inbound", "from": { "number": "+33123456789", "name": "Jean Dupont", "contact_id": "contact_789012" }, "to": { "number": "+33987654321", "name": "Service Client", "user_id": "user_345678" }, "status": "ringing", "timestamp": "2023-06-15T14:32:21Z", "queue": { "id": "queue_123", "name": "Support Technique" }, "custom_data": { "crm_contact_id": "CRM-12345" } } } }
Pour garantir que les webhooks proviennent bien de Diamy et n'ont pas été altérés, nous signons chaque requête avec un secret que vous configurez.
Chaque requête webhook inclut un en-tête Diamy-Signature
qui contient une signature HMAC-SHA256 du corps de la requête, générée avec votre secret webhook.
Diamy-Signature: t=1623766341,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd
L'en-tête contient :
Pour vérifier la signature, vous devez :
const crypto = require('crypto'); const express = require('express'); const app = express(); app.use(express.json({ verify: (req, res, buf) => { req.rawBody = buf; } })); app.post('/webhooks/diamy', (req, res) => { const signature = req.headers['diamy-signature']; const webhookSecret = 'votre_secret_webhook'; if (!signature) { return res.status(400).send('Signature manquante'); } // Extraire le timestamp et la signature const [timestamp, receivedSignature] = signature.split(',').map(part => { const [key, value] = part.split('='); return value; }); // Vérifier que la requête n'est pas trop ancienne (5 minutes max) const now = Math.floor(Date.now() / 1000); if (now - parseInt(timestamp) > 300) { return res.status(400).send('Requête expirée'); } // Calculer la signature const hmac = crypto.createHmac('sha256', webhookSecret); hmac.update(req.rawBody); const expectedSignature = hmac.digest('hex'); // Comparer les signatures if (receivedSignature !== expectedSignature) { return res.status(401).send('Signature invalide'); } // Traiter l'événement const event = req.body; console.log('Événement reçu:', event.type); // Répondre avec un code 200 pour confirmer la réception res.status(200).send('OK'); }); app.listen(3000, () => { console.log('Serveur webhook démarré sur le port 3000'); });
Problème | Solution |
---|---|
Webhook non reçu |
|
Erreur de signature |
|
Événements manquants |
|
Événements en double |
|
Pour plus d'informations ou en cas de problème, n'hésitez pas à contacter notre support technique à l'adresse support@diamy.fr.