Tabba.
IntegrationerSådan virker TabbaFeatures

© 2026 Tabba. Alle rettigheder forbeholdes.

Udviklere
Udviklere
Udviklere
Overview
A month-end accrual entry was booked WebhookA credit note was booked WebhookA customer changed WebhookAn invoice was issued WebhookAn issued invoice was not sent WebhookA product changed Webhook

Andre spor

AI clientsREST API
Webhooks

A product changed

A product was created, changed, switched off or deleted, in Tabba or on the accounting platform, where a change is seen at the next import. data is the product as GET /products/{ref} answers it, with archived_at and deleted_at.

Header Parameters

Tabba-Signature*string

t=<unix seconds>,v1=<hex>: v1 is the HMAC-SHA256, in hex, of <t>.<body> under the endpoint's signing secret, where <body> is the request body byte for byte. Verify it before you trust the body, and refuse a t more than 300 seconds from your own clock. A retry and a replay carry the same body under a new signature.

Tabba-Event-Id*string

The event's id, as in the body.

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

Example Requests

POST/product.updated

An issued invoice was not sent Webhook

The invoice was booked, and its delivery to the customer is not known to have succeeded. Sent beside `invoice.issued`, never instead of it. `data.send_error` says why. The invoice is in the books: follow up on the delivery, and do not issue it again.

Set a person’s hours and completion on a line PUT

Both figures are stated as they now stand: `hours` is the person’s total on the line, and `completion_rate` the completion they stand at. The total is registered as the signed difference against what is registered, in the entry month of the request (Europe/Copenhagen): the one bucket per line, person and month the workspace reads. **Sending the same figures again registers nothing.** Name the line on an invoice (`invoice` and the invoice line’s id) or on an occurrence of a recurring series (`series`, `occurrence` and the series line’s id): an occurrence that is no invoice yet is made one first. Set one person’s hours on one line one request at a time: two requests at the same moment both measure against the same total. Refused with `NOT_ASSIGNED` (409) when the person holds no place on the line, and with `HOURS_BILLED_LOCKED` (409) for the hours of an hourly line its invoice has billed.

object*string
id*string

The same for every endpoint the event went to and for every retry and replay of it. Delivery is at least once: tell a repeat by this id.

Match^evt_[0-9a-f]{32}$
type*string
created_at*string

When the event was announced.

data*|