Webhooks d'application
En mode webhook (applyMode = 'webhook'), un import terminé est livré à votre backend sous forme
de POST HTTP — signé en HMAC, relancé durablement et enregistré dans un journal d’audit de
livraison.
Enregistrer votre endpoint
Section intitulée « Enregistrer votre endpoint »Enregistrez l’URL une fois ; la réponse contient le secret de signature exactement une fois — stockez-le. La rotation le ré-émet de la même façon.
POST /api/import/v1/webhookscontent-type: application/json
{ "url": "https://api.your-app.example/mildport/apply" }La requête
Section intitulée « La requête »POST /your/apply-endpointx-import-event: import.applyx-import-delivery-id: dlv_4f2…x-import-timestamp: 1717000000x-import-signature: t=…,v1=hmac_sha256(body)…content-type: application/json{ "event": "import.apply", "deliveryId": "dlv_4f2…", "tenantId": "tnt_…", "recordId": "rec_…", "action": "submit", "rowCount": 128, "mapping": { "Email": "person.email", "First name": "person.firstName" }, "occurredAt": "2026-07-12T00:00:00.000Z"}meta (contexte fourni par l’hôte), entities et links (le graphe de références résolu) apparaissent quand l’import les a utilisés.
Vérifier la signature
Section intitulée « Vérifier la signature »Calculez un HMAC-SHA256 sur le corps brut de la requête avec votre secret de livraison, et
comparez-le en temps constant à la valeur v1 de x-import-signature. La valeur t= est
l’horodatage signé — rejetez les livraisons dont l’horodatage est trop ancien pour atténuer les
attaques par rejeu.
import { createHmac, timingSafeEqual } from 'node:crypto';
function verify(rawBody: string, header: string, secret: string): boolean { const parts = Object.fromEntries(header.split(',').map(kv => kv.split('='))); const expected = createHmac('sha256', secret).update(`${parts.t}.${rawBody}`).digest('hex'); const got = Buffer.from(parts.v1 ?? '', 'hex'); const exp = Buffer.from(expected, 'hex'); return got.length === exp.length && timingSafeEqual(got, exp);}Relances et idempotence
Section intitulée « Relances et idempotence »Les livraisons sont relancées avec backoff jusqu’à ce que votre endpoint renvoie 2xx. Utilisez
x-import-delivery-id (ou recordId) pour dédupliquer — le même import peut être livré plus
d’une fois.