Guía de integración · PSP

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

EventoCuándoPayload (data)
batch.approvedUn 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.sentTu corte fue enviado al Back Office (todos los movimientos OK).batch_id, business_date, detail_hash, cantidades y montos (suscripto, rescatado, neto).
batch.rejectedUn aprobador rechazó tu corte; las órdenes vuelven a cola.batch_id, business_date, detail_hash, reason, requeued_orders.
batch.settledOps marcó la liquidación cash como conciliada.Mismos campos de batch + bank_reference (opcional).
order.cancelledUn operador anuló una orden tuya.order_id, idempotency_key, comitente, type, amount, reason.
comitente.createdAlta de cuenta sync OK al BO.account_id, client_id, comitente, idempotency_key, status.
comitente.failedEl BO rechazó el alta (reintentable).account_id, client_id, comitente, idempotency_key, status, error.
movement.failedUn movimiento neto falló al BO tras agotar reintentos.movement_id, batch_id, comitente, movement_type, amount, last_error, attempts.
testPrueba 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é 2xx en 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