Skip to main content

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?

  1. Registrás una URL de tu sistema en Facturear y elegís qué eventos querés recibir
  2. Cuando ocurre uno de esos eventos, Facturear hace un HTTP POST a esa URL, firmado con el secreto de tu webhook
  3. Tu sistema verifica la firma, responde 2xx y actúa (completa la orden con el CAE, avisa al cliente, reintenta con otros datos, etc.)
Los eventos se envían para los dos entornos, homologación y producción: el campo 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:
  1. Iniciá sesión en facture.ar
  2. En el menú lateral, en Desarrolladores, entrá a Webhooks
  3. Presioná “Agregar webhook”
  4. 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
  5. Presioná “Crear”. Facturear genera el secreto de firma del webhook (empieza con whsec_)
En la lista de webhooks, cada uno tiene estas acciones:
  • 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
También podés crear, listar, editar y borrar webhooks con tu API Key (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.
Guardá el secreto como cualquier otra credencial (variable de entorno, gestor de secretos). Si se filtra, rotalo: desde ese momento los envíos se firman con el secreto nuevo y el anterior deja de validar, así que actualizalo en tu sistema enseguida.

Headers de cada envío

Cada POST lleva Content-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

Se envía cuando un borrador queda para revisar: porque su modo es 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:
  • t es el momento de la firma, en segundos Unix
  • v1 es el HMAC-SHA256, en hexadecimal, del texto <t>.<body> con tu secreto como clave, donde <body> es el body crudo, tal como llegó
Para verificar:
  1. Separá t y v1 del header
  2. Calculá el HMAC-SHA256 de `${t}.${body}` con tu secreto
  3. Compará tu resultado con v1 en tiempo constante
  4. Rechazá el pedido si t está a más de 5 minutos de tu reloj: así un envío capturado no se puede volver a mandar más tarde
Firmá sobre el body crudo, no sobre el JSON ya parseado: si tu framework parsea el body y lo volvés a serializar, cambian espacios u orden de claves y la firma no coincide.

Node.js (Express)

Python (Flask)

Si además configuraste un header propio con un token, podés validarlo también; la firma ya cubre la autenticidad del pedido.

Responder correctamente al webhook

Tu endpoint debe:
  1. Responder con HTTP 2xx lo antes posible (Facturear corta cada intento a los 10 segundos)
  2. Procesar el evento en background si es una operación lenta
  3. Ser idempotente: guardá el id de los eventos que ya procesaste e ignorá los repetidos. Un reintento manual desde el dashboard vuelve a mandar el mismo evento, con el mismo id
Si respondés con cualquier código que no sea 2xx, o no respondés a tiempo, Facturear reintenta el envío.

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 (mismo id 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.