Skip to main content

Webhooks

Notificaciones de cambios de factura, contingencia y conexión con el SIAT, en lugar de hacer polling a GET /api/v3/invoices/{id}/status.

Registrar un endpoint

POST /api/v3/webhooks/endpoints
Respuesta (201):
El secret solo se muestra completo aquí y al rotarlo: guárdalo para verificar las firmas.

Errores al registrar o actualizar

La URL se valida al crear y al cambiarla con PUT; si falla, 400 con error.code = BAD_REQUEST y uno de estos message:
400

Gestionar endpoints

Todas requieren el header X-API-Key.

Catálogo de eventos

Suscripción con *, un namespace (contingency.*, siat.*) o un tipo exacto de este catálogo.

Seguridad

  • HTTPS obligatorio, sin credenciales embebidas (usuario:clave@).
  • Anti-SSRF. El host se resuelve al registrar (400 si cae en un rango bloqueado) y otra vez en cada entrega; si ahora resuelve a una IP interna no se entrega (lastError = "Destino del webhook no permitido").
  • Rangos bloqueados. IPv4: loopback (127.0.0.0/8), privadas (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16), CGNAT (100.64.0.0/10), link-local y metadata (169.254.0.0/16), 0.0.0.0/8, 192.0.0.0/24, 198.18.0.0/15, multicast (224.0.0.0/4) y 240.0.0.0/4. IPv6: ::1, ::, link-local (fe80::/10), site-local, ULA (fc00::/7), multicast (ff00::/8), 100::/64 y Teredo (2001::/32). Una IPv4 embebida en IPv6 (::ffff:a.b.c.d, NAT64 64:ff9b::/96, 6to4 2002::/16) se evalúa por la IPv4 que contiene.
  • Sin redirecciones. Un 301/302 cuenta como fallo (HTTP 301).
  • Firma HMAC-SHA256 según Standard Webhooks.

Headers en cada entrega

Verificación de firma

Compara firma_esperada con webhook-signature (sin el prefijo v1,) en tiempo constante.

Payload de ejemplo

SIAT v3 (IVA transparente) agrega siat_version, price_basis, amount_net, amount_iva, amount_requested y amount_difference (nulos en v2). Ver priceBasis. documents (eventos invoice.*): URLs de los endpoints autenticados (con tu API Key), solo en facturas con documento. idempotency_key: el Idempotency-Key de la emisión (null sin él).
invoice.emitted puede llegar antes que el email. No lo tomes como confirmación de envío del correo.

Política de reintentos

Responde 2xx en el timeout (5 s para conectar, 10 s para responder). Si no, se reintenta con backoff exponencial hasta 8 intentos. Solo cuenta el código HTTP.
El mismo evento puede llegar más de una vez: deduplica con webhook-id.

Auditoría y reenvío manual

Cada entrega trae status (PENDING, DELIVERED, FAILED, DEAD), attempts, maxAttempts, lastStatusCode y lastError: