Aller au contenu
Commencer

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.

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/webhooks
content-type: application/json
{ "url": "https://api.your-app.example/mildport/apply" }
POST /your/apply-endpoint
x-import-event: import.apply
x-import-delivery-id: dlv_4f2…
x-import-timestamp: 1717000000
x-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" },
"rows": [{ "person.email": "[email protected]", "person.firstName": "Ada" }],
"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.

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);
}

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.