Properties
GET /v1/properties
Section titled “GET /v1/properties”| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
status | query | string | No | LEDIG | UDLEJET | OPSAGT | ISTANDSAETTES | UDE_AF_DRIFT |
kind | query | string | No | BOLIGLEJLIGHED | VAERELSE | BLANDET | ERHVERV |
areaId | query | string | No | Only units in this area |
postalCode | query | string | No | Four digits |
limit | query | integer | No | Page size, 1-200 (default 50) |
cursor | query | string | No | Opaque cursor from meta.nextCursor |
Request exampleNo request body
curl https://api.rieckflow.com/v1/properties \ -H "Authorization: Bearer $RIECK_API_KEY"const svar = await rieck.request("GET", "/v1/properties");{ "data": [ {} ], "meta": { "nextCursor": null }}200 Newest first. ⚠️
status is DERIVED from the tenancies — an active tenancy makes the home UDLEJET even before the handover day, so it cannot be let to somebody else — and it is read-only for that reason, not merely absent from the write schema. Values are the Danish domain terms; tenancy law has no agreed English vocabulary, and an invented one would look canonical without being it.application/jsonPossible errors 5
| HTTP | Code | Meaning |
|---|---|---|
| 400 | invalid_cursor | The cursor is malformed, expired or belongs to another list shape. |
| 401 | invalid_api_key | The API key is missing, invalid, expired or revoked. |
| 403 | api_not_included | The organisation’s plan does not include API access. |
| 403 | insufficient_scope | The key does not have the required scope. |
| 429 | rate_limited | The organisation’s rate budget is exhausted. |
POST /v1/properties
Section titled “POST /v1/properties”⚠️ Two different uniqueness rules, and they get different errors: the same ADDRESS gives 409 address_already_exists, the same unit number 409 unit_number_already_exists. Collapsing them into one error would leave you unable to tell what to fix. Omitting unitNumber lets the database generate one; omitting rentRegime means UKENDT, which is the STRICTEST regime, not the most permissive.
Request body fields 20
| Field | Type | Required | Description |
|---|---|---|---|
reference | string | No | Field in the request payload. |
unitNumber | string | No | Field in the request payload. |
areaId | string | No | Field in the request payload. |
address | object | Yes | Postal address used on documents. |
address.street | string | Yes | Street and house number. |
address.houseNumber | string | No | Field in the request payload. |
address.floor | string | No | Field in the request payload. |
address.side | string | No | Field in the request payload. |
address.postalCode | string | Yes | Postal code. |
address.city | string | Yes | City. |
address.darId | string | No | Field in the request payload. |
address.municipalityCode | string | No | Field in the request payload. |
kind | string | Yes | Field in the request payload. |
areaM2 | integer | No | Field in the request payload. |
rooms | number | No | Field in the request payload. |
yearFirstOccupied | integer | No | Field in the request payload. |
rentRegime | string | No | Field in the request payload. |
consumptionYearStart | string | No | Field in the request payload. |
consumptionYearMovedTo | string | No | Field in the request payload. |
voluntarilyVatRegistered | boolean | No | Field in the request payload. |
Request exampleapplication/json
curl -X POST https://api.rieckflow.com/v1/properties \ -H "Authorization: Bearer $RIECK_API_KEY" \ -H "Idempotency-Key: order-2041" \ -H "Content-Type: application/json" \ -d '{ "address": { "street": "…", "postalCode": "…", "city": "…", "darId": "9b2f1c1e-…" }, "kind": "BOLIGLEJLIGHED", "reference": "crm-9001", "areaId": "9b2f1c1e-…" }'const svar = await rieck.request("POST", "/v1/properties", { body: { "address": { "street": "…", "postalCode": "…", "city": "…", "darId": "9b2f1c1e-…" }, "kind": "BOLIGLEJLIGHED", "reference": "crm-9001", "areaId": "9b2f1c1e-…" },});{ "data": {}}201 Success envelopeapplication/json
Possible errors 9
| HTTP | Code | Meaning |
|---|---|---|
| 400 | invalid_idempotency_key | Idempotency-Key is missing or malformed. |
| 400 | invalid_request | The request body or parameter failed validation. |
| 401 | invalid_api_key | The API key is missing, invalid, expired or revoked. |
| 403 | api_not_included | The organisation’s plan does not include API access. |
| 403 | insufficient_scope | The key does not have the required scope. |
| 409 | idempotency_conflict | The same key was used with a different request. |
| 409 | idempotency_in_progress | The same operation is currently being processed. Retry later. |
| 413 | payload_too_large | The JSON or uploaded file exceeds this endpoint’s size limit. |
| 429 | rate_limited | The organisation’s rate budget is exhausted. |
Request body — fuldt JSON Schema
{ "type": "object", "properties": { "reference": { "anyOf": [ { "type": "string", "maxLength": 100 }, { "type": "null" } ] }, "unitNumber": { "anyOf": [ { "type": "string", "minLength": 1, "maxLength": 20 }, { "type": "null" } ] }, "areaId": { "anyOf": [ { "type": "string", "format": "uuid", "pattern": "^([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)$" }, { "type": "null" } ] }, "address": { "type": "object", "properties": { "street": { "type": "string", "minLength": 1, "maxLength": 200 }, "houseNumber": { "anyOf": [ { "type": "string", "maxLength": 10 }, { "type": "null" } ] }, "floor": { "anyOf": [ { "type": "string", "maxLength": 10 }, { "type": "null" } ] }, "side": { "anyOf": [ { "type": "string", "maxLength": 10 }, { "type": "null" } ] }, "postalCode": { "type": "string", "pattern": "^\\d{4}$" }, "city": { "type": "string", "minLength": 1, "maxLength": 100 }, "darId": { "anyOf": [ { "type": "string", "maxLength": 36 }, { "type": "null" } ] }, "municipalityCode": { "anyOf": [ { "type": "string", "pattern": "^\\d{4}$" }, { "type": "null" } ] } }, "required": [ "street", "postalCode", "city" ], "additionalProperties": false }, "kind": { "type": "string", "enum": [ "BOLIGLEJLIGHED", "VAERELSE", "BLANDET", "ERHVERV" ] }, "areaM2": { "anyOf": [ { "type": "integer", "minimum": 1, "maximum": 100000 }, { "type": "null" } ] }, "rooms": { "anyOf": [ { "type": "number", "minimum": 0.5, "maximum": 100 }, { "type": "null" } ] }, "yearFirstOccupied": { "anyOf": [ { "type": "integer", "minimum": 1200, "maximum": 2200 }, { "type": "null" } ] }, "rentRegime": { "type": "string", "enum": [ "FRI", "OMKOSTNINGSBESTEMT", "SMAAHUS", "UKENDT" ] }, "consumptionYearStart": { "type": "string", "pattern": "^(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$" }, "consumptionYearMovedTo": { "anyOf": [ { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$" }, { "type": "null" } ] }, "voluntarilyVatRegistered": { "type": "boolean" } }, "required": [ "address", "kind" ], "additionalProperties": false}GET /v1/properties/{propertyId}
Section titled “GET /v1/properties/{propertyId}”| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
propertyId | path | string | Yes |
Request exampleNo request body
curl https://api.rieckflow.com/v1/properties/9b2f1c1e-… \ -H "Authorization: Bearer $RIECK_API_KEY"const svar = await rieck.request("GET", "/v1/properties/9b2f1c1e-…");{ "data": {}}200 Success envelopeapplication/json
Possible errors 4
| HTTP | Code | Meaning |
|---|---|---|
| 401 | invalid_api_key | The API key is missing, invalid, expired or revoked. |
| 403 | api_not_included | The organisation’s plan does not include API access. |
| 403 | insufficient_scope | The key does not have the required scope. |
| 429 | rate_limited | The organisation’s rate budget is exhausted. |
PUT /v1/properties/{propertyId}
Section titled “PUT /v1/properties/{propertyId}”Full replacement of the master data — status is not among the fields and cannot be. ⚠️ Changing the ADDRESS clears the property-register enrichment (BFE and unit register number belonged to the OLD address, and a wrong BFE is worse than none because it looks answered). An omitted unitNumber means leave it alone, not clear it.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
propertyId | path | string | Yes |
Request body fields 20
| Field | Type | Required | Description |
|---|---|---|---|
reference | string | No | Field in the request payload. |
unitNumber | string | No | Field in the request payload. |
areaId | string | No | Field in the request payload. |
address | object | Yes | Postal address used on documents. |
address.street | string | Yes | Street and house number. |
address.houseNumber | string | No | Field in the request payload. |
address.floor | string | No | Field in the request payload. |
address.side | string | No | Field in the request payload. |
address.postalCode | string | Yes | Postal code. |
address.city | string | Yes | City. |
address.darId | string | No | Field in the request payload. |
address.municipalityCode | string | No | Field in the request payload. |
kind | string | Yes | Field in the request payload. |
areaM2 | integer | No | Field in the request payload. |
rooms | number | No | Field in the request payload. |
yearFirstOccupied | integer | No | Field in the request payload. |
rentRegime | string | No | Field in the request payload. |
consumptionYearStart | string | No | Field in the request payload. |
consumptionYearMovedTo | string | No | Field in the request payload. |
voluntarilyVatRegistered | boolean | No | Field in the request payload. |
Request exampleapplication/json
curl -X PUT https://api.rieckflow.com/v1/properties/9b2f1c1e-… \ -H "Authorization: Bearer $RIECK_API_KEY" \ -H "Idempotency-Key: order-2041" \ -H "Content-Type: application/json" \ -d '{ "address": { "street": "…", "postalCode": "…", "city": "…", "darId": "9b2f1c1e-…" }, "kind": "BOLIGLEJLIGHED", "reference": "crm-9001", "areaId": "9b2f1c1e-…" }'const svar = await rieck.request("PUT", "/v1/properties/9b2f1c1e-…", { body: { "address": { "street": "…", "postalCode": "…", "city": "…", "darId": "9b2f1c1e-…" }, "kind": "BOLIGLEJLIGHED", "reference": "crm-9001", "areaId": "9b2f1c1e-…" },});{ "data": {}}200 Success envelopeapplication/json
Possible errors 9
| HTTP | Code | Meaning |
|---|---|---|
| 400 | invalid_idempotency_key | Idempotency-Key is missing or malformed. |
| 400 | invalid_request | The request body or parameter failed validation. |
| 401 | invalid_api_key | The API key is missing, invalid, expired or revoked. |
| 403 | api_not_included | The organisation’s plan does not include API access. |
| 403 | insufficient_scope | The key does not have the required scope. |
| 409 | idempotency_conflict | The same key was used with a different request. |
| 409 | idempotency_in_progress | The same operation is currently being processed. Retry later. |
| 413 | payload_too_large | The JSON or uploaded file exceeds this endpoint’s size limit. |
| 429 | rate_limited | The organisation’s rate budget is exhausted. |
Request body — fuldt JSON Schema
{ "type": "object", "properties": { "reference": { "anyOf": [ { "type": "string", "maxLength": 100 }, { "type": "null" } ] }, "unitNumber": { "anyOf": [ { "type": "string", "minLength": 1, "maxLength": 20 }, { "type": "null" } ] }, "areaId": { "anyOf": [ { "type": "string", "format": "uuid", "pattern": "^([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)$" }, { "type": "null" } ] }, "address": { "type": "object", "properties": { "street": { "type": "string", "minLength": 1, "maxLength": 200 }, "houseNumber": { "anyOf": [ { "type": "string", "maxLength": 10 }, { "type": "null" } ] }, "floor": { "anyOf": [ { "type": "string", "maxLength": 10 }, { "type": "null" } ] }, "side": { "anyOf": [ { "type": "string", "maxLength": 10 }, { "type": "null" } ] }, "postalCode": { "type": "string", "pattern": "^\\d{4}$" }, "city": { "type": "string", "minLength": 1, "maxLength": 100 }, "darId": { "anyOf": [ { "type": "string", "maxLength": 36 }, { "type": "null" } ] }, "municipalityCode": { "anyOf": [ { "type": "string", "pattern": "^\\d{4}$" }, { "type": "null" } ] } }, "required": [ "street", "postalCode", "city" ], "additionalProperties": false }, "kind": { "type": "string", "enum": [ "BOLIGLEJLIGHED", "VAERELSE", "BLANDET", "ERHVERV" ] }, "areaM2": { "anyOf": [ { "type": "integer", "minimum": 1, "maximum": 100000 }, { "type": "null" } ] }, "rooms": { "anyOf": [ { "type": "number", "minimum": 0.5, "maximum": 100 }, { "type": "null" } ] }, "yearFirstOccupied": { "anyOf": [ { "type": "integer", "minimum": 1200, "maximum": 2200 }, { "type": "null" } ] }, "rentRegime": { "type": "string", "enum": [ "FRI", "OMKOSTNINGSBESTEMT", "SMAAHUS", "UKENDT" ] }, "consumptionYearStart": { "type": "string", "pattern": "^(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$" }, "consumptionYearMovedTo": { "anyOf": [ { "type": "string", "pattern": "^\\d{4}-\\d{2}-\\d{2}$" }, { "type": "null" } ] }, "voluntarilyVatRegistered": { "type": "boolean" } }, "required": [ "address", "kind" ], "additionalProperties": false}GET /v1/property-areas
Section titled “GET /v1/property-areas”Request exampleNo request body
curl https://api.rieckflow.com/v1/property-areas \ -H "Authorization: Bearer $RIECK_API_KEY"const svar = await rieck.request("GET", "/v1/property-areas");{ "data": {}}200 Your own grouping of the portfolio (building, estate, division) with the number of units in each. No cursor: names are unique per organisation and a portfolio has dozens, not thousands.application/json
Possible errors 4
| HTTP | Code | Meaning |
|---|---|---|
| 401 | invalid_api_key | The API key is missing, invalid, expired or revoked. |
| 403 | api_not_included | The organisation’s plan does not include API access. |
| 403 | insufficient_scope | The key does not have the required scope. |
| 429 | rate_limited | The organisation’s rate budget is exhausted. |
POST /v1/property-areas
Section titled “POST /v1/property-areas”Request body fields 2
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Human-readable name. |
note | string | No | Field in the request payload. |
Request exampleapplication/json
curl -X POST https://api.rieckflow.com/v1/property-areas \ -H "Authorization: Bearer $RIECK_API_KEY" \ -H "Idempotency-Key: order-2041" \ -H "Content-Type: application/json" \ -d '{ "name": "Acme ApS" }'const svar = await rieck.request("POST", "/v1/property-areas", { body: { "name": "Acme ApS" },});{ "data": {}}201 Success envelopeapplication/json
Possible errors 9
| HTTP | Code | Meaning |
|---|---|---|
| 400 | invalid_idempotency_key | Idempotency-Key is missing or malformed. |
| 400 | invalid_request | The request body or parameter failed validation. |
| 401 | invalid_api_key | The API key is missing, invalid, expired or revoked. |
| 403 | api_not_included | The organisation’s plan does not include API access. |
| 403 | insufficient_scope | The key does not have the required scope. |
| 409 | idempotency_conflict | The same key was used with a different request. |
| 409 | idempotency_in_progress | The same operation is currently being processed. Retry later. |
| 413 | payload_too_large | The JSON or uploaded file exceeds this endpoint’s size limit. |
| 429 | rate_limited | The organisation’s rate budget is exhausted. |
Request body — fuldt JSON Schema
{ "type": "object", "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 120 }, "note": { "anyOf": [ { "type": "string", "maxLength": 500 }, { "type": "null" } ] } }, "required": [ "name" ], "additionalProperties": false}GET /v1/tenancies
Section titled “GET /v1/tenancies”| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
propertyId | query | string | No | Only tenancies on this unit |
customerId | query | string | No | Only tenancies this customer is a tenant on |
status | query | string | No | UDKAST | AKTIV | OPSAGT | AFSLUTTET | AFLYST |
limit | query | integer | No | Page size, 1-200 (default 50) |
cursor | query | string | No | Opaque cursor from meta.nextCursor |
Request exampleNo request body
curl https://api.rieckflow.com/v1/tenancies \ -H "Authorization: Bearer $RIECK_API_KEY"const svar = await rieck.request("GET", "/v1/tenancies");{ "data": [ {} ], "meta": { "nextCursor": null }}200 Who lives where, on what terms. Tenants are CUSTOMERS — read them with GET /v1/customers/{id}. ⚠️ Every rent component is separate (heating, water, electricity, cooling, aerial, internet, residents’ representation): a single figure cannot answer “what was the heating charge in March”, which is exactly what a disputed increase turns on. Amounts are integer øre.application/json
Possible errors 5
| HTTP | Code | Meaning |
|---|---|---|
| 400 | invalid_cursor | The cursor is malformed, expired or belongs to another list shape. |
| 401 | invalid_api_key | The API key is missing, invalid, expired or revoked. |
| 403 | api_not_included | The organisation’s plan does not include API access. |
| 403 | insufficient_scope | The key does not have the required scope. |
| 429 | rate_limited | The organisation’s rate budget is exhausted. |
GET /v1/tenancies/{tenancyId}
Section titled “GET /v1/tenancies/{tenancyId}”| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
tenancyId | path | string | Yes |
Request exampleNo request body
curl https://api.rieckflow.com/v1/tenancies/9b2f1c1e-… \ -H "Authorization: Bearer $RIECK_API_KEY"const svar = await rieck.request("GET", "/v1/tenancies/9b2f1c1e-…");{ "data": {}}200 ⚠️ There is deliberately no write path here, and no rent-collection endpoint. Creating a tenancy means ISSUING a tenancy agreement — form, deposit ceiling, statutory terms, signature — and the row’s guards exist precisely so a tenancy cannot come into being without one. Rent is already invoicing:
rentSubscriptionId points at the recurring invoice, and GET /v1/subscriptions/{id} is the way in. ⚠️ The deadlines (fixedTermLapsedAt, inspection and maintenance) are READ, never input: an API that accepted a statutory deadline would turn the law into a field.application/jsonPossible errors 4
| HTTP | Code | Meaning |
|---|---|---|
| 401 | invalid_api_key | The API key is missing, invalid, expired or revoked. |
| 403 | api_not_included | The organisation’s plan does not include API access. |
| 403 | insufficient_scope | The key does not have the required scope. |
| 429 | rate_limited | The organisation’s rate budget is exhausted. |