Webhooks
Los webhooks de Tupana te permiten recibir notificaciones en tiempo real cuando ocurren eventos importantes en tu sistema de facturación. Esta guía te ayudará a configurar y usar webhooks de forma efectiva.¿Qué son los webhooks?
Los webhooks son una forma de comunicación donde Tupana envía automáticamente una notificación HTTP POST a una URL que tú configures cuando ocurre un evento específico (por ejemplo, cuando se emite una factura). A diferencia de las APIs donde tú haces las consultas, con los webhooks Tupana te notifica cuando algo importante sucede, permitiéndote mantener tu sistema sincronizado en tiempo real.Cómo crear un webhook
Desde la interfaz web
- Ve a Configuración → Webhooks
- Haz clic en Nuevo Webhook
- Completa los siguientes campos:
- URL del Endpoint: La URL de tu servidor que recibirá las notificaciones (debe ser HTTPS)
- Eventos: Selecciona los eventos que quieres recibir
- Secret (opcional): Una clave secreta para verificar la autenticidad de las notificaciones
- Ambiente: Producción y sandbox (default), sólo producción o sólo sandbox
- Formato de identificadores: Públicos (
docu_…,ment_…, recomendado) o enteros (API v1). Viene preseleccionado según los webhooks que ya tiene la empresa. Ver Identificadores en el payload - Activo: Marca esta opción para activar el webhook
- Haz clic en Guardar
Ejemplo de configuración
Seguridad
Firma de webhooks
Para verificar que las notificaciones provienen realmente de Tupana, puedes configurar un secret al crear el webhook. Tupana firmará cada notificación usando HMAC SHA-256.Cómo verificar la firma
Node.js:Headers enviados
Cada notificación incluye los siguientes headers:Content-Type: application/jsonUser-Agent: Pana-Webhook/1.0X-Pana-Event-Id: ID único del evento (UUID)X-Pana-Event-Type: Tipo de evento (ej:document.issued)X-Pana-Timestamp: Timestamp ISO 8601 del eventoX-Pana-Delivery: ID único del intento de entrega (UUID)X-Pana-Signature: Firma HMAC SHA-256 (si configuraste un secret)
Eventos soportados
Eventos de documentos
document.issued: Se emitió un documento exitosamentedocument.issue_failed: Falló la emisión de un documentodocument.updated: Se actualizó un documento existentedocument.delivered: Se entregó un documento (PDF/XML enviado al cliente)document.rejected: El SII rechazó el documentodocument.paid: El documento fue pagado (conciliación bancaria)document.unpaid: El documento volvió de pagado a no pagado (se revirtió el pago/conciliación)document.cancelled: El documento fue anulado o tiene nota de créditodocument.trace_updated: Apareció un evento nuevo en la traza del SII (acuse de recibo, reclamo, rechazo). Es el único evento que se notifica tanto al emisor como al receptor del documento
Eventos de documentos programados
scheduled_document.created: Se creó un documento programadoscheduled_document.updated: Se actualizó un documento programadoscheduled_document.run_started: Se inició la ejecución de un documento programadoscheduled_document.run_succeeded: La ejecución de un documento programado fue exitosascheduled_document.run_failed: La ejecución de un documento programado falló
Eventos de credenciales
credential.validated: Una credencial SII fue validada exitosamente contra el SIIcredential.invalid: Una credencial SII quedó inválida (clave incorrecta o cuenta bloqueada)
Eventos operacionales
webhook.test: Evento de prueba para verificar que tu endpoint funciona correctamente
Payloads por Evento
Cada evento tiene una estructura de payload específica. Navega a cada evento para ver su payload completo:Navegación Rápida
- Eventos de Documentos
- Eventos de Documentos Programados
- Eventos de Credenciales
- Eventos Operacionales
Eventos de Documentos
document.issued
Se dispara cuando un documento se emite exitosamente. Incluye el PDF y XML del documento.pdf_file: URL del PDF del documento (solo en este evento)xml_file: URL del XML del documentodocument_issuer: Información completa del emisordocument_receiver: Información completa del receptordetails: Array con todas las líneas del documento
document.issue_failed
Se dispara cuando falla la emisión de un documento.folio, pdf_file y xml_file pueden ser null ya que el documento no se emitió exitosamente.
document.updated
Se dispara cuando se actualiza un documento existente.pdf_file puede ser null en este evento ya que solo se genera en la emisión inicial.
document.delivered
Se dispara cuando se entrega un documento (PDF/XML enviado al cliente).document.rejected
Se dispara cuando el SII rechaza un documento.document.paid
Se dispara cuando un documento es pagado (conciliación bancaria).document.unpaid
Se dispara cuando un documento que estaba pagado vuelve a no pagado, es decir, cuando se revierte el pago o la conciliación (manualmente o porque una nota de crédito / recálculo de saldo dejó la factura con saldo pendiente). El payload es idéntico al dedocument.paid; solo cambia el campo event.
document.cancelled
Se dispara cuando un documento es anulado o tiene una nota de crédito asociada.references puede contener información sobre la nota de crédito o anulación asociada.
document.trace_updated
Se dispara cada vez que aparece un evento nuevo en la traza del SII de un documento: un acuse de recibo, un reclamo, un rechazo o el vencimiento del plazo de mérito ejecutivo.Es el único evento que se notifica a las dos puntas del documento. El resto
de los eventos de documento se envían al emisor; este también le llega al
receptor, para que puedas seguir la traza tanto de lo que emites como de lo que
recibes. El campo
role te dice desde qué lado estás mirando:"issuer": tu empresa emitió el documento (lo ves en tus emitidos)."receiver": tu empresa recibió el documento (lo ves en tus recibidos).
role.Campos de trace
id: ID de la traza en Tupana (integer)date_reception: Fecha y hora en que el SII recibió el documento (string ISO 8601 o null)has_acknowledgments: El documento tiene acuse de recibo (boolean)has_claims: El documento tiene reclamos (boolean)is_rejected: Hay al menos un evento de rechazo (RCD,RFPoRFT) en la traza (boolean)is_paid_cash: El documento fue pagado al contado (boolean)is_more_than_eight_days: Pasaron más de 8 días desde la recepción (boolean)days_until_executive_merit: Días que faltan para el mérito ejecutivo (integer o null; es null si ya hay acuse o rechazo)new_events: Los eventos que gatillaron esta notificación. Es lo que cambió desde el aviso anterior (array)events: Todos los eventos de la traza, ordenados por fecha. Te sirve para reconstruir el historial completo si te perdiste alguna entrega (array)
code: Código del evento en el SII (string)description: Descripción del evento (string)date: Fecha y hora del evento (string ISO 8601)responsable_tax_id: RUT de quien registró el evento (string o null)
Códigos de evento del SII
Cuándo se envía
- Se envía un evento por cada evento nuevo de la traza, no uno por actualización. Tupana consulta la traza de tus documentos varias veces al día; mientras no haya novedad, no recibes nada.
- Un mismo evento del SII notifica una sola vez, por más veces que se
vuelva a consultar la traza. Los reintentos por fallas de tu endpoint sí
repiten el envío, con el mismo
delivery_id(ver Idempotencia). xml_fileviaja sólo si el XML ya está guardado en Tupana; si no, va ennull. Este evento no dispara la descarga del archivo desde el SII.
Eventos de Documentos Programados
scheduled_document.created
Se dispara cuando se crea un documento programado.frequency: Frecuencia de ejecución (daily, weekly, monthly, etc.)status: Estado del documento programado (active, paused, etc.)next_execution: Fecha y hora de la próxima ejecución
scheduled_document.updated
Se dispara cuando se actualiza un documento programado.scheduled_document.run_started
Se dispara cuando se inicia la ejecución de un documento programado.scheduled_document.run_succeeded
Se dispara cuando la ejecución de un documento programado es exitosa.next_execution se actualiza con la próxima fecha de ejecución.
scheduled_document.run_failed
Se dispara cuando falla la ejecución de un documento programado.Eventos de Credenciales
Estos eventos se disparan por credencial individual, incluyendo las creadas vía creación de credenciales en lote. El webhook se configura pormaster_entity, y una credencial puede estar asociada a más de una entidad: si eso ocurre, se envía una notificación por cada entidad que tenga un webhook suscrito al evento.
credential.validated
Se dispara cuando una credencial SII fue validada exitosamente contra el SII (login exitoso).credential.invalid
Se dispara cuando una credencial SII queda inválida: clave incorrecta o cuenta bloqueada.status refleja el estado de la credencial en Tupana (VALID / INVALID), no un detalle del error. El payload no distingue si la causa fue una clave incorrecta o una cuenta bloqueada.
Eventos Operacionales
webhook.test
Evento de prueba para verificar que tu endpoint funciona correctamente.Identificadores en el payload
Cada webhook tiene un campoapi_version que define el formato de todos los ids del payload:
Si no eliges la versión al crear, el default sigue el contexto: por
/v2/webhooks/ nace en 2, por /v1/webhooks/ nace en 1, y desde la plataforma nace en la versión que ya usa la empresa (1 si tiene algún webhook con enteros, 2 si no). El selector del formulario muestra el valor preseleccionado.
Los ids públicos son los mismos que devuelve la API v2, así que puedes cruzarlos directo con GET /v2/documents/ o /v2/master-entities/. Los ejemplos de esta guía muestran la versión 2.
Los eventos de credenciales (credential.*) siempre traen ids públicos, en cualquier versión.
Estructura común del payload
Todos los payloads comparten esta estructura base:event: Tipo de evento que disparó el webhook (string)created_at: Timestamp ISO 8601 del evento (string)data: Objeto con los datos específicos del evento (varía según el tipo)
Campos comunes en eventos de documentos
id: ID único del documento en Tupana (docu_…; entero si el webhook está enapi_version1)folio: Folio del documento (string o null)date_issued: Fecha de emisión en formato ISO (string)amount_with_iva: Monto total con IVA (float)is_sandbox: Indica si es un documento de prueba (boolean)dte_type: Tipo de documento tributario (objeto concodeydescription)sender: Información del emisor (objeto conid,name,tax_id,email)receiver: Información del receptor (objeto conid,name,tax_id,emailo null)document_total: Totales del documento (objeto connet_amount,iva_rate,iva_amount,total_amount)details: Array con las líneas del documentoxml_file: URL del XML del documento (string o null)pdf_file: URL del PDF del documento (string o null, solo endocument.issued)role: Punta del documento en la que está tu empresa,"issuer"o"receiver"(string, solo endocument.trace_updated)trace: Estado de la traza del SII (objeto, solo endocument.trace_updated)
Reintentos
Tupana reintenta automáticamente las entregas fallidas usando una estrategia exponencial:- Intento 1: Inmediato
- Intento 2: 1 minuto después
- Intento 3: 5 minutos después
- Intento 4: 15 minutos después
- Intento 5: 1 hora después
- Intento 6: 6 horas después
Idempotencia
Cada notificación tiene undelivery_id único (UUID). Si recibes el mismo delivery_id múltiples veces, es un reintento del mismo evento. Tu endpoint debe ser idempotente para evitar procesar el mismo evento varias veces.
Recomendaciones
- Responde con código
2xx(200-299) para indicar éxito - Responde rápidamente (idealmente < 2 segundos)
- Si tu endpoint tarda más, responde
202 Acceptedy procesa asíncronamente - No proceses la misma notificación dos veces (usa
delivery_idpara deduplicar)
Errores comunes
Error 4xx (Client Error)
Si tu endpoint responde con un código 4xx (400-499), Tupana asume que hay un problema con la configuración o el formato de la notificación. Estos errores se reintentan, pero si persisten, considera:- Verificar que la URL es correcta y accesible
- Verificar que tu endpoint acepta POST requests
- Verificar que tu endpoint acepta
Content-Type: application/json - Revisar los logs de tu servidor para ver el error específico
Error 5xx (Server Error)
Si tu endpoint responde con un código 5xx (500-599), Tupana asume que hay un problema temporal en tu servidor. Estos errores se reintentan automáticamente.Timeout
Si tu endpoint no responde en 120 segundos, Tupana considera la entrega como fallida y la reintenta.Monitoreo y Debug
Dashboard de métricas
En Configuración → Webhooks, puedes ver:- Total de entregas: Número total de notificaciones enviadas
- Tasa de éxito: Porcentaje de entregas exitosas
- Fallos: Número de entregas fallidas
- Reintentos: Número de reintentos necesarios
- Tiempo promedio de respuesta: Tiempo que tarda tu endpoint en responder
- Top 5 errores: Los errores más comunes
- Top 5 endpoints con fallos: URLs que más fallan
Historial de entregas
Puedes ver el historial completo de cada intento de entrega, incluyendo:- Status code recibido
- Tiempo de respuesta
- Mensaje de error (si falló)
- Payload completo enviado
Mejores prácticas
- Usa HTTPS: Tu endpoint debe usar HTTPS para seguridad
- Configura un secret: Siempre configura un secret y verifica la firma
- Sé idempotente: Usa
delivery_idpara evitar procesar el mismo evento dos veces - Responde rápido: Responde en menos de 2 segundos o usa
202 Accepted - Maneja errores: Responde con códigos HTTP apropiados
- Monitorea métricas: Revisa regularmente el dashboard de métricas
- Prueba primero: Usa el evento
webhook.testpara verificar tu endpoint
Ejemplo completo
Endpoint de ejemplo (Node.js + Express)
Soporte
Si tienes problemas con tus webhooks:- Revisa el Dashboard de Métricas en Configuración → Webhooks
- Revisa el Historial de Entregas para ver errores específicos
- Contacta a soporte con el
delivery_iddel intento fallido
