Webhooks de aplicación
En modo webhook (applyMode = 'webhook'), una importación completada se entrega a tu backend
como un POST HTTP — firmado con HMAC, reintentado de forma duradera y registrado en un
registro de auditoría de entrega.
Registra tu endpoint
Sección titulada «Registra tu endpoint»Registra la URL una vez; la respuesta lleva el secreto de firma exactamente una vez — guárdalo. La rotación lo vuelve a emitir igual.
POST /api/import/v1/webhookscontent-type: application/json
{ "url": "https://api.your-app.example/mildport/apply" }La solicitud
Sección titulada «La solicitud»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 (contexto del host), entities y links (el grafo de referencias resuelto) aparecen cuando el import los usó.
Verifica la firma
Sección titulada «Verifica la firma»Calcula un HMAC-SHA256 sobre el cuerpo bruto de la solicitud usando tu secreto de entrega, y
compáralo en tiempo constante con el valor v1 de x-import-signature. El valor t= es la
marca de tiempo firmada — rechaza las entregas cuya marca de tiempo sea demasiado antigua para
mitigar los ataques de repetición.
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);}Reintentos e idempotencia
Sección titulada «Reintentos e idempotencia»Las entregas se reintentan con backoff hasta que tu endpoint devuelve 2xx. Usa
x-import-delivery-id (o recordId) para deduplicar — la misma importación puede entregarse más
de una vez.