Saltar al contenido
Krezkadev

Webhooks

Entérate solo cuando SUNAT acepta, rechaza o se anula una venta.

En vez de preguntar una y otra vez con GET /sales/{id}, registra una dirección de tu servidor y Krezka te avisa cada cambio con un POST firmado.

Eventos

EventoCuándo
sale.acceptedSUNAT aceptó la boleta o factura. Ya puedes enviarle el PDF al cliente.
sale.observedSUNAT la aceptó con observaciones.
sale.rejectedSUNAT la rechazó. sunat_message dice por qué.
sale.voidedSe anuló (con su credit_note si era boleta o factura).

Cada evento trae la venta completa en data, igual que GET /sales/{id}.

Registrar tu dirección

Terminal
Terminal
curl -X POST https://api.krezka.com/api/v1/erp/webhook_endpoints \
  -H "Authorization: Bearer sk_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "url": "https://tu-web.pe/krezka/avisos", "events": ["sale.accepted", "sale.rejected", "sale.voided"] }'

La respuesta trae el secret (whsec_…) una sola vez: guárdalo, lo necesitas para verificar la firma. events vacío = todos. Hasta 5 direcciones por negocio.

Pruébalo sin vender

POST /webhook_endpoints/{id}/test manda un sale.accepted de ejemplo, firmado igual que los reales, y te dice si tu servidor respondió.

Verificar la firma

Cada aviso trae Krezka-Signature: t=1792…,v1=3f9a…. Calcula el HMAC-SHA256 de t + "." + cuerpo con tu secret y compáralo con v1:

js
js
import crypto from 'node:crypto';

app.post('/krezka/avisos', express.raw({ type: 'application/json' }), (req, res) => {
  const [, t, v1] = req.get('Krezka-Signature').match(/t=(\d+),v1=([a-f0-9]+)/);
  const esperado = crypto.createHmac('sha256', process.env.KREZKA_WHSEC)
    .update(`${t}.${req.body}`).digest('hex');
  if (esperado !== v1) return res.sendStatus(401);
  const evento = JSON.parse(req.body);
  // evento.type === 'sale.accepted' → evento.data es la venta
  res.sendStatus(200);
});

Entregas y reintentos

  • Responde 2xx en menos de 5 segundos; procesa después si tarda.
  • Si no responde, se reintenta (3 veces seguidas y luego en los siguientes barridos, cada 30 s, hasta 20 veces).
  • Un mismo evento puede llegar más de una vez: usa id del evento para no procesarlo dos veces.
  • Krezka-Attempt dice qué intento es.