Webhooks
Eventos salientes, firma HMAC y reintentos.
Configuranos una URL HTTPS (Admin → Billeteras, del lado de la ALyC) y te notificamos los eventos en lugar de que hagas polling.
Eventos
| Evento | Cuándo | Payload (data) |
|---|---|---|
batch.approved | Un aprobador aprobó tu corte (antes del envío completo al BO). | batch_id, business_date, detail_hash, cantidades/montos, movements_queued, opcional risk_override. |
batch.sent | Tu corte fue enviado al Back Office (todos los movimientos OK). | batch_id, business_date, detail_hash, cantidades y montos (suscripto, rescatado, neto). |
batch.rejected | Un aprobador rechazó tu corte; las órdenes vuelven a cola. | batch_id, business_date, detail_hash, reason, requeued_orders. |
batch.settled | Ops marcó la liquidación cash como conciliada. | Mismos campos de batch + bank_reference (opcional). |
order.cancelled | Un operador anuló una orden tuya. | order_id, idempotency_key, comitente, type, amount, reason. |
comitente.created | Alta de cuenta sync OK al BO. | account_id, client_id, comitente, idempotency_key, status. |
comitente.failed | El BO rechazó el alta (reintentable). | account_id, client_id, comitente, idempotency_key, status, error. |
movement.failed | Un movimiento neto falló al BO tras agotar reintentos. | movement_id, batch_id, comitente, movement_type, amount, last_error, attempts. |
test | Prueba de integración manual. | Mensaje de prueba. |
Cada entrega es un POST con body { event, created_at, data } y estos headers:
X-Webhook-Event: batch.sent
X-Webhook-Delivery: id único de la entrega (para deduplicar reintentos)
X-Webhook-Signature: t=1791234567,v1=<hmac hex>
Verificación de la firma
// Node.js — mismo esquema que la firma de requests
import { createHmac, timingSafeEqual } from "node:crypto";
function verify(headers, rawBody, secret) {
const m = /t=(\d+),v1=([0-9a-f]+)/.exec(headers["x-webhook-signature"]);
if (!m) return false;
const expected = createHmac("sha256", secret)
.update(m[1] + "." + rawBody)
.digest("hex");
return timingSafeEqual(Buffer.from(expected), Buffer.from(m[2]));
}
Requisitos de entrega
- Respondé
2xxen menos de 8 segundos (procesá async si hace falta). - Ante error reintentamos con backoff exponencial (30s → 1h, hasta 8 intentos).
- Deduplicá por
X-Webhook-Delivery: un mismo evento puede llegar más de una vez.
Referencia completa: /docs/api (Swagger) · Hub de documentación