Webhooks
En lugar de consultar el API cada cierto tiempo, registra un endpoint HTTP y Nodda te notifica cada vez que termina una sincronización. El flujo típico es:
- Nodda ejecuta el sync en el horario configurado (o bajo demanda).
- Al finalizar emite un evento (
sync.succeeded,sync.partialosync.failed) hacia tu endpoint. - Tu servicio recibe el evento, verifica la firma y llama al API de lectura para obtener los datos frescos.
Los webhooks son solo notificaciones: no contienen datos financieros ni PII. La carga es mínima y la verificación de firma es obligatoria.
Registra y administra tus endpoints desde el panel: app.nodda.cl → Webhooks.
Catálogo de eventos
| Evento | Cuándo se emite |
|---|---|
sync.succeeded | la corrida terminó sin errores |
sync.partial | la corrida terminó pero algún scope tuvo problemas no críticos |
sync.failed | la corrida falló completamente |
Estructura del payload
El cuerpo de cada entrega es JSON con esta forma:
period es el periodo (YYYY-MM) sincronizado para ese scope, o null en scopes point-in-time (ej. saldos). Úsalo para llamar al read endpoint del scope con ?period=. durationMs — number. Wall-clock milliseconds this scope took during the sync run.
En sync.failed (y algunos sync.partial), data incluye además errorCode:
Headers de la entrega
| Header | Valor |
|---|---|
content-type | application/json |
webhook-id | UUID único de la entrega (úsalo para deduplicar) |
webhook-timestamp | Unix epoch en segundos (entero) del momento de entrega |
webhook-signature | firma v1,<base64 HMAC-SHA256> (ver abajo) |
Verificar la firma
Nodda implementa la especificación Standard Webhooks. La firma se computa sobre:
donde:
decoded_secretes la clave base64-decodificada del secreto (prefijowhsec_eliminado antes de decodificar).<rawBody>es el cuerpo crudo tal cual llegó — no lo re-serialices.- El resultado se codifica en base64 y se prefija con
v1,.
Con la librería oficial (recomendado)
Instala svix o standardwebhooks:
Verificación manual (Node.js)
Si prefieres no instalar una librería adicional:
Siempre usa comparación timing-safe (timingSafeEqual) y verifica el timestamp. Rechaza cualquier entrega con más de 5 minutos de antigüedad para mitigar ataques de replay.
Contrato de reintentos
Si tu endpoint no responde con un código 2xx, Nodda reintenta la entrega hasta 4 veces con la siguiente planificación fija:
| Intento | Retraso acumulado |
|---|---|
| 1 (inmediato) | — |
| 2 | +1 min |
| 3 | +30 min |
| 4 | +2 h |
Tras agotar los 4 intentos la entrega queda en estado failed. Si un endpoint acumula demasiadas fallas consecutivas, Nodda lo desactiva automáticamente — puedes reactivarlo desde el panel.
Diseña tu handler para ser idempotente. Usa el header webhook-id para deduplicar: una misma entrega puede llegar más de una vez. Responde 2xx lo antes posible y procesa en background — Nodda no impone un timeout largo pero un handler lento es frágil.
El orden de entrega entre eventos no está garantizado. Si un sync rápido y uno lento se solapan, puedes recibir el evento del segundo antes que el del primero.
Registrar un endpoint
Desde el panel
- Ve a app.nodda.cl → Webhooks → Nuevo endpoint.
- Introduce la URL de tu handler (HTTPS).
- Selecciona los tipos de evento que quieres recibir (
sync.succeeded,sync.partial,sync.failed). - Copia el secreto
whsec_…— se muestra solo una vez.
Via API REST
Respuesta (201):
El campo secret solo aparece en la respuesta de creación y al rotar el secreto.
Rotar el secreto
Esto genera un nuevo whsec_…, invalida el anterior y lo devuelve en la respuesta. Actualiza tu handler antes de rotar en producción.
Ver entregas y reintentar
El endpoint de entregas devuelve el historial de intentos (estado, código HTTP, timestamp) para cada evento.