Webhooks en Facturear
Los webhooks te permiten recibir notificaciones en tiempo real cuando ocurren eventos en Facturear, sin necesidad de hacer polling a la API. Tu sistema recibe un POST automático cuando algo sucede: una factura obtuvo CAE, ARCA la rechazó, terminó un lote, un borrador leído de un documento espera tu revisión o se completó la delegación de un CUIT.¿Cómo funcionan los webhooks?
- Registrás una URL de tu sistema en Facturear y elegís qué eventos querés recibir
- Cuando ocurre uno de esos eventos, Facturear hace un HTTP POST a esa URL, firmado con el secreto de tu webhook
- Tu sistema verifica la firma, responde 2xx y actúa (completa la orden con el CAE, avisa al cliente, reintenta con otros datos, etc.)
environment del payload te dice de cuál viene.
Eventos disponibles
Toda factura emitida por API se procesa en un lote (un
POST /api/invoices crea un lote de un ítem), así que cada factura termina en invoice.completed o en invoice.failed, y cada lote en un batch.completed.
Configurar un webhook
Desde el dashboard:- Iniciá sesión en facture.ar
- En el menú lateral, en Desarrolladores, entrá a Webhooks
- Presioná “Agregar webhook”
- Completá:
- URL del webhook: la dirección de tu sistema que va a recibir el POST
- Eventos: marcá los eventos que te interesan (
delegation.completed,invoice.completed,invoice.failed,batch.completed,draft.review_required) - Headers (opcional): headers propios que Facturear agrega a cada envío
- Presioná “Crear”. Facturear genera el secreto de firma del webhook (empieza con
whsec_)
- Secreto de firma: muestra el secreto, con Copiar y Rotar
- Ver entregas: el historial de envíos, con el detalle de cada uno y Reintentar
- Editar y Eliminar
- El estado (Activo / Inactivo): hacé clic para pausarlo o reactivarlo
GET y POST /api/webhooks, PUT y DELETE /api/webhooks/{id}, con el body { "url", "events", "headers", "isActive" }). El secreto de firma y el historial de entregas se ven solo desde el dashboard: la API nunca devuelve el secreto.
Headers de cada envío
Cada POST llevaContent-Type: application/json, los headers propios que configuraste y estos:
Tus headers propios no pueden reemplazar
Facturear-Signature, Facturear-Event ni Facturear-Delivery.
Payloads
Todos los eventos comparten estos campos:invoice.completed
invoice.failed
batch.completed
batch.status es completed (todo con CAE), completed_with_errors (algunos ítems fallaron) o error (fallaron todos). El detalle de cada ítem lo tenés en GET /api/invoices/batches/{batchId}. Si después reintentás un ítem de un lote terminado, el lote vuelve a procesarse y, al terminar, recibís otro batch.completed con los números actualizados.
delegation.completed
draft.review_required
manual (no se emite solo), porque algún control lo frenó (falta un precio, el total no cierra, receptor sin identificar, posible duplicado, etc.) o porque falló la emisión automática. También se envía cuando el documento no se pudo leer: en ese caso draft.status es error, draft.data es null y draft.errorMessage explica el motivo. Se manda una vez por cada cambio de estado del borrador.
Verificar la firma
Cada envío se firma con el secreto de tu webhook, así que podés comprobar que el pedido viene de Facturear y que nadie modificó el body. El header tiene esta forma:tes el momento de la firma, en segundos Unixv1es el HMAC-SHA256, en hexadecimal, del texto<t>.<body>con tu secreto como clave, donde<body>es el body crudo, tal como llegó
- Separá
tyv1del header - Calculá el HMAC-SHA256 de
`${t}.${body}`con tu secreto - Compará tu resultado con
v1en tiempo constante - Rechazá el pedido si
testá a más de 5 minutos de tu reloj: así un envío capturado no se puede volver a mandar más tarde
Node.js (Express)
Python (Flask)
Responder correctamente al webhook
Tu endpoint debe:- Responder con HTTP 2xx lo antes posible (Facturear corta cada intento a los 10 segundos)
- Procesar el evento en background si es una operación lenta
- Ser idempotente: guardá el
idde los eventos que ya procesaste e ignorá los repetidos. Un reintento manual desde el dashboard vuelve a mandar el mismo evento, con el mismoid
Reintentos de webhooks
Si tu endpoint no responde con 2xx, Facturear reintenta:
Cada intento se firma de nuevo, con un
t actual. Después del 3er intento fallido, el envío queda registrado como fallido y no se reintenta solo: podés reintentarlo desde el dashboard. Para no perder resultados de facturas si tu endpoint estuvo caído, conciliá de vez en cuando con GET /api/invoices/batches/{batchId}.
Consultar webhooks fallidos
Cada envío (exitoso o fallido) queda en el historial del webhook, con el payload, los headers, el código y el body de tu respuesta, y el error si lo hubo. Lo ves desde Webhooks en el dashboard, con Ver entregas en la fila del webhook, y desde ahí podés Reintentar un envío: sale con el mismo payload (mismoid de evento), firmado con el secreto actual y con un Facturear-Delivery nuevo.
Recursos relacionados
Emití facturas electrónicas con Facturear
Conectate a ARCA en minutos y empezá a facturar sin complicaciones.