ffacturifirma

Документація

Вебхуки

Отримуйте підписані HTTP-сповіщення у ваші системи щоразу, коли документ змінюється у facturifirma.ro.

Реєстрація вебхука

З застосунку: сторінка Вебхуки (меню адміністрування) — додайте цільовий URL і секрет підпису. Секрет write-only: після збереження його не можна прочитати.

Через API, з адміністративним API-ключем:

curl -X POST https://app.facturifirma.ro/api/v1/webhooks \
  -H "Authorization: Bearer <API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://example.com/webhook", "secret": "<SIGNING_SECRET>"}'

Події

Наразі надсилається один тип події:

document.changedбудь-яка зміна документа — створення, редагування, виставлення, оплата, сторно, скасування чи видалення, для всіх типів документів (рахунок, проформа, квитанція, накладна, замовлення, кредит-нота).

З часом з'являться нові типи подій; вважайте поле «event» розширюваним та ігноруйте невідомі типи.

Payload

Кожна доставка — це POST із JSON-тілом:

POST https://example.com/webhook

{
  "event": "document.changed",
  "documentId": "8b1f7c02-4c33-4a6e-9f0d-2f6f6f0a9d11",
  "at": "2026-07-15T09:30:00Z"
}

Заголовки

Кожен запит містить тип події та підпис тіла:

Content-Type: application/json
X-Facturifirma-Event: document.changed
X-Facturifirma-Signature: sha256=<hex(HMAC-SHA256(secret, body))>

Перевірка підпису

Підпис — це HMAC-SHA256 сирого тіла запиту з вашим секретом, у форматі «sha256=<hex>». Порівнюйте його за константний час:

import crypto from "node:crypto";

function verify(rawBody, signatureHeader, secret) {
  const expected = "sha256=" +
    crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
  return crypto.timingSafeEqual(
    Buffer.from(signatureHeader), Buffer.from(expected));
}

Доставка та повтори

Доставки йдуть із черги задач з автоматичними повторами (at-least-once, без гарантії порядку). Ваш endpoint має відповідати 2xx; будь-що інше вважається помилкою і повторюється.

Безпека

Приймаються лише абсолютні http(s) URL, що резолвляться в публічні адреси (захист від SSRF). Секрет підпису зашифровано at-rest і API ніколи його не повертає.