Skip to main content
/v1/ covers six data domains plus pre-computed property KPIs, listed by table below. Field-level detail lives in the API reference for each endpoint.

Accounting

accounts, booking_headers, booking_positions, budgets, and account_hierarchies

Contracts

service_contracts, contract_debits, contract_debit_diffs, contract_ends, and index_rent

Depreciation

assets and depreciation

KPI (Preview)

property_kpis and property_kpis_by_floor_area_type, aggregated from the other domains

Operations

notifications, offers, orders, projects, and requests

Property

properties, property_structure, property_creditor_services, and technical_objects

Stakeholder

creditors, employees, owners, and tenants

How the tables connect

property_id is the join key shared across every table on this page. A booking transaction produces one booking_headers row, which groups every line item it posts (booking_positions). Line items post to accounts of different types — general ledger, tenant, creditor, project, or cost centre, see accounts.account_type_name. A transaction usually involves one creditor, tenant, or cost centre, so booking_headers already contains creditor_id, person_id, and property_structure_account_id itself — no join through booking_positions needed.
Each account can have a budget for a given month. For a cost centre, property_structure.account_id matches the accounts.account_number of the corresponding accounts row — not its accounts.account_id. contract_debits references the general ledger account it posts to via account_number, matching accounts.account_number. contract_debit_diffs uses the same account_number field name, but resolves to a tenant account instead — same column name, different account type per table. contract_debits.debit_type.code is a different thing, a debit-type code, not a ledger reference (see the account_id row below).

Join keys in detail

Cardinalities above describe the intended data model.

Key structure: composed, but not decomposable

The identifiers are hierarchical. Each one carries the identifier above it as a literal left prefix, so a tenancy key spells out which unit and which property it belongs to:
The key is built by appending: 1002 (property) + 10001 (unit number) = floor_area_id 100210001; 100210001 + 100001 (tenant number) = floor_area_person_id 100210001100001. Still, don’t parse it back apart to extract the components. Segment widths aren’t fixed — the same property can carry both 45111 and 451110 as floor_area_id, so 45111 is itself a prefix of 451110 and prefix matching is ambiguous. Building the key also drops separators, so a person_id of "010-1" ends up as the suffix 0101 and can’t be recovered. Read property_id, floor_area_id, and person_id directly instead of slicing the composite.