Tabba.
IntegrationerSådan virker TabbaFeatures

© 2026 Tabba. Alle rettigheder forbeholdes.

Udviklere
Udviklere
Udviklere
Overview
Take a line of a recurring series away DELETEList the recurring series of the company GETRead one recurring series GETList the occurrences of a recurring series GETRead one occurrence of a recurring series GETChange the header fields of a recurring series that the body states PATCHChange a line of a recurring series PATCHCreate a recurring series POSTCancel a recurring series POSTAdd a line to a recurring series POSTIssue an occurrence of a recurring series now POST

Andre spor

AI clientsREST API
Recurring series

Read one occurrence of a recurring series

The occurrence with its lines. One that is not issued states what the series’ lines come to on it after every change, with a final partial period’s value lines prorated; one that is issued states the lines its invoice was issued with. **Reading it never makes it an invoice**: an occurrence that is none yet answers invoice_id: null. A date that starts no period of the series is OCCURRENCE_OUT_OF_RANGE (404).

GET
/recurring-series/{ref}/occurrences/{period}

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

Path Parameters

ref*string

The record's id, or ext:<external_id> for the record that carries your own key.

period*string

The first day of the occurrence’s billing period, YYYY-MM-DD, as a list of occurrences states it.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://example.com/recurring-series/string/occurrences/string"
{  "object": "occurrence",  "series_id": "string",  "period": "string",  "period_from": "string",  "period_to": "string",  "issue_date": "string",  "is_final_partial": true,  "proration_factor": 0,  "status": "scheduled",  "invoice_id": "string",  "title": "string",  "lines": [    {      "line_id": "string",      "kind": "series",      "invoice_line_id": "string",      "product_id": "string",      "product_number": "string",      "product_name": "string",      "recognition_method": "value",      "agreed_value": 0,      "hourly_rate": 0,      "discount": 0,      "description_override": "string",      "position": -9007199254740991,      "assignees": [        {          "user_id": "string",          "distribution_percentage": 0,          "hourly_rate_override": 0,          "removed": true        }      ]    }  ]}

List the occurrences of a recurring series GET

In the order of their periods, from the start of the series, or from `from`, to its end date, or to `to`. A series with no end date has no last occurrence: the list is walked a page at a time. Reading an occurrence never makes it an invoice.

Change the header fields of a recurring series that the body states PATCH

A field the body leaves out stays as it is. The lines are not touched, except that a change of `start_date` or `frequency` moves every period and so resets each line to what it started with. Once the series has issued an invoice its customer, currency, schedule and title are locked (`SERIES_SETUP_LOCKED`, 409); `layout_ref` never is. Moving `end_date` on such a series ends it by that date, exactly as the cancel route does, with the credit notes an end books; the cancel route is the one that reports them. A schedule that leaves out occurrences with registered work is refused (`SCHEDULE_DROPS_REGISTERED_WORK`, 409) until the body states `acknowledge_dropped_work`, and a change met by an occurrence that is being issued is refused whole (`ISSUE_IN_PROGRESS`, 409).