Webhooks
Rep notificacions en temps real quan es produeixen esdeveniments a Holded.
Descripció general
Els webhooks et permeten rebre notificacions HTTP POST quan es produeixen esdeveniments al teu compte de Holded, com la creació d'una nova factura o la recepció d'un pagament.
Configurar webhooks
Configura els webhooks al teu panell de Holded a Configuració > Webhooks. Necessitaràs proporcionar:
- Una URL HTTPS accessible públicament
- Els esdeveniments als quals vols subscriure't
Capçaleres comunes
Cada petició de webhook inclou aquestes capçaleres:
x-holded-webhook-eventstringNom de l'esdeveniment, p. ex. invoice.create
x-holded-webhook-datestring · ISO 8601Moment de l'enviament, p. ex. 2026-06-18T11:10:35Z
x-holded-webhook-signaturestringSignatura HMAC-SHA256 amb prefix sha256= (vegeu a sota)
x-holded-webhook-idstringIdentificador únic de l'esdeveniment; utilitza'l com a clau d'idempotència
x-holded-webhook-account-idstringIdentificador del compte de Holded que origina l'esdeveniment
x-holded-webhook-versionstringVersió del sistema de webhooks (p. ex. v1)
Esdeveniments disponibles
Els webhooks estan disponibles per als següents grups d'esdeveniments. Fes clic en un grup per veure els seus esdeveniments i detalls del payload.
Factures
4 esdevenimentsinvoice.createinvoice.updateinvoice.deleteinvoice.approveFactures rectificatives
4 esdevenimentscreditnote.createcreditnote.updatecreditnote.deletecreditnote.approveFactures proforma
3 esdevenimentsproform.createproform.updateproform.deleteRebuts de venda
4 esdevenimentssalesreceipt.createsalesreceipt.updatesalesreceipt.deletesalesreceipt.approvePressupostos
3 esdevenimentsestimate.createestimate.updateestimate.deleteComandes de venda
3 esdevenimentssalesorder.createsalesorder.updatesalesorder.deleteAlbarans
3 esdevenimentswaybill.createwaybill.updatewaybill.deleteServeis
3 esdevenimentsservice.createservice.updateservice.deleteCompres
4 esdevenimentspurchase.createpurchase.updatepurchase.deletepurchase.approveReemborsaments de compra
4 esdevenimentspurchaserefund.createpurchaserefund.updatepurchaserefund.deletepurchaserefund.approveRebuts
3 esdevenimentsreceipt.createreceipt.updatereceipt.deleteComandes de compra
3 esdevenimentspurchaseorder.createpurchaseorder.updatepurchaseorder.deleteAlbarans d'entrada
4 esdevenimentsreceiptnote.createreceiptnote.updatereceiptnote.deletereceiptnote.approvePagaments
3 esdevenimentspayment.createpayment.updatepayment.deleteContactes
3 esdevenimentscontact.createcontact.updatecontact.deleteProductes
3 esdevenimentsproduct.createproduct.updateproduct.deleteEstoc
1 esdevenimentsstock.updateMagatzems
3 esdevenimentswarehouse.createwarehouse.updatewarehouse.deleteVerificar webhooks
Cada petició de webhook inclou una capçalera de signatura (x-holded-webhook-signature) que hauries de verificar per confirmar que la petició prové de Holded. La signatura és un resum hexadecimal HMAC-SHA256 del cos en brut de la petició, signat amb el teu secret de webhook i amb el prefix sha256=.
const crypto = require('crypto');
// Use the raw request body, not the parsed JSON object
app.post('/holded-webhook', express.raw({ type: 'application/json' }), (req, res) => {
const secret = process.env.HOLDED_WEBHOOK_SECRET; // whsec_...
// The header arrives with a "sha256=" prefix; strip it before comparing
const received = (req.header('x-holded-webhook-signature') || '').replace(/^sha256=/, '');
const expected = crypto.createHmac('sha256', secret).update(req.body).digest('hex');
const valid = received.length === expected.length && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(received));
if (!valid) return res.status(401).send('Invalid signature');
const event = req.header('x-holded-webhook-event');
const data = JSON.parse(req.body.toString('utf8'));
// ... process the event and acknowledge
res.sendStatus(200);
});Resposta esperada
El teu endpoint ha de retornar qualsevol codi d'estat 2xx per confirmar la recepció. Si no rebem una resposta 2xx, reintentarem el lliurament amb backoff exponencial.