Webhooks
Notificaciones de cambios de factura, contingencia y conexión con el SIAT, en lugar de hacer polling aGET /api/v3/invoices/{id}/status.
Registrar un endpoint
POST /api/v3/webhooks/endpoints
Errores al registrar o actualizar
La URL se valida al crear y al cambiarla conPUT; 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 (
400si 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) y240.0.0.0/4. IPv6:::1,::, link-local (fe80::/10), site-local, ULA (fc00::/7), multicast (ff00::/8),100::/64y Teredo (2001::/32). Una IPv4 embebida en IPv6 (::ffff:a.b.c.d, NAT6464:ff9b::/96, 6to42002::/16) se evalúa por la IPv4 que contiene. - Sin redirecciones. Un
301/302cuenta como fallo (HTTP 301). - Firma HMAC-SHA256 según Standard Webhooks.
Headers en cada entrega
Verificación de firma
firma_esperada con webhook-signature (sin el prefijo v1,) en tiempo constante.
Payload de ejemplo
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
Responde2xx 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.
Auditoría y reenvío manual
Cada entrega trae
status (PENDING, DELIVERED, FAILED, DEAD), attempts, maxAttempts, lastStatusCode y lastError: