Catálogo de eventos
Al crear el webhook eliges a qué eventos te suscribes. Todos llegan con el mismo sobre (event, created_at, organization_id, data); lo que cambia es data.
Obras
| Evento | Cuándo | data |
|---|---|---|
project.created | Se crea una obra (también al adjudicar un presupuesto). Las de demostración no avisan. | El objeto obra completo. |
project.updated | Cambian los datos o el estado de una obra. | El objeto obra completo. |
project.deleted | Se borra una obra. | { id, code, name } |
Presupuestos
| Evento | Cuándo | data |
|---|---|---|
estimate.created | Se crea un presupuesto. | El objeto presupuesto completo. |
estimate.updated | Cambian sus datos o su estado (también al adjudicarse). | El objeto presupuesto completo. |
estimate.awarded | Se adjudica: nace la obra. | { estimate_id, project_id, code } |
estimate.deleted | Se borra un presupuesto. | { id, code, name } |
Equipo
| Evento | Cuándo | data |
|---|---|---|
members.updated | Se añade o se quita a alguien del equipo de una obra o un presupuesto. | { entity: "project" | "estimate", id }. Lo nuevo, en …/members. |
Ofertas
| Evento | Cuándo | data |
|---|---|---|
budget.created | Se crea una oferta. | { id, project_id, budget_id, code, title, status } |
budget.accepted | El cliente acepta una oferta. | { id, project_id } (en las de presupuestos manuales, también budget_id). |
Compras
| Evento | Cuándo | data |
|---|---|---|
invoice.created | Entra una factura de compra: al registrarla o, si se sube en lote, cuando la app termina de leerla. | La factura con los datos leídos (ver abajo). |
invoice.updated | Cambia el estado de una factura, a mano o al vincularle o quitarle albaranes. | { id, status } |
invoice.conciled | La factura queda conciliada con sus albaranes. | { id, status: "conciliada" } |
delivery_note.created | Entra un albarán: al registrarlo o, si se sube en lote, cuando la app termina de leerlo. | El albarán con los datos leídos (ver abajo). |
delivery_note.updated | Se edita un albarán. | id y los campos cambiados, con sus nombres internos. Para tener el albarán completo, pídelo por la API. |
Proveedores
| Evento | Cuándo | data |
|---|---|---|
provider.created | Se da de alta un proveedor o una subcontrata (también los que crea la app al leer una factura). | El objeto proveedor completo, con sus contactos. |
provider.updated | Cambian sus datos o sus contactos. | El objeto proveedor completo. |
Contenido de invoice.created
Todo lo que necesita un programa de contabilidad para dar de alta la factura sin otra llamada: datos del proveedor, base, IVA, total, forma de pago y líneas, tal como se leyeron del documento. amount es el total con IVA; image_url caduca en 1 hora.
invoice.created
{
"event": "invoice.created",
"created_at": "2026-10-01T07:52:20.114Z",
"organization_id": "5e8a2f61-9d4b-4c07-b3e1-a7c6d0f2b948",
"data": {
"id": "c41e7b92-0d5a-4a3f-9e68-7b2d1c0f5a84",
"organization_id": "5e8a2f61-9d4b-4c07-b3e1-a7c6d0f2b948",
"project_id": "6f1c2a9e-3b7d-4c1e-9a52-1d0e8b7c4a21",
"number": "F-2026/0457",
"date": "2026-09-30",
"date_due": "2026-10-30",
"referencia": "Pedido 2026-014-03",
"status": "pending_review",
"type": "factura",
"rectified_invoice_id": null,
"paid_date": null,
"supplier": {
"name": "Materiales del Sur SL",
"cif": "B00000001",
"address": "Polígono Ejemplo, nave 4, Mérida",
"email": "facturas@ejemplo.es",
"phone": "924 000 000"
},
"base_imponible": 1500,
"iva_porcentaje": 21,
"iva_importe": 315,
"descuento": null,
"amount": 1815,
"forma_pago": "Transferencia a 30 días",
"iban": "ES00 0000 0000 0000 0000 0000",
"banco": null,
"lines": [
{
"descripcion": "Saco de cemento CEM II 25 kg",
"cantidad": 60,
"unidad": "ud",
"precio_unitario": 6.5,
"importe": 390
}
],
"observaciones": null,
"notas": null,
"image_url": "https://…/facturas-images/…?token=…",
"created_at": "2026-10-01T07:51:02.883+00:00"
}
}Contenido de delivery_note.created
data
{
"id": "e7a2c5d8-91b4-4f60-b3d7-28c6e1a09f53",
"organization_id": "5e8a2f61-9d4b-4c07-b3e1-a7c6d0f2b948",
"project_id": "6f1c2a9e-3b7d-4c1e-9a52-1d0e8b7c4a21",
"budget_item_id": null,
"numero_albaran": "A-88213",
"delivery_date": "2026-09-12",
"status": "pending_review",
"supplier": {
"name": "Materiales del Sur SL",
"cif": "B00000001",
"address": null,
"email": null,
"phone": null
},
"base_imponible": 1500,
"iva_porcentaje": 21,
"iva_importe": 315,
"total_amount": 1815,
"lines": [
{
"description": "Saco de cemento CEM II 25 kg",
"quantity": 60,
"unit": "ud",
"unit_price": 6.5,
"total": 390
}
],
"observaciones": null,
"image_url": "https://…/delivery-notes/…?token=…",
"created_at": "2026-09-12T15:31:07.215+00:00"
}webhook.test
Solo lo envían las pruebas (desde la app o con POST /api/v1/webhooks/{id}/test): data lleva un message. No hace falta suscribirse.
Podemos añadir eventos nuevos y campos nuevos dentro de
data. Ignora los que no conozcas en vez de dar error.