Tabba.
IntegrationerSådan virker TabbaFeatures

© 2026 Tabba. Alle rettigheder forbeholdes.

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

Andre spor

AI clientsREST API
Work registrations

Set a person’s hours and completion on a line

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.

PUT
/work-registrations

Authorization

bearerAuth
AuthorizationBearer <token>

An API key minted by an admin under Settings → Developers. It is bound to one company and has a scope: read, or read_write. A request without one, or with one that is not ours, is answered 401 and metered by its client address (x-rate-limits).

In: header

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X PUT "https://example.com/work-registrations" \  -H "Content-Type: application/json" \  -d '{    "line": "cbd064df-a272-4ffb-a570-4b4e90fd2e3b",    "user": "string"  }'
{  "object": "work_registration",  "invoice_id": "string",  "invoice_line_id": "string",  "user_id": "string",  "accrual_month": "string",  "hours": 0,  "hours_delta": 0,  "completion_rate": 0,  "external_id": "string"}

A product changed Webhook

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`.

invoice?string

The invoice the line is on: its id, or ext:<external_id>.

Length1 <= length <= 255
series?string

The recurring series the line is of: its id, or ext:<external_id>. With occurrence.

Length1 <= length <= 255
occurrence?string

The occurrence of the series: the first day of its billing period, YYYY-MM-DD.

Match^\d{4}-\d{2}-\d{2}$
line*string

With invoice: the invoice line's id. With series: the id of the recurring line, or of a one-time line.

Match^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
Formatuuid
user*string

Whose work it is: their id, ext:<external_id> or email:<address>.

Length1 <= length <= 255
hours?|

The person's total hours on the line. Null or left out: the hours stay as they are. One request raises a total by at most 1000 hours, a guard against a slipped decimal (HOURS_CHANGE_TOO_LARGE).

completion_rate?|

The completion the person now stands at, as a fraction in [0, 1]. Null or left out: it stays as it is.

external_id?|

Your own key for the month's registration.