casa.ai API v0.1.0

CLI-first API (ADR-10) — dieselben Tool-Funktionen wie UI/CLI. Auth per Bearer-Session-Token (Better Auth).

Diese Seite wird bei jedem Aufruf aus der Spec gerendert. Rohdatei: /api/openapi.json.

Authentifizierung

Endpunkte

ablesung

PATCH/api/ablesung/{id}

Berichtigt den Stand EINER Ablesung (correct_meter_reading); Zeitpunkt und Anlass bleiben. Antwort mit `stand`, `vorherigerStand` und neu gerechneter `plausibilitaet`. Eine Ablesung, auf der eine festgeschriebene Abrechnung beruht, ist gesperrt (409).

operationId: berichtigeAblesung · Auth: bearerAuth

Request-Body (Pflicht): application/json → AblesungBerichtigenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Die berichtigte Ablesung mit altem und neuem Stand.AblesungBerichtigtResponse
400ungültige Eingabe, unbekanntes Feld (auch die Zähler-Id im Body) oder Stand mit Komma statt Punkt (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent, keine Zuständigkeit für das Objekt oder Testzeitraum abgelaufen (ApiErrorBody, code forbidden)
404unbekannter ODER fremder Zähler bzw. unbekannte oder fremde Ablesung — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel)
409festgeschriebene Abrechnung beruht auf der Ablesung (ABRECHNUNG_FESTGESCHRIEBEN), Zähler archiviert oder negativer Verbrauch (ApiErrorBody, code conflict, Klartext)

abrechnung

POST/api/abrechnung

Startet einen Betriebskosten-Abrechnungslauf (start_billing_run) — Readiness fail-closed, Eingabe INV-TIME-01-gebunden.

operationId: startAbrechnung · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
201Lauf gestartet — die Antwort trägt den bindingContentHash (INV-TIME-01), das Bindungs-Siegel BEIDER Geld-Seiten: Umlage-Eingabe UND VZ-Stammdaten der Gegenrechnung (seit #1812).AbrechnungStartResponse
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden — fail-closed)
404unbekanntes ODER fremdes Objekt (ApiErrorBody, code not_found — kein Existenz-Orakel)
409blockierende Readiness-Befunde oder bereits ein offener Lauf (ApiErrorBody, code conflict)
503Zuständigkeitsprüfung nicht durchführbar (ApiErrorBody, code unavailable — nie durchwinken)

GET/api/abrechnung/{id}

Liest die Ergebniszahlen eines Abrechnungslaufs maschinenlesbar — Geld ausschließlich als Integer-STRING, cent-genau.

operationId: getAbrechnungErgebnis · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Ergebniszahlen des Laufs. GELD REIST AUSSCHLIESSLICH ALS INTEGER-STRING ({ cents: "<Integer>", currency: "EUR" }), ustRatePercent ebenso — nie als JSON-number: Beträge jenseits 2^53 überleben so exakt. `null` bleibt `null` (Wohnraum hat KEINEN USt-Satz, das ist etwas anderes als 0 %). Ist der Lauf nicht rechenbar, ist `umlage` EXPLIZIT `null` mit Klartext in `umlageFehler` und den `readinessFindings` — NIE ein leeres `lines`-Array (das wäre von „alles verteilt, Summe 0" nicht unterscheidbar). `rechenbar` ist abgeleitet (umlage !== null && gegenrechnung !== null). `lines`, `totalUmlagefaehig` und `totalVerteiltNetto` reisen zusammen, damit INV-BK-01 am gelieferten Dokument nachprüfbar bleibt. WIEDERHOLBARKEIT: run, umlage, gegenrechnung und readinessFindings stammen aus dem gebundenen Snapshot und sind bei zweimaligem Lesen byte-gleich — seit #1812 auch die VZ-Seite, die als eigener vz-Zweig im Snapshot liegt und in den bindingContentHash eingeht. EINZIGE Ausnahme: ein vor #1812 gebundener ALT-Lauf hat keinen vz-Zweig; seine VZ-Stammdaten werden weiterhin bei jedem Lesen live gelesen, ohne dass sich bindingContentHash ändert.AbrechnungErgebnisResponse
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannter Lauf, fremder Tenant ODER keine UUID (ApiErrorBody, code not_found — kein Existenz-Orakel, insbesondere kein 403)

POST/api/abrechnung/{id}/berechnet

Setzt den Lauf auf `berechnet` (mark_billing_run_berechnet) — nur bei freigabefähigem Prüfbericht. KEIN Body.

operationId: markAbrechnungBerechnet · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Übergang vollzogen (id, status).AbrechnungBerechnetResponse
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden — fail-closed)
404unbekannter Lauf, fremder Tenant ODER keine UUID (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Prüfbericht nicht freigabefähig — der Lauf bleibt Entwurf (ApiErrorBody, code conflict)
503Zuständigkeitsprüfung nicht durchführbar (ApiErrorBody, code unavailable — nie durchwinken)

GET/api/abrechnung/{id}/s35a-bescheinigungen

Erzeugt die §35a-Bescheinigungen ALLER Wohnraum-Mieter eines FESTGESCHRIEBENEN Abrechnungslaufs (Serienlauf je Objekt) — Geld ausschließlich als Integer-STRING.

operationId: getAbrechnungS35aBescheinigungen · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
formatqueryneinjson | pdfOhne Angabe (oder `json`) die JSON-Serie; `pdf` liefert EIN Dokument (application/pdf) mit je Bescheinigung einer Seite.
StatusBedeutungBody
200Die Serie: je Wohnraum-Vertrag mit Anteil > 0 eine Bescheinigung (Nutzungszeitraum, Einheiten, je §35a-Kategorie der Arbeits-/Lohnkostenanteil; bei Bewohnerwechsel zeitanteilig, Mehrfachbuchungen summiert). Je Vertrag dieselbe Summe wie im §35a-Ausweis der NK-Abrechnung. Gewerbemieter und Eigentümer-Leerstand erhalten keine Bescheinigung; ein Betrag ohne mieterscharfen Anteil steht mit Grund in nichtBescheinigt. INVARIANTE: summeBescheinigungen + summeNichtBescheinigt = summeS35aKosten, cent-genau, Restcent deterministisch. Mit ?format=pdf stattdessen application/pdf (Content-Disposition attachment), byte-deterministisch.S35aBescheinigungenResponse
400unbekanntes Format oder unbekannter Query-Parameter (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannter Lauf, fremder Tenant ODER keine UUID (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Lauf nicht festgeschrieben, Bestandslauf ohne beim Binden gesiegelte §35a-Klassifikation bzw. ohne gesiegelte Anzeigefelder (nie Live-Fallback), oder seine §35a-Belege sind nicht bescheinigungsfähig (Kategorie fehlt, Buchungsdatum außerhalb des Zeitraums) — ApiErrorBody, code conflict, ohne Zahl

abschluss

GET/api/abschluss/{id}/freeze

Fragt, ob an einer Abrechnung noch geschrieben werden darf (Muster F7). Ein bestandskräftiger Lauf plus `vorhaben=neuberechnung` endet mit 409 und nennt den Korrekturweg — ein stilles „nichts passiert" sähe für den Bediener wie Erfolg aus.

operationId: getAbschlussFreeze · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
vorhabenqueryjastorno | neuberechnungWas mit der Abrechnung geschehen soll. GESCHLOSSENES Vokabular mit ZWEI Wörtern; ein Inline-Edit ist hier nicht abgelehnt, sondern nicht formulierbar. Ein unbekanntes Wort fällt NIE still auf einen Zweig zurück.
snapshotHashqueryneinstringDer Hash, den der Aufrufer am AKTUELLEN Stand gebildet hat (`bildeAbschlussSnapshotHash`, 64 Hex-Zeichen klein). Nur MIT ihm fährt die Route die zweite Hälfte von F7 und meldet eine Abweichung mit 409; ohne ihn steht `snapshotGeprueft: false` in der Antwort. Die Route bildet ihn NICHT selbst — der Stand entsteht im Rechenwerk (S12-T11), und ein hier nachgebauter Hash wäre die zweite Wahrheit über denselben Stand.
StatusBedeutungBody
200die Freeze-Auskunft samt Korrekturweg (AbschlussFreezeResponse)AbschlussFreezeResponse
400keine UUID, fehlendes/unbekanntes `vorhaben` ODER ein `snapshotHash` in falscher Form (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Lauf unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409die Abrechnung ist festgeschrieben und das Vorhaben ist `neuberechnung`, ODER der mitgegebene Stand passt nicht mehr zum festgeschriebenen (ApiErrorBody, code conflict)

POST/api/abschluss/{id}/storno

Storniert EINEN Abschluss-Lauf — der einzige Weg, an einer festgeschriebenen Abrechnung überhaupt etwas zu bewegen. Der Lauf bleibt danach vollständig lesbar (GG4/GoBD).

operationId: storniereAbschlussLauf · Auth: bearerAuth

Request-Body (Pflicht): application/json → AbschlussStornoRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200der stornierte Lauf samt Stichtag (AbschlussStornoResponse)AbschlussStornoResponse
400ungültige Eingabe, fehlender Grund ODER fehlender/unförmiger Stichtag (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Lauf unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409der Lauf ist bereits storniert (ApiErrorBody, code conflict). Fail-loud statt No-op: ein zweites Storno überschriebe Grund und Tag des ersten.

altbestand

GET/api/altbestand/posten

Liest die übernommene OP-, Mahn- und Zahlhistorie EINES Mieters (die Auskunft bei Mieterwiderspruch, ADR 0019).

operationId: listAltbestandPosten · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
contractIdqueryjastring(uuid)PFLICHT. Eine Sicht „alle übernommenen Zeilen des Mandanten" wäre ein Massenexport von Zahlungsverhalten und Mahnhistorie; die Auskunft ist je Mieter, weil der Anlass je Mieter ist.
StatusBedeutungBody
200Alle Zeilen dieses Mieters, aufsteigend nach (datum, quellSchluessel) — die Ordnung ist Vertrag, eine wechselnde Reihenfolge wäre gegen einen Widerspruch nicht verwendbar. Geliefert werden ALLE Arten, auch die gebuchten: journalEntryId zeigt bei art=op auf die Eröffnungs-Sollstellung und ist bei mahnung/zahlung null. betragCents ist ein signierter Integer-STRING. Ein fremder Vertrag liefert eine LEERE Liste wie ein nie existierter (kein Existenz-Orakel).AltbestandPostenListResponse
400fehlende oder ungültige contractId (ApiErrorBody, code invalid_request — Feldname + Regel, nie der Wert)
401nicht authentifiziert — leerer Body (kein Oracle)

GET/api/altbestand/provenienz

Liest die Herkunft EINER Eröffnungs-Sollstellung: Altsystem, Exportzeitpunkt, Datei-Hash, Stichtag, Quellzeile (GG7).

operationId: getEroeffnungsProvenienz · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
journalEntryIdqueryjastring(uuid)Die Buchung, deren Herkunft erklärt werden soll.
StatusBedeutungBody
200provenienz mit quellsystem, exportiertAm, dateiHash, uebernahmestichtag, quellSchluessel und contractId — oder null. null ist BEWUSST die Antwort für drei ununterscheidbare Lagen: fremder Mandant, nie existiert, oder eine Buchung, die nicht aus einer Übernahme stammt. Ein 404 für eine davon wäre genau das Existenz-Orakel, das es nicht geben darf.AltbestandProvenienzResponse
400fehlende oder ungültige journalEntryId (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/altbestand/uebernahme

Übernimmt einen Altbestand (uebernehme_altbestand): offene Posten buchen, Mahn-/Zahlhistorie ablegen, Provenienz binden.

operationId: uebernehmeAltbestand · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
201übernommen (propertyId, uebernahmestichtag, uebernahmeId, eroeffnung|null, anzahlPostenNeu, anzahlPostenReplay)
400ungültige Eingabe, doppelter Quellschlüssel im Umschlag, Währungsmischung oder ein fachlich abgewiesener Rückstand (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden — fail-closed)
404Vertrag oder Konto am Objekt unbekannt ODER fremder Mandant (ApiErrorBody, code not_found — ein fremder und ein nie existierender Vertrag liefern DIESELBE Antwort, kein Existenz-Orakel)
409der Buchungssatz saldiert nicht oder der Idempotency-Key ist anders gebunden (ApiErrorBody, code conflict)
503Zuständigkeitsprüfung nicht durchführbar (ApiErrorBody, code unavailable — nie durchwinken)

ausnahmen

GET/api/ausnahmen

Listet die Ausnahme-Inbox (offene Verarbeitungs-/Routing-Ausnahmen des aufrufenden Tenants).

operationId: listAusnahmen · Auth: bearerAuth

StatusBedeutungBody
200offene Ausnahmen (AusnahmenListResponse)AusnahmenListResponse
401nicht authentifiziert — leerer Body (kein Oracle)

auswertung

GET/api/auswertung/einnahmen-ausgaben

Liest das Einnahmen-/Ausgaben-Journal eines Objekts für einen Zeitraum: je Geldbewegung eine Zeile mit Gegenkonto, Beleg und Netto/USt/Brutto, dazu die Summen je Gegenkonto. Eine Umbuchung zwischen zwei Geldkonten ist weder Einnahme noch Ausgabe — sie steht in `umbuchungen`.

operationId: liesEinnahmenAusgabenJournal · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
objektqueryjastring(uuid)Das Objekt (UUID) — Pflicht, s. Kommentar in der Spec-Quelle.
vonqueryjastring(date)Erster Tag des Zeitraums (einschließlich).
bisqueryjastring(date)Letzter Tag des Zeitraums (einschließlich).
je-kontoqueryneinstringAuf GENAU EIN Gegenkonto eingrenzen (`gl_accounts.account_no` am Objekt) — die Kontosicht (WinCASA `JOURNAL_EINAUS_K`). Die Summen gelten dann für dieses Konto; ein Konto ohne Bewegung ergibt eine LEERE Liste, keinen Fehler.
StatusBedeutungBody
200Die Aufstellung des Zeitraums (EinnahmenAusgabenResponse). Geld reist als Integer-STRING in Cent, nie als JSON-number. `ustHerkunft` sagt je Zeile, ob der USt-Betrag GEBUCHT oder aus dem Satz ABGELEITET ist (GG7). ACHTUNG PII: `gegenkonto`/`geldkonten` sind Kontonummern und können Personenkonten benennen (`gl_accounts.account_no`, Kategorie kontakt).EinnahmenAusgabenResponse
400fehlendes/ungültiges Objekt, fehlender oder verdrehter Zeitraum (ApiErrorBody, code invalid_request — Feldname + Regel, nie der Wert)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel)

GET/api/auswertung/einnahmen-ueberschuss

Einnahmen-Überschuss-Aufstellung EINES Objekts für EIN Kalenderjahr (Zufluss/Abfluss, § 11 EStG): Einnahmen und Werbungskosten je Gruppe, Brutto/USt/Netto, Überschuss — für das Objekt oder den Anteil eines Eigentümers; Kautionen, durchlaufende Posten, Rücklagen und Eigentümer-Einlagen/-Entnahmen zählen nicht.

operationId: getEinnahmenUeberschuss · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
objektqueryjastring(uuid)Objekt (Buchungskreis).
jahrqueryjastringKalenderjahr (JJJJ).
eigentuemerqueryneinstring(uuid)Eigentümer (`persons.id`); fehlt ⇒ Objekt gesamt. Der Anteil folgt dem Eigentumsanteil am Tag jeder Position, Rest-Cent nach größtem Rest.
formatqueryneinjson | csv`json` (Vorgabe) oder `csv` (UTF-8 mit BOM, Semikolon, Dezimalkomma, CRLF, Quellenkopf) — zur Weitergabe an Eigentümer oder Steuerberater.
StatusBedeutungBody
200Die Aufstellung als Katalog-Tabelle (`betrag`-Zellen sind Integer-Cent-Strings) oder bei format=csv die fertige CSV-Datei.AuswertungResponse
400ungültige Query — fehlendes/ungültiges Objekt oder Jahr, unbekannter Parameter oder Format (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt oder fremd, oder die Person hat im Jahr keinen Anteil (ApiErrorBody, code not_found)
422Stammdaten nicht auswertbar — Einheit ohne Eigentümer, uneinheitliche Anteile, nicht einordenbares Gegenkonto (ApiErrorBody, code invalid_request)

GET/api/auswertung/finanzstatus

Finanzstatus EINES Objekts: Entwicklung der Geldkonten im Zeitraum (Anfangsbestand, Zugänge, Abgänge, Endbestand, laufender Saldo je Buchung nach Wertstellung) und Vermögensübersicht zum Stichtag.

operationId: getFinanzstatus · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
objektqueryjastring(uuid)Objekt (Buchungskreis). PFLICHT: `account_no` ist nur JE OBJEKT eindeutig — ohne Eingrenzung vermischte der Status gleichnamige Konten verschiedener Objekte.
stichtagqueryneinstring(date)Stichtag der Vermögensübersicht (EINSCHLIESSLICH). Entweder `stichtag` ODER `von`+`bis` — beides zusammen oder keins von beidem ist ein 400.
vonqueryneinstring(date)Beginn des Zeitraums (einschließlich). Alles davor ist der Anfangsbestand der Geldkonten.
bisqueryneinstring(date)Ende des Zeitraums (einschließlich) und zugleich der Stichtag der mitgelieferten Vermögensübersicht.
StatusBedeutungBody
200Der Finanzstatus. Alle Cent-Felder sind vorzeichenbehaftete Integer-STRINGS, nie JSON-numbers — ein Jahresumsatz überschreitet 2^53. `entwicklung` ist im Stichtags-Modus `null`. `stimmt` und `bilanzgleichgewicht` werden AUSGEWIESEN, nicht erzwungen: eine Schieflage soll sichtbar sein.FinanzstatusResponse
400ungültige Query — fehlende/unbrauchbare Objekt-Referenz, kein oder doppelter Modus, verdrehter Zeitraum (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

GET/api/auswertung/saldenliste

Summen- und Saldenliste der Sachkonten EINES Objekts für einen Zeitraum: je Konto Anfangsbestand, Soll- und Haben-Umsatz und Endsaldo, gegliedert nach Kontenklassen.

operationId: getSaldenliste · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
objektqueryjastring(uuid)Objekt (Buchungskreis). PFLICHT: `account_no` ist nur JE OBJEKT eindeutig — ohne Eingrenzung vermischte die Liste gleichnamige Konten verschiedener Objekte.
vonqueryjastring(date)Beginn des Zeitraums (einschließlich). Alles davor ist der Anfangsbestand.
bisqueryjastring(date)Ende des Zeitraums (einschließlich). Sätze danach zählen nirgends mit.
nurBewegtqueryneintrue | false`true` ⇒ nur Konten mit mindestens einer Buchung IM Zeitraum. Konten mit Vortrag, aber ohne Bewegung, entfallen dann ebenfalls (gefilterteKonten nennt ihre Zahl).
formatqueryneinjson | csv`json` (Vorgabe) oder `csv`. Bei `csv` ist die Antwort `text/csv` (UTF-8 mit BOM, Semikolon, Dezimalkomma, CRLF) — nicht der JSON-Umschlag.
StatusBedeutungBody
200Die Liste. Alle Cent-Felder sind vorzeichenbehaftete Integer-STRINGS, nie JSON-numbers — eine Jahressumme überschreitet 2^53. Bei format=csv ist der Body die fertige CSV-Datei (Content-Disposition attachment).SaldenlisteResponse
400ungültige Query — fehlendes/verdrehtes Datum, fehlende oder unbrauchbare Objekt-Referenz (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

GET/api/auswertung/ust-liste

Umsatzsteuer, Vorsteuer und Zahllast eines Objekts über einen Zeitraum — je Steuersatz, auf Wunsch je Konto.

operationId: getAuswertungUstListe · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
objektqueryjastring(uuid)Objekt (Buchungskreis).
vonqueryjastring(date)Erster Tag des Zeitraums (einschliesslich).
bisqueryjastring(date)Letzter Tag des Zeitraums (einschliesslich).
rhythmusqueryneinmonat | quartal | jahrRhythmus der ausgewiesenen Perioden (Default quartal).
je-kontoqueryneintrue | falsetrue ⇒ die Antwort trägt zusätzlich das Detail je Konto und Satz (`zeilen`); sonst ist `zeilen` null. Kebab-Schreibweise, weil die CLI-Flagge `--je-konto` unverändert durchgereicht wird.
StatusBedeutungBody
200Umsatzsteuer-Liste des Objekts (UstListeResponse)UstListeResponse
400Objekt-Referenz, Zeitraum oder Rhythmus unbrauchbar (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

auswertungen

GET/api/auswertungen

Der Katalog der Auswertungen: welche Berichte es gibt, welche Zeitachsen sie kennen und welche Spalten sie liefern.

operationId: getAuswertungsKatalog · Auth: bearerAuth

StatusBedeutungBody
200Der Katalog. Die Reihenfolge ist die Lesefolge der Buchhaltung, nicht die Einfüge-Reihenfolge.AuswertungKatalogResponse
401nicht authentifiziert — leerer Body (kein Oracle)

GET/api/auswertungen/{auswertung}

EINE Auswertung des Katalogs für ein Objekt und einen Zeitraum, als JSON oder CSV — mit Quellenangabe (Mandant, Objekt, Zeitraum, Datenstand).

operationId: getAuswertung · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
auswertungpathjastringKatalog-Name des Berichts (`GET /api/auswertungen` nennt die verfügbaren).
objektqueryjastring(uuid)Objekt (Buchungskreis). PFLICHT: Kontonummern sind nur JE OBJEKT eindeutig, und die Quellenangabe muss sagen, für welches Objekt die Zahl gilt.
vonqueryjastring(date)Beginn des Zeitraums (einschließlich). PFLICHT — ein Export ohne Untergrenze ist später nicht vergleichbar.
bisqueryjastring(date)Ende des Zeitraums (einschließlich). PFLICHT — sonst änderte derselbe Ausdruck morgen sein Ergebnis.
stichtagqueryneinstring(date)Nur bei Auswertungen mit Zeitbezug `zeitraum-und-stichtag` (offene Posten: Stichtag der Verzugstage). Vorgabe: der Abruftag.
formatqueryneinjson | csv`json` (Vorgabe) oder `csv`. Bei `csv` ist die Antwort `text/csv` (UTF-8 mit BOM, Semikolon, Dezimalkomma, CRLF) mit der Quellenangabe als Kopfzeilen.
nurBewegtqueryneintrue | falseNur `saldenliste`: `true` ⇒ nur Konten mit mindestens einer Buchung IM Zeitraum.
kontoqueryneinstringNur `buchungsliste`: Kontonummer am Objekt — der Satz zählt, wenn EINE seiner Zeilen darauf liegt.
belegqueryneinmit | ohneNur `buchungsliste`: `mit` ⇒ die Beleg-Kette löst auf, `ohne` ⇒ sie löst nicht auf.
mengequeryneinoffen | alleNur `offene-posten`: `offen` (Vorgabe) = Arbeitsliste, `alle` zusätzlich die erledigten Posten.
einheitqueryneinstring(uuid)Nur `hausgeld-steuerzuarbeit`: Einheit (alternativ `eigentuemer`).
eigentuemerqueryneinstring(uuid)Nur `hausgeld-steuerzuarbeit`: Eigentümer (alternativ `einheit`).
abschlusslaufqueryneinstring(uuid)Nur `hausgeld-steuerzuarbeit`: festgeschriebener Abschluss-Lauf. Ohne `einheit` ist die Antwort leer; fremder oder unbekannter Lauf ⇒ 404 (not_found), nicht festgeschriebener (unbestätigter, ohne Anker) oder stornierter Lauf ⇒ 409 (conflict); ohne Angabe gilt der aktive Lauf des Jahres (keiner ⇒ leer).
StatusBedeutungBody
200Die Auswertung. Jede Zelle ist ein String oder null; `spalten[i].typ` sagt, wie sie zu lesen ist (`betrag` ⇒ Integer-Cents). Bei format=csv ist der Body die fertige CSV-Datei (Content-Disposition attachment), deren Kopfzeilen dieselbe Quellenangabe tragen.AuswertungResponse
400ungültige Parameter — fehlendes Objekt oder Datum, verdrehter Zeitraum, oder ein Filter, den DIESE Auswertung nicht führt (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404der Katalog führt diese Auswertung nicht (ApiErrorBody, code not_found)

bank

GET/api/bank

Listet Bankverbindungen (3-Wege-Filter, optional auf EIN Objekt eingegrenzt).

operationId: listBankverbindungen · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
statusqueryneinalle | aktiv | archiviertalle | aktiv | archiviert (Default aktiv). Unbekannter Wert ⇒ 400, nie stiller Fallback.
propertyIdqueryneinstring(uuid)grenzt auf EIN Objekt ein (Filter, keine Autorisierung — sichtbar ist ohnehin nur der eigene Tenant, RLS).
StatusBedeutungBody
200Bankverbindungsliste (BankListResponse)BankListResponse
400ungültiger status-Filter oder ungültige propertyId (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/bank

Legt EINE Bankverbindung an einem Objekt an (IBAN-validiert).

operationId: createBankverbindung · Auth: bearerAuth

Request-Body (Pflicht): application/json → BankCreateRequest

StatusBedeutungBody
201angelegte Bankverbindung (Bank)
400ungültige Eingabe, ungültige IBAN ODER Objekt archiviert (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekanntes Objekt ODER fremder Tenant (ApiErrorBody, code not_found)

GET/api/bank/{id}

Liest EINE Bankverbindung (auch archiviert).

operationId: getBankverbindung · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200BankBank
400keine UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel)

PATCH/api/bank/{id}

Ändert Bankverbindungs-Stammfelder (IBAN/Kontoart/Gläubiger-ID).

operationId: updateBankverbindung · Auth: bearerAuth

Request-Body (Pflicht): application/json → BankUpdateRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200geänderte Bankverbindung
400leerer/ungültiger Patch, ungültige IBAN ODER archiviert (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409Kontoart oder Bank-Sachkonto des Kautionskontos einer aktiven Kautionsabrede geändert (ApiErrorBody, code conflict)

POST/api/bank/{id}/archive

Archiviert eine Bankverbindung (archived_at statt DELETE, K5).

operationId: archiveBankverbindung · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200archiviert (BankArchiveResponse). Wiederholter Aufruf = Idempotenz-Replay des Erst-Ergebnisses (identische Antwort, kein zweites Kommando).
400keine UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409Kautionskonto einer aktiven Kautionsabrede — nicht archivierbar (ApiErrorBody, code conflict)

GET/api/bank/{id}/umsaetze

Liest die IMPORTIERTEN Umsätze einer Bankverbindung — die `bankTransactionId`, die POST /api/bankabgleich/* erwartet.

operationId: listBankUmsaetze · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)Die Bankverbindung.
mengequeryneinalle | offen | gebucht`alle` (Default) · `offen` (kein wirksamer Buchungsanspruch) · `gebucht`. Der Default ist bewusst `alle`: diese Route ist die Auskunft über den IMPORT, nicht die Arbeitsliste — ein bereits gebuchter Umsatz darf nicht spurlos verschwinden.
providerIdqueryneinstringAuf GENAU EINE Bank-Referenz eingrenzen (bei camt `AcctSvcrRef`) — der Weg, einen Umsatz aus dem eigenen Auszug wiederzufinden.
correlationIdqueryneinstringAuf EINEN Import-Lauf eingrenzen.
buchungVonqueryneinstring(date)Untere Grenze des Buchungsdatums (einschließlich).
buchungBisqueryneinstring(date)Obere Grenze des Buchungsdatums (einschließlich).
limitqueryneininteger1…200; Default 50. `abgeschnitten` sagt, ob mehr da war.
StatusBedeutungBody
200Die Umsätze der Verbindung, jüngstes Buchungsdatum zuerst. `betragCents` ist ein vorzeichenbehafteter Integer-STRING (> 0 Eingang, < 0 Ausgang), nie eine JSON-number. `gebucht` kommt aus DEMSELBEN Anspruchs-Prädikat wie Arbeitsliste und Reconciliation (INV-BANK-01) — es gibt keine zweite Formulierung. ACHTUNG PII: verwendungszweck, gegenkontoIban und gegenkontoInhaber sind personenbezogen (freitext/bankdaten/name) und reisen absichtlich mit, weil ohne sie kein Mensch einen Umsatz zuordnen kann; der rohe Provider-Datensatz (`raw`) reist NICHT mit.BankUmsatzListResponse
400ungültige Query (ApiErrorBody, code invalid_request — Feldname + Regel, nie der Wert)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannte Bankverbindung, fremder Tenant ODER keine UUID (ApiErrorBody, code not_found — kein Existenz-Orakel, insbesondere kein 403)

POST/api/bank/{id}/umsatz-import

Importiert einen Kontoauszug als Datei (camt.053/camt.052/MT940) auf eine Bankverbindung. Die Datei wird serverseitig geparst; verbucht wird das ERKANNTE Format, nicht das deklarierte. Wiederholung ist gefahrlos (Dedup).

operationId: importBankUmsaetze · Auth: bearerAuth

Request-Body (Pflicht): multipart/form-data → Binärfeld file (format: binary)

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)Die Bankverbindung, auf die importiert wird.
formatqueryjacamt.053 | camt.052 | mt940Leseformat der Datei — wählt NUR den Parser. Verbucht und gemeldet wird das aus der Datei erkannte Format. Unbekannter Wert ⇒ 400, nie stiller Fallback.
StatusBedeutungBody
201Import-Report (BankUmsatzImportResponse) — total = imported + deduplicated + discarded + excluded. Ein vom Import AUSGENOMMENES Konto liefert ebenfalls 201, mit excluded > 0 und exclusion (Begründung), keinen Fehler.BankUmsatzImportResponse
400fehlendes/unbekanntes format, kein oder MEHR ALS EIN file-Feld ODER unlesbare Auszugsdatei (ApiErrorBody, code invalid_request) — kein Teil-Import
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannte Bankverbindung ODER fremder Tenant (ApiErrorBody, code not_found)
409die Bankverbindung bezieht ihre Umsätze bereits über einen nicht getrennten Bankzugang — ein Datei-Import würde doppelt buchen (ApiErrorBody, code conflict). Ausweg: Bankzugang trennen.
413Datei überschreitet die zulässige Maximalgröße (ApiErrorBody, code payload_too_large)

bankabgleich

POST/api/bankabgleich/verbuchen

Legt vor, gibt frei und bucht (execute_bank_transaction_booking) — `modus` wählt das Freigabe-Gate: einzeln (gelb erlaubt) oder sammel (all-green).

operationId: verbucheBankumsatz · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
201Gebucht. Je Umsatz entsteht GENAU EIN wirksamer Buchungsanspruch (INV-BANK-01); Zahlungssatz, Verrechnung und Anspruch liegen in EINER Transaktion. Im Sammelweg wird ERST vollständig freigegeben und DANN gebucht — scheitert eine einzelne Buchung, bleiben die übrigen gebucht und der betroffene Umsatz steht in der Reconciliation weiterhin `offen` (kein stiller Verlust, aber auch keine vorgetäuschte Gesamt-Atomarität).BankabgleichVerbuchungResponse
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403fehlende Step-up-Frische oder keine Zuständigkeit (ApiErrorBody, code forbidden — fail-closed)
404Umsatz/Vorschlag/Sachkonto/Bankverbindung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel; eine archivierte Bankverbindung ist von einer nie existierenden nicht zu unterscheiden)
409bereits entschieden, Ampel blockiert, Sammel-Freigabe nicht durchgehend grün, Vorschlag nicht mehr freigegeben — ODER die Stammdaten geben das Bank-Sachkonto nicht her: keine bzw. mehrere Zuordnungen am Objekt der Bankverbindung, oder ein mitgeschicktes bankGlAccountNo weicht vom abgeleiteten ab (ApiErrorBody, code conflict). Diese Ablehnungen sind DETERMINISTISCH — ein Retry hilft nie; die Meldung nennt den Klärungsweg (Kontenplan pflegen bzw. den Wert weglassen).
503Zuständigkeitsprüfung nicht durchführbar (ApiErrorBody, code unavailable — nie durchwinken)

POST/api/bankabgleich/vorlegen

Legt EINEN Bankumsatz als Buchungsvorschlag vor (create_bank_transaction_booking_proposal) — vorbereitend, reversibel, ohne Freigabe.

operationId: legeBankumsatzVor · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
201Vorschlags-Version angelegt. `ampel` stammt aus der BEWERTUNG und entscheidet, ob einzeln oder gesammelt freigegeben werden darf.BankabgleichVorlageResponse
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden — fail-closed)
404Umsatz/Sachkonto/Bankverbindung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel; eine archivierte Bankverbindung ist von einer nie existierenden nicht zu unterscheiden)
409Debitor nicht eindeutig, kein Tilgungsziel — ODER die Stammdaten geben das Bank-Sachkonto nicht her: keine bzw. mehrere Zuordnungen am Objekt der Bankverbindung, oder ein mitgeschicktes bankGlAccountNo weicht vom abgeleiteten ab (ApiErrorBody, code conflict). Diese Ablehnungen sind DETERMINISTISCH — ein Retry hilft nie; die Meldung nennt den Klärungsweg (Kontenplan pflegen bzw. den Wert weglassen).
503Zuständigkeitsprüfung nicht durchführbar (ApiErrorBody, code unavailable — nie durchwinken)

bankzugang

GET/api/bankzugang

Listet die Bankzugänge des aufrufenden Tenants samt Status (ohne Anbieter-Zugangsdaten).

operationId: listBankzugaenge · Auth: bearerAuth

StatusBedeutungBody
200Bankzugänge des Tenants (BankzugangListResponse)BankzugangListResponse
401nicht authentifiziert — leerer Body (kein Oracle)

bauabzug

GET/api/bauabzug/anmeldung

Liest die einbehaltene Bauabzugsteuer je Monat EINES Kalenderjahres — Grundlage der Anmeldung (§ 48a EStG): Summe, Zahl der Einbehalte und Fälligkeit am 10. des Folgemonats. Gezählt wird nur tatsächlich Einbehaltenes: ein Einbehalt zählt, solange seine Buchung (Kreditor an Verbindlichkeit Finanzamt, entsteht mit der Freigabe des Zahlungsauftrags) wirksam, also nicht storniert ist; ein noch nicht freigegebener Auftrag zählt nicht.

operationId: listBauabzugAnmeldung · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
jahrqueryjastringKalenderjahr JJJJ
StatusBedeutungBody
200{ jahr, monate[] } aufsteigend nach Monat; Monate ohne Einbehalt erscheinen nicht. Cent-Felder sind Integer-STRINGS.BauabzugAnmeldungResponse
400ungültige Query (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

GET/api/bauabzug/freistellungsbescheinigung

Liest die hinterlegten Freistellungsbescheinigungen (§ 48b EStG) EINES Kreditors: Nummer, gültig bis, Umfang, Auftragsbezug und ausstellendes Finanzamt, absteigend nach Gültigkeit.

operationId: listFreistellungsbescheinigungen · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
kreditorPersonIdqueryjastring(uuid)
StatusBedeutungBody
200{ kreditorPersonId, bescheinigungen[] } — ein fremder/unbekannter Kreditor ergibt eine leere Liste (kein Existenz-Orakel).FreistellungsbescheinigungenResponse
400ungültige Query (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/bauabzug/freistellungsbescheinigung

Hinterlegt eine Freistellungsbescheinigung am Kreditor (hinterlege_freistellungsbescheinigung). Ohne gültige Bescheinigung behält der Zahlungsauftrag für eine Bauleistung über der Bagatellgrenze 15 % für das Finanzamt ein.

operationId: hinterlegeFreistellungsbescheinigung · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200hinterlegt — { freistellungsbescheinigungId, kreditorPersonId, nummer, gueltigBis, umfang }
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Schreibrecht (ApiErrorBody, code forbidden)
404Kreditor unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)
409dieselbe Nummer ist am Kreditor bereits hinterlegt (ApiErrorBody, code conflict)

POST/api/bauabzug/kostenart

Kennzeichnet eine Kostenart als Bauleistung (§ 48 Abs. 1 Satz 3 EStG) oder nimmt das Kennzeichen zurück (setze_kostenart_bauleistung). Eingangsrechnungen auf Aufwandskonten dieser Kostenart lösen am Zahlungsauftrag die Bauabzugs-Prüfung aus.

operationId: setzeKostenartBauleistung · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200gesetzt — { costCategoryId, istBauleistung }
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Schreibrecht (ApiErrorBody, code forbidden)
404Kostenart unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)

POST/api/bauabzug/objekt-einstellung

Setzt die Lage des Auftraggebers am Objekt, die § 48 EStG unterscheidet (setze_bauabzug_objekt_einstellung): ausschließlich steuerfreie Vermietungsumsätze nach § 4 Nr. 12 UStG heben die Bagatellgrenze auf 15.000 € (§ 48 Abs. 2 Nr. 1 EStG); ein Vermieter von höchstens zwei Wohnungen ist vom Abzug ausgenommen (§ 48 Abs. 1 Satz 2 EStG, Grund vermieter-hoechstens-zwei-wohnungen). Ohne Einstellung gilt 5.000 € und keine Ausnahme.

operationId: setzeBauabzugObjektEinstellung · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200gesetzt — { propertyId, ausschliesslichSteuerfreieVermietung, hoechstensZweiWohnungen }
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Schreibrecht oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Objekt unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)

GET/api/bauabzug/pruefungen

Liest die Bauabzugs-Entscheidungen je Bauleistungs-Position der Zahlungsaufträge: Grund, Rechnungsbetrag, Auszahlung, Einbehalt, Fälligkeit und den Befund der Freistellungsbescheinigung — eine fehlende oder abgelaufene wird mit Status, Nummer und Gültigkeit benannt.

operationId: listBauabzugPruefungen · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
paymentOrderIdqueryneinstring(uuid)nur die Positionen dieses Zahlungsauftrags
StatusBedeutungBody
200{ pruefungen[] } nach Zahlungstag und Posten geordnet; ein fremder/unbekannter Auftrag ergibt eine leere Liste. Cent-Felder sind Integer-STRINGS.BauabzugPruefungenResponse
400ungültige Query (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/bauabzug/volle-zahlung

Erlaubt, einen offenen Posten (Bauleistung) trotz fehlender Freistellungsbescheinigung VOLL zu zahlen (erlaube_volle_zahlung_bauleistung) — nur mit dokumentierter Begründung und nur mit dem Recht bauabzug.volle-zahlung. Je Posten gilt die erste Erlaubnis.

operationId: erlaubeVolleZahlungBauleistung · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200erlaubt — { openItemId, begruendung, erlaubtVon }
400ungültige Eingabe, z. B. leere Begründung (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403das Recht bauabzug.volle-zahlung fehlt (ApiErrorBody, code forbidden)
404Posten unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)
409für diesen Posten ist die volle Zahlung bereits erlaubt (ApiErrorBody, code conflict)

beleg

POST/api/beleg

Reicht einen Beleg über die echte Ingest-Vordertür ein (Byte-Typ-/Malware-Gate, Blob, Ingest, Dispatch-Enqueue).

operationId: uploadBeleg · Auth: bearerAuth

Request-Body (Pflicht): multipart/form-data → Binärfeld file (format: binary)

StatusBedeutungBody
201Ingest-Ergebnis der Vordertür (BelegUploadResponse) — outcome received|duplicate|quarantined.BelegUploadResponse
400kaputter/fehlender multipart-Body oder keine Datei im Feld file (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
413Upload überschreitet die zulässige Maximalgröße — früh am Transport abgewiesen (ApiErrorBody, code payload_too_large)

beschluss

POST/api/beschluss/{id}/status

Schreibt den Lebenszyklus-Status eines Beschlusses fort (append-only-Verlauf plus Projektion).

operationId: setzeBeschlussStatus · Auth: bearerAuth

Request-Body (Pflicht): application/json → BeschlussStatusRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200der geschriebene Wechsel (BeschlussStatusResponse)BeschlussStatusResponse
400ungültige Eingabe ODER unzulässiger Übergang unter der geltenden Kantenmenge — z. B. bestandskraeftig → angenommen, oder jeder Ausgang aus dem Endzustand nichtig (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Beschluss unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

buchung

POST/api/buchung

Führt einen freigegebenen Buchungsvorschlag aus (execute_booking) — optional rückdatiert.

operationId: executeBuchung · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
201gebucht (journalEntryId, proposalId, proposalVersion, konto, betragCents, betragCurrency)
400ungültige Eingabe oder unzulässiges Buchungsdatum (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden — fail-closed)
404unbekannter Vorschlag ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Zustand lässt die Buchung nicht zu: keine/abgelehnte Freigabe, überholt, bereits gebucht (ApiErrorBody, code conflict)
503Zuständigkeitsprüfung nicht durchführbar (ApiErrorBody, code unavailable — nie durchwinken)

POST/api/buchung/eroeffnungsbestand

Baut Anfangsbestände auf (import_opening_balances) — die Migrationsnaht.

operationId: importEroeffnungsbestand · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
201aufgebaut (propertyId, uebernahmestichtag, gebucht[], anzahlNeu, anzahlReplay)
400ungültige Eingabe, unzulässiger Stichtag oder fachlich abgewiesener Rückstand (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden — fail-closed)
404Konto am Objekt unbekannt ODER fremdes Objekt (ApiErrorBody, code not_found — kein Existenz-Orakel)
409der Buchungssatz saldiert nicht (ApiErrorBody, code conflict)
503Zuständigkeitsprüfung nicht durchführbar (ApiErrorBody, code unavailable)

cli

POST/api/cli/login/exchange

Schritt 3 des CLI-Browser-Logins: tauscht den einmaligen Rückruf-Code gegen den Session-Token (nur im Antwort-Body, nie in einer URL).

operationId: exchangeCliLoginCode · Auth: keine (öffentlich)

Request-Body (Pflicht): application/json

StatusBedeutungBody
200Session-Token (Bearer) — ausschließlich hier im Body, nie in einer URL (Query-Strings landen in Access-Logs, Proxy-Logs und der Browser-History). Gehört in eine sichere Ablage, nie in eine Ausgabe.
400Anmeldevorgang unbekannt, abgelaufen, noch nicht bestätigt oder bereits eingelöst (ApiErrorBody, code invalid_request)

POST/api/cli/login/start

Schritt 1 des CLI-Browser-Logins: startet eine Anmelderunde und liefert die im Browser zu öffnende Anmelde-URL.

operationId: startCliLogin · Auth: keine (öffentlich)

Request-Body (Pflicht): application/json → CliLoginStartRequest

StatusBedeutungBody
200Anmelderunde angelegt — `verificationUrl` im Browser öffnen, `loginId` für den Tausch aufbewahren.
400state fehlt/unbrauchbar, redirectUri ist keine Loopback-Adresse ODER frisch ist kein Boolean (ApiErrorBody, code invalid_request)
429zu viele gleichzeitig offene Anmeldevorgänge (ApiErrorBody, code invalid_request)

datev

POST/api/datev/belegpaket

Erzeugt den DATEV-Buchungsstapel mit Beleglinks UND das zugehörige Belegpaket (ZIP mit document.xml und den unveränderten Original-Belegen) in EINEM Lauf (eine Historien-Zeile). Body wie beim Buchungsstapel. Die Antwort trägt "stapel" (Metadaten, laufId, hinweise, datei), "belegpaket" (null, wenn keine Buchung einen übertragbaren Beleg hat), "ohneBeleg" (Zeilennummer und Grund je Buchung ohne Beleg im Paket; nie Buchungstext oder Name) und "hinweis" (Text genau dann, wenn belegpaket null ist). In der Historie liegt nur die Stapel-Datei mit den Beleglinks; das ZIP wird NICHT abgelegt und ist nur in dieser Antwort abrufbar. Ist der Belegspeicher nicht erreichbar, gibt es 503, keinen Teil-Export und keine Historien-Zeile.

operationId: exportiereDatevBelegpaket · Auth: bearerAuth

Request-Body (Pflicht): application/json → DatevBelegpaketRequest

StatusBedeutungBody
200Stapel, Belegpaket und Ohne-Beleg-Liste (DatevBelegpaketResponse)DatevBelegpaketResponse
400ungültige Eingabe oder unbekanntes Feld (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder fehlendes Recht (ApiErrorBody, code forbidden)
404Objekt unbekannt, fremder Mandant ODER nicht zuständig (ApiErrorBody, code not_found)
409leerer Umfang, Zeitraum nicht in einem Kalenderjahr, fehlende Kontenzuordnung, Sachkontenlänge, kein eindeutiges Hauptkonto oder Abstimmung gegen das Journal; benannt, nie mit Buchungstext (ApiErrorBody, code conflict)
503Belegspeicher nicht erreichbar; nichts exportiert, keine Historien-Zeile (ApiErrorBody, code unavailable)

POST/api/datev/buchungsstapel

Erzeugt den DATEV-Buchungsstapel (EXTF 700) für ein oder mehrere Objekte und ein Kalenderjahr und legt den Lauf in der Export-Historie ab. Die Antwort trägt die Datei (Windows-1252, Base64) samt sha256 und "hinweise" auf nicht festgeschriebene Perioden (Hinweis, kein Abweis). Der Export löst KEINE Festschreibung aus; "festschreibung" ist nur das Kennzeichen im Kopfsatz. Ein abweichendes Wirtschaftsjahr geht als zwei Stapel (zwei Aufrufe): exportiert wird der Teil des Kalenderjahres `jahr`, der im Wirtschaftsjahr ab `wirtschaftsjahrBeginn` liegt; berührt das Wirtschaftsjahr das Jahr nicht, ist das ein 400.

operationId: exportiereDatevBuchungsstapel · Auth: bearerAuth

Request-Body (Pflicht): application/json → DatevBuchungsstapelRequest

StatusBedeutungBody
200der Lauf samt Datei (DatevBuchungsstapelResponse)DatevBuchungsstapelResponse
400ungültige Eingabe oder unbekanntes Feld (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder fehlendes Recht (ApiErrorBody, code forbidden)
404Objekt unbekannt, fremder Mandant ODER nicht zuständig (ApiErrorBody, code not_found)
409leerer Umfang, Zeitraum nicht in einem Kalenderjahr (Klartext nennt beide Teilzeiträume), fehlende Kontenzuordnung, Sachkontenlänge, kein eindeutiges Hauptkonto oder Abstimmung gegen das Journal; benannt, nie mit Buchungstext (ApiErrorBody, code conflict)

POST/api/datev/debkred

Erzeugt die DATEV-Stammdatendatei Debitoren/Kreditoren (EXTF, Personenkonten mit Name, Anschrift und bestätigter IBAN) zu einem Buchungsstapel für ein oder mehrere Objekte und ein Kalenderjahr. Die Antwort trägt die Datei (Windows-1252, Base64) samt sha256 und Zahlen. "umfang" ist Pflicht (buchungsstapel oder alle-aktiven). Die Datei enthält Namen und Anschriften: sie steht NICHT in der Export-Historie und ist nicht erneut abrufbar (siehe "hinweise"); der Beleg im Kommando-Log trägt nur sha256 und Zahlen.

operationId: exportiereDatevDebKred · Auth: bearerAuth

Request-Body (Pflicht): application/json → DatevDebKredRequest

StatusBedeutungBody
200die Datei samt Zahlen (DatevDebKredResponse)DatevDebKredResponse
400ungültige Eingabe, fehlender umfang oder unbekanntes Feld (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder fehlendes Recht (ApiErrorBody, code forbidden)
404Objekt unbekannt, fremder Mandant ODER nicht zuständig (ApiErrorBody, code not_found)
409leerer Umfang, Zeitraum, fehlende Kontenzuordnung, Sachkontenlänge, Personenkonto ohne Geschäftspartner oder bereits verwendeter Idempotency-Key, dessen Datei sich nicht bytegleich herstellen lässt (anderer Body oder geänderte Stammdaten seit dem Erstlauf; bei gleichem Body und unveränderten Stammdaten antwortet der Retry mit 200 und derselben Datei; neuen Key verwenden); benannt, nie mit Name oder Anschrift, ohne Datei (ApiErrorBody, code conflict)

GET/api/datev/historie

Listet die früheren DATEV-Buchungsstapel-Läufe, die für die angemeldete Person sichtbar sind, jüngster zuerst: Lauf-Id, Zeitraum, Objekte, Dateiname, sha256, Zeilenzahl, Summe, Zeitpunkt und erzeugende Person; nie Buchungstexte und keine Datei-Bytes. Ein Lauf über mehrere Objekte steht in der Liste jedes seiner Objekte (nur als Kennzahlen); seine Datei liefert der Download nur, wenn die Person für ALLE Objekte des Laufs zuständig ist. Die Historie hält nur die Stapel-Datei; ein Belegpaket (ZIP) und die DebKred-Datei sind nicht darin. Seitenweise: "weiter" der Antwort ist der Cursor für die nächste Seite. Mandant und Zuständigkeit stammen aus der Session.

operationId: listeDatevHistorie · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
objektqueryneinarray<string(uuid)>Nur Läufe, die dieses Objekt berühren; wiederholbar (Läufe, die mindestens eines berühren). Ein Objekt außerhalb der eigenen Zuständigkeit liefert nichts.
limitqueryneinintegerSeitengröße, 1 bis 200 (Vorgabe 200)
weiterqueryneinstringCursor "weiter" der vorigen Seite
StatusBedeutungBody
200Eine Seite der Historie (DatevHistorieListResponse)DatevHistorieListResponse
400ungültiges objekt, limit oder weiter (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
503Zuständigkeitsprüfung nicht durchführbar (ApiErrorBody, code unavailable — nie durchwinken)

GET/api/datev/historie/{laufId}/datei

Liefert die abgelegte Stapel-Datei eines früheren Laufs erneut, byte-gleich zum ursprünglichen Export (gleiche sha256), ohne neuen Buchungslauf, ohne Kommando-Log-Eintrag und ohne neue Historien-Zeile. Nur die Stapel-Datei: ein Belegpaket (ZIP) und die DebKred-Datei liegen nicht in der Historie. Unbekannte, fremde oder nicht vollständig zuständige Lauf-Id ⇒ 404. Stimmen die abgelegten Bytes nicht mehr zu ihrem sha256, gibt es 500 und kein Byte.

operationId: ladeDatevHistorieDatei · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
laufIdpathjastring(uuid)
StatusBedeutungBody
200Lauf-Id und Datei (DatevHistorieDateiResponse)DatevHistorieDateiResponse
401nicht authentifiziert — leerer Body (kein Oracle)
404Lauf unbekannt, fremder Mandant oder die Person ist nicht für alle Objekte des Laufs zuständig (ApiErrorBody, code not_found)
500abgelegte Datei passt nicht mehr zu ihrem sha256; nichts ausgeliefert (ApiErrorBody, code internal)
503Zuständigkeitsprüfung nicht durchführbar (ApiErrorBody, code unavailable — nie durchwinken)

eigentum

POST/api/eigentum/{id}/beenden

Beendet eine Eigentumszeile; die Pfad-Id ist die `ownershipId`. `endeExklusiv` ist der erste Tag OHNE Eigentum („zum 30.06." ⇒ 2025-07-01). Beenden kürzt nur das Fenster; dasselbe Ende ein zweites Mal ist ein Erfolg ohne Änderung (`beendet` false). Der Idempotenz-Schlüssel kommt vom Aufrufer (Header).

operationId: beendeEigentum · Auth: bearerAuth

Request-Body (Pflicht): application/json → EigentumBeendenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200das beendete Eigentum (EigentumBeendenResponse)EigentumBeendenResponse
400keine UUID, ungültiges Datum, Ende nicht nach Beginn oder Vollmacht beginnt nicht vor dem Ende (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Eigentumszeile unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — beide Fälle identisch
409die Zeile endet bereits zu einem ANDEREN Tag (ApiErrorBody, code conflict)

einheit

GET/api/einheit

Listet Einheiten (3-Wege-Filter Alle/Aktiv/Archiviert, Default aktiv; optional je Gebäude oder Objekt).

operationId: listEinheiten · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
statusqueryneinalle | aktiv | archiviertalle | aktiv | archiviert (Default aktiv). Wirkt NUR auf units.archived_at — seit #445 kaskadiert archive_building bzw. archive_property abwärts, sodass mit-archivierte Einheiten aus dem aktiv-Default verschwinden.
gebaeudeIdqueryneinstring(uuid)Nur Einheiten DIESES Gebäudes. Einschränkung innerhalb des Tenants, keine Autorisierungsgrenze.
objektIdqueryneinstring(uuid)Nur Einheiten dieses Objekts (über alle seine Gebäude hinweg). Einschränkung innerhalb des Tenants.
StatusBedeutungBody
200Einheitenliste (EinheitListResponse)EinheitListResponse
400ungültiger status-Filter oder Eltern-ID keine UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/einheit

Legt eine Einheit an einem aktiven Gebäude an.

operationId: createEinheit · Auth: bearerAuth

Request-Body (Pflicht): application/json → EinheitCreateRequest

StatusBedeutungBody
201angelegte Einheit (Einheit)
400ungültige Eingabe ODER Elterngebäude archiviert (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Elterngebäude unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409Einheitennummer im Objekt bereits an eine aktive Einheit vergeben (ApiErrorBody, code conflict, #5534)

GET/api/einheit/{id}

Liest EINE Einheit (auch archiviert) samt Gebäude- und Objekt-Bezug.

operationId: getEinheit · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200EinheitEinheit
400keine UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel)

PATCH/api/einheit/{id}

Ändert unitNo/unitKind/bezeichnung (nur nicht-archivierte Einheiten).

operationId: updateEinheit · Auth: bearerAuth

Request-Body (Pflicht): application/json → EinheitUpdateRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200geänderte Einheit
400leerer/ungültiger Patch ODER Einheit archiviert (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409neue Einheitennummer im Objekt bereits an eine aktive Einheit vergeben (ApiErrorBody, code conflict, #5534)

POST/api/einheit/{id}/archive

Archiviert eine Einheit (archived_at statt DELETE, K5).

operationId: archiveEinheit · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200archiviert (EinheitArchiveResponse). Wiederholter Aufruf = Idempotenz-Replay des Erst-Ergebnisses (identische Antwort, kein zweites Kommando).
400keine UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

GET/api/einheit/{id}/attribut

Liest die Attribut-Historie einer Einheit (alle Zeitscheiben je Attribut, active zum Stichtag).

operationId: listEinheitAttribute · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
attributeKeyqueryneinstringnur Scheiben dieses Attribut-Schlüssels (exakte Übereinstimmung)
asOfqueryneinstring(date)Stichtag YYYY-MM-DD, gegen den `active` gemessen wird (Default: heute UTC). Ungültiges Format ⇒ 400.
StatusBedeutungBody
200Attribut-Historie (EinheitAttributListResponse)EinheitAttributListResponse
400keine UUID oder ungültiger asOf (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Einheit unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/einheit/{id}/attribut

Setzt/ändert eine Attribut-Zeitscheibe „ab Datum" (SCD-2; Überschneidungen desselben Attributs werden abgelehnt).

operationId: setEinheitAttribut · Auth: bearerAuth

Request-Body (Pflicht): application/json → EinheitAttributSetRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200gesetzte Zeitscheibe (EinheitAttributSetResponse)
400ungültige Eingabe, leerer/degenerierter Bereich ODER Überschneidung mit einer bestehenden Scheibe desselben Attributs (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Einheit unbekannt, archiviert ODER fremder Tenant (ApiErrorBody, code not_found bzw. invalid_request bei archiviert)

GET/api/einheit/{id}/belegung

Löst die Belegung einer Einheit zum Stichtag auf („wer wohnt in Einheit X?"), optional stattdessen die Historie. EINE Zustandsachse mit vier Ausgängen: aktiver Mietvertrag (Mietpartei) · Eigentümer als Selbstnutzer · Drittnutzer-Kontakt · Leerstand. Der Zustand wird ABGELEITET, wo casa den Mietvertrag selbst führt (aktiver Vertrag ⇒ vermietet, Vertragslücke ⇒ Leerstand), und aus der gepflegten Zeitscheibe GELESEN, wo nicht (fremdverwaltete WEG-Einheit). Ein Widerspruch zwischen beiden ist ein BEFUND, keine Sperre.

operationId: getEinheitBelegung · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
stichtagqueryneinstring(date)Stichtag YYYY-MM-DD, zu dem aufgelöst wird (Default: heute UTC). Ungültiges Format ⇒ 400.
historiequeryneinstring`1` ⇒ statt der Auflösung die volle, nicht-archivierte Zeitscheiben-Historie (EinheitBelegungHistorieResponse).
StatusBedeutungBody
200aufgelöste Belegung (EinheitBelegungResponse) bzw. Historie (EinheitBelegungHistorieResponse) bei `historie=1`EinheitBelegungResponse
400keine UUID oder ungültiger Stichtag (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Einheit unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/einheit/{id}/belegung

Setzt/ändert die GEPFLEGTE Belegungs-Zeitscheibe „ab Datum" (SCD-2; Überschneidungen werden abgelehnt). Pflegt ausschliesslich den Fall, in dem casa den Mietvertrag NICHT führt. Personenzahl 0 bei zustand=leerstand wird abgelehnt: eine leerstehende Einheit zählt bei personenbasierter Umlage fiktiv als 1 Person (BGH VIII ZR 159/05), 0 ist nicht wählbar.

operationId: setEinheitBelegung · Auth: bearerAuth

Request-Body (Pflicht): application/json → EinheitBelegungSetRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200gesetzte Zeitscheibe (EinheitBelegungSetResponse)
400ungültige Eingabe, leerer/degenerierter Bereich, Personenzahl 0 bei Leerstand (BGH-Gate), Drittnutzer ausserhalb von „vermietet" ODER Überschneidung mit einer bestehenden Scheibe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Einheit oder Drittnutzer-Person unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

GET/api/einheit/{id}/eigentuemerwechsel

Listet die Eigentümerwechsel-Vorgänge einer Einheit, aufsteigend nach Grundbuch-Stichtag, mit den beteiligten abgehenden und neuen Eigentumszeilen. Eine Einheit ohne Wechsel ist eine leere Liste.

operationId: listEinheitEigentuemerwechsel · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200die Wechsel-Vorgänge der Einheit (EigentuemerwechselListeResponse)EigentuemerwechselListeResponse
400keine UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Einheit unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — beide Fälle identisch

POST/api/einheit/{id}/eigentuemerwechsel

Erfasst einen Eigentümerwechsel als EINEN Vorgang: die abgehenden Eigentumszeilen enden am Grundbuch-Stichtag, die neuen beginnen an ihm; optional mit Verwalterzustimmung. Der Stichtag ist die Eintragung im Grundbuch, Abteilung I — nicht der Notartermin. Laufende SEV-Mandate abgehender Eigentümer werden nicht beendet, sondern in `sevMandateOffen` genannt. Der Idempotenz-Schlüssel kommt vom Aufrufer (Header).

operationId: erfasseEinheitEigentuemerwechsel · Auth: bearerAuth

Request-Body (Pflicht): application/json → EigentuemerwechselErfassenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200der erfasste Wechsel mit beendeten und neuen Zeilen sowie offenen SEV-Mandaten, ohne Zustellanschrift (EigentuemerwechselErfassenResponse)EigentuemerwechselErfassenResponse
400keine UUID oder ungültige Eingabe (ApiErrorBody, code invalid_request) — auch: abgehende Zeile doppelt, Anteil kein positiver Integer-String
401nicht authentifiziert — leerer Body (kein Oracle)
404Einheit, Person oder abgehende Eigentumszeile unbekannt, fremder Mandant ODER Zeile gehört nicht zur Einheit (ApiErrorBody, code not_found) — alle Fälle identisch
409Zustandskonflikt (ApiErrorBody, code conflict): Anteilssumme der neuen Eigentümer weicht von der der abgehenden ab, der Stichtag liegt in einem bereits festgeschriebenen Abrechnungsjahr (Korrektur des Abschlusses), Überlappung, eine abgehende Zeile ist bereits beendet oder schon durch einen Wechsel beendet, das Objekt trägt kein Eigentum

POST/api/einheit/{id}/eigentum

Erfasst eine Eigentumszeile (Person, Anteil in Zehntausendsteln als Integer-String, Beginn, optional Ende, Zustellanschrift, Vollmacht, Umsatzsteuer-Option) an der Einheit. Die Einheit steht im Pfad. Der Idempotenz-Schlüssel kommt vom Aufrufer (Header). Ein Löschweg existiert bewusst nicht: Eigentum wird beendet.

operationId: erfasseEinheitEigentum · Auth: bearerAuth

Request-Body (Pflicht): application/json → EigentumErfassenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200die erfasste Eigentumszeile samt Befunden zur Anteilssumme, ohne Zustellanschrift (EigentumErfassenResponse)EigentumErfassenResponse
400keine UUID oder ungültige Eingabe (ApiErrorBody, code invalid_request) — auch: Ende nicht nach Beginn, Anteil kein positiver Integer-String
401nicht authentifiziert — leerer Body (kein Oracle)
404Einheit oder Person unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — beide Fälle identisch
409Zustandskonflikt (ApiErrorBody, code conflict): dieselbe Person hält die Einheit schon im überlappenden Zeitraum (Überlappung), das Objekt trägt kein Eigentum (Miet-Objekt), die Person oder Einheit ist archiviert

PUT/api/einheit/{id}/einnahmeart

Setzt die Einnahmeart einer Einheit (Wohnung, andere Räume, an Angehörige vermietet, nicht steuerpflichtig) und optional das Geschoss — die Merkmale, nach denen die Auswertung `einnahmen-ueberschuss-einnahmeart` die Mieteinnahmen gliedert. `einnahmeart: null` entfernt sie; die Auswertung meldet eine Einheit ohne Einnahmeart dann als Befund, statt einen Wert zu raten.

operationId: setEinheitEinnahmeart · Auth: bearerAuth

Request-Body (Pflicht): application/json → EinheitEinnahmeartSetRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200wirksamer Stand nach dem Aufruf (EinheitEinnahmeartResponse)EinheitEinnahmeartResponse
400ungültige Eingabe (unbekannte Einnahmeart, leeres oder zu langes Geschoss) oder Einheit archiviert (ApiErrorBody)
401nicht authentifiziert — leerer Body (kein Oracle)
404Einheit unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/einheit/{id}/reactivate

Reaktiviert eine Einheit (#445).

operationId: reactivateEinheit · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200reaktiviert (EinheitReactivateResponse).
400keine UUID ODER Gebäude/Objekt archiviert (ApiErrorBody, code invalid_request) — erst den Elternteil reaktivieren.
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409Einheitennummer im Objekt inzwischen an eine andere aktive Einheit vergeben (ApiErrorBody, code conflict, #5534) — erst die Nummer der aktiven Einheit ändern.

GET/api/einheit/{id}/sev-mandat

Löst die Sondereigentumsverwaltung einer Einheit zum Stichtag auf („beauftragt der Eigentümer uns hier zusätzlich mit der Vermietung, und mit welchen Vertragswerten?"), optional stattdessen die Historie. Halboffen: ein Mandat ab 01.01.2025 wird zum 01.06.2025 gefunden, zum 31.12.2024 nicht; ein zum 01.07.2025 beendetes am 30.06. noch, am 01.07. nicht mehr. `mandat: null` heisst „am Stichtag keine Sondereigentumsverwaltung" — nicht „Einheit unbekannt" (dafür 404).

operationId: getEinheitSevMandat · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
stichtagqueryneinstring(date)Stichtag YYYY-MM-DD, zu dem aufgelöst wird (Default: heute UTC). Ungültiges Format ⇒ 400.
historiequeryneinstring`1` ⇒ statt der Auflösung alle Zeitabschnitte (SevMandatHistorieResponse).
StatusBedeutungBody
200wirksames Mandat (SevMandatResponse) bzw. alle Zeitabschnitte (SevMandatHistorieResponse) bei `historie=1`SevMandatResponse
400keine UUID oder ungültiger Stichtag (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Einheit unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/einheit/{id}/sev-mandat

Vereinbart die Sondereigentumsverwaltung für einen Eigentümer und diese Einheit als Zeitabschnitt. NUR in einem Objekt der Verwaltungsart "pro" ("WEG mit Mietverwaltung"): in einem reinen Mietobjekt gibt es kein Sondereigentum, das zusätzlich beauftragt werden könnte, in einer reinen WEG führt die Verwaltung die Mietseite nicht. Die Person muss im GESAMTEN Mandatszeitraum Eigentümerin der Einheit sein. Es gibt bewusst KEIN Änderungs-Kommando: ein Wechsel von „mit Mietinkasso" zu „ohne" ist beenden + neu anlegen (Parität Immoware24).

operationId: legeEinheitSevMandatAn · Auth: bearerAuth

Request-Body (Pflicht): application/json → SevMandatAnlegenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200angelegte Vereinbarung (SevMandatAnlegenResponse)
400ungültige Eingabe, leerer Zeitraum, unstimmige Vertragswerte (Art ohne Wert oder Wert ohne Art), Mietgutschrift ohne Mietinkasso, fehlendes Auszahlungsziel, Objekt nicht "pro", Person im Zeitraum nicht Eigentümerin ODER Überschneidung mit einem bestehenden Mandat derselben Wohnung (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Einheit, Person oder Bankverbindung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/einheit/{id}/sev-mieterabrechnung

Berechnet die Betriebskostenabrechnung des Mieters der SEV-Wohnung aus der Hausgeld-Einzelabrechnung, die der Server aus dem genannten festgeschriebenen WEG-Abschlusslauf lädt (hashgeprüft; nie Beträge, Positionen oder Schlüssel aus dem Body) — umlagefähiger Anteil, Geldkreis miete — plus umlagefähigen Kosten der Wohnung; Vermieter ist der Eigentümer laut unit_ownerships (bei Wechsel ein Abschnitt je Eigentümer). Bei Mietinkasso lädt der Server die Vorauszahlungen aus der Mietbuchhaltung des Vertrags (ein Vorauszahlungsfeld im Body ist ein 400). Dazu derselbe Prüfbericht wie bei Mietobjekten, einschließlich heizkostenv_ohne_verbrauch (Kürzungsrecht nach § 12 HeizkostenV). Schreibt nichts.

operationId: berechneSevMieterabrechnung · Auth: bearerAuth

Request-Body (Pflicht): application/json

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200{ abrechnung, pruefbericht } — abrechnung mit abschnitte (vermieter, kosten mit herkunft/herkunftText, vorauszahlungen mit herkunft), Summen und nichtUmlagefaehig; pruefbericht { freigabefaehig, proben, funde }. Cent-Felder sind Ganzzahl-STRINGS.
400ungültige Eingabe (auch eine Einzelabrechnung oder Vorauszahlungen im Body), Wohnung nicht im Abschlusslauf, Kostenart ohne Zuordnung, keine lückenlose Sondereigentumsverwaltung im ganzen Abrechnungsjahr, Umfangswechsel mit ↔ ohne Mietinkasso im Abrechnungsjahr ODER Eigentumslücke (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Einheit, Vertrag oder Abschlusslauf unbekannt, fremder Tenant ODER Objekt nicht zuständig — je dieselbe Antwort (ApiErrorBody, code not_found)
409der Abschlusslauf ist storniert, sein Beschluss nicht angenommen/bestandskräftig, er trägt keinen Festschreibungs-Anker ODER sein Stand passt nicht mehr zum Hash — nie Betrag oder Hash in der Antwort (ApiErrorBody, code conflict)

GET/api/einheit/{id}/sev-mieterkosten

Die SE-Kosten der Wohnung, die für die Mieterabrechnung bereitstehen: genau die umlagefähig gekennzeichneten, bezahlten, nicht stornierten Rechnungen mit Rechnungsdatum im Zeitraum (beide Grenzen inklusiv).

operationId: listSevMieterKosten · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
vonqueryjastring(date)Beginn YYYY-MM-DD (inklusiv). Fehlend oder ungültig ⇒ 400.
bisqueryjastring(date)Ende YYYY-MM-DD (inklusiv). Fehlend oder ungültig ⇒ 400.
StatusBedeutungBody
200umlagefähige SE-Kosten im Zeitraum (SevMieterKostenResponse)SevMieterKostenResponse
400fehlender oder ungültiger Zeitraum (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Einheit unbekannt, fremder Tenant ODER Objekt nicht zuständig (ApiErrorBody, code not_found)

GET/api/einheit/{id}/wechselzeitraum

Prüft vorab, ob sich ein nachträglich erfasster früherer Bewohner- oder Eigentümerzeitraum (von/bis, beide Tage INKLUSIVE) in den Bestand der Einheit einfügt: ok · ueberlappt (mit Zeilen-Id der betroffenen Zeile; auch wenn das Ende auf den Beginn des bestehenden Zeitraums fällt) · zeitraum-verdreht · beginn-unbekannt, dazu eine etwaige Lücke zum nächsten bestehenden Zeitraum (gemeldet, nicht verboten). Reiner Read, schreibt nichts; erfasst wird über die Belegungs- und Eigentumsendpunkte.

operationId: pruefeEinheitWechselzeitraum · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
artqueryjabewohner | eigentuemerbewohner | eigentuemer
vonqueryjastring(date)Erster Tag des Zeitraums (inklusive), JJJJ-MM-TT.
bisqueryjastring(date)Letzter Tag des Zeitraums (inklusive), JJJJ-MM-TT.
StatusBedeutungBody
200Prüfergebnis (WechselzeitraumResponse)WechselzeitraumResponse
400keine UUID, ungültige Art oder ungültiger Kalendertag (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Einheit unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

einheitengruppe

GET/api/einheitengruppe

Listet die Abrechnungskreise (3-Wege-Archiv-Filter, optional auf ein Objekt eingegrenzt).

operationId: listEinheitengruppen · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
statusqueryneinstringaktiv | archiviert | alle (Default aktiv)
propertyIdqueryneinstring(uuid)nur Kreise dieses Objekts
StatusBedeutungBody
200Kreis-Liste (EinheitengruppeListResponse)EinheitengruppeListResponse
400ungültiger Filter/UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/einheitengruppe

Legt einen Abrechnungskreis an einem aktiven Objekt an.

operationId: createEinheitengruppe · Auth: bearerAuth

Request-Body (Pflicht): application/json → EinheitengruppeCreateRequest

StatusBedeutungBody
200angelegter Kreis (Einheitengruppe)
400ungültige Eingabe ODER Objekt archiviert (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

GET/api/einheitengruppe/{id}

Liest einen Abrechnungskreis mit seinen Mitgliedschaften (active zum Stichtag).

operationId: getEinheitengruppe · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
asOfqueryneinstring(date)Stichtag YYYY-MM-DD, gegen den `active` je Mitgliedschaft gemessen wird (Default heute UTC). Ungültig ⇒ 400.
StatusBedeutungBody
200Kreis-Detail inkl. Mitgliedschaften (EinheitengruppeDetailResponse)EinheitengruppeDetailResponse
400keine UUID oder ungültiger asOf (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Kreis unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

PATCH/api/einheitengruppe/{id}

Ändert Stammfelder eines Abrechnungskreises (name/groupKind).

operationId: updateEinheitengruppe · Auth: bearerAuth

Request-Body (Pflicht): application/json → EinheitengruppeUpdateRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200geänderter Kreis (Einheitengruppe)
400leerer/ungültiger Patch ODER Kreis archiviert (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Kreis unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/einheitengruppe/{id}/archive

Archiviert einen Abrechnungskreis (archived_at statt DELETE).

operationId: archiveEinheitengruppe · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Archiv-Ergebnis (UmlageArchiveResponse)
401nicht authentifiziert — leerer Body (kein Oracle)
404Kreis unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/einheitengruppe/{id}/mitglied

Nimmt eine Einheit „ab Datum" in den Kreis auf (SCD-2; Überschneidungen derselben Einheit im Kreis werden abgelehnt).

operationId: addEinheitengruppeMitglied · Auth: bearerAuth

Request-Body (Pflicht): application/json → EinheitengruppeMitgliedAddRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200aufgenommene Mitgliedschaft (EinheitengruppeMitgliedAddResponse)
400ungültige Eingabe, leerer Bereich, Einheit gehört nicht zum Objekt des Kreises, Kreis/Einheit archiviert ODER Überschneidung (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Kreis oder Einheit unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/einheitengruppe/{id}/mitglied/beenden

Beendet die offene Mitgliedschaft einer Einheit zum Stichtag.

operationId: endEinheitengruppeMitglied · Auth: bearerAuth

Request-Body (Pflicht): application/json → EinheitengruppeMitgliedEndRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200beendete Mitgliedschaft (EinheitengruppeMitgliedEndResponse)
400ungültige Eingabe ODER Ende vor Beginn (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Kreis oder Mitgliedschaft unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

einstellungen

POST/api/einstellungen/festschreibung

Schaltet die Festschreibung der Buchungsperioden für ein Objekt (propertyId) oder als Mandanten-Vorgabe (propertyId null) ein oder aus. Ausschalten lässt bestehende Festschreibungen unberührt. Nur ein Mensch mit Admin-Recht.

operationId: setzeFestschreibungSchalter · Auth: bearerAuth

Request-Body (Pflicht): application/json → FestschreibungSchalterRequest

StatusBedeutungBody
200der jetzt gespeicherte Wert (FestschreibungSchalterResponse)FestschreibungSchalterResponse
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder fehlendes Recht — nur ein Mensch (ApiErrorBody, code forbidden)
404Objekt unbekannt, fremder Mandant ODER nicht zuständig (ApiErrorBody, code not_found)

fremdvertrag

GET/api/fremdvertrag

Liest die Verträge mit Dritten des Mandanten (Versicherung, Wartung, Dienstleistung, Versorgung), begrenzt auf die Objekte mit Zuständigkeit des Aufrufers: Art, Bezeichnung, Partner, Beginn, Konditionen zum Stichtag (Beträge als Integer-STRING in Cent), Fristenstand, Zahl der Schadenfälle. Filter propertyId, art, status (aktiv | beendet | alle, Vorgabe aktiv), limit (Vorgabe 50, höchstens 200) und offset. Nur lesend.

operationId: getFremdvertragListe · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
propertyIdqueryneinstring(uuid)
artqueryneinversicherung | wartung | dienstleistung | versorgung
statusqueryneinaktiv | beendet | alle
limitqueryneininteger
offsetqueryneininteger
StatusBedeutungBody
200{ stichtag, zeilen[], gesamt, limit, offset } — leer ohne Verträge; Geld ist ein Integer-STRING in Cent.FremdvertragListeResponse
400ungültige Query, z. B. unbekannter Parameter oder unbekannter Filterwert (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/fremdvertrag

Legt einen Vertrag mit Dritten samt ersten Konditionen an: propertyId, art, partnerPersonId (Rolle Kreditor oder Dienstleister), bezeichnung, beginn, kuendigungsfristMonate; optional laufzeitEnde, vertragsnummer, Verlängerung (ohne Angabe: Vorgabe der Einstellung, sonst ja, 12 Monate), beitrag mit beitragIntervall, selbstbehalt (nur Versicherung) und bemerkung. Geld ist ein Objekt {cents, currency}.

operationId: legeFremdvertragAn · Auth: bearerAuth

Request-Body (Pflicht): application/json → FremdvertragAnlegenRequest

StatusBedeutungBody
200Vertrags-Id und die ersten Konditionen (Version 1).FremdvertragAnlegenResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Recht fehlt (ApiErrorBody, code forbidden)
404Objekt unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel)

GET/api/fremdvertrag/{id}

Liest EINEN Vertrag mit Dritten: Konditionen zum Stichtag, Konditionen-Historie, Ereignisse, Fristenstand (spaetesterZugang, aufgabeAb), Dauerzahlungs-Abgleich und Schadenfälle. Optional stichtag (Vorgabe: Berliner Tag der Server-Uhr). Nur lesend.

operationId: getFremdvertrag · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
stichtagqueryneinstring(date)
StatusBedeutungBody
200Der Vertrag mit allen Bestandteilen; Geld ist ein Integer-STRING in Cent.FremdvertragResponse
400ungültige Query, z. B. unbekannter Parameter oder kein Kalendertag (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Vertrag unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel)

POST/api/fremdvertrag/{id}/beendigung

Beendet den Vertrag zum Tag beendetAm (nicht vor dem Beginn, optional grund). Die Vertrags-Id steht im Pfad.

operationId: beendeFremdvertrag · Auth: bearerAuth

Request-Body (Pflicht): application/json → FremdvertragBeendigungRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Ereignis-Id und Beendigungstag.FremdvertragBeendigungResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Recht fehlt (ApiErrorBody, code forbidden)
404Vertrag unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Vertrag schon beendet (ApiErrorBody, code conflict)

POST/api/fremdvertrag/{id}/dauerzahlung

Verknüpft den Vertrag mit einer Dauerzahlung desselben Objekts. Weichen Beitrag und Dauerzahlung ab, nennt die Antwort den Befund; er sperrt nicht. Die Vertrags-Id steht im Pfad.

operationId: verknuepfeFremdvertragDauerzahlung · Auth: bearerAuth

Request-Body (Pflicht): application/json → FremdvertragDauerzahlungRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Vertrags-Id, Dauerzahlungs-Id und optional der Abweichungs-Befund.FremdvertragDauerzahlungResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Recht fehlt (ApiErrorBody, code forbidden)
404Vertrag oder Dauerzahlung unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Vertrag schon verknüpft oder Dauerzahlung schon vergeben (ApiErrorBody, code conflict)

POST/api/fremdvertrag/{id}/dauerzahlung/loesen

Löst die Verknüpfung des Vertrags mit seiner Dauerzahlung (Body {}). Die Dauerzahlung selbst bleibt unberührt. Die Vertrags-Id steht im Pfad.

operationId: loeseFremdvertragDauerzahlung · Auth: bearerAuth

Request-Body (Pflicht): application/json → FremdvertragDauerzahlungLoesenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Vertrags-Id und die bis eben verknüpfte Dauerzahlung.FremdvertragDauerzahlungLoesenResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Recht fehlt (ApiErrorBody, code forbidden)
404Vertrag unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Der Vertrag ist mit keiner Dauerzahlung verknüpft (ApiErrorBody, code conflict)

POST/api/fremdvertrag/{id}/frist-entscheid

Hält die Entscheidung zu einem Vertragsende fest: bezugEnde, entscheidung (verlaengern | kuendigen | neu_ausschreiben), optional grund. Es wird nie eine Kündigung angelegt. Danach verschwindet die Zeile aus dem Fristenwächter. Die Vertrags-Id steht im Pfad.

operationId: entscheideFremdvertragFrist · Auth: bearerAuth

Request-Body (Pflicht): application/json → FremdvertragFristEntscheidRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Ereignis-Id, Entscheidung und Hinweis.FremdvertragFristEntscheidResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Recht fehlt (ApiErrorBody, code forbidden)
404Vertrag unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Zu diesem Vertragsende ist schon entschieden oder der Vertrag ist beendet (ApiErrorBody, code conflict)

POST/api/fremdvertrag/{id}/konditionen

Legt eine neue Konditions-Version des Vertrags an (kein Teil-Patch: jeder Schlüssel ist Pflicht, leer ist null). gueltigAb muss nach dem gueltigAb der letzten Version liegen. Die Vertrags-Id steht im Pfad.

operationId: aendereFremdvertragKonditionen · Auth: bearerAuth

Request-Body (Pflicht): application/json → FremdvertragKonditionenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Vertrags-Id und die neue Konditions-Version.FremdvertragKonditionenResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Recht fehlt (ApiErrorBody, code forbidden)
404Vertrag unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Vertrag beendet oder gueltigAb nicht nach der letzten Version (ApiErrorBody, code conflict)

POST/api/fremdvertrag/{id}/kuendigung

Hält die Kündigung des Vertrags fest (wirksamZum nicht vor heute, optional grund). Die Antwort nennt das früheste Vertragsende und den spätesten Zugang als Auskunft; sie sperrt nicht. Die Vertrags-Id steht im Pfad.

operationId: kuendigeFremdvertrag · Auth: bearerAuth

Request-Body (Pflicht): application/json → FremdvertragKuendigungRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Ereignis-Id, Wirksamkeit, frühestes Ende und spätester Zugang.FremdvertragKuendigungResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Recht fehlt (ApiErrorBody, code forbidden)
404Vertrag unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Vertrag schon beendet (ApiErrorBody, code conflict)

GET/api/fremdvertrag/einstellung

Liest die Einstellung der Verträge mit Dritten des Mandanten: Vorlauf-Tage, Vorgaben für die Verlängerung, Meldefrist für Schadenfälle, Schadenhonorar (Basispunkte und Text) und Herkunft (vorgabe | mandant). Ohne gespeicherte Einstellung gilt die Vorgabe. Nur lesend.

operationId: getFremdvertragEinstellung · Auth: bearerAuth

StatusBedeutungBody
200Die Einstellung des Mandanten oder die Vorgabe.FremdvertragEinstellungResponse
400ungültige Query (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

PUT/api/fremdvertrag/einstellung

Setzt die Einstellung der Verträge mit Dritten des Mandanten (alle sechs Werte, kein Teil-Patch): vorlaufTage, Vorgaben für die Verlängerung, schadenMeldefristTage, Schadenhonorar in Basispunkten und ob es aktiv ist. Nur ein Mensch mit dem Recht, Rollen und Rechte zu verwalten.

operationId: setzeFremdvertragEinstellung · Auth: bearerAuth

Request-Body (Pflicht): application/json → FremdvertragEinstellungSetzenRequest

StatusBedeutungBody
200Gesetzte Werte, Stand davor und geaendert-Kennzeichen.FremdvertragEinstellungSetzenResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Recht fehlt (ApiErrorBody, code forbidden)

GET/api/fremdvertrag/fristen

Liest den Fristenwächter der Verträge mit Dritten: je Vertrag kategorie (kuendigungsfrist | frist-verpasst | ohne-laufzeit), spaetesterZugang, aufgabeAb, tageBisFrist, Ampel und offen. Filter stichtag (Vorgabe: Berliner Tag der Server-Uhr), propertyId, art, nurOffen (Vorgabe true) und mitUeberwachungsluecken (Verträge ohne Laufzeitende). Nur lesend, begrenzt auf die Objekte mit Zuständigkeit des Aufrufers.

operationId: getFremdvertragFristen · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
stichtagqueryneinstring(date)
propertyIdqueryneinstring(uuid)
artqueryneinversicherung | wartung | dienstleistung | versorgung
nurOffenqueryneintrue | false
mitUeberwachungslueckenqueryneintrue | false
StatusBedeutungBody
200{ stichtag, zeilen[] } — leer ohne Fristen.FremdvertragFristenResponse
400ungültige Query, z. B. unbekannter Parameter, kein Kalendertag oder unbekannte Art (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

gebaeude

GET/api/gebaeude

Listet Gebäude (3-Wege-Filter Alle/Aktiv/Archiviert, Default aktiv; optional je Objekt).

operationId: listGebaeude · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
statusqueryneinalle | aktiv | archiviertalle | aktiv | archiviert (Default aktiv). Unbekannter Wert ⇒ 400, nie stiller Fallback.
objektIdqueryneinstring(uuid)Nur Gebäude DIESES Objekts. Einschränkung innerhalb des Tenants, KEINE Autorisierungsgrenze (die macht RLS) — eine fremde ID schneidet auf die leere Menge.
StatusBedeutungBody
200Gebäudeliste (GebaeudeListResponse)GebaeudeListResponse
400ungültiger status-Filter oder objektId keine UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/gebaeude

Legt ein Gebäude an einem aktiven Objekt an.

operationId: createGebaeude · Auth: bearerAuth

Request-Body (Pflicht): application/json → GebaeudeCreateRequest

StatusBedeutungBody
201angelegtes Gebäude (Gebaeude)
400ungültige Eingabe ODER Elternobjekt archiviert (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Elternobjekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel)

GET/api/gebaeude/{id}

Liest EIN Gebäude (auch archiviert).

operationId: getGebaeude · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200GebaeudeGebaeude
400keine UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel)

PATCH/api/gebaeude/{id}

Ändert die Gebäude-Adresse (nur nicht-archivierte Gebäude).

operationId: updateGebaeude · Auth: bearerAuth

Request-Body (Pflicht): application/json → GebaeudeUpdateRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200geändertes Gebäude
400leerer/ungültiger Patch ODER Gebäude archiviert (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/gebaeude/{id}/archive

Archiviert ein Gebäude (archived_at statt DELETE, K5). Kaskadiert abwärts: alle Einheiten des Gebäudes werden mitarchiviert (#445).

operationId: archiveGebaeude · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200archiviert (GebaeudeArchiveResponse). Wiederholter Aufruf = Idempotenz-Replay des Erst-Ergebnisses (identische Antwort, kein zweites Kommando). Alle Einheiten des Gebäudes werden in derselben Transaktion mitarchiviert (Kaskade #445, ein Kommando).
400keine UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/gebaeude/{id}/reactivate

Nimmt die Archiv-Kaskade eines Gebäudes zurück (#445) — nur der eigene Teilbaum, nie aufwärts.

operationId: reactivateGebaeude · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200reaktiviert (GebaeudeReactivateResponse).
400keine UUID, Kaskade zu groß ODER das ELTERNOBJEKT ist archiviert (ApiErrorBody, code invalid_request) — erst das Objekt reaktivieren.
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409eine zurückgeholte Einheit trüge eine Nummer, die im Objekt inzwischen an eine aktive Einheit vergeben ist (ApiErrorBody, code conflict, #5534) — nichts wurde reaktiviert.

health

GET/api/health

Liveness der Web-App (App-Prozess + DB-Erreichbarkeit).

operationId: getHealth · Auth: keine (öffentlich)

StatusBedeutungBody
200healthyHealthResponse
503unhealthy — fail-closed

honorar

GET/api/honorar/anpassungen

Geschichte der Honorar-Anpassungen EINES Objekts, neueste zuerst — ohne den Akteur, der sie vorgenommen hat.

operationId: listHonorarAnpassungen · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
objektqueryjastring(uuid)Das Objekt.
StatusBedeutungBody
200{ anpassungen: [ { id, propertyId, wirksamAb, grundlage, beschlussId, zustimmungAm, begruendung, scheibeAlt, scheibeNeu, createdAt } ] }HonorarAnpassungenResponse
400ungültige Query (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt oder mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)

POST/api/honorar/anpassungen

Passt die Honorarvereinbarung eines Objekts an (passe_honorarvereinbarung_an): neue Zeitscheibe ab einem Monatsersten, die laufende endet am Vortag. WEG nur mit tragendem Beschluss, keine Rückwirkung auf gestellte Monate. Derselbe Idempotency-Key legt die Anpassung nur einmal an.

operationId: passeHonorarvereinbarungAn · Auth: bearerAuth

Request-Body (Pflicht): application/json → PasseHonorarvereinbarungAnRequest

StatusBedeutungBody
201{ anpassungId, neueScheibe, geschlosseneScheibe, vergleich, hinweise } — Cent-Felder und Sätze als Integer-STRINGS.HonorarAnpassungResponse
400ungültige Eingabe oder verletzte Regel des Fachkerns, z. B. weg-braucht-beschluss oder vereinbarung-ungueltig (ApiErrorBody, code invalid_request; die Meldung beginnt mit dem Regel-Code)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Objekt oder Beschluss unbekannt oder mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)
409zu diesem Datum gibt es schon eine Anpassung (anpassung-existiert) ODER die Anpassung wirkt auf einen gestellten Monat zurück (ApiErrorBody, code conflict)

POST/api/honorar/lauf

Stellt das Verwalterhonorar EINES Objekts für EINE Periode — Monat oder Quartal, passend zum Rhythmus (#5583) — (stelle_verwalterhonorar): Soll Aufwand „Verwaltervergütung" an Haben Kreditor Verwalter, Rechnungsnummer aus dem Nummernkreis des Verwalters (HON-nnnnnn). NUR mit dem Inhalts-Hash aus POST /api/honorar/lauf/vorschlag. Genau einmal je Periode — ein zweiter Start ist `unveraendert`, eine geänderte Vereinbarung eine Differenzbuchung. Bei vereinbarter Entnahme ein Zahlungsauftrag `awaiting-approval` in der bestehenden Zahlungsfreigabe (gib_zahlungsauftrag_frei, Vier-Augen) — nie direkt ausgeführt.

operationId: stelleVerwalterhonorar · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200gestellt — { laufId, propertyId, monat, ergebnis (gebucht · differenz_gebucht · unveraendert), buchung, paymentOrderId, paymentOrderContentHash }
400ungültige Eingabe — u. a. ein unbekanntes Feld (Betrag und Konten kommen nie aus der Eingabe) (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Schreibrecht, keine Zuständigkeit für das Objekt oder kein menschlicher Akteur (ApiErrorBody, code forbidden)
404keine Honorarvereinbarung hinterlegt ODER Objekt mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Inhalt seit dem Vorschlag geändert, keine gültige Buchungskonfiguration, keine eindeutige bestätigte Bankverbindung des Verwalters für die Entnahme oder ein gleichzeitiger Lauf derselben Periode — es wird nichts gebucht (ApiErrorBody, code conflict)

POST/api/honorar/lauf/storno

Storniert den Honorarlauf EINES Objekts für EINE Periode — Monat oder Quartal (#5583) — (storniere_verwalterhonorar): je wirksamer Honorarbuchung ein Storno-Satz über den bestehenden Storno-Weg (storno_entry, Periode des Originals) und Abbruch noch nicht eingereichter Entnahmeaufträge. Danach ist die Periode neu stellbar.

operationId: storniereVerwalterhonorar · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200storniert — { laufId, stornoEntryIds, cancelledPaymentOrderIds }
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Schreibrecht, keine Zuständigkeit für das Objekt oder kein menschlicher Akteur (ApiErrorBody, code forbidden)
409für den Monat ist kein Honorar gebucht (auch: Objekt mandantenfremd — kein Existenz-Orakel) oder die Entnahme ist bereits eingereicht — es wird nichts storniert (ApiErrorBody, code conflict)

POST/api/honorar/lauf/vorschlag

Vorschlag des Honorarlaufs EINES Objekts für EINE Periode (Monat oder Quartal, passend zum Rhythmus, #5583): die Rechnung aus der Honorarvorschau, das für die Periode schon Gebuchte, die Differenz, ob eine Entnahme entstünde, und der Inhalts-Hash — ohne zu schreiben.

operationId: honorarlaufVorschlag · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200der Vorschlag — { propertyId, monat, nettoCents, umsatzsteuerCents, bruttoCents, currency, positionen, sonderleistungen, sonderleistungenNettoCents, sonderleistungenUmsatzsteuerCents, monatsrechnungen, gebuchtCents, differenzCents (vorzeichenbehaftet), entnahme, buchungsteile, vorschlagHash }. Cent-Felder sind Integer-STRINGS. Beim Quartal (#5583) ist die Rechnung die Summe der drei `monatsrechnungen`, die der `vorschlagHash` mitdeckt. Jede erfasste, nicht stornierte Sonderleistung des Monats ist eine EIGENE Position mit eigener USt (#5189). `buchungsteile` zeigt die Sätze, die das Stellen bucht — Gutschrift und Rechnung getrennt, nie saldiert (ein gleich teurer Tausch hat Differenz 0, bucht aber beide).
400ungültige Eingabe oder unbrauchbar gespeicherte Vereinbarung (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404keine Honorarvereinbarung hinterlegt ODER Objekt mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)
409nicht stellbar: keine gültige Buchungskonfiguration (Objekt-Option `verwalterhonorar.buchung`), keine Zeitscheibe für den Monat, Eigenbestand oder Monat ausserhalb des Verwaltungszeitraums (ApiErrorBody, code conflict)

GET/api/honorar/rentabilitaet

Rentabilität EINES Objekts über einen Zeitraum ganzer Monate: Ertrag, Aufwand, Deckungsbeitrag, Marge, Kapazitätsanteil und Urteil samt den geltenden Kalkulationssätzen. Ohne erfasste Zeit lautet das Urteil nicht-beurteilbar, nie wirtschaftlich.

operationId: getRentabilitaet · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
objektqueryjastring(uuid)Das Objekt.
vonqueryjastringErster Monat `JJJJ-MM` (inklusiv).
bisqueryjastringLetzter Monat `JJJJ-MM` (inklusiv), höchstens 24 Monate ab von.
StatusBedeutungBody
200Alle Cent-Felder und Basispunkte sind Integer-STRINGS; margeBasispunkte ist null ohne Ertrag. Keine Mitarbeiternamen.RentabilitaetResponse
400ungültige Query, Zeitraum ungültig oder länger als 24 Monate (zeitraum-zu-lang), oder unbrauchbare Kalkulations-Option mit Regel-Text (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt oder mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)

POST/api/honorar/sonderleistungen

Erfasst EINE Sonderleistung (erfasse_sonderleistung) mit dem Preis-Schnappschuss aus dem Katalog des Objekts. Derselbe Idempotency-Key legt sie nur einmal an.

operationId: erfasseSonderleistung · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200{ sonderleistungId, bezeichnung, menge, nettoCents, umsatzsteuersatzProzent, umsatzsteuerCents, bruttoCents, currency } — Cent-Felder und Satz als Integer-STRINGS.
400ungültige Eingabe, unbekanntes Feld, Leistung nicht im Katalog, Menge passt nicht zur Preisart, Einheit nicht im Objekt oder unbrauchbarer Katalog (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404am Objekt ist kein Sonderleistungs-Katalog hinterlegt ODER das Objekt ist mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)

POST/api/honorar/sonderleistungen/serie

Serienerfassung (erfasse_sonderleistungsserie): EINE Leistung mit Preis je Einheit für jede Einheit, die am Leistungsdatum zum Objekt gehört — in einem Schritt (z. B. § 35a-Bescheinigung). Dieselbe Serie (Objekt, Leistung, Leistungsdatum) entsteht nur einmal; eine Wiederholung meldet bereitsErfasst: true.

operationId: erfasseSonderleistungsserie · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200{ serieId, anzahl, sonderleistungIds, nettoCents, currency, bereitsErfasst }
400ungültige Eingabe, Leistung nicht im Katalog, Leistung nicht je Einheit, Objekt ohne Einheiten am Leistungsdatum (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404kein Sonderleistungs-Katalog am Objekt ODER Objekt mandantenfremd (ApiErrorBody, code not_found)

POST/api/honorar/sonderleistungen/storno

Storniert eine erfasste Sonderleistung (storniere_sonderleistung). Sie bleibt auffindbar, zählt aber in keiner Honorarrechnung mehr.

operationId: storniereSonderleistung · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200{ sonderleistungId, storniert: true }
400ungültige Eingabe oder unbekanntes Feld (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404keine Sonderleistung mit dieser Id an diesem Objekt ODER mandantenfremd (ApiErrorBody, code not_found)
409die Sonderleistung ist bereits storniert (ApiErrorBody, code conflict)

POST/api/honorar/sonderleistungen/vorlage

Kopiert den Vorlage-Katalog des Mandanten (Mandanten-Option `verwalterhonorar.sonderleistungen`) als EIGENEN Sonderleistungs-Katalog an ein Objekt (uebernimm_sonderleistungsvorlage). Eine Kopie, kein Verweis; ein vorhandener Katalog wird nie überschrieben.

operationId: uebernimmSonderleistungsvorlage · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200{ anzahl } — Zahl der übernommenen Katalogeinträge
400ungültige Eingabe oder unbrauchbare Vorlage (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Objekt unbekannt oder mandantenfremd (ApiErrorBody, code not_found)
409kein Vorlage-Katalog hinterlegt ODER das Objekt hat schon einen Katalog (ApiErrorBody, code conflict)

GET/api/honorar/vorschau

Verwalterhonorar EINES Objekts für EINEN Monat als Vorschau: Positionsaufstellung je Einheit/Basis/Zuschlag, Netto, Umsatzsteuer und Brutto — ohne Buchung.

operationId: getHonorarVorschau · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
objektqueryjastring(uuid)Objekt, dessen Verwaltungsvertrag abgerechnet wird. Die Honorarvereinbarung hängt je Objekt, es gibt keinen mandantenweiten Default.
monatqueryjastringAbrechnungsmonat `JJJJ-MM`. Das Honorar ist eine monatliche Größe; ein Teilmonat ist nicht vereinbart und wird benannt abgelehnt (409 conflict), statt eine Tageskonvention zu erfinden.
StatusBedeutungBody
200Die Aufstellung. Alle Cent-Felder und der USt-Satz sind Integer-STRINGS, nie JSON-numbers.HonorarVorschauResponse
400ungültige Query oder unbrauchbar gespeicherte Vereinbarung (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404für dieses Objekt ist keine Honorarvereinbarung hinterlegt (oder das Objekt gehört einem anderen Mandanten — unter RLS ununterscheidbar, kein Existenz-Orakel). Hinterlegt wird sie als OBJEKT-Option unter dem Schlüssel `verwalterhonorar.vereinbarungen` über `POST /api/option`; ihr Wert ist die LISTE der Zeitscheiben.
409nicht berechenbar: keine Zeitscheibe für den Monat (Lücke oder Wechsel mitten im Monat), Eigenbestand ohne Honorar, Monat nicht vollständig im Verwaltungszeitraum oder vereinbarter Zuschlag ohne Ereignisquelle (ApiErrorBody, code conflict)

inkasso

GET/api/inkasso

Listet die Inkasso-Übergaben des Mandanten, neueste zuerst; Query `objekt` (UUID) und `status` (entwurf | uebergeben | zurueckgenommen | abgeschlossen). Nur lesend. Die Übergabe ist ein Datensatz: sie sendet nichts an Dritte und erzeugt kein Partnerformat.

operationId: listeInkassoUebergaben · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
objektqueryneinstring(uuid)nur Übergaben dieses Objekts
statusqueryneinentwurf | uebergeben | zurueckgenommen | abgeschlossennur Übergaben mit diesem Status
StatusBedeutungBody
200{ uebergaben[] } — Cent-Felder sind Integer-STRINGS; Empfänger, Begründung, Grund und Notiz sind Freitext.InkassoUebergabeListeResponse
400ungültige Query, z. B. unbekannter Parameter, keine UUID oder unbekannter Status (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/inkasso

Legt eine Inkasso-Übergabe als ENTWURF an (lege_inkasso_uebergabe_an): je Posten offener Rest, Fälligkeit, Mahnstufe, Mahngebühren und Verzugszinsen bis zum Stichtag; die Forderungsaufstellung wird gebildet, gehasht und eingefroren. Voraussetzung ist Mahnstufe 3 oder anwalt; darunter nur mit `begruendungMahnstufe`. Die Übergabe ist ein Datensatz: sie sendet nichts an Dritte und erzeugt kein Partnerformat. Derselbe Posten kann nicht in zwei aktiven Übergaben stehen (409). Der Idempotency-Key kommt vom Aufrufer.

operationId: legeInkassoUebergabeAn · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
201die angelegte Übergabe (Status entwurf) samt ausgeschriebener Forderungsaufstellung und PostenlisteInkassoUebergabeDetailResponse
400ungültige Eingabe, `begruendung-mahnstufe-fehlt`, `posten-gehoert-nicht-zur-uebergabe` (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Zuständigkeit, Schreibrecht oder Mandantenzugehörigkeit fehlt, Testzeitraum abgelaufen, Paket nicht enthalten, oder der Aufrufer ist ein Agent (ApiErrorBody, code forbidden)
404Objekt oder Schuldner unbekannt ODER mandantenfremd (ApiErrorBody, code not_found)
409`posten-bereits-uebergeben` oder `posten-nicht-mehr-offen` (ApiErrorBody, code conflict)

GET/api/inkasso/{id}

Liest EINE Inkasso-Übergabe samt eingefrorener Forderungsaufstellung (ausgeschrieben, Cent als Integer-Strings) und Postenliste. Unbekannt und mandantenfremd antworten gleich. Nur lesend.

operationId: getInkassoUebergabe · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)uebergabeId
StatusBedeutungBody
200die ÜbergabeInkassoUebergabeDetailResponse
401nicht authentifiziert — leerer Body (kein Oracle)
404Übergabe unbekannt ODER mandantenfremd — dieselbe Meldung (ApiErrorBody, code not_found)

POST/api/inkasso/{id}/abschluss

Schließt die übergebene Inkasso-Übergabe ab (schliesse_inkasso_uebergabe_ab): Body `{ art, notiz? }` mit art bezahlt | vergleich | uneinbringlich | sonstiges. Die Posten werden frei. Der Idempotency-Key kommt vom Aufrufer.

operationId: schliesseInkassoUebergabeAb · Auth: bearerAuth

Request-Body (Pflicht): application/json

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)uebergabeId
StatusBedeutungBody
200abgeschlossenInkassoUebergabeAbschlussResponse
400ungültige Eingabe, z. B. unbekannte Abschlussart (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Zuständigkeit, Schreibrecht oder Mandantenzugehörigkeit fehlt, Testzeitraum abgelaufen, Paket nicht enthalten, oder der Aufrufer ist ein Agent (ApiErrorBody, code forbidden)
404Übergabe unbekannt ODER mandantenfremd — dieselbe Meldung (ApiErrorBody, code not_found)
409unzulässiger Statusübergang, z. B. noch im Entwurf oder schon abgeschlossen (ApiErrorBody, code conflict)

GET/api/inkasso/{id}/forderungsaufstellung

Lädt die eingefrorene Forderungsaufstellung als CSV-Datei in einer JSON-Antwort (`datei`: dateiname, sha256, groesseBytes, inhaltBase64; dazu `aufstellungHash`). Semikolon-getrennt, UTF-8 mit BOM, Dezimalkomma; zweimal geladen ⇒ byte-gleich. Der Dateiname trägt keine Personenangaben. Reiner Lesezugriff — nichts wird geschrieben; `Cache-Control: no-store`.

operationId: getInkassoForderungsaufstellung · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)uebergabeId
StatusBedeutungBody
200die Datei samt PrüfsummeInkassoAufstellungDateiResponse
401nicht authentifiziert — leerer Body (kein Oracle)
404Übergabe unbekannt ODER mandantenfremd — dieselbe Meldung (ApiErrorBody, code not_found)

POST/api/inkasso/{id}/uebergabe

Übergibt den Entwurf (uebergebe_inkasso): setzt den Mahnstatus jedes Postens auf „Beim Rechtsanwalt" (anwalt), in derselben Transaktion. Body `{ uebergebenAm }`. Sendet nichts an Dritte. Eine zweite Übergabe ⇒ 409. Der Idempotency-Key kommt vom Aufrufer.

operationId: uebergebeInkasso · Auth: bearerAuth

Request-Body (Pflicht): application/json

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)uebergabeId
StatusBedeutungBody
200übergebenInkassoUebergabeUebergebenResponse
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Zuständigkeit, Schreibrecht oder Mandantenzugehörigkeit fehlt, Testzeitraum abgelaufen, Paket nicht enthalten, oder der Aufrufer ist ein Agent (ApiErrorBody, code forbidden)
404Übergabe unbekannt ODER mandantenfremd — dieselbe Meldung (ApiErrorBody, code not_found)
409nicht mehr im Entwurf, oder ein Posten ist nicht mehr offen bzw. gesperrt (ApiErrorBody, code conflict)

POST/api/inkasso/{id}/zuruecknahme

Nimmt die Übergabe mit Pflichtgrund zurück (nimm_inkasso_uebergabe_zurueck): die Posten werden frei; der Mahnstatus wird NICHT zurückgestuft. Body `{ grund }` (höchstens 500 Zeichen). Ohne Grund ⇒ 400. Der Idempotency-Key kommt vom Aufrufer.

operationId: nimmInkassoUebergabeZurueck · Auth: bearerAuth

Request-Body (Pflicht): application/json

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)uebergabeId
StatusBedeutungBody
200zurückgenommenInkassoUebergabeZuruecknahmeResponse
400ungültige Eingabe, z. B. fehlender Grund (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Zuständigkeit, Schreibrecht oder Mandantenzugehörigkeit fehlt, Testzeitraum abgelaufen, Paket nicht enthalten, oder der Aufrufer ist ein Agent (ApiErrorBody, code forbidden)
404Übergabe unbekannt ODER mandantenfremd — dieselbe Meldung (ApiErrorBody, code not_found)
409unzulässiger Statusübergang, z. B. schon zurückgenommen oder abgeschlossen (ApiErrorBody, code conflict)

instandhaltung

GET/api/instandhaltung

Liest die Instandhaltungs-Vorgänge des Mandanten, begrenzt auf die Objekte mit Zuständigkeit des Aufrufers: Nummer, Titel, Typ, Dringlichkeit, Status, Objekt, Einheit, Auftragswert (Cent als Integer-STRING), Auftragsnummer und die Zahl offener Befunde. Filter propertyId, status, dringlichkeit, typ, nurOffen (ohne abgeschlossen und storniert), limit (Vorgabe 50, höchstens 200) und offset. Nur lesend.

operationId: getInstandhaltungListe · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
propertyIdqueryneinstring(uuid)
statusqueryneinstring
dringlichkeitqueryneinstring
typqueryneinstring
nurOffenqueryneintrue | false
limitqueryneininteger
offsetqueryneininteger
StatusBedeutungBody
200{ stichtag, limit, offset, zeilen[] } — leer ohne Vorgänge; Geld ist ein Integer-STRING in Cent.InstandhaltungListeResponse
400ungültige Query, z. B. unbekannter Parameter oder unbekannter Statuswert (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/instandhaltung

Erfasst eine Meldung: Pflicht propertyId, typSchluessel (aktiver Vorgangstyp), titel, beschreibung, dringlichkeit; optional unitId, melderPersonId, beginnAm, haeufigkeit, baulichVeraendernd. Der Vorgang entsteht im Status gemeldet mit Nummer. Der Idempotenz-Schlüssel kommt vom Aufrufer (Header).

operationId: meldeInstandhaltung · Auth: bearerAuth

Request-Body (Pflicht): application/json → InstandhaltungMeldenRequest

StatusBedeutungBody
200Der Vorgang mit Nummer, Status, nächsten Schritten und Befunden.InstandhaltungMeldungResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt, Einheit oder Melder unbekannt oder mandantenfremd (ApiErrorBody, code not_found)

GET/api/instandhaltung/{id}

Liest EINEN Instandhaltungs-Vorgang mit Verlauf, Angeboten, Aufträgen, Freigabestand des lebenden Auftrags, Rechnungen mit Zahlungsstand (nicht-gebucht | nicht-ermittelbar | offen | ausgeglichen), Befunden und nächsten Schritten. Optional stichtag (Vorgabe: Berliner Tag der Server-Uhr). Nur lesend.

operationId: getInstandhaltungVorgang · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
stichtagqueryneinstring(date)
StatusBedeutungBody
200Der Vorgang mit allen Bestandteilen; Geld ist ein Integer-STRING in Cent.InstandhaltungVorgangResponse
400ungültige Query, z. B. unbekannter Parameter oder kein Kalendertag (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Vorgang unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel)

POST/api/instandhaltung/{id}/abschluss

Schließt den Vorgang ab; optional begruendung. Die Vorgangs-Id steht im Pfad.

operationId: schliesseInstandhaltungVorgang · Auth: bearerAuth

Request-Body (Pflicht): application/json → InstandhaltungAbschlussRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Vorgangs-Id, vorheriger und neuer Status, Ereignis-Id und Begründung.InstandhaltungAbschlussResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Recht fehlt (ApiErrorBody, code forbidden)
404Vorgang oder Auftrag unbekannt, mandantenfremd oder außerhalb der Objektsicht, oder kein lebender Auftrag (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Zu dem Vorgang läuft noch ein Auftrag (ApiErrorBody, code conflict)

POST/api/instandhaltung/{id}/angebot

Erfasst das Angebot eines zugeordneten Dienstleisters: dienstleisterPersonId, betrag als Objekt {cents, currency}, optional gueltigBis, realisierungAb, dokumentId. Die Vorgangs-Id steht im Pfad.

operationId: erfasseInstandhaltungAngebot · Auth: bearerAuth

Request-Body (Pflicht): application/json → InstandhaltungAngebotRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Das Angebot; Geld als {cents, currency}.InstandhaltungAngebotResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Vorgang unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Vorgang gesperrt oder Angebot nicht mehr änderbar (code conflict)

POST/api/instandhaltung/{id}/angebot/verwerfen

Verwirft ein Angebot des Vorgangs mit Grund. Die Vorgangs-Id steht im Pfad.

operationId: verwerfeInstandhaltungAngebot · Auth: bearerAuth

Request-Body (Pflicht): application/json → InstandhaltungAngebotVerwerfenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Das verworfene Angebot.InstandhaltungAngebotResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Vorgang unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Angebot nicht änderbar, in Auftrag oder Vorgang gesperrt (code conflict)

POST/api/instandhaltung/{id}/angebot/waehlen

Wählt ein vorliegendes Angebot des Vorgangs. Die Vorgangs-Id steht im Pfad.

operationId: waehleInstandhaltungAngebot · Auth: bearerAuth

Request-Body (Pflicht): application/json → InstandhaltungAngebotWaehlenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Das gewählte Angebot, Zahl der Angebote und ein möglicher Befund.InstandhaltungAngebotWaehlenResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Vorgang unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Angebot nicht wählbar oder Vorgang gesperrt (code conflict)

POST/api/instandhaltung/{id}/auftrag

Erteilt den Auftrag des Vorgangs, nachdem die Kostenfreigabe vollständig ist: optional auftragId (ohne Angabe der lebende Auftrag des Vorgangs). Ein Auftrag ohne gültige Freigabe wird nie erteilt (409). Gestattungs- und Freistellungsbefunde sind Warnungen, die Erteilung läuft trotzdem. Die Vorgangs-Id steht im Pfad.

operationId: erteileInstandhaltungAuftrag · Auth: bearerAuth

Request-Body (Pflicht): application/json → InstandhaltungAuftragErteilenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Auftrags-Id, Auftragsnummer, Erteilungstag und Befunde.InstandhaltungAuftragErteilenResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Recht fehlt (ApiErrorBody, code forbidden)
404Vorgang oder Auftrag unbekannt, mandantenfremd oder außerhalb der Objektsicht, oder kein lebender Auftrag (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Auftrag nicht freigegeben oder die Freigabe ist nicht mehr gültig (ApiErrorBody, code conflict)

POST/api/instandhaltung/{id}/auftrag/ausfuehrung

Meldet die Ausführung des erteilten Auftrags: ausgefuehrtAm (nicht nach heute, nicht vor der Erteilung), optional notiz und auftragId (ohne Angabe der lebende Auftrag). Die Vorgangs-Id steht im Pfad.

operationId: meldeInstandhaltungAusfuehrung · Auth: bearerAuth

Request-Body (Pflicht): application/json → InstandhaltungAuftragAusfuehrungRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Auftrags-Id und Ausführungstag.InstandhaltungAuftragAusfuehrungResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Recht fehlt (ApiErrorBody, code forbidden)
404Vorgang oder Auftrag unbekannt, mandantenfremd oder außerhalb der Objektsicht, oder kein lebender Auftrag (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Auftrag nicht erteilt (ApiErrorBody, code conflict)

POST/api/instandhaltung/{id}/auftrag/stornieren

Storniert den Auftrag des Vorgangs mit Grund (Pflicht); optional auftragId. Nach der Freigabe fällt der Vorgang zurück in angebote_offen, eine neue Freigabe ist nötig. Ein ausgeführter Auftrag oder ein Auftrag mit Rechnung lässt sich nicht mehr stornieren (409). Die Vorgangs-Id steht im Pfad.

operationId: storniereInstandhaltungAuftrag · Auth: bearerAuth

Request-Body (Pflicht): application/json → InstandhaltungAuftragStornierenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Auftrags-Id und neuer Vorgangsstatus.InstandhaltungAuftragStornierenResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Recht fehlt (ApiErrorBody, code forbidden)
404Vorgang oder Auftrag unbekannt, mandantenfremd oder außerhalb der Objektsicht, oder kein lebender Auftrag (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Auftrag ausgeführt, Rechnung verknüpft oder schon storniert (ApiErrorBody, code conflict)

POST/api/instandhaltung/{id}/dienstleister

Weist dem Vorgang einen Dienstleister zu; es entsteht ein Angebot im Status angefragt. Die Vorgangs-Id steht im Pfad.

operationId: weiseInstandhaltungDienstleisterZu · Auth: bearerAuth

Request-Body (Pflicht): application/json → InstandhaltungDienstleisterRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Vorgangsstatus und das angefragte Angebot.InstandhaltungDienstleisterResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Vorgang unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Vorgang gesperrt oder Dienstleister schon zugeordnet (code conflict)

POST/api/instandhaltung/{id}/freigabe

Beantragt die Kostenfreigabe des Vorgangs (Auftrag im Status zur_freigabe): optional angebotId, kostenobergrenze als Objekt {cents, currency}, dienstleisterPersonId, costCategoryId. Zu einem Vorgang mit lebendem Auftrag ist ein zweiter Antrag ein Konflikt. Die Vorgangs-Id steht im Pfad.

operationId: beantrageInstandhaltungKostenfreigabe · Auth: bearerAuth

Request-Body (Pflicht): application/json → InstandhaltungFreigabeBeantragenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Auftrag-Id, Version, Betrag {cents, currency}, nötige Stufen und Befunde.InstandhaltungFreigabeBeantragenResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Vorgang unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Vorgang gesperrt oder es läuft schon ein Auftrag (code conflict)

POST/api/instandhaltung/{id}/freigabe/entscheid

Entscheidet eine Stufe (verwalter, zweit) der Kostenfreigabe des Vorgangs: approved oder rejected mit rejectReason. Eine zweite Stufe ist nur bei aktivem Vier-Augen-Schalter und erreichter Schwelle nötig. Der Antragsteller kann bei aktivem Vier-Augen nicht selbst freigeben (403). Die Vorgangs-Id steht im Pfad.

operationId: entscheideInstandhaltungKostenfreigabe · Auth: bearerAuth

Request-Body (Pflicht): application/json → InstandhaltungFreigabeEntscheidenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Entscheidung, Auftrags- und Vorgangsstatus, offene Stufen.InstandhaltungFreigabeEntscheidenResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Selbstfreigabe verboten oder Recht fehlt (ApiErrorBody, code forbidden)
404Vorgang unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Stufe schon entschieden oder Auftrag hat sich geändert (code conflict)

POST/api/instandhaltung/{id}/qualifizieren

Qualifiziert einen Vorgang: Typ, Dringlichkeit, baulich verändernd, Gestattungsbeschluss, Beginn und Häufigkeit, oder ausdrücklich beginnUnbekannt. Die Vorgangs-Id steht im Pfad, nie im Body. Aus gemeldet wird in_klaerung.

operationId: qualifiziereInstandhaltungVorgang · Auth: bearerAuth

Request-Body (Pflicht): application/json → InstandhaltungQualifizierenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Der Vorgang mit Status, nächsten Schritten und Befunden.InstandhaltungQualifizierenResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Vorgang unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Vorgang steht jenseits von in_klaerung (code conflict)

POST/api/instandhaltung/{id}/rechnung

Verknüpft einen Rechnungsbeleg mit dem ausgeführten Auftrag: documentId, rechnungsdatum, optional auftragId. Befunde (freistellung-fehlt, rechnung-ueber-auftrag, gestattungsbeschluss-fehlt) sperren nicht: die Verknüpfung gelingt und nennt sie. Die harte Sperre der Zahlung ohne Freistellungsbescheinigung liegt im Zahlungsauftrag. Die Vorgangs-Id steht im Pfad.

operationId: verknuepfeInstandhaltungRechnung · Auth: bearerAuth

Request-Body (Pflicht): application/json → InstandhaltungRechnungRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Rechnungs-Id, Betrag, Auftragswert, Abweichung, Summe, Bauleistung und Befunde mit Code, Schwere und Text.InstandhaltungRechnungResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Recht fehlt (ApiErrorBody, code forbidden)
404Vorgang oder Auftrag unbekannt, mandantenfremd oder außerhalb der Objektsicht, oder kein lebender Auftrag (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Beleg schon verknüpft oder Auftrag nicht ausgeführt (ApiErrorBody, code conflict)

POST/api/instandhaltung/{id}/stornieren

Storniert den Vorgang mit Grund (Pflicht). Läuft noch ein Auftrag, ist erst der Auftrag zu stornieren (409). Die Vorgangs-Id steht im Pfad.

operationId: storniereInstandhaltungVorgang · Auth: bearerAuth

Request-Body (Pflicht): application/json → InstandhaltungVorgangStornierenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Vorgangs-Id, vorheriger und neuer Status, Ereignis-Id und Grund.InstandhaltungAbschlussResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Recht fehlt (ApiErrorBody, code forbidden)
404Vorgang oder Auftrag unbekannt, mandantenfremd oder außerhalb der Objektsicht, oder kein lebender Auftrag (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Zu dem Vorgang läuft noch ein Auftrag (ApiErrorBody, code conflict)

GET/api/instandhaltung/aufgaben

Liest die offene Instandhaltung-Arbeit als abgeleitete Aufgaben (sofort-unbearbeitet, angebot-ausstehend, freigabe-wartet, rechnung-fehlt) der Objekte mit Zuständigkeit des Aufrufers. Optional stichtag (Vorgabe: Berliner Tag der Server-Uhr) und propertyId. Nur lesend.

operationId: getInstandhaltungAufgaben · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
stichtagqueryneinstring(date)
propertyIdqueryneinstring(uuid)
StatusBedeutungBody
200{ stichtag, zeilen[] } — leer ohne offene Arbeit.InstandhaltungAufgabenResponse
400ungültige Query, z. B. unbekannter Parameter oder kein Kalendertag (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

GET/api/instandhaltung/einstellung

Liest die Instandhaltung-Einstellung des Mandanten: Zweitfreigabe-Schwelle, Vergleichsangebote-Schwelle (Cent als Integer-STRING), Mindestangebote und die Herkunft (vorgabe | mandant). Nur lesend.

operationId: getInstandhaltungEinstellung · Auth: bearerAuth

StatusBedeutungBody
200Die Einstellung; ohne gespeicherte Zeile gilt die Vorgabe des Kerns (herkunft vorgabe).InstandhaltungEinstellungResponse
400ungültige Query (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

PUT/api/instandhaltung/einstellung

Setzt die Instandhaltung-Einstellung des Mandanten: zweitfreigabeAbCents (Cent als Integer-String, null = nie), vergleichsangeboteAbCents, mindestangebote. Nur ein Mensch mit Recht (sonst 403).

operationId: setzeInstandhaltungEinstellung · Auth: bearerAuth

Request-Body (Pflicht): application/json → InstandhaltungEinstellungSetzenRequest

StatusBedeutungBody
200Die gesetzte Einstellung samt vorherigem Stand; Geld als Integer-String in Cent.InstandhaltungEinstellungSetzenResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Recht fehlt (ApiErrorBody, code forbidden)

GET/api/instandhaltung/katalog

Liest den aufgelösten Vorgangstypen-Katalog des Mandanten (Vorgabe plus Abweichungen); standardmäßig nur aktive Typen, mit auchInaktive=true alle. Nur lesend.

operationId: getInstandhaltungKatalog · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
auchInaktivequeryneintrue | false
StatusBedeutungBody
200{ typen[] } — schluessel, bezeichnung, ohneAngebotErlaubt, aktiv, vorgabe.InstandhaltungKatalogResponse
400ungültige Query (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

PUT/api/instandhaltung/katalog

Legt einen Vorgangstyp im Katalog des Mandanten an oder ändert ihn: schluessel, bezeichnung, ohneAngebotErlaubt, aktiv. Nur ein Mensch mit Recht (sonst 403).

operationId: setzeInstandhaltungVorgangstyp · Auth: bearerAuth

Request-Body (Pflicht): application/json → InstandhaltungKatalogSetzenRequest

StatusBedeutungBody
200Der gesetzte Vorgangstyp.InstandhaltungKatalogSetzenResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Recht fehlt (ApiErrorBody, code forbidden)

kaution

GET/api/kaution

Liest die Kautionsliste des Mandanten zum Stichtag: vereinbart · erhalten · offen · getrennte Anlage (§ 551 BGB).

operationId: listKautionsliste · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
propertyIdqueryneinstring(uuid)Auf EIN Objekt eingrenzen (Filter, keine Autorisierung).
stichtagqueryneinstring(date)Stichtag der Eingänge UND des Vertragsfilters; weggelassen ⇒ heute (Render-Uhr der Anfrage, nie die Browser-Uhr).
archiveScopequeryneinalle | aktiv | archiviert3-Wege-Filter auf die Archiv-Kette des Vertrags-Reads; Default `aktiv`.
abrechnungsstandqueryneinabgerechnet | nicht-abgerechnet | abrechnungsreifFilter auf den Abrechnungsstand (#6897): `abgerechnet` (nicht stornierte Abrechnung vorhanden), `nicht-abgerechnet` (keine; auch Bürgschaft/Verpfändung), `abrechnungsreif` (Vertrag beendet UND nicht abgerechnet; nie eine Sicherheit ohne Geldfluss). Zeilen und Summen entstehen aus der gefilterten Menge; ohne Angabe alle Zeilen.
StatusBedeutungBody
200Zeilen + Summen aus DERSELBEN Zeilenmenge. Je Zeile trägt `abrechnung` den Abrechnungsstand (`null` ⇒ nicht abgerechnet). Cent-Felder sind vorzeichenbehaftete Integer-STRINGS. `offenCents` ist POSITIV bei Rückstand; ein dokumentarisch übernommener Bestand steht auf `eingang-unbekannt` und trägt `mahnbarerRestCents: "0"` — er wird durch die Umstellung nicht gemahnt. `summen` summiert nur EUR-Zeilen; andere Währungen stehen je Währung getrennt in `summenFremdwaehrung`. ACHTUNG: `mietpartei` ist personenbezogen.KautionslisteResponse
400ungültige Query (ApiErrorBody, code invalid_request — Feldname + Regel, nie der Wert)
401nicht authentifiziert — leerer Body (kein Oracle)

GET/api/kaution/abrechnung

Liest den gespeicherten Abrechnungsstand EINES Vertrags (nicht stornierte Kautionsabrechnung) mit Rückbehalt-Status keiner | gehalten | teilfreigegeben | freigegeben, dem noch gehaltenen Rest und den Teilfreigaben.

operationId: getKautionsabrechnungStand · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
contractIdqueryjastring(uuid)
StatusBedeutungBody
200Der gespeicherte Stand; Cent-Felder sind Integer-STRINGS. `rueckbehaltBegruendung` ist Freitext eines Menschen (personenbezogen).KautionsabrechnungStandResponse
400ungültige Query (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Vertrag unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel); keine geltende Abrechnung ⇒ ApiErrorBody, code KAUTION_KEINE_ABRECHNUNG.

POST/api/kaution/abrechnung

Rechnet die Kaution eines beendeten Vertrags ab (rechne_kaution_ab): Kaution + Zinsen − ausgewählte fällige Forderungen dieses Vertrags (Verrechnung über die bestehende OP-Verrechnung) − Rückbehalt mit Grundart (BK-Nachzahlung gedeckelt, Sonstiges mit Begründung). Bucht NUR mit hashgebundener Freigabe des Inhalts (vorschlagHash aus POST /api/kaution/abrechnung/vorschlag, freigegeben über POST /api/kaution/abrechnung/freigabe). Die Auszahlung geht als Zahlungsauftrag in die bestehende Freigabe (gib_zahlungsauftrag_frei, Vier-Augen) — nie direkt. Genau einmal je Vertrag.

operationId: rechneKautionAb · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200Die Abrechnung: Bestand, Zinsen, Guthaben, Verrechnung je Posten, Rückbehalt und Deckel, Auszahlung, Restforderung, Art; dazu `paymentOrderId`/`paymentOrderContentHash` des Auftrags `awaiting-approval` (null bei Auszahlung 0). Cent-Felder sind Integer-STRINGS.
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Schreibrecht oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Vertrag unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Vertrag nicht beendet oder bereits abgerechnet, Posten nicht verrechenbar, Rückbehalt: Sonstiges ohne Begründung, zweite BK-Zeile, BK nicht wählbar (letztes Guthaben bzw. keine bekannte Nachzahlung), BK über dem Deckel oder Summe über dem Guthaben, keine Kautionsanlage oder keine bestätigte Bankverbindung des Mieters, Empfänger offen (mehrere wählbar, keine Wahl) oder gewählte Bankverbindung nicht (mehr) bestätigt bzw. nicht die eines Mieters des Vertrags, keine Freigabe des Inhalts oder Inhalt seit der Freigabe geändert — es wird nichts gebucht (ApiErrorBody, code conflict)

POST/api/kaution/abrechnung/freigabe

Gibt einen Vorschlag der Kautionsabrechnung, Rückbehalt-Freigabe bzw. des Stornos frei (gib_kautionsabrechnung_frei): bindet die Freigabe an genau den vorgelegten Inhalts-Hash, bucht selbst nichts. Erst danach buchen POST /api/kaution/abrechnung, POST /api/kaution/rueckbehalt-freigabe bzw. POST /api/kaution/abrechnung/storno.

operationId: gibKautionsabrechnungFrei · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200freigegeben — { approvalId, art, contractId, vorschlagHash }
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Schreib-/Freigaberecht oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Vertrag bzw. (art storno) Abrechnung unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)
409der Inhalt weicht vom vorgelegten Hash ab (neu vorschlagen), über diesen Vorschlag ist bereits entschieden oder der Schritt ist nicht möglich (ApiErrorBody, code conflict)

POST/api/kaution/abrechnung/storno

Storniert eine ausgeführte Kautionsabrechnung (storniere_kautionsabrechnung): NUR mit hashgebundener Freigabe (vorschlagHash aus POST /api/kaution/abrechnung/vorschlag, art storno, freigegeben über POST /api/kaution/abrechnung/freigabe). Danach ist POST /api/kaution/abrechnung für denselben Vertrag wieder möglich.

operationId: storniereKautionsabrechnung · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200storniert — { kautionsabrechnungId, contractId, storniertAm, stornierteZahlungsauftraege, stornierteVerrechnungen }
400ungültige Eingabe, auch unbekanntes Feld (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Schreibrecht oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Abrechnung unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)
409keine Freigabe des Inhalts, fremder Hash, bereits storniert oder Auszahlungsauftrag schon eingereicht (mit Auftrag und Status) — es wird nichts geschrieben (ApiErrorBody, code conflict)

POST/api/kaution/abrechnung/vorschlag

Berechnet den VORSCHLAG einer Kautionsabrechnung (art abrechnung), einer Rückbehalt-Freigabe (art rueckbehalt) bzw. eines Stornos (art storno) samt Inhalts-Hash — mit derselben Rechnung wie die Ausführung, ohne zu schreiben.

operationId: kautionsabrechnungsvorschlag · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200der Vorschlag — { art, contractId, vorschlagHash, status (offen · freigegeben · abgelehnt), inhalt }. Cent-Felder im Inhalt sind Integer-STRINGS.
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Vertrag bzw. (art storno) Abrechnung unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)
409die Abrechnung bzw. Rückbehalt-Freigabe ist so nicht möglich (dieselben Gründe wie bei der Ausführung) (ApiErrorBody, code conflict)

POST/api/kaution/eingang

Verbucht einen Bankumsatz des am Vertrag hinterlegten Kautionskontos als Eingang der Kaution (verbuche_kautionseingang): Bank an Kautions-Personenkonto des Mieters, mit Buchungsanspruch und Tilgung der offenen Raten — ohne Zuordnung zum Mietkonto. Nur bei Barkaution.

operationId: verbucheKautionseingang · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200verbucht (Wiederholung ⇒ `replay: true`, nichts doppelt). Cent-Felder sind Integer-STRINGS.
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Vertrag oder Bankumsatz unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)
409keine gültige Freigabe des Vorschlags (fehlt, abgelehnt oder Inhalt seither geändert), kein Kautionskonto oder nicht das am Vertrag hinterlegte, keine Abrede, Bürgschaft/Verpfändung (kein Zahlungsstrom), kein Eingang oder Umsatz bereits anders verbucht (ApiErrorBody, code conflict)

GET/api/kaution/einstellung

Liest die Kaution-Einstellung des Mandanten: die Frist des Rückbehalts in Monaten (Vorgabe 6; beginnt mit dem Abrechnungsdatum der Kautionsabrechnung) und `istVorgabe` (true, solange der Mandant nichts eingestellt hat).

operationId: getKautionEinstellung · Auth: bearerAuth

StatusBedeutungBody
200{ rueckbehaltFristMonate, istVorgabe }KautionEinstellungResponse
401nicht authentifiziert — leerer Body (kein Oracle)

PUT/api/kaution/einstellung

Setzt die Frist des Rückbehalts des Mandanten (setze_kaution_rueckbehalt_frist): ganze Zahl 1…36 Monate. Nur ein Mensch mit Admin-Recht (rollenrechte.verwalten). Gilt nur für neue Abrechnungen — das Wiedervorlage-Datum wird beim Buchen an der Abrechnung festgeschrieben, bestehende bleiben unverändert. Idempotent: derselbe Wert nochmal ändert nichts.

operationId: setzeKautionRueckbehaltFrist · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200{ rueckbehaltFristMonate, istVorgabe: false } — die jetzt geltende FristKautionEinstellungResponse
400monate keine ganze Zahl 1…36 oder unbekanntes Feld (ApiErrorBody, code invalid_request) — nichts geschrieben
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Mensch oder ohne Admin-Recht (ApiErrorBody, code forbidden)

POST/api/kaution/freigabe

Gibt einen Kautions-Vorschlag frei (gib_kaution_frei): bindet die Freigabe an genau den vorgelegten Inhalts-Hash. Erst danach buchen POST /api/kaution/sollstellung bzw. POST /api/kaution/eingang.

operationId: gibKautionFrei · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200freigegeben — { approvalId, art, contractId, vorschlagHash }
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Schreib-/Freigaberecht oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Vertrag oder Bankumsatz unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)
409der Inhalt weicht vom vorgelegten Hash ab (neu vorschlagen), über diesen Vorschlag ist bereits entschieden oder der Geldpfad ist nicht möglich (ApiErrorBody, code conflict)

POST/api/kaution/rueckbehalt-freigabe

Gibt den Rückbehalt einer Kautionsabrechnung als eigenen Schritt frei (gib_kautionsrueckbehalt_frei): optional gegen dann fällige Forderungen dieses Vertrags verrechnet, der Rest als Zahlungsauftrag in die bestehende Freigabe. Mit betragCents nur einen TEILBETRAG (#6900): Status teilfreigegeben mit Rest, der letzte Schritt (Rest 0) freigegeben; ohne betragCents der ganze Rest. Jeder Schritt bucht NUR mit hashgebundener Freigabe seines Inhalts (art rueckbehalt).

operationId: gibKautionsrueckbehaltFrei · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200Rückbehalt, verrechneter Teil, Auszahlung, Restforderung (Integer-STRINGS) und der Auftrag `awaiting-approval` (null bei Auszahlung 0).
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Schreibrecht oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Vertrag unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)
409kein gehaltener Rückbehalt, bereits freigegeben, Teilbetrag 0/negativ/über dem Rest, Posten nicht verrechenbar, Auszahlungsseite unvollständig, keine Freigabe des Inhalts oder Inhalt seit der Freigabe geändert — es wird nichts gebucht (ApiErrorBody, code conflict)

GET/api/kaution/rueckbehalt-fristen

Liest Fristende und Überfälligkeit je gehaltenem Rückbehalt: für jede nicht stornierte Kautionsabrechnung im Rückbehalt-Status gehalten oder teilfreigegeben Vertrag, Abrechnungsdatum, Rückbehalt, Rest, fristEnde (beim Buchen gespeicherter Termin (Wiedervorlage am): Abrechnungsdatum + Frist des Mandanten zum Buchungszeitpunkt; eine spätere Änderung der Frist wirkt nur auf neue Abrechnungen), ueberfaellig und die Tage der Überschreitung. Nur lesend — keine automatische Aktion, keine Mail.

operationId: getKautionRueckbehaltFristen · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
stichtagqueryneinstring(date)
nurUeberfaelligqueryneintrue | false
StatusBedeutungBody
200{ stichtag, fristMonate, zeilen[] } — nur Rückbehalte der Objekte mit Zuständigkeit; Cent-Felder sind Integer-STRINGS.KautionRueckbehaltFristenResponse
400ungültige Query, z. B. unbekannter Parameter oder kein Kalendertag (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/kaution/sollstellung

Stellt die bis zum Stichtag fälligen Kautionsraten eines Vertrags soll (stelle_kaution_soll): SOLL Kautions-Personenkonto des Mieters / HABEN Kaution, je Rate ein Satz — getrennt vom Mietkonto, idempotent je Rate. Nur bei Barkaution.

operationId: stelleKautionSoll · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200Der vollständige Ratenplan mit Status je Rate (`sollgestellt` · `bereits-sollgestellt` · `nicht-faellig`); Cent-Felder sind Integer-STRINGS. Wiederholen bucht nichts doppelt (`neuSollgestellt: 0`).
400ungültige Eingabe oder Stichtag in der Zukunft (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Vertrag unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)
409keine gültige Freigabe des Vorschlags (fehlt, abgelehnt oder Inhalt seither geändert), keine Kautionsabrede (übernommener Bestand — „vereinbart, Eingang unbekannt", wird nicht sollgestellt), Bürgschaft/Verpfändung (kein Zahlungsstrom), kein Mieter für das Kautions-Personenkonto, kein Mietbeginn oder Kontonummer am Objekt belegt (ApiErrorBody, code conflict)

POST/api/kaution/vorschlag

Berechnet den VORSCHLAG eines Kautions-Geldpfads (Ratensollstellung oder Kautionseingang) samt Inhalts-Hash — mit derselben Rechnung wie die Ausführung, ohne zu schreiben.

operationId: kautionsvorschlag · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200der Vorschlag — { art, vorschlagHash, status (offen · freigegeben · abgelehnt), inhalt }. Cent-Felder im Inhalt sind Integer-STRINGS.
400ungültige Eingabe oder Stichtag in der Zukunft (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Vertrag oder Bankumsatz unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)
409der Geldpfad ist für diesen Vertrag/Umsatz nicht möglich (keine Abrede, kein Zahlungsstrom, falsche Anlage …) (ApiErrorBody, code conflict)

GET/api/kaution/zinsen

Liest die gebuchten Zinsgutschriften EINER Kaution (aufsteigend nach Zeitraum; stornierte erscheinen nicht).

operationId: listKautionszinsen · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
contractIdqueryjastring(uuid)
StatusBedeutungBody
200{ contractId, gutschriften[] } — Cent-Felder sind Integer-STRINGS.KautionszinsenResponse
400ungültige Query (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Vertrag unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)

POST/api/kaution/zinsen/buchung

Bucht das freigegebene Zinsjahr (buche_kautionszinsen): je Kaution mit Zins ein Satz zum 31.12. SOLL 1481 Zinsforderung Kautionskonto / HABEN Kautions-Personenkonto des Mieters (§ 551 Abs. 3 BGB), ohne Bankumsatz-Anspruch — idempotent je Konto, Jahr und Kaution.

operationId: bucheKautionszinsen · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200gebucht — Zins je Kaution mit Status (`gebucht` · `bereits-gebucht` · `kein-anteil`). Wiederholen bucht nichts doppelt (`neuGebucht: 0`). Cent-Felder sind Integer-STRINGS.
400ungültige Eingabe oder 31.12. des Jahres liegt in der Zukunft (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Schreibrecht oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Kautionskonto unbekannt, mandantenfremd ODER nicht zuständig (ApiErrorBody, code not_found — kein Existenz-Orakel)
409keine gültige Freigabe (fehlt, abgelehnt oder Inhalt seither geändert), das Jahr ist nicht das nächste offene des Kontos oder mit anderem Inhalt gebucht, oder an einem Tag mit Kapital gilt kein Zinssatz (ApiErrorBody, code conflict)

PUT/api/kaution/zinsen/festzins

Pflegt den Zinssatz EINES Kautionskontos „gültig ab heute" (setze_kautionskonto_festzins mit gueltigAb = heute, Verwaltungstag): legt einen Eintrag der Satzhistorie an oder überschreibt den von heute; basispunkte null löscht den Eintrag von heute. Für andere Tage: POST /api/kaution/zinsen/saetze. Reine Stammdatenänderung ohne Buchung und ohne Freigabe. Nur ein Mensch; ein Konto einer anderen Art oder ein heute in einem gebuchten Zinszeitraum ⇒ 409.

operationId: setzeKautionskontoFestzins · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200{ bankAccountId, basispunkte } — der jetzt gespeicherte Satz von heute (null = Eintrag gelöscht)
400Schemafehler, z. B. Satz außerhalb 0…2000 (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Mensch (ein Agent pflegt den Satz nicht)
404Konto unbekannt, archiviert, eines fremden Mandanten oder außerhalb der Zuständigkeit; Löschen, wenn es für heute keinen Eintrag gibt
409das Konto ist kein Kautionskonto, oder heute liegt in einem gebuchten Zinszeitraum des Kontos

POST/api/kaution/zinsen/freigabe

Gibt ein Zinsjahr frei (gib_kautionszinsen_frei): bindet die Freigabe an genau den vorgelegten Inhalts-Hash. Erst danach bucht POST /api/kaution/zinsen/buchung.

operationId: gibKautionszinsenFrei · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200freigegeben — { approvalId, bankAccountId, jahr, vorschlagHash }
400ungültige Eingabe oder 31.12. des Jahres liegt in der Zukunft (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Schreib-/Freigaberecht oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Kautionskonto unbekannt, mandantenfremd ODER nicht zuständig (ApiErrorBody, code not_found — kein Existenz-Orakel)
409der Inhalt weicht vom vorgelegten Hash ab (neu vorschlagen), über dieses Zinsjahr ist bereits entschieden oder der Zinslauf ist nicht möglich (ApiErrorBody, code conflict)

GET/api/kaution/zinsen/saetze

Liest die Satzhistorie „gültig ab" EINES Kautionskontos, aufsteigend nach gueltigAb. Der Satz an einem Tag ist der Eintrag mit dem größten gueltigAb <= Tag; vor dem ersten Eintrag gilt kein Satz. Ein fremdes, unbekanntes oder nicht zuständiges Konto liefert eine leere Liste (kein Existenz-Orakel).

operationId: listKautionZinssaetze · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
bankAccountIdqueryjastring(uuid)
StatusBedeutungBody
200{ bankAccountId, saetze[] } — Satzhistorie aufsteigend nach gueltigAbKautionZinssaetzeResponse
400bankAccountId fehlt oder keine UUID, unbekannter Query-Parameter (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/kaution/zinsen/saetze

Schreibt EINEN Eintrag der Satzhistorie eines Kautionskontos (setze_kautionskonto_festzins): Upsert auf (Konto, gueltigAb) — gleicher gueltigAb überschreibt den Satz, ein wiederholter gleicher Aufruf ändert nichts; basispunkte null löscht den Eintrag dieses Tages. Ein gueltigAb in einem gebuchten Zinszeitraum des Kontos wird abgewiesen (Anlegen, Überschreiben und Löschen). Reine Stammdatenänderung ohne Buchung und ohne Freigabe. Nur ein Mensch.

operationId: setzeKautionZinssatz · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200{ bankAccountId, gueltigAb, basispunkte } — der jetzt gespeicherte Satz dieses Tages (null = Eintrag gelöscht)
400Schemafehler, z. B. Satz außerhalb 0…2000 oder gueltigAb kein Kalendertag (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Mensch (ein Agent pflegt den Satz nicht)
404Konto unbekannt, archiviert, eines fremden Mandanten oder außerhalb der Zuständigkeit; Löschen eines Eintrags, den es für den Tag nicht gibt
409das Konto ist kein Kautionskonto, oder gueltigAb liegt in einem gebuchten Zinszeitraum des Kontos

GET/api/kaution/zinsen/stand

Liest den Zinsstand je Kautions-Anlagekonto: bis wann das Konto verzinst ist (letzter gebuchter Zinszeitraum, null ohne Zinslauf), die Zahl der Barkautionen und die noch unbeanspruchten Haben-Umsätze. Nur lesend; ob ein Umsatz ein Zins ist, entscheidet die Antwort nicht.

operationId: getKautionZinsstand · Auth: bearerAuth

StatusBedeutungBody
200{ konten[] } — nur Anlagekonten der Objekte mit Zuständigkeit; Cent-Felder sind Integer-STRINGS.KautionZinsstandResponse
400unbekannter Query-Parameter (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/kaution/zinsen/storno

Storno des ZULETZT gebuchten Zinsjahres eines Kautionskontos in drei Stufen (stufe vorschlag | freigabe | ausfuehren; Tools gib_kautionszinsjahr_storno_frei und storniere_kautionszinsjahr, Artefakt-Art kautionszinsjahr-storno): je Kaution die Gegenbuchung des Jahreszinssatzes über den Weg von storno_entry. Danach ist das Jahr wieder das nächste offene Zinsjahr und bucht unter der nächsten Generation (g<n+1>) neu; ein zweiter Storno bucht nichts. Nur solange dem Jahr keine Bankgutschrift zugeordnet und keine Kaution abgerechnet ist.

operationId: storniereKautionszinsjahr · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200vorschlag: { vorschlagHash, status, bankAccountId, jahr, generation, bereitsStorniert, summeCents, currency, anteile[{ contractId, zinsCents }] }; freigabe: { approvalId, bankAccountId, jahr, vorschlagHash }; ausfuehren: { bankAccountId, jahr, generation, storniertAm, neuStorniert, nullzinsjahr, stornierteSaetze }. Cent-Felder sind Integer-STRINGS.
400ungültige Eingabe, auch fehlender oder zu langer Grund und unbekanntes Feld (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Schreibrecht oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Kautionskonto unbekannt, mandantenfremd ODER nicht zuständig (ApiErrorBody, code not_found — kein Existenz-Orakel)
409nicht das zuletzt gebuchte Jahr, dem Jahr ist eine Bankgutschrift zugeordnet, eine Kaution des Jahres ist abgerechnet, keine gültige Freigabe (fehlt, abgelehnt oder Inhalt seither geändert) — es wird nichts geschrieben (ApiErrorBody, code conflict)

POST/api/kaution/zinsen/vorschlag

Berechnet den VORSCHLAG des Jahreszinslaufs eines Kautionskontos (nächstes offenes Kalenderjahr): je Kaution mit Guthaben im Jahr Stand zum 01.01., Zinstage, Satz bzw. Sätze und Zins (taggenau, Zinseszins über den Stand zum 01.01.), dazu die Summe — samt Inhalts-Hash, ohne zu schreiben. Eine Kaution, deren Abrechnungstag im Jahr liegt, ist nicht enthalten.

operationId: kautionszinsvorschlag · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200der Vorschlag — Hash, Freigabe-Status (offen · freigegeben · abgelehnt), Zins je Kaution, Summe und der vollständige Inhalt. Cent-Felder sind Integer-STRINGS.
400ungültige Eingabe oder 31.12. des Jahres liegt in der Zukunft (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Kautionskonto unbekannt, mandantenfremd ODER nicht zuständig (ApiErrorBody, code not_found — kein Existenz-Orakel)
409das Jahr ist nicht das nächste offene des Kontos, an einem Tag mit Kapital gilt kein Zinssatz, das Jahr ist mit anderem Inhalt gebucht oder eine Kaution hat im Jahr einen Abgang ohne Abrechnung; art gutschrift: der Umsatz ist kein Haben-Umsatz auf einem Kautionskonto, ist schon gebucht (Bankumsatz-Anspruch) oder das Jahr hat keinen offenen Saldo auf 1481 (ApiErrorBody, code conflict)

kontenrahmen

GET/api/kontenrahmen

Listet die verfügbaren Musterkontenrahmen (Code-Katalog, kein Mandanten-Stammdatum).

operationId: listKontenrahmen · Auth: bearerAuth

StatusBedeutungBody
200Vorlagenliste (KontenrahmenListResponse)KontenrahmenListResponse
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/kontenrahmen/{id}/apply

Spielt einen Musterkontenrahmen auf den Kontenplan EINES Objekts ein (Bulk-Anlage).

operationId: applyKontenrahmen · Auth: bearerAuth

Request-Body (Pflicht): application/json → KontenrahmenApplyRequest

ParameterOrtPflichtTypBeschreibung
idpathjastringKennung des Musterkontenrahmens
StatusBedeutungBody
200eingespielt (KontenrahmenApplyResponse). WIEDERHOLUNG IST HARMLOS: der Idempotency Key ist deterministisch (apply_chart_of_accounts:<propertyId>:<rahmenId>:<version>), ein zweiter Aufruf ist ein Replay des Erst-Ergebnisses — kein zweiter Kontensatz, kein zweites Kommando.
400ungültige Eingabe ODER Objekt archiviert (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannter Rahmen ODER unbekanntes/fremdes Objekt (ApiErrorBody, code not_found)

konto

GET/api/konto

Listet Konten (3-Wege-Filter, optional auf EIN Objekt eingegrenzt).

operationId: listKonten · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
statusqueryneinalle | aktiv | archiviertalle | aktiv | archiviert (Default aktiv). Unbekannter Wert ⇒ 400, nie stiller Fallback.
propertyIdqueryneinstring(uuid)grenzt auf EIN Objekt ein (Filter, keine Autorisierung — sichtbar ist ohnehin nur der eigene Tenant, RLS).
StatusBedeutungBody
200Kontenliste (KontoListResponse)KontoListResponse
400ungültiger status-Filter oder ungültige propertyId (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/konto

Legt EIN Konto im Kontenplan eines Objekts an.

operationId: createKonto · Auth: bearerAuth

Request-Body (Pflicht): application/json → KontoCreateRequest

StatusBedeutungBody
201angelegtes Konto (Konto)
400ungültige Eingabe, unbekannte Kostenkategorie, am Objekt schon vergebene Kontonummer ODER Objekt archiviert (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekanntes Objekt ODER fremder Tenant (ApiErrorBody, code not_found)

GET/api/konto/{id}

Liest EIN Konto (auch archiviert) samt Kostenkategorie.

operationId: getKonto · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200KontoKonto
400keine UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel)

PATCH/api/konto/{id}

Ändert Konto-Stammfelder (nach Erstbuchung nur noch den Namen).

operationId: updateKonto · Auth: bearerAuth

Request-Body (Pflicht): application/json → KontoUpdateRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200geändertes Konto
400leerer/ungültiger Patch, Konto archiviert, unbekannte Kostenkategorie, schon vergebene Kontonummer ODER buchungsrelevantes Feld nach Erstbuchung (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/konto/{id}/archive

Archiviert ein Konto (archived_at statt DELETE, K5).

operationId: archiveKonto · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200archiviert (KontoArchiveResponse). Wiederholter Aufruf = Idempotenz-Replay des Erst-Ergebnisses (identische Antwort, kein zweites Kommando).
400keine UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/konto/{id}/umlageschluessel

Ordnet dem Konto einen Umlageschlüssel zu oder hebt die Zuordnung auf (allocationKeyId null).

operationId: assignKontoUmlageschluessel · Auth: bearerAuth

Request-Body (Pflicht): application/json → KontoUmlageschluesselRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200geändertes Konto (Konto)Konto
400keine UUID, Konto archiviert ODER Schlüssel aus fremdem Objekt/archiviert (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Konto/Schlüssel unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

mahnlauf

GET/api/mahnlauf

Liest die Übersicht des Registers „Mahnlauf": die offenen Vorgänge (fällig oder in Arbeit) der Objekte mit Zuständigkeit, den Vorgang, den das Register öffnet (Query `lauf` ist der Deep-Link), die früheren (ausgeführten) Vorgänge und — ohne offenen Vorgang — die Zahl der zu mahnenden Debitoren. Ein Vorgang gehört dem, der ihn bearbeitet; ein fremd bearbeiteter Vorgang ist nur anzusehen. Nur lesend — nichts davon mahnt.

operationId: getMahnlaufUebersicht · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
laufqueryneinstring(uuid)Deep-Link: Vorgang, der bevorzugt geöffnet wird
StatusBedeutungBody
200{ offene[], gewaehlt, fruehere[], zuMahnendeDebitoren } — Cent-Felder sind Integer-STRINGS; Namen nur, soweit die Lesung sie führt.MahnlaufUebersichtResponse
400ungültige Query, z. B. unbekannter Parameter oder keine UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/mahnlauf

Startet einen Mahnlauf-Vorgang (starte_mahnlauf_vorgang) oder öffnet den eigenen, schon vorbereiteten: der Vorbereitungs-Schlüssel entsteht serverseitig aus Mandant, Nutzer, Stichtag und der Zahl ausgeführter Vorgänge, nie aus dem Body. Ein zweiter Aufruf desselben Nutzers zum selben Stichtag liefert denselben Vorgang (`neu: false`, 200) und legt keinen zweiten an. Ein Vorgang gehört dem, der ihn bearbeitet. Mahnt nicht — Ausführen, Freigabe und Versand sind ein eigener Schritt. Der Idempotency-Key kommt vom Aufrufer.

operationId: starteMahnlaufVorgang · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200der eigene vorbereitete Vorgang wurde geöffnet (`neu: false`)MahnlaufStartResponse
201ein neuer Vorgang wurde angelegt (`neu: true`)MahnlaufStartResponse
400ungültige Eingabe, z. B. kein Kalendertag oder unbekanntes Feld (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Schreibrecht, Zuständigkeit oder Mandantenzugehörigkeit fehlt, Testzeitraum abgelaufen, Paket nicht enthalten, oder der Aufrufer ist ein Agent (ApiErrorBody, code forbidden)
409der Schlüssel trägt einen ausgeführten oder von jemand anderem bearbeiteten Vorgang (ApiErrorBody, code conflict)

GET/api/mahnlauf/{laufId}

Liest EINEN Vorgang: Kopf (Stichtag, Status, Schritt, Summen, wer ihn bearbeitet), Umfang (Objekte und Einheiten der Zuständigkeit), die Positionen der Ableitung mit Beträgen und — bei einem ausgeführten Vorgang — das Ergebnis. Unbekannter, mandantenfremder oder nicht sichtbarer Vorgang: dieselbe 404. Nur lesend.

operationId: getMahnlaufVorgang · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
laufIdpathjastring(uuid)vorgangId
StatusBedeutungBody
200der Vorgang — Cent-Felder sind Integer-STRINGSMahnlaufVorgangResponse
401nicht authentifiziert — leerer Body (kein Oracle)
404Vorgang unbekannt ODER mandantenfremd ODER nicht sichtbar — dieselbe Meldung (ApiErrorBody, code not_found)

PATCH/api/mahnlauf/{laufId}

Bereitet einen Vorgang vor — mit GENAU EINEM der Schlüssel `stichtag` (setze_mahnlauf_stichtag), `umfang` (setze_mahnlauf_umfang: objektIds und abgewaehlteEinheitIds) oder `schritt` (setze_mahnlauf_schritt, 0 bis 3). Zwei Schlüssel oder keiner ⇒ 400. Ein Vorgang gehört dem, der ihn bearbeitet (fremd in Arbeit ⇒ 409); ein ausgeführter Vorgang ist nicht mehr änderbar (409). Mahnt nicht. Der Idempotency-Key kommt vom Aufrufer.

operationId: bereiteMahnlaufVorgangVor · Auth: bearerAuth

Request-Body (Pflicht): application/json

ParameterOrtPflichtTypBeschreibung
laufIdpathjastring(uuid)vorgangId
StatusBedeutungBody
200gesetzt — der Vorgang nach dem Aufruf (`geaendert: false`, wenn der Wert schon so stand)MahnlaufVorbereitetResponse
400ungültige Eingabe, z. B. zwei Schlüssel oder keiner, Schritt außerhalb 0…3 (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Schreibrecht, Zuständigkeit oder Mandantenzugehörigkeit fehlt, Testzeitraum abgelaufen, Paket nicht enthalten, oder der Aufrufer ist ein Agent (ApiErrorBody, code forbidden)
404Vorgang unbekannt ODER mandantenfremd — dieselbe Meldung (ApiErrorBody, code not_found)
409Vorgang fremd in Arbeit, bereits ausgeführt, gleichzeitig geändert oder ein Objekt läuft in einem anderen Vorgang (ApiErrorBody, code conflict)

POST/api/mahnlauf/{laufId}/ausfuehren

Führt einen vorbereiteten Mahnlauf-Vorgang aus (fuehre_mahnlauf_vorgang_aus, Außenwirkung): erzeugt je Schreiben einen Eintrag und gibt die unauffälligen Schreiben frei. Verlangt eine frische Anmeldung, das Ausführungsrecht und einen Menschen; Mandant und Akteur kommen aus der Sitzung, der Step-up-Nachweis nie aus dem Body. Ein zweiter Aufruf liefert das Erst-Ergebnis (`erstAusfuehrung: false`). Der Versand ist ein eigener Schritt.

operationId: fuehreMahnlaufVorgangAus · Auth: bearerAuth

Request-Body (optional): application/json

ParameterOrtPflichtTypBeschreibung
laufIdpathjastring(uuid)vorgangId
StatusBedeutungBody
200ausgeführt (oder das Erst-Ergebnis eines schon ausgeführten Vorgangs)MahnlaufAusfuehrenResponse
400ungültige Eingabe, z. B. ein Body mit `stepUp` oder einem anderen Feld (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403frische Anmeldung fehlt, ist abgelaufen oder schon verbraucht (ApiErrorBody, code step_up_required — `casa auth login --frisch`), oder das Ausführungsrecht fehlt/ist entzogen, die Selbstfreigabe wird abgelehnt, oder der Aufrufer ist ein Agent (code forbidden). Nichts geschrieben, nichts versendet.
404Vorgang unbekannt ODER mandantenfremd — dieselbe Meldung (ApiErrorBody, code not_found)
409Vorgang fremd in Arbeit oder gleichzeitig geändert, nichts zu mahnen (ApiErrorBody, code conflict)

POST/api/mahnlauf/{laufId}/ausschluss

Nimmt eine Position mit Pflichtgrund aus dem Mahnlauf (schliesse_mahnposition_aus): `positionsSchluessel` aus der Lesung, `grund` höchstens 200 Zeichen. Erneutes Ausschließen lässt eine Zeile stehen (der jüngere Grund gilt). Ein Vorgang gehört dem, der ihn bearbeitet; ein ausgeführter Vorgang ist nicht mehr änderbar. Mahnt nicht.

operationId: schliesseMahnpositionAus · Auth: bearerAuth

Request-Body (Pflicht): application/json

ParameterOrtPflichtTypBeschreibung
laufIdpathjastring(uuid)vorgangId
StatusBedeutungBody
200ausgeschlossen — der Grund wird nicht zurückgegebenMahnlaufAusschlussResponse
400Grund fehlt oder zu lang, Position nicht ausschließbar, ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Schreibrecht, Zuständigkeit oder Mandantenzugehörigkeit fehlt, oder der Aufrufer ist ein Agent (ApiErrorBody, code forbidden)
404Vorgang unbekannt ODER mandantenfremd — dieselbe Meldung (ApiErrorBody, code not_found)
409Vorgang fremd in Arbeit oder bereits ausgeführt (ApiErrorBody, code conflict)

POST/api/mahnlauf/{laufId}/ausschluss/aufheben

Holt eine ausgeschlossene Position in den Mahnlauf zurück (hole_mahnposition_zurueck). Gab es keinen Ausschluss, ist das ein Erfolg ohne Wirkung (`zurueckgeholt: false`). Ein Vorgang gehört dem, der ihn bearbeitet; ein ausgeführter Vorgang ist nicht mehr änderbar. Mahnt nicht.

operationId: holeMahnpositionZurueck · Auth: bearerAuth

Request-Body (Pflicht): application/json

ParameterOrtPflichtTypBeschreibung
laufIdpathjastring(uuid)vorgangId
StatusBedeutungBody
200zurückgeholtMahnlaufAusschlussAufhebenResponse
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Schreibrecht, Zuständigkeit oder Mandantenzugehörigkeit fehlt, oder der Aufrufer ist ein Agent (ApiErrorBody, code forbidden)
404Vorgang unbekannt ODER mandantenfremd — dieselbe Meldung (ApiErrorBody, code not_found)
409Vorgang fremd in Arbeit oder bereits ausgeführt (ApiErrorBody, code conflict)

GET/api/mahnlauf/{laufId}/schreiben/{mahnschreibenId}/datei

Lädt die Datei EINES Mahnschreibens als JSON (`datei`: dateiname, sha256, groesseBytes, inhaltBase64) und vermerkt den Download (vermerke_mahnschreiben_download) VOR der Antwort. Die binäre PDF-Route `…/pdf` bleibt daneben bestehen und liefert dieselben Bytes. Keine Außenwirkung, kein Step-up.

operationId: getMahnschreibenDatei · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
laufIdpathjastring(uuid)vorgangId
mahnschreibenIdpathjastring(uuid)mahnschreibenId (aus dem Ergebnis des Vorgangs)
StatusBedeutungBody
200die Datei samt PrüfsummeMahnlaufSchreibenDateiResponse
401nicht authentifiziert — leerer Body (kein Oracle)
403Schreibrecht (daten.schreiben) fehlt (ApiErrorBody, code forbidden)
404Vorgang oder Schreiben unbekannt, mandantenfremd oder nicht im Vorgang — dieselbe Meldung (ApiErrorBody, code not_found)

POST/api/mahnlauf/{laufId}/schreiben/{mahnschreibenId}/erneut

Sendet EIN fehlgeschlagenes Schreiben erneut (sende_mahnschreiben_erneut, Außenwirkung, frische Anmeldung): nur für den Status `fehlgeschlagen`, sonst 409. Ein zweiter Versand desselben Schreibens ist ausgeschlossen.

operationId: sendeMahnschreibenErneut · Auth: bearerAuth

Request-Body (optional): application/json

ParameterOrtPflichtTypBeschreibung
laufIdpathjastring(uuid)vorgangId
mahnschreibenIdpathjastring(uuid)mahnschreibenId (aus dem Ergebnis des Vorgangs)
StatusBedeutungBody
200erneut gesendet (`ausgang` versandt oder wieder fehlgeschlagen)MahnlaufErneutResponse
400ungültige Eingabe, z. B. ein Body mit `stepUp` (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403frische Anmeldung fehlt, ist abgelaufen oder schon verbraucht (ApiErrorBody, code step_up_required — `casa auth login --frisch`), oder das Ausführungsrecht fehlt/ist entzogen, die Selbstfreigabe wird abgelehnt, oder der Aufrufer ist ein Agent (code forbidden). Nichts geschrieben, nichts versendet.
404Vorgang oder Schreiben unbekannt, mandantenfremd oder nicht im Vorgang — dieselbe Meldung (ApiErrorBody, code not_found)
409Schreiben nicht fehlgeschlagen, bereits versendet oder zugestellt, Vorgang nicht ausgeführt (ApiErrorBody, code conflict)

POST/api/mahnlauf/{laufId}/schreiben/{mahnschreibenId}/freigabe

Entscheidet über EIN Schreiben einzeln (entscheide_mahnschreiben): `entscheidung` freigeben oder zurueckweisen, beim Zurückweisen mit `grundCode` (optional `grundNotiz`). Nach freigeben folgt der Versand genau dieses Schreibens (Außenwirkung, frische Anmeldung, Ausführungsrecht); der Versandweg ist mail. Ein Agent darf nicht; eine rote Ampel ist nicht freigebbar.

operationId: entscheideMahnschreiben · Auth: bearerAuth

Request-Body (Pflicht): application/json

ParameterOrtPflichtTypBeschreibung
laufIdpathjastring(uuid)vorgangId
mahnschreibenIdpathjastring(uuid)mahnschreibenId (aus dem Ergebnis des Vorgangs)
StatusBedeutungBody
200entschieden (bei freigeben samt Versand-Ergebnis)MahnlaufSchreibenFreigabeResponse
400ungültige Eingabe, z. B. zurueckweisen ohne Grundcode oder freigeben mit Grund (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403frische Anmeldung fehlt, ist abgelaufen oder schon verbraucht (ApiErrorBody, code step_up_required — `casa auth login --frisch`), oder das Ausführungsrecht fehlt/ist entzogen, die Selbstfreigabe wird abgelehnt, oder der Aufrufer ist ein Agent (code forbidden). Nichts geschrieben, nichts versendet.
404Vorgang oder Schreiben unbekannt, mandantenfremd oder nicht im Vorgang — dieselbe Meldung (ApiErrorBody, code not_found)
409schon entschieden, Ampel rot oder Inhalt zwischenzeitlich geändert (ApiErrorBody, code conflict)

POST/api/mahnlauf/{laufId}/schreiben/{mahnschreibenId}/zustellung

Dokumentiert die von Hand erfolgte Zustellung EINES Schreibens (dokumentiere_mahnzustellung, Außenwirkung): `zugestelltAm`, `kanal` (brief, einschreiben, persoenliche_uebergabe) und die ausdrückliche Bestätigung `tatsacheBestaetigt: true`. Genau ein Nachweis je Schreiben; ein zweiter ist ein Konflikt.

operationId: dokumentiereMahnzustellung · Auth: bearerAuth

Request-Body (Pflicht): application/json

ParameterOrtPflichtTypBeschreibung
laufIdpathjastring(uuid)vorgangId
mahnschreibenIdpathjastring(uuid)mahnschreibenId (aus dem Ergebnis des Vorgangs)
StatusBedeutungBody
200dokumentiertMahnlaufZustellungResponse
400Angaben fehlen, Bestätigung false, Datum in der Zukunft oder nach dem Stichtag (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403frische Anmeldung fehlt, ist abgelaufen oder schon verbraucht (ApiErrorBody, code step_up_required — `casa auth login --frisch`), oder das Ausführungsrecht fehlt/ist entzogen, die Selbstfreigabe wird abgelehnt, oder der Aufrufer ist ein Agent (code forbidden). Nichts geschrieben, nichts versendet.
404Vorgang oder Schreiben unbekannt, mandantenfremd oder nicht im Vorgang — dieselbe Meldung (ApiErrorBody, code not_found)
409bereits dokumentiert oder versendet, Vorgang nicht ausgeführt (ApiErrorBody, code conflict)

POST/api/mahnlauf/{laufId}/versand

Versendet die Schreiben eines AUSGEFÜHRTEN Vorgangs (versende_mahnschreiben, Außenwirkung, eigene frische Anmeldung): `versandweg` mail oder druck, optional `mahnschreibenIds` für „Versand fortsetzen" (nur diese Schreiben). Nur wenn der Vorgang ausgeführt ist und mindestens ein Schreiben `download_bereit` ist, sonst 409 OHNE Verbrauch der Anmeldung; ein zweiter Versand desselben Schreibens ist ausgeschlossen. Die Antwort nennt die Zähler und je Schreiben den Ausgang.

operationId: versendeMahnlauf · Auth: bearerAuth

Request-Body (Pflicht): application/json

ParameterOrtPflichtTypBeschreibung
laufIdpathjastring(uuid)vorgangId
StatusBedeutungBody
200der Versand lief — Zähler und Ergebnis je Schreiben (einzelne Schreiben können fehlgeschlagen sein)MahnlaufVersandResponse
400ungültige Eingabe, z. B. unbekannter Versandweg oder ein Body mit `stepUp` (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403frische Anmeldung fehlt, ist abgelaufen oder schon verbraucht (ApiErrorBody, code step_up_required — `casa auth login --frisch`), oder das Ausführungsrecht fehlt/ist entzogen, die Selbstfreigabe wird abgelehnt, oder der Aufrufer ist ein Agent (code forbidden). Nichts geschrieben, nichts versendet.
404Vorgang oder eines der Schreiben unbekannt ODER mandantenfremd — dieselbe Meldung (ApiErrorBody, code not_found)
409Vorgang nicht ausgeführt oder nichts mehr zu versenden (ApiErrorBody, code conflict)

mandat

GET/api/mandat

Listet SEPA-Mandate (Status-Filter alle|pending|active|revoked|expired, Default alle).

operationId: listMandate · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
statusqueryneinalle | pending | active | revoked | expiredalle | pending | active | revoked | expired (Default alle). Unbekannter Wert ⇒ 400.
vertragIdqueryneinstring(uuid)nur Mandate dieses Vertrags (UUID)
personIdqueryneinstring(uuid)nur Mandate dieser Person (UUID)
StatusBedeutungBody
200Mandatsliste (MandatListResponse)MandatListResponse
400ungültiger status-Filter oder UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/mandat

Legt ein SEPA-Mandat zu einem Vertrag an (Status pending).

operationId: createMandat · Auth: bearerAuth

Request-Body (Pflicht): application/json → MandatCreateRequest

StatusBedeutungBody
201angelegtes Mandat (Mandat)
400ungültige Eingabe ODER doppelte mandateRef im Tenant (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Vertrag ODER Person unbekannt, archiviert oder fremder Tenant (ApiErrorBody, code not_found). Die Ziel-Prüfung leistet der Tool-Layer.

GET/api/mandat/{id}

Liest EIN SEPA-Mandat samt Vertrags-/Personen-Bezug (auch widerrufen/abgelaufen).

operationId: getMandat · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200MandatMandat
400keine UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel)

POST/api/mandat/{id}/status

Führt den Mandatsstatus (validierter Übergang nach active/revoked/expired).

operationId: setMandatStatus · Auth: bearerAuth

Request-Body (Pflicht): application/json → MandatStatusRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Status geführt (MandatStatusResponse). Wiederholter Aufruf = Idempotenz-Replay des Erst-Ergebnisses.
400ungültiges Ziel oder unerlaubter Übergang (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

me

GET/api/me

Aktuelle Session (Tenant + User + Step-up-Status).

operationId: getMe · Auth: bearerAuth

StatusBedeutungBody
200Session (Tenant + User + Step-up)MeResponse
401nicht authentifiziert — leerer Body (kein Oracle); Clients mappen den Status auf code "unauthenticated"

mieterhoehung

POST/api/mieterhoehung/{id}/entscheidung

Entscheidet EINE Mieterhöhungs-Fassung (entscheide_mieterhoehung): freigeben (`approved`) oder ablehnen (`rejected`, mit Grund-Code). Bindung und Inhalts-Hash bestimmt der Server frisch aus der Datenbank; der Rumpf trägt keinen Hash. Verlangt eine frische Anmeldung (Step-up). Ein Agent darf nicht entscheiden.

operationId: entscheideMieterhoehung · Auth: bearerAuth

Request-Body (Pflicht): application/json

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)mieterhoehungId
StatusBedeutungBody
200entschieden — { approvalId, mieterhoehungId, decision, bindung, contentHash }
400ungültige Eingabe, z. B. Ablehnung ohne Grund (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Entscheider ist ein Agent bzw. ohne Berechtigung, oder Step-up nötig (ApiErrorBody, code forbidden)
404Fassung unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Fassung verfallen oder schon entschieden (ApiErrorBody, code conflict)

POST/api/mieterhoehung/{id}/feststellung

Stellt die Reaktion des Mieters auf ein Erhöhungsverlangen fest (stelle_mieterhoehung_fest): ausdrückliche Zustimmung (Zustand `wirksam`), Widerspruch oder Sonderkündigung (Zustand `abgelehnt`). Setzt einen wirksamen Zustellnachweis voraus; die Feststellung ist append-only und fällt genau einmal. Nur ein Mensch darf sie festhalten, der Erfasser ist der Akteur.

operationId: stelleMieterhoehungFest · Auth: bearerAuth

Request-Body (Pflicht): application/json

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)mieterhoehungId
StatusBedeutungBody
200festgestellt — { mieterhoehungId, feststellungId, zustand, wirksam }
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Akteur ist ein Agent bzw. ohne Berechtigung (ApiErrorBody, code forbidden) — nichts geschrieben
404Mieterhöhung unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)
409nicht zugestellt (kein Zustellnachweis) oder bereits festgestellt (ApiErrorBody, code conflict) — nichts geschrieben

GET/api/mieterhoehung/{id}/indexerklaerung

Erzeugt die Erklärung einer Indexanpassung nach § 557b Abs. 3 BGB als Text im Standardwortlaut (erzeuge_indexanpassungserklaerung): alter und neuer Index, alte und neue Miete, Rechenweg und Wirksamkeitsmonat (Beginn des übernächsten Monats nach dem Zugang). Indexwerte und geplanter Betrag kommen aus dem gespeicherten Index-Vorgang und werden gegen die Kette nachgerechnet; weicht das Ergebnis ab, gibt es keinen Text. Nur lesend — der Text wird erzeugt, nicht versendet.

operationId: getMieterhoehungIndexerklaerung · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)mieterhoehungId eines Index-Vorgangs
StatusBedeutungBody
200{ text, vorlageVersion, dokumentHash, zugangErfasst } — dokumentHash ist SHA-256 (hex) über den Text; zugangErfasst false = kein Zugangstag erfasst, der Wirksamkeitsmonat ist die Vorschau aus dem geplanten Wirksamkeitstag.IndexanpassungErklaerungResponse
401nicht authentifiziert — leerer Body (kein Oracle)
404Vorgang unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)
409kein Index-Vorgang, sondern z. B. ein § 558-Verlangen (ApiErrorBody, code MIETERHOEHUNG_KEIN_INDEXVORGANG), oder die Nachrechnung weicht vom gespeicherten Vorgang ab (code conflict) — kein Text.

POST/api/mieterhoehung/{id}/ruecknahme

Nimmt eine wirksame Mieterhöhung zurück (nimm_mieterhoehung_zurueck): Pflichtbegründung, Zustand `zurueckgenommen`. Die Antwort trägt `alterBetragCents`, den Betrag, der wieder gilt — aus dem Vorgang gelesen.

operationId: nimmMieterhoehungZurueck · Auth: bearerAuth

Request-Body (Pflicht): application/json

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)mieterhoehungId
StatusBedeutungBody
200zurückgenommen — { mieterhoehungId, ruecknahmeId, zustand, alterBetragCents, currency }
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Akteur ist ein Agent bzw. ohne Berechtigung (ApiErrorBody, code forbidden) — nichts geschrieben
404Mieterhöhung unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Mieterhöhung ist nicht wirksam (ApiErrorBody, code conflict) — nichts geschrieben

POST/api/mieterhoehung/{id}/versand

Versendet das freigegebene Mieterhöhungsschreiben nach § 558a BGB (versende_mieterhoehungsschreiben) über das Außenwirkungs-Gate: Zustellnachweis mit Dokument-Hash, Zustand `versendet` (nie `wirksam`). `mail` geht über den Versandkanal des Mandanten, `druck` protokolliert nur die Übergabe. Akteurs-Kette und Step-up bestimmt der Server aus Sitzung und Freigabe — nie aus dem Rumpf. Verlangt eine frische Anmeldung (Step-up) und eine Freigabe durch eine andere Person. Ein Agent darf nicht versenden.

operationId: versendeMieterhoehungsschreiben · Auth: bearerAuth

Request-Body (Pflicht): application/json

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)mieterhoehungId
StatusBedeutungBody
200Versuch protokolliert — { mieterhoehungId, versandweg, ausgang: "zugestellt" | "fehlgeschlagen", zustellnachweisId, providerRef, fehlerCode }; bei "fehlgeschlagen" bleibt der Zustand unverändert
400ungültige Eingabe oder unbekanntes Feld (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Gate hat abgewiesen: keine Freigabe, Selbstfreigabe, kein frischer Step-up, kein Ausführungsrecht oder Versender ist ein Agent (ApiErrorBody, code MIETERHOEHUNG_VERSAND_GESPERRT). Nichts versendet.
404Vorgang unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Schreiben ist schon zugegangen (ApiErrorBody, code MIETERHOEHUNG_BEREITS_VERSENDET) oder die Anmeldung trägt schon eine andere Ausführung (code MIETERHOEHUNG_VERSAND_GESPERRT). Kein zweiter Versand.

POST/api/mieterhoehung/{id}/zahlung

Erfasst eine beobachtete Zahlung zum Erhöhungsverlangen (erfasse_mieterhoehungszahlung). Betrag, Währung und Datum liest der Server aus dem Buchungssatz, der eine Zahlung auf dem Mieter-Personenkonto dieses Vertrags sein muss. `unterVorbehalt` ist Pflicht ohne Default: das Merkmal „vorbehaltlos" bestätigt ein Mensch, es wird nie aus dem Bank-Matching abgeleitet. Mit der dritten vorbehaltlosen Zahlung in drei Perioden entsteht genau eine konkludente Feststellung (Zustand `wirksam`); eine Zahlung unter Vorbehalt zählt nicht.

operationId: erfasseMieterhoehungszahlung · Auth: bearerAuth

Request-Body (Pflicht): application/json

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)mieterhoehungId
StatusBedeutungBody
200erfasst — { mieterhoehungId, zahlungEntryId, neuErfasst, zaehlendePerioden, feststellungId, betragCents, currency, gezahltAm }
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Akteur ist ein Agent bzw. ohne Berechtigung (ApiErrorBody, code forbidden) — nichts geschrieben
404Mieterhöhung oder Buchungssatz (keine Zahlung dieses Vertrags) unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)
409nicht zugestellt (kein Zustellnachweis) (ApiErrorBody, code conflict) — nichts geschrieben

GET/api/mieterhoehung/faellig

Liest, wer für eine Mieterhöhung fällig ist: je laufendem Wohnraumvertrag der zuständigen Objekte den frühesten § 558-Termin (Jahressperrfrist; gesperrt mit Grund bei Index- oder Staffelvereinbarung), bei Indexmiete den § 557b-Termin mit dem jüngsten VPI-Monat und der neuen Miete als Vorschau (vpi-fehlt oder basisjahr-abweichend statt eines geschätzten oder umgerechneten Werts) und das Ende der Zustimmungsfrist eines versendeten Vorgangs. Nur lesend — kein Vorgang, keine Mail; Gewerbeverträge erscheinen nicht.

operationId: getMieterhoehungFaellig · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
stichtagqueryneinstring(date)
StatusBedeutungBody
200{ stichtag, zeilen[] } — nur Verträge der Objekte mit Zuständigkeit; Cent-Felder sind Integer-STRINGS.MieterhoehungFaelligResponse
400ungültige Query, z. B. unbekannter Parameter oder kein Kalendertag (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

GET/api/mieterhoehung/staffelliste

Liest die Staffelmieterhöhungsliste (UC-LIST-016): je Vertrag mit mindestens einem Kaltmieten-Wechsel die zum Stichtag geltende (aktuelle) und die unmittelbar vorherige Kaltmiete mit Gültigkeitsbeginn und Differenz, die nächste künftige Stufe und die Herkunft des Wechsels (anlage = im Anlage-Kommando des Vertrags entstanden, sonst konditionswechsel). Aktuell heißt: gilt zum Stichtag — nicht die zuletzt erfasste. von/bis grenzen auf Verträge ein, deren aktuelle Stufe in diesem Zeitraum gültig wurde. Nur lesend.

operationId: getStaffelmieteListe · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
stichtagqueryneinstring(date)
vonqueryneinstring(date)
bisqueryneinstring(date)
objektqueryneinstring(uuid)
StatusBedeutungBody
200{ stichtag, zeilen[] } — nur Verträge der Objekte mit Zuständigkeit; Cent-Felder sind Integer-STRINGS.StaffelmieteListeResponse
400ungültige Query, z. B. unbekannter Parameter, kein Kalendertag oder von nach bis (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

mieterwechsel

POST/api/mieterwechsel

Mieterwechsel auf einer Einheit: Altvertrag beenden, Neuvertrag anlegen, Zeitscheiben fortschreiben (eine Transaktion).

operationId: executeMieterwechsel · Auth: bearerAuth

Request-Body (Pflicht): application/json → MieterwechselRequest

StatusBedeutungBody
201Wechsel ausgeführt (MieterwechselResponse). Wiederholter Aufruf mit gleichem Idempotency-Key = Replay des Erst-Ergebnisses.MieterwechselResponse
400überlappende Belegung, unbestätigter Leerstand, unplausibles Enddatum, objektfremder Altvertrag oder Float auf Geld (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Einheit, Altvertrag oder Zahlungs-Komponente unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409Altvertrag bereits beendet oder Einheit anderweitig belegt (ApiErrorBody, code conflict)

migration

GET/api/migration/{id}/vergleich

Der centgenaue Abweichungsbericht je Fachbereich zu EINEM Import-Vorgang: casa.ai rechnet den importierten Bestand nach und stellt ihn gegen die WinCASA-Vergleichswerte des jüngsten Satzes — mit Konto, Person, Differenz und Erklärung je Abweichung und einem Grund je nicht vergleichbarem Fachbereich. Cent-Beträge als Ganzzahl-Text. Schreibt nichts.

operationId: leseMigrationsvergleich · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Der Bericht (MigrationsvergleichResponse)MigrationsvergleichResponse
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Mitglied des Mandanten der Sitzung (ApiErrorBody, code forbidden)
404Import-Vorgang unbekannt, fremder Tenant ODER keine UUID (ApiErrorBody, code not_found) — alle drei sehen gleich aus, eine Unterscheidung wäre bereits ein Existenz-Orakel.
409der Vorgang trägt noch keinen Satz WinCASA-Vergleichswerte (ApiErrorBody, code conflict) — erst im Direktimport die Vergleichswerte erzeugen.
503Berechtigungsprüfung derzeit nicht möglich (ApiErrorBody, code unavailable)

objekt

GET/api/objekt

Listet Objekte (3-Wege-Filter Alle/Aktiv/Archiviert, Default aktiv).

operationId: listObjekte · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
statusqueryneinalle | aktiv | archiviertalle | aktiv | archiviert (Default aktiv). Unbekannter Wert ⇒ 400, nie stiller Fallback.
StatusBedeutungBody
200Objektliste (ObjektListResponse)ObjektListResponse
400ungültiger status-Filter (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/objekt

Legt ein Objekt an; der 1:1-Buchungskreis entsteht automatisch (F3).

operationId: createObjekt · Auth: bearerAuth

Request-Body (Pflicht): application/json → ObjektCreateRequest

StatusBedeutungBody
201angelegtes Objekt inkl. accountingCircleId (Objekt)
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

GET/api/objekt/{id}

Liest EIN Objekt (auch archiviert) samt Buchungskreis.

operationId: getObjekt · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200ObjektObjekt
400keine UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel)

PATCH/api/objekt/{id}

Ändert Objekt-Stammfelder (nur nicht-archivierte Objekte).

operationId: updateObjekt · Auth: bearerAuth

Request-Body (Pflicht): application/json → ObjektUpdateRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200geändertes Objekt
400leerer/ungültiger Patch ODER Objekt archiviert (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

GET/api/objekt/{id}/abschluss

Liest die Abschluss-Läufe eines Objekts. Ein stornierter Lauf verschwindet NICHT aus dem Bestand (GG4/GoBD) — er trägt `storniert: true` und wird vom Nachfolger über `ersetztLaufId` genannt.

operationId: listObjektAbschlussLaeufe · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
jahrqueryneinintegerFiltert auf EIN Wirtschaftsjahr. Ohne Angabe: alle Jahre — das vermischt nichts, denn jeder Lauf trägt sein Jahr an der Zeile. Ein Jahr ohne Lauf ergibt eine LEERE Liste, keinen Fehler.
StatusBedeutungBody
200die Läufe des Objekts, aktive und stornierte (AbschlussLaufListResponse)AbschlussLaufListResponse
400keine UUID ODER `jahr` ist keine ganze Zahl (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/objekt/{id}/abschluss/korrektur

Führt die Korrektur-Kette einer Kaskaden-Neuberechnung aus: je betroffenem Jahr ein Storno und ein NEUER Lauf mit Referenz auf den stornierten, in EINER Transaktion. Der Idempotenz-Schlüssel kommt vom Aufrufer — zwei Aufrufe am selben Schlüssel ergeben GENAU EINE Kette.

operationId: fuehreObjektAbschlussKorrekturAus · Auth: bearerAuth

Request-Body (Pflicht): application/json → AbschlussKorrekturRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200die geschriebene Kette; bei `bereits_ausgefuehrt` leer (AbschlussKorrekturResponse)AbschlussKorrekturResponse
400ungültige Eingabe ODER eine Gate-Entscheidung nennt ein Jahr, das in dieser Kaskade keinen neuen Lauf bekommt (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409das Objekt führt in KEINEM Jahr der Kaskade einen aktiven Lauf — eine Korrektur hätte nichts zu ersetzen (ApiErrorBody, code conflict)

POST/api/objekt/{id}/archive

Archiviert Objekt + 1:1-Buchungskreis (archived_at statt DELETE, K5). Kaskadiert abwärts: alle Gebäude + Einheiten des Objekts werden mitarchiviert (#445).

operationId: archiveObjekt · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200archiviert (ObjektArchiveResponse). Wiederholter Aufruf = Idempotenz-Replay des Erst-Ergebnisses (identische Antwort, kein zweites Kommando). Alle Gebäude und Einheiten des Objekts werden in derselben Transaktion mitarchiviert (Kaskade #445, ein Kommando).
400keine UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

GET/api/objekt/{id}/beschluss

Liest die Beschluss-Sammlung eines Objekts (§ 24 Abs. 7 WEG), optional nach Lebenszyklus-Status gefiltert.

operationId: listObjektBeschluesse · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
statusqueryneinstringkommagetrennte Lebenszyklus-Zustände (angenommen, abgelehnt, angefochten, bestandskraeftig, aufgehoben, nichtig). OHNE Angabe: die VOLLSTÄNDIGE Sammlung — eine stille Vorauswahl gibt es nicht. Ein unbekannter Wert ⇒ 400 (nicht: leere Liste).
StatusBedeutungBody
200Beschluss-Sammlung des Objekts (BeschlussListResponse)BeschlussListResponse
400keine UUID oder unbekannter Status im Filter (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/objekt/{id}/beschluss

Erfasst EINEN Beschluss samt Teil-Gegenständen (auch der WinCASA-Alt-Import läuft hier durch).

operationId: erfasseObjektBeschluss · Auth: bearerAuth

Request-Body (Pflicht): application/json → BeschlussErfasseRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200erfasster Beschluss samt Teil-Gegenstands-Referenzen (BeschlussErfasseResponse)BeschlussErfasseResponse
400ungültige Eingabe, kein Teil-Gegenstand, kein Verkündungszustand als Anfangsstatus ODER laufende Nummer bereits vergeben (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/objekt/{id}/beschluss/import

Importiert einen WinCASA-Beschlussbestand (Export der Tabelle VERTHEMEN bzw. VERSAMMLUNG_ERG) in die Sammlung eines Objekts. Multipart-Upload, serverseitig geparst. Teilerfolg ist erlaubt: abgewiesene Zeilen stehen benannt in der Antwort, die übrigen bleiben geschrieben.

operationId: importiereObjektBeschluesse · Auth: bearerAuth

Request-Body (Pflicht): multipart/form-data → Binärfeld file (format: binary)

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
onrqueryjastringObjektnummer des ALTBESTANDS, deren Zeilen übernommen werden. Pflicht und ohne Default: eine Export-Datei kann die Zeilen mehrerer Objekte enthalten, und die laufende Nummer der Sammlung wird je Objekt vergeben (§ 24 Abs. 7 WEG).
StatusBedeutungBody
200Import-Bericht mit Befunden (BeschlussImportResponse)BeschlussImportResponse
400keine UUID, fehlende onr ODER die Datei ist kein Beschluss-Export (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
413Datei zu groß oder Upload zu langsam (ApiErrorBody, code payload_too_large)

GET/api/objekt/{id}/brennstoffkonto

Liest das Brennstoffkonto eines Objekts: das aktive Konto mit Zustand und Zeitpunkt der Wahl, den gemerkten Ausgangszustand (`vorzustand`), den Befund (`brennstoffkonto-verteilt-doppelt`, wenn das Brennstoffkonto trotzdem umlagefähig ist oder einen Schlüssel trägt) und die Konten des Objekts mit Heizkosten-Kostenart als Auswahlhilfe. Nur lesend.

operationId: getBrennstoffkonto · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Brennstoffkonto, Befund und Auswahlhilfe (BrennstoffkontoResponse)BrennstoffkontoResponse
400ungültige Objekt-Id (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekanntes ODER fremdes Objekt — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel)

POST/api/objekt/{id}/brennstoffkonto

Setzt das Brennstoffkonto des Objekts. Das Brennstoffkonto verteilt die Heizkosten über die Heizkostenabrechnung und darf nicht zusätzlich als Betriebskosten umgelegt werden; das Setzen macht das Konto nicht umlagefähig und entfernt den Umlageschlüssel (`bestaetigt: true` ist Pflicht, wenn es das verliert). Das frühere Brennstoffkonto geht auf seinen gespeicherten Ausgangszustand zurück. Ein Konto mit Buchungen wird nicht umgestellt. Der Idempotency-Key kommt vom Aufrufer.

operationId: setzeBrennstoffkonto · Auth: bearerAuth

Request-Body (Pflicht): application/json → BrennstoffkontoSetzenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
201Brennstoffkonto gesetzt (BrennstoffkontoGesetztResponse)BrennstoffkontoGesetztResponse
400ungültige Eingabe oder fehlende Bestätigung (umstellung-braucht-bestaetigung, die Meldung nennt, was verloren geht) (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder fehlende Zuständigkeit/Recht (ApiErrorBody, code forbidden)
404unbekanntes Objekt, unbekanntes, archiviertes oder objektfremdes Konto — dieselbe Meldung (ApiErrorBody, code not_found)
409bereits-brennstoffkonto oder konto-gebucht — Konto mit Buchungen wird nicht umgestellt (ApiErrorBody, code conflict)

POST/api/objekt/{id}/brennstoffkonto/aufheben

Hebt das Brennstoffkonto des Objekts auf: die Markierung endet, das Konto geht auf seinen gespeicherten Ausgangszustand zurück (`bestaetigt: true` ist Pflicht, wenn es dadurch wieder umlagefähig wird oder einen Schlüssel erhält). Ein inzwischen gebuchtes Konto bleibt wie es ist. Der Idempotency-Key kommt vom Aufrufer.

operationId: hebeBrennstoffkontoAuf · Auth: bearerAuth

Request-Body (Pflicht): application/json → BrennstoffkontoAufhebenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Brennstoffkonto aufgehoben (BrennstoffkontoAufgehobenResponse)BrennstoffkontoAufgehobenResponse
400ungültige Eingabe oder fehlende Bestätigung (umstellung-braucht-bestaetigung) (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder fehlende Zuständigkeit/Recht (ApiErrorBody, code forbidden)
404unbekanntes Objekt oder das Objekt hat kein Brennstoffkonto (ApiErrorBody, code not_found)

GET/api/objekt/{id}/buchungsperioden

Liest Stand und Protokoll der festschreibbaren Buchungsperioden eines Objekts: Schalter (eigener und Mandanten-Vorgabe, aktiv), Wirtschaftsjahr-Beginn, je Festschreibung ob sie gilt oder geöffnet ist (bei Öffnung Grund, wer, wann) und die Journalsätze, die zwischen Öffnung und Neu-Festschreiben mit Datum in der Periode gebucht wurden. Mit format=export kommt dieselbe Antwort als deterministische JSON-Datei (content-disposition attachment, gleiche Daten ergeben gleiche Bytes). Nur Journalsätze: offene Posten und Sollstellungen sind nicht gesperrt.

operationId: getObjektBuchungsperioden · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
formatqueryneinexport
StatusBedeutungBody
200Stand und Protokoll (BuchungsperiodenResponse); mit format=export als Datei-DownloadBuchungsperiodenResponse
400unbekannter Query-Parameter oder format ungleich export (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt, fremder Mandant ODER nicht zuständig (ApiErrorBody, code not_found)

POST/api/objekt/{id}/buchungsperioden/festschreibung

Schreibt die nächste Buchungsperiode eines Objekts fest (Wirtschaftsjahr des Objekts, lückenlos) oder schreibt eine geöffnete Periode mit genau ihrem Zeitraum neu fest. Nur ein Mensch; das Objekt kommt aus dem Pfad.

operationId: festschreibeObjektBuchungsperiode · Auth: bearerAuth

Request-Body (optional): application/json → BuchungsperiodeFestschreibungRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200die geschriebene Festschreibung (BuchungsperiodeFestschreibungResponse)BuchungsperiodeFestschreibungResponse
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder fehlendes Recht — nur ein Mensch (ApiErrorBody, code forbidden)
404Objekt unbekannt, fremder Mandant ODER nicht zuständig (ApiErrorBody, code not_found)
409Schalter aus, Lücke, kein Wirtschaftsjahr-Beginn, Wirtschaftsjahr unklar, Periode noch nicht abgelaufen, paralleler Aufruf oder Periode gesperrt; Code in error.code (ApiErrorBody, code conflict)

POST/api/objekt/{id}/buchungsperioden/oeffnung

Öffnet eine festgeschriebene Buchungsperiode des Objekts mit Pflichtgrund (auch eine mittlere). Genau eine Öffnungszeile je Festschreibung, unveränderliches Protokoll. Nur ein Mensch; die Festschreibung muss zum Objekt im Pfad gehören.

operationId: oeffneObjektBuchungsperiode · Auth: bearerAuth

Request-Body (Pflicht): application/json → BuchungsperiodeOeffnungRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200die geschriebene Öffnung (BuchungsperiodeOeffnungResponse)BuchungsperiodeOeffnungResponse
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder fehlendes Recht — nur ein Mensch (ApiErrorBody, code forbidden)
404Objekt oder Festschreibung unbekannt, fremder Mandant ODER nicht zuständig (ApiErrorBody, code not_found)
409Periode ist bereits geöffnet; Code in error.code (ApiErrorBody, code conflict)

GET/api/objekt/{id}/check

Plausi-Gate: prüft die Gesundheit/Vollständigkeit eines Objekts (Struktur, Flächen-Pflichtwerte §20 NMV, MEA-Rahmen) und liefert Flächensummen je Gebäude/Objekt als AGGREGAT — ein Soll-Abgleich findet nicht statt, das Schema trägt keine Soll-Fläche.

operationId: checkObjekt · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
asOfqueryneinstring(date)Stichtag YYYY-MM-DD, gegen den die Attribut-Scheiben gemessen werden (Default: heute UTC).
StatusBedeutungBody
200Plausi-Ergebnis (ObjektCheckResponse)ObjektCheckResponse
400keine UUID ODER ungültiger asOf (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel)

GET/api/objekt/{id}/eigentum

Liest das Eigentum eines Objekts zum Stichtag, gruppiert je Einheit, mit Anteilssumme und Befund `anteilssumme_ungleich_10000`. Pflicht: Query `stichtag` (YYYY-MM-DD, keine Server-Uhr). Optional `einheit` (nur diese Einheit) und `historie` (1/true: auch abgelaufene und künftige Zeilen; `istGegenwart` markiert die am Stichtag wirksamen). Die Zustellanschrift steht nie in der Antwort, nur das Kennzeichen `hatZustellanweisung`.

operationId: listObjektEigentum · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
stichtagqueryjastring(date)
einheitqueryneinstring(uuid)
historiequerynein0 | 1 | true | false
StatusBedeutungBody
200das Eigentum je Einheit (EigentumListeResponse)EigentumListeResponse
400keine UUID, `stichtag` fehlt oder ist kein Kalendertag, `einheit` keine UUID, `historie` unbekannt (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt oder Einheit unbekannt, fremder Mandant ODER Einheit gehört nicht zum Objekt (ApiErrorBody, code not_found) — alle Fälle identisch

GET/api/objekt/{id}/hausgeld

Liest die gestellten Hausgeld-Sollstellungen eines Objekts für EIN Wirtschaftsjahr (§ 28 Abs. 1 WEG). Vorschuss und quittierte Differenz stehen NEBENEINANDER — die Differenz ersetzt den Vorschuss nicht.

operationId: listObjektHausgeldSoll · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
jahrqueryjaintegerDas WIRTSCHAFTSJAHR — bei einem Rumpfjahr nicht das Kalenderjahr der Fälligkeit. Pflicht und ohne Default: eine Liste über ALLE Jahre vermischte zwei Wirtschaftspläne, und genau diese Achse trennt sie. Ein Jahr ohne Soll ergibt eine LEERE Liste, keinen Fehler.
StatusBedeutungBody
200die gestellten Soll-Zeilen des Objekts im gefragten Wirtschaftsjahr (HausgeldSollListResponse)HausgeldSollListResponse
400keine UUID ODER `jahr` fehlt/ist keine ganze Zahl (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/objekt/{id}/hausgeld/differenz

Quittiert rückwirkende Differenz-Vorschläge eines Soll-Laufs — der GEFÜHRTE Schritt. Schuldner und Plan-Version werden vom VORSCHLAG übernommen und nicht neu abgeleitet.

operationId: quittiereObjektHausgeldDifferenz · Auth: bearerAuth

Request-Body (Pflicht): application/json → HausgeldDifferenzRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200die gebuchten Differenz-Positionen (HausgeldDifferenzResponse)HausgeldDifferenzResponse
400ungültige Eingabe, leerer Stapel ODER fehlendes quittiertVon/quittiertAm (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409derselbe Vorschlag ist bereits quittiert (ApiErrorBody, code conflict)

POST/api/objekt/{id}/hausgeld/soll

Stellt das Hausgeld eines Objekts für ein Wirtschaftsjahr fällig — je Einheit und Monat eine Sollstellung. Rückwirkende Differenzen liefert der Lauf als VORSCHLAG und bucht sie NICHT (Owner-Leitplanke 2026-08-20).

operationId: stelleObjektHausgeldSoll · Auth: bearerAuth

Request-Body (Pflicht): application/json → HausgeldSollRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200der Lauf samt gestellten Positionen und ungebuchten Differenz-Vorschlägen (HausgeldSollResponse)HausgeldSollResponse
400ungültige Eingabe, unbekannter/fehlender Geldkreis ODER ein Buchungs-Gate der Freigabe hat abgelehnt (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409der Geldkreis dieses Laufs ist nicht weg_hausgeld, ODER derselbe Lauf/Monat ist bereits gestellt (ApiErrorBody, code conflict). Ein Miet-Soll läuft über den Sollstellungslauf, nicht hierüber.

GET/api/objekt/{id}/hausgeld/zahlung

Verteilt eine Zahlung auf die Hausgeld- und die Rücklagen-Seite EINER gestellten Sollstellung (S12-T05-Policy, Präzedenz Objekt > Tenant > Default). SCHREIBT NICHTS: die Soll-Zeile ist danach zeichengleich.

operationId: ordneObjektHausgeldZahlungZu · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
jahrqueryjaintegerDie WIRTSCHAFTSJAHR-Achse des Lauf-Scopes. Ausdrücklich KEIN Filter: die sollstellungId ist innerhalb von (Mandant, Objekt) bereits eindeutig, und beide Achsen sind Prädikat der Abfrage. Die gelieferte Position trägt ihre Herkunft (Monat, Plan-Version, Rechtsgrundlage) selbst.
sollstellungIdqueryjastring(uuid)Die Zeile aus `hausgeld_sollstellungen`, gegen die verteilt wird. Die Forderung wird GELESEN, nie vom Aufrufer behauptet.
centsqueryjastringDer eingegangene Betrag in ganzen Cents als ZIFFERN-STRING (INV-MONEY-01, nie ein Float). Negativ ist fail-loud.
StatusBedeutungBody
200die Aufteilung samt angewandter Regel und der UNVERÄNDERTEN Soll-Position (HausgeldZahlungResponse)HausgeldZahlungResponse
400keine UUID, fehlender/ungültiger Betrag ODER eine gesetzte, unbekannte Zuordnungs-Einstellung (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt/Sollstellung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/objekt/{id}/kontenrahmen-schluessel

Zieht für die Konten, die ein Musterkontenrahmen VOR #5553 am Objekt angelegt hat, die fehlenden Umlageschlüssel und deren Verknüpfungen nach (#5638).

operationId: backfillKontenrahmenSchluessel · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200nachgezogen: { propertyId, angelegteSchluessel[] mit { art, allocationKeyId, name }, verknuepfteKonten[] mit { glAccountId, accountNo, art, allocationKeyId } }. Atomar (EIN Kommando) und zustandsidempotent: ein zweiter Aufruf mit frischem Key legt keinen zweiten Schlüssel an und liefert leere Listen, derselbe Header `Idempotency-Key` ist ein Replay des Erst-Ergebnisses; ein vorhandener aktiver, objektweiter Schlüssel derselben Art wird wiederverwendet, Konten mit gepflegtem Schlüssel bleiben unangetastet. Das Einspielen des Rahmens selbst bleibt ein Replay.
400keine UUID ODER Objekt archiviert (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/objekt/{id}/reactivate

Nimmt die Archiv-Kaskade eines Objekts zurück (#445): Objekt + 1:1-Buchungskreis werden aktiv, dazu genau die Gebäude/Einheiten/Abrechnungskreise, die DIESELBE Kaskade stillgelegt hat.

operationId: reactivateObjekt · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200reaktiviert (ObjektReactivateResponse). Vorher EINZELN archivierte Kinder bleiben archiviert. Ein bereits aktives Objekt liefert alreadyActive=true ohne Write. Wiederholungssicher nur über denselben Header `Idempotency-Key`.
400keine UUID ODER Kaskade zu groß (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409eine zurückgeholte Einheit trüge eine Nummer, die im Objekt inzwischen an eine aktive Einheit vergeben ist (ApiErrorBody, code conflict, #5534) — nichts wurde reaktiviert.

GET/api/objekt/{id}/ruecklagen

Liest den Katalog der Rücklagen eines Objekts (älteste zuerst) mit Ist-Bestand zum Stichtag und dem Kennzeichen `aufgeloest`. Aufgelöste Rücklagen bleiben im Katalog.

operationId: listObjektRuecklagen · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
stichtagqueryneinstring(date)Stichtag (INKLUSIV, YYYY-MM-DD) für den Ist-Bestand. Ohne Angabe ist `istBestand` null — der Server liest keine Uhr.
StatusBedeutungBody
200der Katalog des Objekts (RuecklagenKatalogResponse)RuecklagenKatalogResponse
400keine UUID ODER `stichtag` ist kein Kalendertag (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) — beide Fälle identisch

POST/api/objekt/{id}/ruecklagen

Legt eine Rücklage des Objekts samt Kontenpaar an (passives Rücklagenkonto, aktives Bestandskonto). Die Erhaltungsrücklage gibt es je Objekt genau einmal (§ 19 Abs. 2 Nr. 4 WEG). Der Idempotenz-Schlüssel kommt vom Aufrufer (Header). Ein Änderungs- oder Löschweg existiert bewusst nicht.

operationId: legeObjektRuecklageAn · Auth: bearerAuth

Request-Body (Pflicht): application/json → RuecklageAnlegenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200die angelegte Rücklage samt Kontenpaar; bei Wiederholung mit demselben Idempotenz-Schlüssel `ausgang` bereits_ausgefuehrt (RuecklageAnlegenResponse)RuecklageAnlegenResponse
400keine UUID, ungültige Eingabe (z. B. Zweckbindung fehlt bei `zweckgebunden`) oder Untergruppe/Konto gehört nicht zum Objekt (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — beide Fälle identisch
409das Objekt führt bereits eine Erhaltungsrücklage, ist kein WEG-Objekt oder ein Konto ist schon einer Rücklage zugeordnet (ApiErrorBody, code conflict)

GET/api/objekt/{id}/ruecklagen/abstimmung

Stimmt das aktive Bestandskonto gegen das passive Rücklagenkonto je Rücklage und gesamt zum Stichtag ab (Befunde: fehlende Umbuchung Giro → Festgeld, Konto ohne Gegenstück).

operationId: getObjektRuecklagenAbstimmung · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
stichtagqueryjastring(date)Stichtag (INKLUSIV, YYYY-MM-DD). Pflicht und ohne Default: der Server liest keine Uhr.
StatusBedeutungBody
200die Abstimmung des Objekts (RuecklagenAbstimmungResponse)RuecklagenAbstimmungResponse
400keine UUID ODER `stichtag` fehlt/ist kein Kalendertag (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) — beide Fälle identisch
409Konto mehreren Rücklagen zugeordnet, Fremdwährung im Konto oder Beschluss ohne lesbaren Status (ApiErrorBody, code conflict)

POST/api/objekt/{id}/ruecklagen/aufloesung

Löst eine Rücklage auf — nur gegen Aufhebungsbeschluss und nur bei Saldo 0,00 €. Das Konto bleibt, die Rücklage bleibt im Katalog lesbar (`aufgeloest` true); danach wird nichts mehr auf sie gebucht.

operationId: loeseObjektRuecklageAuf · Auth: bearerAuth

Request-Body (Pflicht): application/json → RuecklagenAufloesungRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200die Auflösung; bei Wiederholung mit demselben Idempotenz-Schlüssel `ausgang` bereits_ausgefuehrt (RuecklagenAufloesungResponse)RuecklagenAufloesungResponse
400keine UUID, ungültige Eingabe oder eine Referenz (Beschluss, Konto) ist am Objekt nicht verwendbar (ApiErrorBody, code invalid_request) — auch: Aufhebungsbeschluss fehlt
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt oder Rücklage unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — beide Fälle identisch
409Zustandskonflikt (ApiErrorBody, code conflict): der Saldo ist nicht 0,00 € (erst zurückführen oder entnehmen) oder die Rücklage ist bereits aufgelöst

POST/api/objekt/{id}/ruecklagen/buchung

Bucht eine Bewegung auf dem passiven Rücklagenkonto: Betrag > 0 ist eine Zuführung, Betrag < 0 eine Entnahme (`betragCents` "-5000" = Entnahme von 50,00 €). Eine Entnahme braucht `zweck`, bauliche_veraenderung und modernisierung zusätzlich `umwidmungsBeschlussRef`. Dieselbe Zuführungs-Periode wird nur EINMAL gebucht: die zweite Antwort trägt `ausgang` bereits_gebucht und erzeugt keinen zweiten Journalsatz. Korrektur = Gegenbewegung mit `korrigiertBewegungId`.

operationId: bucheObjektRuecklagenBewegung · Auth: bearerAuth

Request-Body (Pflicht): application/json → RuecklagenBuchungRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200die Bewegung, `ausgang` gebucht oder bereits_gebucht (gleiche Periode oder wiederholter Idempotenz-Schlüssel) (RuecklagenBuchungResponse)RuecklagenBuchungResponse
400keine UUID, ungültige Eingabe oder eine Referenz (Beschluss, Konto) ist am Objekt nicht verwendbar (ApiErrorBody, code invalid_request) — auch: Betrag 0, Zweck fehlt oder unbekannt, Feld passt nicht zur Richtung, Buchungsdatum ungültig oder in der Zukunft
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt oder Rücklage unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — beide Fälle identisch
409Zustandskonflikt (ApiErrorBody, code conflict): die Rücklage ist aufgelöst, die Entnahme übersteigt den Bestand, der Zweck verlangt einen Umwidmungsbeschluss, das Bestandskonto lautet nicht auf die GdWE oder die Korrektur ist unzulässig

POST/api/objekt/{id}/ruecklagen/rueckfuehrung

Führt eine Zwischenfinanzierung in voller Höhe in die Rücklage zurück. Je Zwischenfinanzierung gibt es genau eine Rückführung.

operationId: rueckfuehreObjektRuecklageZwischenfinanzierung · Auth: bearerAuth

Request-Body (Pflicht): application/json → RuecklagenRueckfuehrungRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200die Rückführung; bei Wiederholung mit demselben Idempotenz-Schlüssel `ausgang` bereits_ausgefuehrt (RuecklagenRueckfuehrungResponse)RuecklagenRueckfuehrungResponse
400keine UUID, ungültige Eingabe oder eine Referenz (Beschluss, Konto) ist am Objekt nicht verwendbar (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt, Rücklage oder Zwischenfinanzierung unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — alle Fälle identisch
409die Zwischenfinanzierung ist bereits zurückgeführt oder die Rücklage ist aufgelöst (ApiErrorBody, code conflict)

POST/api/objekt/{id}/ruecklagen/soll

Legt eine Soll-Zuführung einer Rücklage fest und bindet sie an einen Beschluss-Teilgegenstand. Betrag in Cent als Ziffern-String (> 0). Eine aufgelöste Rücklage nimmt kein Soll mehr an.

operationId: legeObjektRuecklagenSollFest · Auth: bearerAuth

Request-Body (Pflicht): application/json → RuecklagenSollRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200die festgelegte Soll-Zuführung; bei Wiederholung mit demselben Idempotenz-Schlüssel `ausgang` bereits_ausgefuehrt (RuecklagenSollResponse)RuecklagenSollResponse
400keine UUID, ungültige Eingabe oder eine Referenz (Beschluss, Konto) ist am Objekt nicht verwendbar (ApiErrorBody, code invalid_request) — auch: Beschluss-Referenz fehlt oder Betrag nicht positiv
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt oder Rücklage unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — beide Fälle identisch
409die Rücklage ist aufgelöst (ApiErrorBody, code conflict)

GET/api/objekt/{id}/ruecklagen/soll-ist

Liest Soll, Ist und Rückstand der Rücklagen eines Objekts zum Stichtag. Ohne `ruecklageId` alle Rücklagen des Objekts, nach Rücklagen-Id sortiert.

operationId: listObjektRuecklagenSollIst · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
stichtagqueryjastring(date)Stichtag (INKLUSIV, YYYY-MM-DD). Pflicht und ohne Default: der Server liest keine Uhr.
ruecklageIdqueryneinstring(uuid)Nur diese Rücklage. Gehört sie nicht zum Objekt (oder ist unbekannt), ist das ein 404 not_found.
StatusBedeutungBody
200Soll/Ist je Rücklage (RuecklagenSollIstResponse)RuecklagenSollIstResponse
400keine UUID ODER `stichtag` fehlt/ist kein Kalendertag ODER `ruecklageId` ist keine UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt ODER fremder Tenant ODER `ruecklageId` unbekannt/fremd (ApiErrorBody, code not_found) — alle Fälle identisch

GET/api/objekt/{id}/ruecklagen/wiedervorlagen

Liest die offenen Zwischenfinanzierungen eines Objekts (noch nicht zurückgeführt) mit Fälligkeit, Betrag und Beschluss-Referenz, nach Fälligkeit geordnet. `ueberfaellig` ist eine Auskunft, keine Sperre.

operationId: listObjektRuecklagenWiedervorlagen · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
bisqueryjastring(date)Bezugstag (YYYY-MM-DD): überfällig ist, was VOR diesem Tag fällig war. Pflicht und ohne Default: der Server liest keine Uhr.
StatusBedeutungBody
200die offenen Wiedervorlagen (RuecklagenWiedervorlagenResponse)RuecklagenWiedervorlagenResponse
400keine UUID ODER `bis` fehlt/ist kein Kalendertag (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found) — beide Fälle identisch

POST/api/objekt/{id}/ruecklagen/zins

Erfasst einen Zinsertrag einer Rücklage: brutto wird in Kapitalertragsteuer (25 %), Solidaritätszuschlag (5,5 % auf die Steuer) und netto aufgeteilt und gebucht. Ein negativer Zins (Verwahrentgelt) hat hier keinen Weg. Derselbe Aufruf (Idempotenz-Schlüssel) ergibt `ausgang` bereits_gebucht ohne zweite Bewegung.

operationId: erfasseObjektRuecklagenZins · Auth: bearerAuth

Request-Body (Pflicht): application/json → RuecklagenZinsRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200der Zinsertrag, `ausgang` gebucht oder bereits_gebucht (RuecklagenZinsResponse)RuecklagenZinsResponse
400keine UUID, ungültige Eingabe oder eine Referenz (Beschluss, Konto) ist am Objekt nicht verwendbar (ApiErrorBody, code invalid_request) — auch: Bruttozins nicht positiv
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt oder Rücklage unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — beide Fälle identisch
409Zustandskonflikt (ApiErrorBody, code conflict): die Rücklage ist aufgelöst, am Zins-Konto hängt ein Verteilerschlüssel, die Summenprobe schlägt fehl oder der Replay weicht vom gespeicherten Satz ab

POST/api/objekt/{id}/ruecklagen/zwischenfinanzierung

Entnimmt der Rücklage kurzfristig Liquidität gegen Beschluss (Zwischenfinanzierung) und legt eine Wiedervorlage an. `beschlussRef` ist Pflicht; die Frist kommt aus der Policy (Objekt vor Mandant vor 3 Monaten) und ist mit `fristMonate` überschreibbar.

operationId: entnimmObjektRuecklageZwischenfinanzierung · Auth: bearerAuth

Request-Body (Pflicht): application/json → RuecklagenZwischenfinanzierungRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200die Zwischenfinanzierung mit Fälligkeit; bei Wiederholung mit demselben Idempotenz-Schlüssel `ausgang` bereits_ausgefuehrt (RuecklagenZwischenfinanzierungResponse)RuecklagenZwischenfinanzierungResponse
400keine UUID, ungültige Eingabe oder eine Referenz (Beschluss, Konto) ist am Objekt nicht verwendbar (ApiErrorBody, code invalid_request) — auch: Beschluss-Referenz fehlt oder Frist ungültig
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt oder Rücklage unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — beide Fälle identisch
409Zustandskonflikt (ApiErrorBody, code conflict): die Rücklage ist aufgelöst, der Bestand oder die Deckung des Beschlusses reicht nicht, oder der Beschluss trägt die Entnahme nicht

GET/api/objekt/{id}/sev-auszahlung

Vorschlag der Auszahlung des Mietüberschusses je SEV-Mandat des Objekts für einen Monat (Stichtag Monatsletzter): Saldo des Verrechnungskontos, Sockel, Auszahlungsbetrag und Empfänger-IBAN — oder das Mandat als übersprungen mit Grund (Rhythmus, offene Posten, kein Überschuss, bereits ausgezahlt, ohne Auszahlungskonto) — samt vorschlagHash, den ein Mensch mit POST bestätigt. Schreibt nichts.

operationId: getSevAuszahlungVorschlag · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
monatqueryjastringMonat JJJJ-MM. Pflicht. Fehlend oder ungültig ⇒ 400.
StatusBedeutungBody
200Vorschlag (SevAuszahlungVorschlagResponse). ACHTUNG PII: `auszahlungen[].empfaengerIban` ist eine IBAN (Kategorie bankdaten) — der Empfänger, den der Mensch vor dem Stellen sehen muss.SevAuszahlungVorschlagResponse
400fehlender oder ungültiger Monat (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403nicht zuständig für das Objekt (ApiErrorBody, code forbidden)
404Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/objekt/{id}/sev-auszahlung

Stellt die Auszahlungen des Mietüberschusses eines Monats nach Bestätigung des gesehenen Vorschlags (vorschlagHash): je Mandat der Entnahme-Satz auf dem Eigentümer-Verrechnungskonto und EIN Zahlungsauftrag awaiting-approval an das Privatkonto des Eigentümers, abgehend vom angegebenen Objekt-Bankkonto. Ausgeführt wird erst nach der bestehenden Zahlungsfreigabe (Vier-Augen). Idempotent je Mandat und Monat.

operationId: stelleSevAuszahlungen · Auth: bearerAuth

Request-Body (Pflicht): application/json → SevAuszahlungStellenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Die gestellten Auszahlungen samt Zahlungsaufträgen und die übersprungenen Mandate (SevAuszahlungStellenResponse)SevAuszahlungStellenResponse
400ungültige Eingabe (u. a. Zusatzfeld wie propertyId oder ein Betrag) ODER das Bankkonto ist kein Konto dieses Objekts (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Mensch als Akteur ODER nicht zuständig für das Objekt (ApiErrorBody, code forbidden)
404Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409Vorschlag geändert (vorschlagHash), gleichzeitiger Lauf derselben Periode ODER Idempotency-Key an eine andere Eingabe gebunden (ApiErrorBody, code conflict)

GET/api/objekt/{id}/sev-eigentuemerwechsel

Befunde „Eigentümer gewechselt, Mandat läuft weiter" eines Objekts für einen Monat: je SEV-Mandat, dessen Person an mindestens einem Tag, an dem das Mandat wirkt, nicht (mehr) Eigentümerin der Wohnung ist — mit dem ersten solchen Tag und den Eigentümern an diesem Tag. Der Mietgutschrift-Lauf schreibt diesen Monat nicht an den bisherigen Eigentümer gut. Schreibt nichts.

operationId: getSevEigentuemerwechselBefunde · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
monatqueryjastringMonat JJJJ-MM. Pflicht. Fehlend oder ungültig ⇒ 400.
StatusBedeutungBody
200Die Befunde (SevEigentuemerwechselBefundeResponse)SevEigentuemerwechselBefundeResponse
400fehlender oder ungültiger Monat (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403nicht zuständig für das Objekt (ApiErrorBody, code forbidden)

GET/api/objekt/{id}/sev-garantie-abstimmliste

Abstimmliste der Garantiemieten eines Objekts über einen Zeitraum: je Wohnung mit Garantie- oder Mindestmiete die garantierte gegen die erzielte Miete, die Differenz, die Gutschrift an den Eigentümer und die Belastung des Garantiegebers, dazu die Summen je Spalte. Gerechnet aus dem Bestand — unabhängig davon, ob die Gutschrift schon vorgelegt oder freigegeben ist. Schreibt nichts.

operationId: ladeSevGarantieAbstimmliste · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
monatequeryjastringDer Zeitraum: lückenlose Monate JJJJ-MM, kommagetrennt in Kalenderfolge (z. B. 2025-03,2025-04), höchstens zwölf. Fehlend, formwidrig oder lückenhaft ⇒ 400.
StatusBedeutungBody
200Die Abstimmliste (SevGarantieAbstimmlisteResponse)SevGarantieAbstimmlisteResponse
400fehlender, formwidriger oder lückenhafter Zeitraum ODER Basis kalt ohne getrennt gebuchte Kaltmiete (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt, fremder Tenant ODER nicht zuständig (ApiErrorBody, code not_found)

GET/api/objekt/{id}/sev-hausgeld

Vorschlag der Hausgeldzahlung aus der vereinnahmten Miete für ein Objekt und einen Monat — je SEV-Mandat die offenen Hausgeld-Posten (Rückstände im Mandatszeitraum eingeschlossen, Sonderumlage nur bei Vereinbarung), das Guthaben, die Deckung und jede Unterdeckung als Befund (Einheit, Betrag, Regel), dazu übersprungene Mandate mit Grund, samt vorschlagHash, den ein Mensch mit POST bestätigt. Schreibt nichts.

operationId: getSevHausgeldVorschlag · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
monatqueryjastringMonat JJJJ-MM. Pflicht. Fehlend oder ungültig ⇒ 400.
StatusBedeutungBody
200Vorschlag (SevHausgeldVorschlagResponse)SevHausgeldVorschlagResponse
400fehlender oder ungültiger Monat (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt, fremder Tenant ODER nicht zuständig (ApiErrorBody, code not_found)

POST/api/objekt/{id}/sev-hausgeld

Monatslauf eines Objekts nach der Mietgutschrift in zwei Runden über diese eine Route. Runde 1 (Body mit verguetungen: je Mandat mandatId und vorschlagHash des gesehenen Vergütungsvorschlags) prüft alle Vergütungs-Hashes vor der ersten Buchung, bucht die Vergütungen und antwortet mit hausgeldStatus 'nicht_bestaetigt' und dem Hausgeld-Vorschlag, der nach der Vergütung gilt, samt vorschlagHash. Runde 2 (Body mit diesem vorschlagHash) bezahlt das Hausgeld aus der vereinnahmten Miete: Belastung des Verrechnungskontos (Art hausgeld_an_weg) und Ausgleich der Hausgeld-Sollstellung bzw. Ausgabe an den Kreditor (Festbetrag); danach die Zuführung zur Sonderrücklage. Bei Unterdeckung gilt die Regel des Mandats (einziehen / nicht zahlen / aus der Sonderrücklage). Die Mietgutschrift des Monats muss freigegeben sein. Eine Wiederholung mit demselben Idempotency-Key bucht nichts doppelt.

operationId: zahleSevHausgeld · Auth: bearerAuth

Request-Body (Pflicht): application/json → SevHausgeldZahlenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Laufergebnis (SevHausgeldZahlungResponse)SevHausgeldZahlungResponse
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Mensch als Akteur ODER nicht zuständig für das Objekt (ApiErrorBody, code forbidden)
404Objekt unbekannt, fremder Tenant ODER ein Mandat in verguetungen gehört nicht zu diesem Objekt (ApiErrorBody, code not_found)
409Vorschlag geändert (Vergütungs- oder Hausgeld-vorschlagHash, auch: bereits bezahlt), Mietgutschrift des Monats nicht freigegeben, gleichzeitiger Lauf ODER Idempotency-Key an eine andere Eingabe gebunden (ApiErrorBody, code conflict)

POST/api/objekt/{id}/sev-mietgutschrift

Legt die monatliche Mietgutschrift der SEV-Mandate des Objekts für eine Periode als Vorschläge vor — Grundlage je Vereinbarung die eingegangene Miete (Buchungsdatum im Monat), die sollgestellte Miete oder ein Festbetrag; eine Periode aus mehreren Monaten ist die Summe der Einzelmonate. Idempotent je Mandat und Monat: ein zweiter Lauf legt nichts vor, eine nachträgliche Zahlung ergibt eine Nachgutschrift über die Differenz. Mandate ohne Mietinkasso werden übersprungen und ausgewiesen.

operationId: legeSevMietgutschriftenVor · Auth: bearerAuth

Request-Body (Pflicht): application/json → SevMietgutschriftLaufRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Ergebnis des Laufs (SevMietgutschriftLaufResponse)SevMietgutschriftLaufResponse
400ungültige Eingabe ODER keine lückenlose Monatsfolge (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403nicht zuständig für das Objekt ODER kein Schreibrecht (ApiErrorBody, code forbidden)
409Reihenfolge-Sperre: die Miet-Sollstellung eines Monats ist für das Objekt nicht abgeschlossen — die Meldung nennt den fehlenden Schritt ODER Idempotency-Key an eine andere Eingabe gebunden (ApiErrorBody, code conflict)

GET/api/objekt/{id}/sonderumlage

Listet die Sonderumlagen eines Objekts, aufsteigend nach Fälligkeit, mit Zweck, Gesamtbetrag, Zahlweise, Raten-Fälligkeiten, Kennzeichen `gestellt` und der Tatsache `schluesselAbweichung`. Ein Objekt ohne Sonderumlagen ist eine leere Liste.

operationId: listeObjektSonderumlagen · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200die Sonderumlagen des Objekts (SonderumlageListeResponse)SonderumlageListeResponse
400keine UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — beide Fälle identisch

POST/api/objekt/{id}/sonderumlage

Legt eine Sonderumlage mit Beschluss-Teilgegenstand, Zweck, Fälligkeit, Zahlweise (Einmalzahlung oder Ratenplan) und Gesamtbetrag in Cent als Ziffern-String an; das Sonderkonto entsteht mit. Der Idempotenz-Schlüssel kommt vom Aufrufer (Header). Ein Änderungs- oder Löschweg existiert bewusst nicht: eine Korrektur ist ein Zweitbeschluss mit eigener Sonderumlage.

operationId: legeObjektSonderumlageAn · Auth: bearerAuth

Request-Body (Pflicht): application/json → SonderumlageAnlegenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200die angelegte Sonderumlage mit Sonderkonto, Raten und Warnungen; bei Wiederholung mit demselben Idempotenz-Schlüssel `ausgang` bereits_ausgefuehrt (SonderumlageAnlegenResponse)SonderumlageAnlegenResponse
400keine UUID oder ungültige Eingabe (ApiErrorBody, code invalid_request) — auch: Beschluss-Referenz fehlt oder gehört zu keinem Beschluss des Objekts, Zweck oder Fälligkeit fehlt, Betrag nicht positiv, Ratenplan widersprüchlich
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — beide Fälle identisch
409am Beschluss-Teilgegenstand hängt schon eine Sonderumlage, oder der Schlüsselabgleich ist auf blockierend gestellt (ApiErrorBody, code conflict)

GET/api/objekt/{id}/sonderumlage/soll

Liest das gestellte Soll EINER Sonderumlage je Einheit und Rate mit Schuldnern (Eigentümer am Fälligkeitstag, Innenverhältnis in Zehntausendsteln). Pflicht: Query `sonderumlageId`. Solange nicht sollgestellt, ist `einheiten` leer.

operationId: leseObjektSonderumlageSoll · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
sonderumlageIdqueryjastring(uuid)
StatusBedeutungBody
200das Soll der Sonderumlage (SonderumlageSollResponse)SonderumlageSollResponse
400keine UUID oder `sonderumlageId` fehlt bzw. ist keine UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt oder Sonderumlage unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — alle Fälle identisch

POST/api/objekt/{id}/sonderumlage/soll

Stellt eine Sonderumlage Soll: Verteilung nach Miteigentumsanteil auf die Einheiten, Teilung in Raten, Schuldner je Rate ist der Eigentümer am Fälligkeitstag. Append-only: ein zweiter Aufruf stellt nichts neu und antwortet mit `ausgang` bereits_ausgefuehrt (Erfolg). Der Idempotenz-Schlüssel kommt vom Aufrufer (Header).

operationId: stelleObjektSonderumlageSoll · Auth: bearerAuth

Request-Body (Pflicht): application/json → SonderumlageSollStellenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200das gestellte Soll je Einheit; `ausgang` ausgefuehrt, oder bereits_ausgefuehrt, wenn das Soll schon stand (SonderumlageSollStellenResponse)SonderumlageSollStellenResponse
400keine UUID oder ungültige Eingabe (ApiErrorBody, code invalid_request) — auch: Beschluss-Referenz des abweichenden Schlüssels gehört zu keinem Beschluss des Objekts
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt oder Sonderumlage unbekannt ODER fremder Mandant (ApiErrorBody, code not_found) — alle Fälle identisch
409Zustandskonflikt (ApiErrorBody, code conflict): Pflichtinhalt des Beschlusses fehlt (Zweck, Fälligkeit oder Ratenplan), der Miteigentumsanteil fehlt an einer Einheit, eine Einheit hat am Fälligkeitstag keinen Eigentümer (Eigentümerlücke), der Lauf-Typ ist nicht verdrahtet oder der Schlüsselabgleich ist blockierend

POST/api/objekt/{id}/steuerpflichtige-erloeskonten

Zieht am Objekt die steuerpflichtigen Gegenkonten der Sollstellungs-Erlöskonten und das USt-Konto 1776 nach und hält den Stichtag der Sollversteuerung fest (#5992).

operationId: ensureSteuerpflichtigeErloeskonten · Auth: bearerAuth

Request-Body (Pflicht): application/json

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200nachgezogen: { propertyId, gueltigAb (wirksamer Stichtag oder null), created[], skipped[] } mit { accountNo, name }, unvertraeglich[] mit { accountNo, befund }. Wiederholung ist harmlos: vorhandene Konten bleiben unangetastet, ein Stichtag wandert nie. Ist ein vorhandenes Konto gleicher Nummer nicht exakt das der Werksvorlage (Kontoart, DATEV 8400/1776, USt-Satz), steht es in unvertraeglich und es wird KEIN Stichtag gesetzt.
400ungültige Eingabe ODER Objekt archiviert (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

GET/api/objekt/{id}/vermoegensbericht

Listet die abgelegten Vermögensberichts-Stände eines Objekts (§ 28 Abs. 4 WEG). Ältere Stände verschwinden NICHT (GoBD) — sie tragen ihre `standNr`, der jüngste Stichtag zuerst.

operationId: listObjektVermoegensberichtStaende · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
stichtagqueryneinstring(date)Grenzt auf EINEN Stichtag ein (`YYYY-MM-DD`). Ohne Angabe erscheinen alle Stichtage; ein Objekt ohne Stand ergibt eine LEERE Liste, keinen Fehler.
StatusBedeutungBody
200die abgelegten Stände des Objekts (VermoegensberichtStandListResponse)VermoegensberichtStandListResponse
400keine UUID ODER `stichtag` ist kein `YYYY-MM-DD` (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/objekt/{id}/vermoegensbericht

Erzeugt den Vermögensbericht eines Objekts zum Stichtag und legt ihn als NEUEN Stand ab. Der Idempotenz-Schlüssel kommt vom Aufrufer: zwei Aufrufe am selben Schlüssel ergeben GENAU EINEN Stand. Readiness- und Konsistenz-Befunde stehen in der Antwort.

operationId: legeObjektVermoegensberichtAb · Auth: bearerAuth

Request-Body (Pflicht): application/json → VermoegensberichtAblageRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200der abgelegte Stand samt Readiness- und Konsistenz-Befunden (VermoegensberichtAblageResponse)VermoegensberichtAblageResponse
400ungültige Eingabe ODER eine Fachablehnung des Rechenkerns — etwa eine Zusatzposition ohne Beleg-Referenz (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409zu diesem Idempotenz-Schlüssel ist der Bericht bereits abgelegt — es entsteht KEIN zweiter Stand (ApiErrorBody, code conflict). Der vorhandene Stand ist über die Liste lesbar.

GET/api/objekt/{id}/versammlung

Liest die Versammlungen (und Umlaufbeschlüsse) eines Objekts, jüngstes Versammlungsdatum zuerst.

operationId: listObjektVersammlungen · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Versammlungen des Objekts (VersammlungListResponse)VersammlungListResponse
400keine UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/objekt/{id}/versammlung

Legt eine Versammlung oder einen Umlaufbeschluss an. Einladungsfrist unter 3 Wochen: Hinweis im Ergebnis und Begründung Pflicht, keine Sperre.

operationId: legeObjektVersammlungAn · Auth: bearerAuth

Request-Body (Pflicht): application/json → VersammlungAnlegenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
201angelegte Versammlung samt Hinweisen zur Einladungsfrist (VersammlungSchreibResponse)VersammlungSchreibResponse
400ungültige Eingabe, Begründung bei unterschrittener Einladungsfrist fehlt (einladungsfrist-begruendung-fehlt) ODER Umlaufbeschluss mit Einladung/Stimmprinzip (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder fehlendes Recht (ApiErrorBody, code forbidden)
404Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

GET/api/objekt/{id}/wirtschaftsplan

Listet die Versionen der Wirtschaftspläne eines Objekts (optional eines Wirtschaftsjahres). Ein Jahr ohne Plan ergibt eine LEERE Liste, keinen Fehler.

operationId: listObjektWirtschaftsplanVersionen · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
jahrqueryneinintegerNur dieses WIRTSCHAFTSJAHR.
StatusBedeutungBody
200die Versionen, Jahr und Version aufsteigend (WirtschaftsplanVersionenResponse)WirtschaftsplanVersionenResponse
400keine UUID ODER `jahr` ist keine ganze Zahl (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt ODER fremder Tenant — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel)

POST/api/objekt/{id}/wirtschaftsplan

Legt den Wirtschaftsplan eines Objekts für ein Wirtschaftsjahr als Version 1 an (lege_wirtschaftsplan_an). Geld ist ein Objekt {cents, currency}. Die Objekt-Id kommt ausschliesslich aus dem Pfad.

operationId: legeObjektWirtschaftsplanAn · Auth: bearerAuth

Request-Body (Pflicht): application/json → WirtschaftsplanAnlegenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200die angelegte Version 1 im Status entwurf (WirtschaftsplanVersionResponse)WirtschaftsplanVersionResponse
400ungültige Eingabe, unbekanntes Feld oder unzulässiges Wirtschaftsjahr (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt ODER fremder Tenant — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel)
409für Objekt und Jahr gibt es schon einen Plan — Änderungen laufen über den Entwurf als neue Version (ApiErrorBody, code conflict)

POST/api/objekt/{id}/wirtschaftsplan/beschluss

Beschließt eine Version im Status entwurf (beschliesse_wirtschaftsplan): prüft das Beschluss-Gate, bindet den Plan append-only an den tragenden Teil-Gegenstand und setzt ihn auf beschlossen. Ohne tragenden Beschluss bleibt der Plan Entwurf. Dieselbe Referenz noch einmal ist ein No-op (bereits_beschlossen). Die Objekt-Id kommt ausschliesslich aus dem Pfad.

operationId: beschliesseObjektWirtschaftsplan · Auth: bearerAuth

Request-Body (Pflicht): application/json → WirtschaftsplanBeschliessenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200der beschlossene Plan mit seiner Bindung (WirtschaftsplanBeschliessenResponse)WirtschaftsplanBeschliessenResponse
400ungültige Eingabe oder unbekanntes Feld (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt oder Plan unbekannt ODER fremder Tenant ODER Beschluss unbekannt (ApiErrorBody, code not_found)
409der Beschluss trägt nicht, der Plan ist kein Entwurf, es gibt eine neuere Version oder er ist schon unter anderer Referenz beschlossen (ApiErrorBody, code conflict)

POST/api/objekt/{id}/wirtschaftsplan/entwurf

Bearbeitet den Entwurf: legt eine NEUE Version mit der vollständigen Positionsliste an (bearbeite_wirtschaftsplan_entwurf); die alte Version bleibt unverändert.

operationId: bearbeiteObjektWirtschaftsplanEntwurf · Auth: bearerAuth

Request-Body (Pflicht): application/json → WirtschaftsplanEntwurfRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200die neue Version im Status entwurf (WirtschaftsplanVersionResponse)WirtschaftsplanVersionResponse
400ungültige Eingabe, unbekanntes Feld oder unzulässiges Wirtschaftsjahr (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt ODER fremder Tenant ODER für das Jahr gibt es noch keinen Plan (ApiErrorBody, code not_found)

POST/api/objekt/{id}/wirtschaftsplan/hausgeld-soll

Übernimmt den geltenden beschlossenen Wirtschaftsplan ins Hausgeld-Soll und stellt es fällig (uebernehme_wirtschaftsplan_ins_hausgeld_soll). Ohne Zahlen des Aufrufers: Monatsbetrag = Jahresanteil auf zwölf Monate, Rücklage getrennt, rückwirkende Differenzen nur als Vorschlag. Ohne eigenen Plan im Jahr gilt der letzte beschlossene Plan weiter, wenn der Beschluss die Fortgeltung trägt (quelle fortgeltung).

operationId: uebernehmeObjektWirtschaftsplanInsHausgeldSoll · Auth: bearerAuth

Request-Body (Pflicht): application/json → WirtschaftsplanUebernahmeRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200das gestellte Soll plus Herkunft des Plans (WirtschaftsplanUebernahmeResponse)WirtschaftsplanUebernahmeResponse
400ungültige Eingabe oder unbekanntes Feld (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt oder Plan unbekannt ODER fremder Tenant ODER Beschluss unbekannt (ApiErrorBody, code not_found)
409kein geltender Plan (plan-fehlt), Fortgeltung bei abweichendem Wirtschaftsjahr oder ein anderer Geldkreis (ApiErrorBody, code conflict)

GET/api/objekt/{id}/wirtschaftsplan/stand

Liest EINE Version eines Wirtschaftsplans. Mit `vergleichMit` liefert die Antwort zusätzlich den Diff von dieser Version zur genannten; mit `berechnung=true` Gesamtplan, Einzelpläne mit Monatsbeträgen und Befunde, serverseitig aus Positionen und Stammdaten gerechnet.

operationId: getObjektWirtschaftsplanStand · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
jahrqueryjaintegerDas WIRTSCHAFTSJAHR.
versionqueryjaintegerDie Version.
vergleichMitqueryneinintegerEine andere Version desselben Jahres; liefert den Diff.
berechnungqueryneinboolean`true` liefert die Berechnung.
StatusBedeutungBody
200der Stand (WirtschaftsplanStandResponse)WirtschaftsplanStandResponse
400keine UUID ODER `jahr`/`version`/`vergleichMit` fehlt oder ist keine ganze Zahl, `berechnung` weder true noch false (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt oder Version unbekannt ODER fremder Tenant — dieselbe Meldung (ApiErrorBody, code not_found)

POST/api/objekt/{id}/wirtschaftsplan/verwerfen

Verwirft eine Version im Status entwurf (verwirf_wirtschaftsplan); ihre Positionen bleiben lesbar. Ein beschlossener oder bereits verworfener Plan bleibt unverändert.

operationId: verwirfObjektWirtschaftsplan · Auth: bearerAuth

Request-Body (Pflicht): application/json → WirtschaftsplanVerwerfenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200die verworfene Version (WirtschaftsplanVerwerfenResponse)WirtschaftsplanVerwerfenResponse
400ungültige Eingabe oder unbekanntes Feld (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt oder Version unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409die Version ist kein Entwurf mehr (ApiErrorBody, code conflict)

offene-posten

GET/api/offene-posten

Liest die offenen Posten des Mandanten samt der drei getrennten Summen (Rückstand · Guthaben · Saldo).

operationId: listOffenePosten · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
propertyIdqueryneinstring(uuid)Auf EIN Objekt eingrenzen (Filter, keine Autorisierung).
contractIdqueryneinstring(uuid)Auf EINEN Debitor eingrenzen.
geldkreisqueryneinmiete | weg_hausgeld | sev
mengequeryneinoffen | alle`offen` (Default) = die Arbeitsliste (offen/teilweise); `alle` zusätzlich die erledigten Posten.
richtungqueryneinforderung | guthaben | verbindlichkeitWeggelassen ⇒ ALLE Richtungen. Kein Default auf `forderung` — sonst verschwänden Guthaben aus der Standardsicht.
dueFromqueryneinstring(date)Untere Grenze der Fälligkeits-Achse (einschließlich).
dueToqueryneinstring(date)Obere Grenze der Fälligkeits-Achse (einschließlich).
stichtagqueryneinstring(date)Stichtag der Verzugstage; weggelassen ⇒ heute.
archiveScopequeryneinalle | aktiv | archiviert3-Wege-Filter auf die Archiv-Kette; Default `aktiv`. Der Read filtert, er verschweigt nichts — `alle` liefert auch archivierte Objekte.
asOfqueryneinstring(date)Stichtag der Archiv-Achse. OHNE asOf misst der Read auf `archived_at` (Betriebs-Default), MIT asOf auf dem Verwaltungszeitraum.
StatusBedeutungBody
200Posten + Summen aus DERSELBEN Projektion (ADR 0011, INV-OP-01). Alle Cent-Felder sind vorzeichenbehaftete Integer-STRINGS, nie JSON-numbers. Rückstand, Guthaben und Saldo stehen GETRENNT: „Rückstand gesamt" ist rueckstandCents — dort verschwindet kein Mahnfall hinter einem fremden Guthaben.OffenePostenListResponse
400ungültige Query (ApiErrorBody, code invalid_request — Feldname + Regel, nie der Wert)
401nicht authentifiziert — leerer Body (kein Oracle)

option

GET/api/option

Listet Options-Zeilen (optionaler Filter scopeType/scopeId/key).

operationId: listOptions · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
scopeTypequeryneintenant | objekt | einheit | vertragtenant | objekt | einheit | vertrag
scopeIdqueryneinstring(uuid)Ziel-UUID der Ebene
keyqueryneinstring
StatusBedeutungBody
200Options-Liste (OptionListResponse)OptionListResponse
400ungültiger Filter (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/option

Setzt/überschreibt eine gescopte Option (Upsert je scope+key).

operationId: setOption · Auth: bearerAuth

Request-Body (Pflicht): application/json → OptionSetRequest

StatusBedeutungBody
200gesetzte Option (OptionSetResponse); created unterscheidet neu vs. überschrieben
400ungültige Eingabe (unbekannter scope_type, fehlende scope_id, fehlender value …) (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

GET/api/option/effective

Löst den effektiven Wert eines Schlüssels über die Kandidaten-Scopes auf (spezifischster gewinnt).

operationId: resolveOption · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
keyqueryjastring
objektIdqueryneinstring(uuid)Objekt-Ebene in die Auflösung einbeziehen
einheitIdqueryneinstring(uuid)Einheiten-Ebene einbeziehen
vertragIdqueryneinstring(uuid)Vertrags-Ebene einbeziehen
StatusBedeutungBody
200effektiver Wert (OptionResolveResponse); found:false ⇒ nirgends gesetztOptionResolveResponse
400fehlender key ODER ungültige Scope-Referenz (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

person

GET/api/person

Listet Personen (3-Wege-Filter Alle/Aktiv/Archiviert, Default aktiv).

operationId: listPersonen · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
statusqueryneinalle | aktiv | archiviertalle | aktiv | archiviert (Default aktiv). Unbekannter Wert ⇒ 400, nie stiller Fallback.
StatusBedeutungBody
200Personenliste (PersonListResponse)PersonListResponse
400ungültiger status-Filter (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/person

Legt eine Person im Adressbuch an.

operationId: createPerson · Auth: bearerAuth

Request-Body (Pflicht): application/json → PersonCreateRequest

StatusBedeutungBody
201angelegte Person (Person)
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

GET/api/person/{id}

Liest EINE Person (auch archiviert).

operationId: getPerson · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200PersonPerson
400keine UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel)

PATCH/api/person/{id}

Ändert Personen-Stammfelder (nur nicht-archivierte Personen).

operationId: updatePerson · Auth: bearerAuth

Request-Body (Pflicht): application/json → PersonUpdateRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200geänderte Person
400leerer/ungültiger Patch ODER Person archiviert (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/person/{id}/archive

Archiviert eine Person (archived_at statt DELETE, K5). Ihre Rollen bleiben unberührt.

operationId: archivePerson · Auth: bearerAuth

Request-Body (optional): application/json

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200archiviert (PersonArchiveResponse). Wiederholter Aufruf = Idempotenz-Replay des Erst-Ergebnisses (identische Antwort, kein zweites Kommando). Schon archiviert ⇒ alreadyArchived: true, der erste Grund bleibt.
400keine UUID ODER ungültiger Body (kein JSON-Objekt, unbekanntes Feld, ungültiger grund) (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

posteingang

GET/api/posteingang

Listet die Freigabe-Inbox (wartende Buchungsvorschläge des aufrufenden Tenants).

operationId: listPosteingang · Auth: bearerAuth

StatusBedeutungBody
200wartende Vorschläge (PosteingangListResponse)PosteingangListResponse
401nicht authentifiziert — leerer Body (kein Oracle)

rechte

POST/api/rechte/objekt

Setzt eine Objekt-Zuständigkeit (set_object_responsibility), optional an eine Fähigkeit (Rolle) gebunden.

operationId: setObjektZustaendigkeit · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
201gesetzt (userId, propertyId, assignmentId, roleId, roleKey, alreadyAssigned). `roleId`/`roleKey` sind `null`, wenn ohne `roleKey` (bzw. mit `roleKey: null`) gesetzt — gilt dann für alle Fähigkeiten.
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden — fail-closed)
404unbekanntes Objekt ODER fremder Tenant ODER unbekannte Rolle (ApiErrorBody, code not_found — kein Existenz-Orakel)

POST/api/rechte/objekt/entziehen

Entzieht eine Objekt-Zuständigkeit (revoke_object_responsibility, wirkt sofort), optional rollenscharf.

operationId: revokeObjektZustaendigkeit · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200entzogen (userId, propertyId, roleId, roleKey, revoked). `roleId`/`roleKey` sind `null`, wenn ohne `roleKey` entzogen (alle Bindungen) — sonst der adressierte Rollenbezug. Ohne aktive Zuständigkeit sichtbarer No-op (revoked:false).
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/rechte/rolle

Weist einem User eine Rolle zu (assign_role, RLS-tenant-gebunden).

operationId: assignRolle · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
201zugewiesen (userId, roleId, roleKey, alreadyAssigned)
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannte Rolle ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel)

rolle

GET/api/rolle

Listet Rollen (3-Wege-Gültigkeitsfilter Alle/Aktiv/Beendet, Default aktiv).

operationId: listRollen · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
statusqueryneinalle | aktiv | beendetalle | aktiv | beendet (Default aktiv). Gemessen an der GÜLTIGKEIT, nicht an einem archived_at (das hat party_roles nicht). aktiv ∪ beendet ≠ alle: zukünftige Rollen erscheinen nur unter `alle`. Unbekannter Wert ⇒ 400.
personqueryneinstring(uuid)nur Rollen dieser Person (UUID)
asOfqueryneinstring(date)Stichtag YYYY-MM-DD, gegen den aktiv/beendet gemessen wird (Default: heute, UTC).
StatusBedeutungBody
200Rollenliste (RolleListResponse)RolleListResponse
400ungültiger status-Filter, person-UUID oder Stichtag (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/rolle

Vergibt einer Person eine Rolle an Objekt ODER Einheit (mit Gültigkeit).

operationId: assignRolle · Auth: bearerAuth

Request-Body (Pflicht): application/json → RolleAssignRequest

StatusBedeutungBody
201vergebene Rolle (Rolle)
400ungültige Eingabe, kein/zwei Ziele oder unplausible Gültigkeit (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Person ODER Rollen-Ziel unbekannt, archiviert oder fremder Tenant (ApiErrorBody, code not_found). Die Ziel-Prüfung leistet der Tool-Layer — die Ziel-Spalten tragen KEINE Fremdschlüssel.

POST/api/rolle/{id}/end

Beendet eine Rolle zum Stichtag (obere valid_range-Grenze statt DELETE, K5).

operationId: endRolle · Auth: bearerAuth

Request-Body (Pflicht): application/json → RolleEndRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200beendet (RolleEndResponse). Wiederholter Aufruf = Idempotenz-Replay des Erst-Ergebnisses.
400ungültiges/unplausibles Enddatum (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

schadenfall

GET/api/schadenfall

Liest die Schadenfälle des Mandanten, begrenzt auf die Objekte mit Zuständigkeit des Aufrufers, neueste Schäden zuerst: Nummer, Status, Schadensdatum, Schadenart, Objekt, Schadenssumme (Cent als Integer-STRING) und Zahl der Befunde. Filter propertyId, status (kommagetrennt), versicherungsvertragId, instandhaltungVorgangId, nurOffen (ohne abgeschlossen), limit (Vorgabe 50, höchstens 200) und offset. Nur lesend.

operationId: getSchadenfallListe · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
propertyIdqueryneinstring(uuid)
statusqueryneinstring
versicherungsvertragIdqueryneinstring(uuid)
instandhaltungVorgangIdqueryneinstring(uuid)
nurOffenqueryneintrue | false
limitqueryneininteger
offsetqueryneininteger
StatusBedeutungBody
200{ stichtag, zeilen[], gesamt, limit, offset } — leer ohne Schadenfälle; Geld ist ein Integer-STRING in Cent.SchadenfallListeResponse
400ungültige Query, z. B. unbekannter Parameter oder unbekannter Statuswert (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/schadenfall

Erfasst einen Schadenfall (Status erfasst): propertyId, schadensdatum (nicht nach heute), schadenart, beschreibung; optional unitId, versicherungsvertragId und instandhaltungVorgangId (beide desselben Objekts).

operationId: legeSchadenfallAn · Auth: bearerAuth

Request-Body (Pflicht): application/json → SchadenfallAnlegenRequest

StatusBedeutungBody
200Schadenfall-Id, Nummer, Status, Selbstbehalt und Befunde.SchadenfallErgebnis
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Recht fehlt (ApiErrorBody, code forbidden)
404Objekt, Einheit, Vertrag oder Vorgang unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel)

GET/api/schadenfall/{id}

Liest EINEN Schadenfall: Kopf, Versicherungsvertrag, Instandhaltungs-Vorgang, Befunde, Bilanz (Schadenssumme, Selbstbehalt, erwartete und tatsächliche Erstattung, Differenz), Erstattungen mit Buchungsstand (gebucht | vorgeschlagen) und den Honorar-Vorschlag, der nicht automatisch abgerechnet wird. Optional stichtag (Vorgabe: Berliner Tag der Server-Uhr). Nur lesend.

operationId: getSchadenfall · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
stichtagqueryneinstring(date)
StatusBedeutungBody
200Der Schadenfall mit allen Bestandteilen; Geld ist ein Integer-STRING in Cent.SchadenfallResponse
400ungültige Query, z. B. unbekannter Parameter oder kein Kalendertag (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Schadenfall unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel)

POST/api/schadenfall/{id}/abschluss

Schließt den Schadenfall ab (optional begruendung); ohne Versicherungsbezug ist eine Begründung Pflicht. Die Schadenfall-Id steht im Pfad.

operationId: schliesseSchadenfall · Auth: bearerAuth

Request-Body (Pflicht): application/json → SchadenfallAbschlussRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Schadenfall-Id, vorheriger Status, Begründung, Bilanz und Befund.SchadenfallAbschlussResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Recht fehlt (ApiErrorBody, code forbidden)
404Schadenfall unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Der Status des Schadenfalls erlaubt den Abschluss nicht (ApiErrorBody, code conflict)

POST/api/schadenfall/{id}/deckung

Erfasst die Deckungsentscheidung des Versicherers: entscheidung (zugesagt | abgelehnt), deckungAm, optional schadenssumme und selbstbehalt als Geld-Objekt {cents, currency}. Die Schadenfall-Id steht im Pfad.

operationId: erfasseSchadenfallDeckung · Auth: bearerAuth

Request-Body (Pflicht): application/json → SchadenfallDeckungRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Schadenfall-Id, Nummer, Status, Selbstbehalt, Schadenssumme und Befunde.SchadenfallDeckungResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Recht fehlt (ApiErrorBody, code forbidden)
404Schadenfall unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Der Status des Schadenfalls erlaubt die Entscheidung nicht (ApiErrorBody, code conflict)

POST/api/schadenfall/{id}/erstattung

Ordnet einen Bankumsatz als Erstattung zu. Die Buchung entsteht als Vorschlag und wird erst nach der Freigabe gebucht. Der Fall muss auf Deckung zugesagt oder reguliert stehen; ein Umsatz gehört höchstens einem Schadenfall. Die Schadenfall-Id steht im Pfad.

operationId: erfasseSchadenfallErstattung · Auth: bearerAuth

Request-Body (Pflicht): application/json → SchadenfallErstattungRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Erstattung, Bilanz und der Buchungsvorschlag (nicht gebucht).SchadenfallErstattungResponse
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Recht fehlt (ApiErrorBody, code forbidden)
404Schadenfall unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Bankumsatz schon einem Schadenfall zugeordnet oder der Fall steht nicht auf Deckung zugesagt oder reguliert (ApiErrorBody, code conflict)

POST/api/schadenfall/{id}/meldung

Hält die Meldung an den Versicherer fest: gemeldetAm, optional aktenzeichen und versicherungsvertragId. Eine verstrichene Meldefrist ist ein Befund (meldefrist-verstrichen); die Meldung wird trotzdem festgehalten. Die Schadenfall-Id steht im Pfad.

operationId: meldeSchadenfallVersicherer · Auth: bearerAuth

Request-Body (Pflicht): application/json → SchadenfallMeldenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Schadenfall-Id, Nummer, Status gemeldet, Selbstbehalt und Befunde.SchadenfallErgebnis
400ungültige Nutzlast (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Recht fehlt (ApiErrorBody, code forbidden)
404Schadenfall unbekannt, mandantenfremd oder außerhalb der Objektsicht (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Schadenfall steht in einem Status, in dem die Meldung nicht möglich ist (ApiErrorBody, code conflict)

sev-mandat

POST/api/sev-mandat/{id}/anfangsbestand

Übernimmt den Anfangsbestand des Eigentümer-Verrechnungskontos eines SEV-Mandats aus dem Altbestand — eine Buchung im Geldkreis Sondereigentum (Verrechnungskonto gegen Gegenkonto DESSELBEN Mandats), die in keiner Sicht der offenen Posten erscheint. Der Betrag erscheint als Saldo ab dem Stichtag selbst, der Stichtag zählt inklusiv (GET /api/sev-mandat/{id}/verrechnungskonto). Genau ein aktiver Anfangsbestand je Mandat.

operationId: erfasseSevAnfangsbestand · Auth: bearerAuth

Request-Body (Pflicht): application/json → SevAnfangsbestandRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200geschriebene Anfangsbestands-Buchung (SevAnfangsbestandResponse)SevAnfangsbestandResponse
400ungültige Eingabe, Betrag 0 oder ausserhalb des speicherbaren Bereichs, Stichtag in der Zukunft, Mandat ohne Verrechnungskonto (ohne Mietinkasso) ODER Konto archiviert (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Mandat unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409bereits ein aktiver Anfangsbestand erfasst ODER Idempotency-Key an eine andere Eingabe gebunden (ApiErrorBody, code conflict)

POST/api/sev-mandat/{id}/beenden

Beendet einen SEV-Zeitabschnitt zu einem Datum. Beendet heisst GEKÜRZT, nicht gelöscht: die Historie bleibt stehen, damit eine bereits abgerechnete SEV-Periode erklärbar bleibt. Kürzen nur — ein Ende nach einem bestehenden Ende und ein Ende am Beginntag werden abgewiesen; dasselbe Ende ein zweites Mal ist ein No-op-Erfolg.

operationId: beendeSevMandat · Auth: bearerAuth

Request-Body (Pflicht): application/json → SevMandatBeendenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200beendete Vereinbarung (SevMandatBeendenResponse)
400ungültiges Datum, Ende am oder vor dem Beginn ODER Ende nach einem bereits gesetzten Ende (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Mandat unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409am oder nach dem Ende liegen noch geltende Angaben des Eigentümers für die Mieterabrechnung — erst aufheben, dann beenden (ApiErrorBody, code conflict)

GET/api/sev-mandat/{id}/eigentuemerabrechnung

Jahresabrechnung der Sondereigentumsverwaltung für den Eigentümer über einen Zeitraum: Einnahmen, Ausgaben und Auszahlungen je Buchungsart (Klasse nach Art, nie nach Vorzeichen), Mieteinnahmen mit Soll, Ist, Ausfall und Ertrag je m², Kosten der Wohnung und die Entwicklung des Geldbestands mit Probe gegen den Saldo des Verrechnungskontos, dazu der Empfänger mit Anrede und Anschrift. Schreibt nichts.

operationId: ladeSevEigentuemerabrechnung · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
vonqueryjastring(date)Erster Tag des Zeitraums YYYY-MM-DD (inklusiv, nach Buchungsdatum). Fehlend oder kein Kalendertag ⇒ 400.
bisqueryjastring(date)Letzter Tag des Zeitraums YYYY-MM-DD (inklusiv, nach Buchungsdatum). Fehlend, kein Kalendertag oder vor von ⇒ 400.
mitAuszahlungqueryneintrue | falsetrue (Vorgabe) oder false: false blendet die Positionen des Auszahlungsblocks aus — Summe und Geldbestand zählen die Auszahlungen trotzdem. Ein anderer Wert ⇒ 400.
StatusBedeutungBody
200Die Abrechnung (SevEigentuemerabrechnungResponse)SevEigentuemerabrechnungResponse
400fehlender oder ungültiger Zeitraum, von nach bis, ungültiges mitAuszahlung, unbekannter Query-Parameter ODER Mandat ohne Mietinkasso (kein Verrechnungskonto) (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Mandat unbekannt, fremder Tenant ODER Objekt nicht zuständig — dieselbe Antwort (ApiErrorBody, code not_found)
422Empfänger unvollständig: Name, Anrede oder Anschrift des Eigentümers fehlt — kein Ausdruck mit leerem Adressfeld (ApiErrorBody, code invalid_request)

GET/api/sev-mandat/{id}/ertragsumbuchung

Die Ertragsumbuchungen eines SEV-Mandats in beiden Richtungen (Abgang an den neuen, Zugang vom bisherigen Eigentümer) mit Zeitraum und Beleg.

operationId: listSevErtragsumbuchungen · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Die Umbuchungen (SevErtragsumbuchungListResponse). ACHTUNG PII: `beleg.bezeichnung` ist Freitext des Verwalters (Kategorie freitext).SevErtragsumbuchungListResponse
401nicht authentifiziert — leerer Body (kein Oracle)
404Mandat unbekannt, fremder Tenant ODER nicht zuständig (ApiErrorBody, code not_found)

POST/api/sev-mandat/{id}/ertragsumbuchung

Bucht Mieterträge eines Zeitraums vom Mandat im Pfad (alter Eigentümer) auf das Mandat `nachMandatId` (neuer Eigentümer derselben Wohnung) um — eigene Buchungsart mit Beleg, auf beiden Verrechnungskonten ausgewiesen, beide Seiten in EINER Transaktion. Höchstens die im Zeitraum gutgeschriebene, noch nicht umgebuchte Miete.

operationId: bucheSevErtragsumbuchung · Auth: bearerAuth

Request-Body (Pflicht): application/json → SevErtragsumbuchungBuchenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Die gebuchte Umbuchung (SevErtragsumbuchungBuchenResponse)SevErtragsumbuchungBuchenResponse
400ungültige Eingabe (Zeitraum leer, Betrag, Beleg fehlt, Zusatzfeld) ODER die Mandate betreffen verschiedene Wohnungen (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Mensch als Akteur ODER nicht zuständig für das Objekt (ApiErrorBody, code forbidden)
404ein Mandat unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409der Betrag übersteigt die im Zeitraum gutgeschriebene, noch nicht umgebuchte Miete ODER Idempotency-Key an eine andere Eingabe gebunden (ApiErrorBody, code conflict)

POST/api/sev-mandat/{id}/mieter-handwert

Trägt bei SEV OHNE Mietinkasso eine Angabe des Eigentümers für die Mieterabrechnung ein (erfasse_sev_mieter_handwert): eine Vorauszahlung des Mieters oder umlagefähige Kosten der Wohnung, Herkunft „Angabe Eigentümer". Identität einer Angabe ist ihre handwertId, nie ihr Inhalt: ohne handwertId legt jeder Aufruf eine NEUE Angabe an (erfasst, Fassung 1) — auch zwei gleiche am selben Tag; eine Wiederholung schützt allein der Idempotency-Key. Mit handwertId wird genau diese Angabe des Mandats korrigiert (ersetzt, Fassung + 1; Datum, Betrag, Kostenart, Bezeichnung änderbar, die Art nicht); gleicht sie der geltenden Fassung ⇒ unveraendert. Mit aktion aufheben, handwertId und der gesehenen fassung wird die Angabe append-only aufgehoben (aufgehoben, Fassung + 1): sie fällt aus Liste und Abrechnung; endgültig, keine Korrektur danach. Nur durch einen Menschen.

operationId: erfasseSevMieterHandwert · Auth: bearerAuth

Request-Body (Pflicht): application/json

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200erfasst, unverändert, ersetzt oder aufgehoben — { ergebnis, handwertId, mandatId, unitId, art, datum, betragCents, kostenart, bezeichnung, fassung, herkunft (angabe_eigentuemer), currency }
400ungültige Eingabe, Datum in der Zukunft oder außerhalb des Mandats, Mandat mit Mietinkasso ODER Korrektur mit anderer Art (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt ODER kein Mensch (ApiErrorBody, code forbidden)
404Mandat unbekannt ODER fremder Tenant ODER handwertId unter diesem Mandat unbekannt — dieselbe Antwort (ApiErrorBody, code not_found)
409Idempotency-Key an eine andere Eingabe gebunden, Angabe bereits aufgehoben ODER Aufhebung gegen eine veraltete Fassung (ApiErrorBody, code conflict)

GET/api/sev-mandat/{id}/rechnung

Die Rechnungen des Sondereigentums eines SEV-Mandats mit Kennzeichen (Kostenart, umlagefähig), Status (bezahlt, nicht_bezahlt, storniert) und Befund einer Unterdeckung.

operationId: listSevRechnungen · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Rechnungen des Mandats (SevRechnungListResponse)SevRechnungListResponse
401nicht authentifiziert — leerer Body (kein Oracle)
404Mandat unbekannt, fremder Tenant ODER Objekt nicht zuständig (ApiErrorBody, code not_found)

POST/api/sev-mandat/{id}/rechnung

Bezahlt eine Rechnung des Sondereigentums aus der Miete des Eigentümers: Belastung des Verrechnungskontos (Art sonstige_ausgabe) mit Kennzeichen Kostenart + umlagefähig. Bei Unterdeckung entscheidet beiUnterdeckung (einziehen, nicht_zahlen, sonderruecklage) mit Befund. Die Rechnung erscheint in keiner Abrechnung der Gemeinschaft.

operationId: bucheSevRechnung · Auth: bearerAuth

Request-Body (Pflicht): application/json → SevRechnungBuchenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200gebucht, nicht bezahlt (mit Befund) oder unverändert (SevRechnungBuchenResponse)SevRechnungBuchenResponse
400ungültige Eingabe, unbekannte Kostenart, umlagefähig bei nie umlagefähiger Kostenart, Zahlungsdatum in der Zukunft, Unterdeckung ohne Entscheid ODER Mandat ohne Verrechnungskonto (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Mandat oder Beleg unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409dieselbe Rechnung (Kreditor + Rechnungsnummer) mit anderem Inhalt erfasst ODER Idempotency-Key an eine andere Eingabe gebunden (ApiErrorBody, code conflict)

GET/api/sev-mandat/{id}/schlussauszahlung

Vorschlag der Schlussauszahlung eines BEENDETEN SEV-Mandats (Ende erreicht): der GANZE Saldo des Verrechnungskontos — der Sockel wird nicht mehr einbehalten — an das Privatkonto des bisherigen Eigentümers, gesperrt bei offenen Hausgeld-Posten aus dem Mandatszeitraum, samt vorschlagHash, den ein Mensch mit POST bestätigt. Schreibt nichts.

operationId: getSevSchlussauszahlungVorschlag · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Vorschlag (SevSchlussauszahlungVorschlagResponse). ACHTUNG PII: `empfaengerIban` ist eine IBAN (Kategorie bankdaten) — der Empfänger, den der Mensch vor dem Stellen sehen muss.SevSchlussauszahlungVorschlagResponse
400das Mandat nennt kein bestätigtes Privatkonto des Eigentümers (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Mandat unbekannt, fremder Tenant ODER nicht zuständig (ApiErrorBody, code not_found)
409das Mandat ist nicht beendet oder sein Ende ist noch nicht erreicht (ApiErrorBody, code conflict)

POST/api/sev-mandat/{id}/schlussauszahlung

Stellt die Schlussauszahlung nach Bestätigung des gesehenen Vorschlags (vorschlagHash): der Entnahme-Satz über den ganzen Saldo und EIN Zahlungsauftrag awaiting-approval an das Privatkonto des bisherigen Eigentümers, abgehend vom angegebenen Objekt-Bankkonto. Ausgeführt wird erst nach der bestehenden Zahlungsfreigabe (Vier-Augen).

operationId: stelleSevSchlussauszahlung · Auth: bearerAuth

Request-Body (Pflicht): application/json → SevSchlussauszahlungStellenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Die gestellte Schlussauszahlung samt Zahlungsauftrag (SevSchlussauszahlungStellenResponse)SevSchlussauszahlungStellenResponse
400ungültige Eingabe (u. a. ein Betrag oder eine IBAN im Body), das Bankkonto ist kein Konto des Objekts ODER kein Privatkonto (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Mensch als Akteur ODER nicht zuständig für das Objekt (ApiErrorBody, code forbidden)
404Mandat unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409Mandat nicht beendet, Vorschlag geändert (vorschlagHash), gesperrt (offene Posten, kein Überschuss) ODER Idempotency-Key an eine andere Eingabe gebunden (ApiErrorBody, code conflict)

GET/api/sev-mandat/{id}/sonderruecklage

Saldo der Sonderrücklage eines SEV-Mandats zum Stichtag (inklusiv) samt vereinbartem Höchststand — Geld des Eigentümers, getrennt vom Verrechnungskonto ausgewiesen und nicht Teil der Rücklage der Gemeinschaft. Zuführung (Monatslauf) und Entnahme (Unterdeckung) laufen im Tool-Layer.

operationId: getSevSonderruecklageSaldo · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
stichtagqueryjastring(date)Stichtag YYYY-MM-DD (inklusiv). Pflicht — kein stilles „heute". Fehlend oder ungültig ⇒ 400.
StatusBedeutungBody
200Saldo zum Stichtag (SevSonderruecklageSaldoResponse)SevSonderruecklageSaldoResponse
400fehlender oder ungültiger Stichtag ODER Mandat ohne Mietinkasso (dann gibt es keine Sonderrücklage) (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Mandat unbekannt, fremder Tenant ODER Objekt nicht zuständig (ApiErrorBody, code not_found)

GET/api/sev-mandat/{id}/verguetung

Vorschlag der Verwaltervergütung eines SEV-Mandats für einen Monat — Fall (vermietet/Leerstand), Bemessungsgrundlage, Netto, USt und Brutto samt vorschlagHash, den ein Mensch mit POST bestätigt. Auf Ist-Basis folgt die Vergütung der Mietgutschrift des Monats.

operationId: getSevVerguetungVorschlag · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
monatqueryjastringMonat JJJJ-MM. Pflicht. Fehlend oder ungültig ⇒ 400.
StatusBedeutungBody
200Vorschlag (SevVerguetungVorschlagResponse)SevVerguetungVorschlagResponse
400fehlender oder ungültiger Monat, Monat ausserhalb des Mandatszeitraums ODER Mandat ohne Verrechnungskonto (ohne Mietinkasso) (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Mandat unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409Reihenfolge-Sperre: Ist-Basis ohne Mietgutschrift des Monats (ApiErrorBody, code conflict)

POST/api/sev-mandat/{id}/verguetung

Bucht die Verwaltervergütung eines SEV-Mandats für einen Monat nach Bestätigung des gesehenen Vorschlags (vorschlagHash): Belastung des Eigentümer-Verrechnungskontos (Art Verwaltervergütung) und Ertrag beim Verwalter, die USt getrennt ausgewiesen. Genau einmal je Mandat und Monat. Bis zum SEV-Monatslauf (#5218) ist diese Route der Einstieg.

operationId: bucheSevVerguetung · Auth: bearerAuth

Request-Body (Pflicht): application/json → SevVerguetungBuchenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Ergebnis der Buchung (SevVerguetungBuchungResponse)SevVerguetungBuchungResponse
400ungültige Eingabe, Monat ausserhalb des Mandatszeitraums, Mandat ohne Verrechnungskonto (ohne Mietinkasso) ODER Konto archiviert (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Mensch als Akteur ODER nicht zuständig für das Objekt (ApiErrorBody, code forbidden)
404Mandat unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409Reihenfolge-Sperre (keine Mietgutschrift des Monats), Vorschlag geändert (vorschlagHash), abweichend gebucht, gleichzeitiger Lauf ODER Idempotency-Key an eine andere Eingabe gebunden (ApiErrorBody, code conflict)

GET/api/sev-mandat/{id}/verrechnungskonto

Saldo des Eigentümer-Verrechnungskontos eines SEV-Mandats zum Stichtag (inklusiv) — das Geld, das dem Eigentümer zusteht. Jeder Eigentümer hat sein eigenes Konto; eine Buchung beim einen ändert den Saldo des anderen nicht.

operationId: getSevVerrechnungskontoSaldo · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
stichtagqueryjastring(date)Stichtag YYYY-MM-DD (inklusiv). Pflicht — kein stilles „heute". Fehlend oder ungültig ⇒ 400.
StatusBedeutungBody
200Saldo zum Stichtag (SevVerrechnungskontoSaldoResponse)SevVerrechnungskontoSaldoResponse
400fehlender oder ungültiger Stichtag ODER Mandat ohne Verrechnungskonto (ohne Mietinkasso) (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Mandat unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

sev-mietgutschrift

POST/api/sev-mietgutschrift/{id}/ablehnung

Lehnt einen Mietgutschrift-Vorschlag ab: seine Reservierung wird gelöst, ein Folgelauf legt neu vor. Nur ein Mensch lehnt ab.

operationId: lehneSevMietgutschriftAb · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Die gelösten Monate (SevMietgutschriftAblehnungResponse)SevMietgutschriftAblehnungResponse
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Mensch als Akteur ODER nicht zuständig für das Objekt (ApiErrorBody, code forbidden)
404Vorschlag unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409bereits entschieden (ApiErrorBody, code conflict)

POST/api/sev-mietgutschrift/{id}/freigabe

Gibt einen Mietgutschrift-Vorschlag nach Bestätigung seines inhaltsHash frei: je Monat mit Anteil eine Buchung (Art Mietgutschrift) auf dem Verrechnungskonto des Eigentümers. Nur ein Mensch gibt frei.

operationId: gibSevMietgutschriftFrei · Auth: bearerAuth

Request-Body (Pflicht): application/json → SevMietgutschriftFreigabeRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Die Buchungen (SevMietgutschriftFreigabeResponse)SevMietgutschriftFreigabeResponse
400ungültige Eingabe ODER Konto archiviert (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Mensch als Akteur ODER nicht zuständig für das Objekt (ApiErrorBody, code forbidden)
404Vorschlag unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409Vorschlag geändert (inhaltsHash) ODER bereits entschieden (ApiErrorBody, code conflict)

sollstellung

POST/api/sollstellung

Startet einen Sollstellungslauf (start_sollstellungslauf) — Ergebnis sind VORSCHLÄGE, gebucht wird erst nach der Freigabe.

operationId: starteSollstellungslauf · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
201Lauf gestartet — die Antwort zählt die erzeugten Vorschläge (neu/storno/ersatz) und die übersprungenen Debitoren.SollstellungslaufStartResponse
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden — fail-closed)
404unbekanntes ODER fremdes Objekt (ApiErrorBody, code not_found — kein Existenz-Orakel)
409offene Readiness-Befunde ohne Begründung oder bereits ein offener Lauf (ApiErrorBody, code conflict)
503Zuständigkeitsprüfung nicht durchführbar (ApiErrorBody, code unavailable — nie durchwinken)

GET/api/sollstellung/{id}/vorschlaege

Liest die Vorschläge EINES Sollstellungslaufs — die `proposalIds`, die POST /api/sollstellung/freigabe erwartet.

operationId: listSollstellungVorschlaege · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)Der Sollstellungslauf.
artqueryneinneu | storno | ersatzAuf EINE Vorschlagsart eingrenzen. Weggelassen ⇒ ALLE. Wer freigibt, will in der Regel alle: die kanonische Ordnung STORNO VOR ERSATZ ist die, in der INV-SOLL-01 zu keinem Zeitpunkt zwei wirksame Forderungen sieht — sie zu zerreissen ist eine bewusste Entscheidung des Aufrufers.
nurOffenequeryneintrue | false`true` ⇒ nur Vorschläge OHNE bindende Entscheidung — die Menge, die eine Freigabe noch annimmt.
StatusBedeutungBody
200Kopf, Vorschläge und Readiness-Befunde des Laufs. `betragCents` ist ein vorzeichenbehafteter Integer-STRING, nie eine JSON-number. Die `ampel` ist GELESEN (der Lauf hat sie gesetzt), nicht hier gerechnet. `bindetAktuellenStand` unterscheidet „noch nicht entschieden" von „Freigabe durch eine Korrektur ungültig geworden" — zwei Zustände, die in einem einzelnen Boolean verschmelzen würden. Die `befunde` stehen NEBEN den Vorschlägen: „für diesen Vertrag ist nichts entstanden" darf nicht als „Lauf leer" ankommen.SollstellungVorschlaegeResponse
400ungültige Query (ApiErrorBody, code invalid_request — Feldname + Regel, nie der Wert)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannter Lauf, fremder Tenant ODER keine UUID (ApiErrorBody, code not_found — kein Existenz-Orakel, insbesondere kein 403)

POST/api/sollstellung/freigabe

Gibt die Vorschläge eines Sollstellungslaufs in EINEM Zug frei (batch_approve_proposals) — ALL-GREEN, keine Teil-Freigabe.

operationId: gibSollstellungFrei · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
201Freigegeben. Je Element reist der contentHash mit — der Beleg, an den die Freigabe bindet (INV-APPROVAL-01).SollstellungFreigabeResponse
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403fehlende Step-up-Frische oder keine Zuständigkeit (ApiErrorBody, code forbidden — fail-closed)
404unbekannter ODER fremder Vorschlag (ApiErrorBody, code not_found — kein Existenz-Orakel)
409bereits entschieden oder nicht durchgehend grün (ApiErrorBody, code conflict)
503Zuständigkeitsprüfung nicht durchführbar (ApiErrorBody, code unavailable — nie durchwinken)

sondereigentumsverwaltung

GET/api/sondereigentumsverwaltung/stand

Liest den Monatsstand der Sondereigentumsverwaltung eines Objekts: je SEV-Wohnung die erledigten und offenen Schritte, den Saldo des Eigentümers, Sockel und Sonderrücklage, die Unterdeckungen mit Betrag und den nächsten fälligen Schritt. Werte ohne Quelle stehen auf „nicht verfügbar", nie auf null.

operationId: liesSevMonatsstand · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
objektqueryjastring(uuid)Das Objekt (UUID) — Pflicht: der Monatsstand ist je Objekt, nicht mandantenweit.
monatqueryjastringDer Monat als `JJJJ-MM` (Monat 01 bis 12). Ohne Monat gäbe es keinen Stand, sondern eine Momentaufnahme, die morgen anders lautet.
StatusBedeutungBody
200Der Monatsstand (SevMonatsstandResponse). Beträge reisen als Integer-STRING in Cent, nie als JSON-number — und als `null`, sobald ihr `stand` nicht `bekannt` ist. ACHTUNG PII: `wohnungen[].eigentuemer` ist ein Personenname (Kategorie name); das ist die Auskunft, die bestellt wurde (Abnahme 4: Eigentümer mit Namen).SevMonatsstandResponse
400fehlendes/ungültiges Objekt oder ungültiger Monat (ApiErrorBody, code invalid_request — Feldname + Regel, nie der Wert)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel)

uebernahme

GET/api/uebernahme/abrechnungen

Listet die Abrechnungsläufe eines Objekts mit Herkunft und Kennzeichen „übernommen" (neueste zuerst).

operationId: listUebernahmeAbrechnungen · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
propertyIdqueryjastring(uuid)Das Objekt, dessen Läufe gelistet werden. Ein fremdes oder unbekanntes Objekt liefert eine LEERE Liste (kein Existenz-Orakel).
StatusBedeutungBody
200Läufe des Objekts, neueste zuerst; uebernommen ist true bei Herkunft `uebernahme`.UebernahmeAbrechnungenListResponse
400fehlende oder ungültige propertyId (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/uebernahme/abrechnungen

Übernimmt die festgeschriebene Abrechnung EINES früheren Zeitraums eines Objekts als Bestand (uebernehme_abrechnung_bestand).

operationId: uebernehmeAbrechnungBestand · Auth: bearerAuth

Request-Body (Pflicht): application/json

StatusBedeutungBody
200Nur mit pruefen: true — die Vorschau: Summen, geplante Eröffnungsposten und das Siegel; es wurde nichts geschrieben.UebernahmeAbrechnungVorschauResponse
201übernommen (auch die Replay-Antwort bei gleichem Idempotency-Key hat diese Form; Eröffnungsposten mit replay true).UebernahmeAbrechnungUebernommenResponse
400ungültige Eingabe oder ein fachlich abgewiesener Rückstand (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden — fail-closed)
404Objekt, Vertrag oder Konto unbekannt ODER fremder Mandant (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Zeitraum endet nicht vor dem Übernahmestichtag, für Objekt und Zeitraum existiert schon ein Lauf, ein offener Vertrag hat kein Personenkonto, das Ertragskonto ist kein Sachkonto, die Eröffnungsbuchung meldet einen vorhandenen Satz, oder der Idempotency-Key ist anders gebunden (ApiErrorBody, code conflict, Klartext)
503Zuständigkeitsprüfung nicht durchführbar (ApiErrorBody, code unavailable — nie durchwinken)

umlageschluessel

GET/api/umlageschluessel

Listet die Umlageschlüssel (3-Wege-Archiv-Filter, optional auf Objekt/Abrechnungskreis eingegrenzt).

operationId: listUmlageschluessel · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
statusqueryneinstringaktiv | archiviert | alle (Default aktiv)
propertyIdqueryneinstring(uuid)nur Schlüssel dieses Objekts
unitGroupIdqueryneinstring(uuid)nur auf diesen Kreis gescopte Schlüssel
StatusBedeutungBody
200Schlüssel-Liste (UmlageschluesselListResponse)UmlageschluesselListResponse
400ungültiger Filter/UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/umlageschluessel

Legt einen Umlageschlüssel an einem aktiven Objekt an (optional schon gescoped).

operationId: createUmlageschluessel · Auth: bearerAuth

Request-Body (Pflicht): application/json → UmlageschluesselCreateRequest

StatusBedeutungBody
200angelegter Schlüssel (Umlageschluessel)
400ungültige Eingabe, Objekt archiviert ODER Scope-Kreis fremd-objektlich (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt ODER Scope-Kreis unbekannt/fremder Tenant (ApiErrorBody, code not_found)

GET/api/umlageschluessel/{id}

Liest einen Umlageschlüssel.

operationId: getUmlageschluessel · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Schlüssel (Umlageschluessel)Umlageschluessel
400keine UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Schlüssel unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

PATCH/api/umlageschluessel/{id}

Ändert Stammfelder eines Umlageschlüssels (keyType/name/config). Der Scope wird über /scope gesetzt.

operationId: updateUmlageschluessel · Auth: bearerAuth

Request-Body (Pflicht): application/json → UmlageschluesselUpdateRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200geänderter Schlüssel (Umlageschluessel)
400leerer/ungültiger Patch ODER Schlüssel archiviert (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Schlüssel unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/umlageschluessel/{id}/archive

Archiviert einen Umlageschlüssel (archived_at statt DELETE).

operationId: archiveUmlageschluessel · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Archiv-Ergebnis (UmlageArchiveResponse)
401nicht authentifiziert — leerer Body (kein Oracle)
404Schlüssel unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/umlageschluessel/{id}/messdienst-import

Importiert externe Messdienst-Festbeträge (CSV oder ARGE-D-Satz-Datei, Format serverseitig am Inhalt erkannt) in einen Umlageschlüssel vom Typ „extern". Append-only: jeder Aufruf legt einen neuen Batch an. Die Antwort echot die GESPEICHERTE Periode zurück — der Abrechnungslauf liest nur Batches mit EXAKT passender Periode.

operationId: importMessdienstBetraege · Auth: bearerAuth

Request-Body (Pflicht): multipart/form-data → Binärfeld file (format: binary)

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)Der zu befüllende Umlageschlüssel; er MUSS den Typ „extern" haben (sonst 400).
propertyIdqueryjastring(uuid)Objekt, für das importiert wird.
periodFromqueryjastring(date)Beginn der Abrechnungsperiode (einschließlich). MUSS exakt der Periode des Abrechnungslaufs entsprechen, sonst bleibt der Import wirkungslos.
periodToqueryjastring(date)Ende der Abrechnungsperiode (einschließlich) — dieselbe Exaktheitsregel wie periodFrom.
currencyqueryjastringWährung ALLER Zeilen dieses Aufrufs (z. B. EUR).
StatusBedeutungBody
201gespeicherter Batch (MessdienstImportResponse). Zeilen ohne Vertrag/Einheit blockieren den Import nicht, sie erscheinen in unmatchedCount.MessdienstImportResponse
400fehlende/ungültige Pflicht-Query, kein oder MEHR ALS EIN file-Feld, unlesbare CSV, Schlüssel nicht vom Typ „extern", archivierter Schlüssel/archiviertes Objekt ODER eine Zeile mit unbekannter Vertrags-/Einheits-Referenz (ApiErrorBody, code invalid_request) — kein Teil-Import
401nicht authentifiziert — leerer Body (kein Oracle)
404Umlageschlüssel oder Objekt unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
413Datei überschreitet die zulässige Maximalgröße (ApiErrorBody, code payload_too_large)

POST/api/umlageschluessel/{id}/scope

Setzt (unitGroupId) oder löst (null) den Abrechnungskreis-Scope eines Schlüssels. HINWEIS: Der Scope wird gespeichert, aber von der Abrechnung noch NICHT ausgewertet — ein gescopter Schlüssel verteilt heute wie ein objektweiter.

operationId: scopeUmlageschluessel · Auth: bearerAuth

Request-Body (Pflicht): application/json → UmlageschluesselScopeRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200neuer Scope (UmlageschluesselScopeResponse)
400ungültige Eingabe, Schlüssel archiviert ODER Kreis fremd-objektlich (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Schlüssel ODER Kreis unbekannt/fremder Tenant (ApiErrorBody, code not_found)

vermoegensbericht

GET/api/vermoegensbericht/{id}

Liest EINEN abgelegten Stand samt Bericht und Befunden. `onr` ist PFLICHT: der Stand hängt an BEIDEN Achsen, und ein Stand der Nachbargemeinschaft ist über diesen Weg nicht lesbar.

operationId: getVermoegensberichtStand · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
onrqueryjastring(uuid)Das Objekt, an dem der Stand hängt. Die Objekt-Achse trägt RLS NICHT — eine Verwaltung führt viele WEG-Objekte desselben Mandanten; ohne sie läse eine Objektsicht den Bestandsausweis der Nachbargemeinschaft.
StatusBedeutungBody
200der Stand samt byte-stabilem Serialisat und seinen Befunden (VermoegensberichtStandResponse)VermoegensberichtStandResponse
400keine UUID ODER `onr` fehlt (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Stand unbekannt, fremder Tenant ODER fremdes Objekt (ApiErrorBody, code not_found) — alle drei sehen gleich aus, eine Unterscheidung wäre bereits ein Existenz-Orakel.

versammlung

GET/api/versammlung/{id}

Liest EINE Versammlung samt Tagesordnung und Teilnehmern. Die Beschlussfähigkeit wird nicht berechnet, sondern wie gespeichert ausgewiesen.

operationId: leseVersammlung · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200die Versammlung samt Tagesordnung und Teilnehmern, Summe der Stimmgewichte und Teilnehmerzahl (VersammlungDetail)VersammlungDetail
400keine UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Versammlung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

PATCH/api/versammlung/{id}

Ändert eine Versammlung (nicht art, nicht propertyId). Status nur entwurf → durchgefuehrt und entwurf|durchgefuehrt → abgesagt.

operationId: aendereVersammlung · Auth: bearerAuth

Request-Body (Pflicht): application/json → VersammlungAendernRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200geänderte Versammlung samt Hinweisen zur Einladungsfrist (VersammlungSchreibResponse)VersammlungSchreibResponse
400ungültige Eingabe, unbekanntes Feld (z. B. art) ODER Begründung bei unterschrittener Einladungsfrist fehlt (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder fehlendes Recht (ApiErrorBody, code forbidden)
404Versammlung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409Versammlung abgeschlossen (Beschlüsse generiert) ODER Statuswechsel nicht zulässig (ApiErrorBody, code conflict)

POST/api/versammlung/{id}/beschluesse

Übernimmt die verkündeten Beschlüsse der Versammlung in die Beschluss-Sammlung des Objekts, mit laufender Nummer je Objekt (größte Nummer + 1, fortlaufend), genau einmal und alles oder nichts. Voraussetzung: verkündet, mindestens ein Beschluss-TOP, jeder Beschluss-TOP hat ein Ergebnis. Geschäftsordnungs- und Notiz-TOPs werden nicht übernommen und stehen als übersprungen im Ergebnis. Danach ist die Versammlung abgeschlossen und unveränderlich.

operationId: erzeugeBeschluesseAusVersammlung · Auth: bearerAuth

Request-Body (Pflicht): application/json → VersammlungBeschluesseGenerierenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200übernommene Beschlüsse, übersprungene TOPs, Anzahl (VersammlungBeschluesseGenerierenResponse)VersammlungBeschluesseGenerierenResponse
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder fehlendes Recht (ApiErrorBody, code forbidden)
404Versammlung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409bereits generiert (bereits-generiert), nicht verkündet (nicht-verkuendet), kein Beschluss-TOP (keine-beschluesse) oder Beschluss-TOPs ohne Ergebnis (ergebnis-fehlt, Liste der TOP-Nummern), laufende Nummer vergeben (ApiErrorBody, code conflict)

POST/api/versammlung/{id}/teilnehmer

Setzt einen Teilnehmer mit Stimmrecht (Upsert je Person; erneutes Setzen überschreibt). Kein Entfernen: wer nicht erschienen ist, wird nicht erfasst. Ob die Person Eigentümer ist, prüft casa.ai nicht (Gäste, Vertreter, Verwalter sind Teilnehmer). Stimmgewicht: koepfe nur 1, mea Zehntausendstel, objekt Anzahl der Einheiten.

operationId: erfasseVersammlungTeilnehmer · Auth: bearerAuth

Request-Body (Pflicht): application/json → VersammlungTeilnehmerErfassenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Teilnehmer überschrieben (VersammlungTeilnehmerSchreibResponse, angelegt=false)VersammlungTeilnehmerSchreibResponse
201Teilnehmer neu erfasst (VersammlungTeilnehmerSchreibResponse, angelegt=true)VersammlungTeilnehmerSchreibResponse
400ungültige Eingabe, Stimmgewicht passt nicht zum Stimmprinzip ODER Umlaufbeschluss (umlauf-ohne-teilnehmer) (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder fehlendes Recht (ApiErrorBody, code forbidden)
404Versammlung oder Person unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409Versammlung abgeschlossen (versammlung-abgeschlossen) (ApiErrorBody, code conflict)

POST/api/versammlung/{id}/tops

Erfasst einen Tagesordnungspunkt (Beschluss, Geschäftsordnung, Notiz). Die laufende TOP-Nummer vergibt der Server als nächste freie je Versammlung; parallele Anlagen erhalten verschiedene Nummern.

operationId: erfasseVersammlungTop · Auth: bearerAuth

Request-Body (Pflicht): application/json → VersammlungTopErfassenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
201erfasster TOP (VersammlungTopSchreibResponse)VersammlungTopSchreibResponse
400ungültige Eingabe ODER Umlaufbeschluss mit zweitem TOP (umlauf-genau-ein-top) (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder fehlendes Recht (ApiErrorBody, code forbidden)
404Versammlung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409Versammlung abgeschlossen (versammlung-abgeschlossen) ODER ausdrücklich genannte TOP-Nummer vergeben (ApiErrorBody, code conflict)

PATCH/api/versammlung/{id}/tops/{topId}

Ändert Text und Art eines Tagesordnungspunkts. Die laufende Nummer (Reihenfolge) ist nicht änderbar.

operationId: aendereVersammlungTop · Auth: bearerAuth

Request-Body (Pflicht): application/json → VersammlungTopAendernRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
topIdpathjastring(uuid)
StatusBedeutungBody
200geänderter TOP (VersammlungTopSchreibResponse)VersammlungTopSchreibResponse
400ungültige Eingabe, unbekanntes Feld (z. B. lfdNr) (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder fehlendes Recht (ApiErrorBody, code forbidden)
404Versammlung oder TOP unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409Versammlung abgeschlossen ODER Art-Änderung widerspräche erfasstem Ergebnis/Beschluss (ApiErrorBody, code conflict)

POST/api/versammlung/{id}/tops/{topId}/ergebnis

Erfasst das Abstimmungsergebnis EINES Beschluss-TOP: Feststellung angenommen | abgelehnt und Ja/Nein/Enthaltung in Köpfen und in Anteilen (Zehntausendstel). Erneutes Setzen überschreibt, solange die Versammlung nicht abgeschlossen ist. Das System zählt keine Einzelstimmen und leitet die Feststellung nicht aus den Zahlen ab; ein offensichtlicher Widerspruch kommt als Hinweis ergebnis-widerspricht-zahlen, nie als Fehler.

operationId: erfasseTopErgebnis · Auth: bearerAuth

Request-Body (Pflicht): application/json → VersammlungTopErgebnisRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
topIdpathjastring(uuid)
StatusBedeutungBody
200gespeichertes Ergebnis, ggf. mit Hinweis (VersammlungTopErgebnisResponse)VersammlungTopErgebnisResponse
400ungültige Eingabe (z. B. negative oder nicht ganze Zahl) ODER Geschäftsordnungs-/Notiz-TOP (top-ohne-abstimmung) (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder fehlendes Recht (ApiErrorBody, code forbidden)
404Versammlung oder TOP unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409Versammlung abgeschlossen (versammlung-abgeschlossen) (ApiErrorBody, code conflict)

GET/api/versammlung/{id}/umlauf

Liest den Stand des Umlaufs: Vorgang, Rücklaufliste mit Namen und Stimmgewichten, Zählung, fristAbgelaufen und feststellbar. Bis zur Feststellung zählt der Server live (mit dem heutigen Tag), danach gilt die eingefrorene Zählung.

operationId: leseUmlaufStand · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Stand des Umlaufs (UmlaufStandResponse)UmlaufStandResponse
400ungültige Versammlungs-Id (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403kein Zugriff auf diesen Mandanten (ApiErrorBody, code forbidden)
404Versammlung unbekannt, fremder Tenant, nicht zuständig ODER Umlauf nicht eröffnet — dieselbe Meldung (ApiErrorBody, code not_found)

POST/api/versammlung/{id}/umlauf

Eröffnet den Umlauf einer Versammlung der Art umlauf (Status entwurf, genau ein Beschluss-TOP). Allstimmigkeit ist der Default (alle Eigentümer in Textform, § 23 Abs. 3 S. 1 WEG); die abgesenkte Mehrheit (mehrheit_abgegebene) braucht einen vorher gefassten, tragenden Beschluss — das System prüft nicht, ob er sich auf diesen Gegenstand bezieht. Legt je Eigentümer-Person eine Rücklaufzeile an. Die Frist ist keine Ausschlussfrist.

operationId: eroeffneUmlaufbeschluss · Auth: bearerAuth

Request-Body (Pflicht): application/json → UmlaufEroeffnenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
201Umlauf eröffnet (UmlaufEroeffnetResponse)UmlaufEroeffnetResponse
400ungültige Eingabe, mehrheit_abgegebene ohne Beschluss (absenkung-braucht-beschluss), Frist vor der Eröffnung, keine Eigentümer, Stimmgewicht fehlt (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder fehlende Zuständigkeit/Recht (ApiErrorBody, code forbidden)
404Versammlung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409Umlauf bereits eröffnet (umlauf-bereits-eroeffnet) oder Versammlung nicht mehr im Entwurf (ApiErrorBody, code conflict)

POST/api/versammlung/{id}/umlauf/feststellung

Stellt das Ergebnis des Umlaufs fest (einmalig): friert die Zählung ein, schreibt das Ergebnis in den Beschluss-TOP und setzt die Versammlung auf durchgefuehrt. Ein nicht zustande gekommener Umlauf geht als abgelehnt in die Sammlung. Erst nach der Verkündung entsteht ein Beschluss in der Sammlung.

operationId: stelleUmlaufErgebnisFest · Auth: bearerAuth

Request-Body (Pflicht): application/json → UmlaufFeststellenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200festgestellt (UmlaufFeststellungResponse)UmlaufFeststellungResponse
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder fehlende Zuständigkeit/Recht (ApiErrorBody, code forbidden)
404Versammlung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409noch nicht feststellbar (feststellung-noch-nicht-moeglich) oder bereits festgestellt (umlauf-festgestellt) (ApiErrorBody, code conflict)

POST/api/versammlung/{id}/umlauf/ruecklauf

Erfasst die Antwort EINER Person (ja, nein, enthaltung) mit Eingangsdatum, Kanal und Textform-Bestätigung. Zustimmung gilt nur in Textform. Eine spätere Antwort überschreibt die frühere, bis der Umlauf festgestellt ist; eine Antwort nach dem Fristende zählt (Hinweis nach-fristablauf).

operationId: erfasseUmlaufRuecklauf · Auth: bearerAuth

Request-Body (Pflicht): application/json → UmlaufRuecklaufRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Antwort erfasst, mit Zählstand (UmlaufRuecklaufResponse)UmlaufRuecklaufResponse
400ungültige Eingabe, ja ohne Textform (textform-fehlt), Person steht nicht auf der Rücklaufliste (person-nicht-eigentuemer), Eingang vor Eröffnung oder in der Zukunft (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder fehlende Zuständigkeit/Recht (ApiErrorBody, code forbidden)
404Versammlung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409Umlauf bereits festgestellt (umlauf-festgestellt) (ApiErrorBody, code conflict)

POST/api/versammlung/{id}/umlauf/verkuendung

Verkündet den festgestellten Umlauf (einmalig), hält Mitteilungsdatum und -form fest und liefert das berechnete Ende der Anfechtungsfrist (ein Monat ab Verkündung, § 45 WEG). Auch ein nicht zustande gekommener Umlauf wird verkündet. Danach lassen sich die Beschlüsse generieren (POST /api/versammlung/{id}/beschluesse).

operationId: verkuendeUmlaufbeschluss · Auth: bearerAuth

Request-Body (Pflicht): application/json → UmlaufVerkuendenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200verkündet (UmlaufVerkuendungResponse)UmlaufVerkuendungResponse
400ungültige Eingabe, Datum vor dem Versammlungsdatum oder in der Zukunft (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder fehlende Zuständigkeit/Recht (ApiErrorBody, code forbidden)
404Versammlung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409noch nicht festgestellt (umlauf-nicht-festgestellt) oder bereits verkündet (bereits-verkuendet) (ApiErrorBody, code conflict)

POST/api/versammlung/{id}/verkuendung

Verkündet die Versammlung (setzt verkuendet_am EINMAL) und liefert das berechnete Ende der Anfechtungsfrist (ein Monat ab Verkündung, § 45 WEG; Feiertage nicht berücksichtigt). Das Fristende wird nirgends gespeichert. Voraussetzung: Status durchgefuehrt, mindestens ein Beschluss-TOP, jeder Beschluss-TOP hat ein Ergebnis; das Datum liegt nicht vor dem Versammlungsdatum und nicht in der Zukunft.

operationId: verkuendeVersammlung · Auth: bearerAuth

Request-Body (Pflicht): application/json → VersammlungVerkuendenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200verkündet, mit anfechtungsfristEnde (VersammlungVerkuendungResponse)VersammlungVerkuendungResponse
400ungültige Eingabe, Datum vor dem Versammlungsdatum oder in der Zukunft (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder fehlendes Recht (ApiErrorBody, code forbidden)
404Versammlung unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409bereits verkündet (bereits-verkuendet), Status nicht durchgefuehrt, kein Beschluss-TOP oder Beschluss-TOPs ohne Ergebnis (Liste der TOP-Nummern), Versammlung abgeschlossen (ApiErrorBody, code conflict)

version

GET/api/version

Serverseitig eingebrannte Build-ID (Deploy-Skew-Erkennung).

operationId: getVersion · Auth: keine (öffentlich)

StatusBedeutungBody
200Build-IDVersionResponse

vertrag

GET/api/vertrag

Listet Verträge (3-Wege-Gültigkeitsfilter Alle/Aktiv/Beendet, Default aktiv).

operationId: listVertraege · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
statusqueryneinalle | aktiv | beendetalle | aktiv | beendet (Default aktiv). Gemessen an end_date, nicht an archived_at. aktiv ∪ beendet ≠ alle: zukünftige Verträge erscheinen nur unter `alle`. Unbekannter Wert ⇒ 400.
objektIdqueryneinstring(uuid)nur Verträge dieses Objekts (UUID)
asOfqueryneinstring(date)Stichtag YYYY-MM-DD, gegen den aktiv/beendet gemessen wird (Default: heute, UTC).
StatusBedeutungBody
200Vertragsliste (VertragListResponse)VertragListResponse
400ungültiger status-Filter, objektId-UUID oder Stichtag (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/vertrag

Legt ein Mietverhältnis samt initialer Zahlungs-Zeitscheibe an.

operationId: createVertrag · Auth: bearerAuth

Request-Body (Pflicht): application/json → VertragCreateRequest

StatusBedeutungBody
201angelegter Vertrag inkl. Zeitscheiben (Vertrag)
400ungültige Eingabe (z. B. Float-Betrag, fehlende depositCurrency) (ApiErrorBody, code invalid_request). Eine Kautionsabrede über mehr als drei Nettokaltmieten der initialen Zeitscheibe (§ 551 Abs. 1 BGB) ⇒ ApiErrorBody, code KAUTION_UEBERSTEIGT_OBERGRENZE; die Meldung nennt Kaution, Nettokaltmiete und Grenze; kein Vertrag entsteht.
401nicht authentifiziert — leerer Body (kein Oracle)
404Objekt ODER eine Zahlungs-Komponente unbekannt, archiviert oder fremder Tenant (ApiErrorBody, code not_found). Die Ziel-Prüfung leistet der Tool-Layer.
409Kautionsabrede ohne bestimmbare Nettokaltmiete ⇒ ApiErrorBody, code KAUTION_OHNE_NETTOKALTMIETE (fail-closed, kein Vertrag entsteht).

GET/api/vertrag/{id}

Liest EINEN Vertrag samt Konditionen-Zeitscheiben und vereinbarten Zahlungen (auch beendet).

operationId: getVertrag · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Vertrag (mit gefülltem terms-Array)Vertrag
400keine UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel)

POST/api/vertrag/{id}/end

Beendet einen Vertrag zum Stichtag (setzt end_date, schließt offene Zeitscheiben; statt DELETE, K5).

operationId: endVertrag · Auth: bearerAuth

Request-Body (Pflicht): application/json → VertragEndRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200beendet (VertragEndResponse). Wiederholter Aufruf = Idempotenz-Replay des Erst-Ergebnisses.
400ungültiges/unplausibles Enddatum (am/vor Beginn oder Scheiben-Beginn) (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/vertrag/{id}/indexmiete

Beantragt eine Indexanpassung (beantrage_indexanpassung): neue Miete = bisherige × aktueller Index / Bezugsindex (kaufmännisch gerundet), frühestens zwölf Monate nach der letzten Änderung, wirksam ab dem übernächsten Monat nach Zugang. Eine Erhöhung wird als freigabepflichtiger Vorgang in die Mieterhöhungs-Freigabe gelegt — umgestellt wird erst nach der Freigabe über die Konditionen (kein automatisches Umstellen).

operationId: beantrageIndexanpassung · Auth: bearerAuth

Request-Body (Pflicht): application/json

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200{ art: vorgelegt | zu-frueh | keine-aenderung, … } — bei `vorgelegt` (Erhöhung wie Senkung, beide freigabepflichtig) mit mieterhoehungId, neueKaltmieteCents, vorhaben (die geplante Zeitscheibe) und inhaltHash; bei `zu-frueh` mit fruehesterTermin und ohne Vorgang.
400ungültige Anfrage oder nicht rechenbar (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Vertrag unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)
409keine Indexmiete-Vereinbarung, Indexmonat nicht in der Reihe, kein offener Zeitscheiben-Stand oder bereits eine andere Erhöhung zum Wirksamkeitstag (ApiErrorBody, code conflict)

PUT/api/vertrag/{id}/indexmiete

Hält die Indexmiete-Vereinbarung eines Vertrags fest (setze_indexmietvereinbarung): Basisjahr der VPI-Reihe und Ausgangsindex (Berichtsmonat). `vereinbarung: null` nimmt sie zurück.

operationId: setzeIndexmietvereinbarung · Auth: bearerAuth

Request-Body (Pflicht): application/json

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200gesetzt — { contractId, vereinbarung, zuvor }
400ungültige Vereinbarung oder unbekanntes Feld (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Vertrag unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)

POST/api/vertrag/{id}/kaution

Hält die Kautionsabrede eines Vertrags fest (setze_kautionsabrede): Betrag und Währung (Pflicht, wenn der Vertrag noch keine Kaution dokumentiert), Anlageform, Raten nach § 551 Abs. 2 BGB (1…3) und optional die getrennte Anlage. Erst damit wird aus einer dokumentierten Kaution eine sollstellbare Forderung.

operationId: setzeKautionsabrede · Auth: bearerAuth

Request-Body (Pflicht): application/json

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200gesetzt — { contractId, vereinbartCents, currency, kautionAnlageform, kautionRaten, kautionAnlagekontoId }
400ungültige Abrede, z. B. mehr als 3 Raten oder Raten bei Bürgschaft (ApiErrorBody, code invalid_request). Kaution über drei Nettokaltmieten der am Abredetag gültigen Zeitscheibe bei Wohnraum (§ 551 Abs. 1 BGB) ⇒ ApiErrorBody, code KAUTION_UEBERSTEIGT_OBERGRENZE; die Meldung nennt Kaution, Nettokaltmiete und Grenze; nichts geschrieben.
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Vertrag oder Kautionskonto unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)
409kein Kautionsbetrag vereinbart oder bereits Raten/Eingänge gebucht (ApiErrorBody, code conflict). Wohnraum ohne Nettokaltmiete am Abredetag ⇒ ApiErrorBody, code KAUTION_OHNE_NETTOKALTMIETE (fail-closed, nichts geschrieben).

GET/api/vertrag/{id}/kuendigung

Liest die Kündigungslage eines Vertrags: mit zugang + kuendigender den VORSCHLAG des Vertragsendes nach § 573c BGB (ohne Write), dazu die bereits erfasste Kündigung samt Kennzeichnung „abweichend vereinbart".

operationId: getVertragKuendigung · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
zugangqueryneinstring(date)Tag des Zugangs (nur zusammen mit kuendigender)
kuendigenderqueryneinmieter | vermieterWer kündigt (nur zusammen mit zugang)
StatusBedeutungBody
200Kündigungslage (vorschlag null ohne Query; kuendigung null ohne erfasste Kündigung)VertragKuendigungResponse
400ungültige Query (kein existierender Kalendertag, unbekannter Kündigender, nur einer der beiden Parameter) (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Vertragsende nicht berechenbar: Bundesland des Objekts bzw. (Vermieter) Vertragsbeginn fehlt (ApiErrorBody, code conflict)

POST/api/vertrag/{id}/kuendigung

Erfasst die Kündigung (terminate_contract) und beendet den Vertrag zum errechneten Ende nach § 573c BGB — oder zum abweichend vereinbarten Ende (vereinbartesEnde), das dann als „abweichend vereinbart" gekennzeichnet wird. Einmalig: ein bereits beendeter Vertrag antwortet alreadyEnded: true.

operationId: kuendigeVertrag · Auth: bearerAuth

Request-Body (Pflicht): application/json → VertragKuendigenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200gekündigt (VertragKuendigenResponse). Wiederholung mit demselben Idempotency-Key = Replay des Erst-Ergebnisses.VertragKuendigenResponse
400ungültige Eingabe, contractId im Body, oder vereinbartes Ende am/vor dem Beginn (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt des Vertrags (ApiErrorBody, code forbidden)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)
409Vertragsende nicht berechenbar: Bundesland des Objekts bzw. (Vermieter) Vertragsbeginn fehlt (ApiErrorBody, code conflict)

POST/api/vertrag/{id}/mieterhoehung

Legt ein Mieterhöhungsverlangen nach § 558 BGB an (erstelle_mieterhoehung): Vorgang im Zustand `entwurf` und dokumentiertes Schreiben entstehen, der Vorgang erscheint in der Freigabe. Es entsteht KEINE Zeitscheibe — umgestellt wird erst nach der Freigabe über die Konditionen. Die Vertrags-Id steht nur im Pfad; Mandant und Akteur kommen aus der Sitzung (ein Mandant im Rumpf wird ignoriert).

operationId: erstelleMieterhoehung · Auth: bearerAuth

Request-Body (Pflicht): application/json

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
201angelegt — { mieterhoehungId, schreibenId, contractId, wirksamAb, zustand: "entwurf", zustimmungsfristBis, alterBetragCents, neuerBetragCents, … }
400ungültige Eingabe oder unbekanntes Feld (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403keine Zuständigkeit für das Objekt bzw. keine Berechtigung (ApiErrorBody, code forbidden)
404Vertrag unbekannt ODER mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Kappungsgrenze und/oder Jahressperrfrist verletzt (ApiErrorBody, code MIETERHOEHUNG_UNZULAESSIG) oder zu diesem Wirksamkeitstag besteht schon ein Verlangen (code MIETERHOEHUNG_DOPPELT); Indexmiete-/Staffelmiete-Kollision. Nichts geschrieben.
422Wucherschwelle überschritten (code MIETERHOEHUNG_WUCHER), Begründung trägt das Verlangen nicht (code MIETERHOEHUNG_SCHREIBEN_UNGUELTIG), Wirksamkeitstag vor Ende der Zustimmungsfrist (code MIETERHOEHUNG_VOR_ZUSTIMMUNGSFRIST) oder in der Vergangenheit (code MIETERHOEHUNG_RUECKWIRKEND). Nichts geschrieben.

GET/api/vertrag/{id}/personen

Liest die Kopfzahl-Historie eines Vertrags (alle Zeitscheiben, active zum Stichtag).

operationId: listVertragPersonen · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
asOfqueryneinstring(date)Stichtag YYYY-MM-DD, gegen den `active` gemessen wird (Default: heute UTC). Ungültiges Format ⇒ 400.
StatusBedeutungBody
200Kopfzahl-Historie (VertragPersonenListResponse)VertragPersonenListResponse
400keine UUID oder ungültiger asOf (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Vertrag unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/vertrag/{id}/personen

Setzt/ändert eine Kopfzahl-Zeitscheibe „ab Datum" (SCD-2; Überschneidungen desselben Vertrags werden abgelehnt).

operationId: setVertragPersonen · Auth: bearerAuth

Request-Body (Pflicht): application/json → VertragPersonenSetRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200gesetzte Zeitscheibe (VertragPersonenSetResponse)
400ungültige Eingabe (negative/gebrochene Kopfzahl, validFrom nach validTo) ODER Überschneidung mit einer bestehenden Scheibe desselben Vertrags (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Vertrag unbekannt ODER fremder Tenant (ApiErrorBody, code not_found)

POST/api/vertrag/{id}/personen/{sliceId}/remove

Entfernt eine Kopfzahl-Zeitscheibe außer der ersten (stillgelegt, K5); die Vorgängerin deckt die Lücke wieder bzw. ist wieder laufend. Kein Body. Wiederholung = Replay.

operationId: removeVertragPersonen · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
sliceIdpathjastring(uuid)Id der Scheibe (aus GET /api/vertrag/{id}/personen)
StatusBedeutungBody
200entfernt (VertragPersonenRemoveResponse)VertragPersonenRemoveResponse
400id oder sliceId keine UUID (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Vertrag oder Scheibe unbekannt, fremder Tenant, an einem anderen Vertrag oder schon entfernt (ApiErrorBody, code not_found — kein Existenz-Orakel)
409die erste Scheibe des Vertrags bleibt (P82) — ändern statt entfernen (ApiErrorBody, code conflict)

POST/api/vertrag/{id}/zahlung

Konditionswechsel: vereinbarte Zahlungen als Zeitscheibe ändern (schließt die offene Scheibe auf `ab`, öffnet lückenlos eine neue).

operationId: changeVertragZahlung · Auth: bearerAuth

Request-Body (Pflicht): application/json → VertragZahlungChangeRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200gewechselt (VertragZahlungChangeResponse). Wiederholter Aufruf mit gleichem Idempotency-Key = Replay des Erst-Ergebnisses.
400rückwirkendes/ungültiges ab oder Float auf Geld (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannt ODER fremder Tenant (ApiErrorBody, code not_found — kein Existenz-Orakel)
409kein offener Zeitscheiben-Stand oder nebenläufiger Wechsel (ApiErrorBody, code conflict)

zaehler

GET/api/zaehler

Zähler des Mandanten (optional je Objekt, Einheit, Zählerart) — mit Einheitsnummer, Art, Maßeinheit und Archivstand.

operationId: listZaehler · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
objektqueryneinstring(uuid)Nur Zähler dieses Objekts.
einheitqueryneinstring(uuid)Nur Zähler dieser Einheit.
zaehlerartqueryneinstringNur Zähler dieser Art (z. B. `kaltwasser`).
archiveScopequeryneinalle | aktiv | archiviertArchivstand der Zähler: `aktiv` (Default), `archiviert` oder `alle`.
StatusBedeutungBody
200Die Zähler.ZaehlerListeResponse
400ungültige Query (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/zaehler

Legt einen Zähler an (create_meter). Ohne Nummer: Nummernkreis `KW|WW|HZ|ST-<Turnusjahr>-NNN` als Vorgabe; die Antwort nennt die vergebene Nummer. Objekt und Standort sind danach fest. Derselbe Idempotency-Key legt nur einen Zähler an.

operationId: legeZaehlerAn · Auth: bearerAuth

Request-Body (Pflicht): application/json → ZaehlerAnlegenRequest

StatusBedeutungBody
201Der angelegte Zähler.ZaehlerGespeichertResponse
400ungültige Eingabe, unbekanntes Feld, Nummer und Präfix zugleich oder Einheit eines anderen Objekts (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent, keine Zuständigkeit für das Objekt oder Testzeitraum abgelaufen (ApiErrorBody, code forbidden)
404unbekanntes ODER fremdes Objekt bzw. unbekannter oder fremder Zähler — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Objekt oder Einheit ist archiviert (ApiErrorBody, code conflict)

PATCH/api/zaehler/{id}

Ändert Zählerart, Zählernummer oder Maßeinheit (update_meter); mindestens ein Feld. Objekt und Standort sind nach der Anlage fest (400).

operationId: aendereZaehler · Auth: bearerAuth

Request-Body (Pflicht): application/json → ZaehlerAendernRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200Der geänderte Zähler.ZaehlerGespeichertResponse
400leerer Patch, unbekanntes Feld (auch propertyId/unitId) oder ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent, keine Zuständigkeit für das Objekt oder Testzeitraum abgelaufen (ApiErrorBody, code forbidden)
404unbekanntes ODER fremdes Objekt bzw. unbekannter oder fremder Zähler — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel)
409der Zähler ist archiviert (ApiErrorBody, code conflict)

GET/api/zaehler/{id}/ablesungen

Ablesungs-Historie EINES Zählers, aufsteigend nach Ablesezeitpunkt; Stände als Dezimal-Strings (Skala 3).

operationId: listZaehlerAblesungen · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
vonqueryneinstring(date)Erster Kalendertag `JJJJ-MM-TT` (inklusiv).
bisqueryneinstring(date)Letzter Kalendertag `JJJJ-MM-TT` (inklusiv).
StatusBedeutungBody
200Die Ablesungen.ZaehlerAblesungenResponse
400ungültige Query (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannter ODER fremder Zähler — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel)

POST/api/zaehler/{id}/ablesungen

Erfasst eine Ablesung (record_meter_reading). Plausibilitäts-Warnungen (Ausreißer, Verbrauch null) und Hinweise (Ablesefenster) stehen in `plausibilitaet`; sie sind KEIN Fehler, der Stand ist dann gespeichert. Die Zwischenablesung am Tag des Mieterwechsels ist Voraussetzung der Verbrauchs-Zuordnung je Vertrag. Derselbe Idempotency-Key erfasst nur eine Ablesung.

operationId: erfasseZaehlerAblesung · Auth: bearerAuth

Request-Body (Pflicht): application/json → ZaehlerAblesenRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
201Die gespeicherte Ablesung mit Plausibilitäts-Ergebnis.ZaehlerAbgelesenResponse
400ungültige Eingabe, unbekanntes Feld (auch die Zähler-Id im Body) oder Stand mit Komma statt Punkt (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent, keine Zuständigkeit für das Objekt oder Testzeitraum abgelaufen (ApiErrorBody, code forbidden)
404unbekannter ODER fremder Zähler bzw. unbekannte oder fremde Ablesung — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Zähler archiviert, Stand unter dem Vorstand (negativer Verbrauch) oder Zeitpunkt schon belegt (ApiErrorBody, code conflict, Klartext der Maske)

POST/api/zaehler/{id}/archiv

Legt einen Zähler still (archive_meter). Ein zweites Archivieren ist 200 mit `bereitsArchiviert: true`. Ein Zähler mit Ablesungen lässt sich erst nach dem Stand zum jüngsten Periodenende stilllegen (409 OFFENE_ABLESUNG).

operationId: archiviereZaehler · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200{ id, archiviertAm, bereitsArchiviert }ZaehlerArchiviertResponse
400ungültige Zähler-Id oder ein Feld im Body — der Body ist leer (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent, keine Zuständigkeit für das Objekt oder Testzeitraum abgelaufen (ApiErrorBody, code forbidden)
404unbekanntes ODER fremdes Objekt bzw. unbekannter oder fremder Zähler — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel)
409offene Ablesung: der Stand zum jüngsten Periodenende fehlt (ApiErrorBody, code conflict, Klartext der Maske)

POST/api/zaehler/{id}/tausch

Tauscht einen Zähler als EINE Fachhandlung (replace_meter): Endstand des Altzählers, Neuzähler (`replaces_meter_id`), Anfangsstand (Standard 0.000), Altzähler archiviert. Die Antwort nennt die Id des neuen Zählers.

operationId: tauscheZaehler · Auth: bearerAuth

Request-Body (Pflicht): application/json → ZaehlerTauschRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
201Alt- und Neuzähler mit beiden Ständen.ZaehlerGetauschtResponse
400ungültige Eingabe, unbekanntes Feld (auch die Zähler-Id im Body) oder Stand mit Komma statt Punkt (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent, keine Zuständigkeit für das Objekt oder Testzeitraum abgelaufen (ApiErrorBody, code forbidden)
404unbekannter ODER fremder Zähler bzw. unbekannte oder fremde Ablesung — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Zähler archiviert, Endstand unter dem Vorstand oder Zeitpunkt belegt (ApiErrorBody, code conflict, Klartext der Maske)

GET/api/zaehler/{id}/zwischenstand

Zwischenstand-VORSCHLAG eines Zählers für einen Stichtag (Mieterwechsel): linear nach Kalendertagen zwischen dem letzten Stand davor und dem ersten danach, mit Begründung. Wird NICHT gebucht und ist nie ein Wert des Abrechnungslaufs; übernehmen heißt, die Ablesung selbst zu erfassen (Anlass zwischenablesung, Erhebungsart schaetzung). Nur lesend.

operationId: getZaehlerZwischenstand · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
stichtagqueryjastring(date)Stichtag `JJJJ-MM-TT`.
StatusBedeutungBody
200Der Vorschlag oder der Grund, warum es keinen gibt (`code`); Stände sind Dezimal-Strings.ZaehlerZwischenstandResponse
400fehlender oder unlesbarer Stichtag bzw. unbekannter Parameter (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekannter ODER fremder Zähler — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel)

GET/api/zaehler/pflicht

Erfassungspflicht nach HeizkostenV für Objekt und Zählerart (ab 3 Wohneinheiten, mit Ausnahme-Option `zaehler.erfassungspflicht_ausnahme`). Ein HINWEIS, keine Sperre; nur lesend.

operationId: getZaehlerPflicht · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
objektqueryjastring(uuid)Das zu prüfende Objekt.
zaehlerartqueryjastringZählerart, z. B. waerme, wasser_warm, wasser_kalt, strom.
StatusBedeutungBody
200Die Pflicht (`ja` · `nein` · `ausnahme` · `nicht-heizkostenv`) mit Hinweisen.ZaehlerPflichtResponse
400fehlende oder ungültige Query (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekanntes ODER fremdes Objekt — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel)
409unbrauchbare Ausnahme-Option `zaehler.erfassungspflicht_ausnahme` am Objekt (ApiErrorBody) — mit Klartext abgelehnt statt geraten

POST/api/zaehler/sammelanlage

Legt denselben Zählertyp für mehrere Einheiten EINES Objekts an (create_meters_for_units, höchstens 500 Einheiten). Je Einheit `angelegt` oder `vorhanden`; eine Wiederholung legt nur Fehlendes an.

operationId: legeZaehlerSammelanlage · Auth: bearerAuth

Request-Body (Pflicht): application/json → ZaehlerSammelanlageRequest

StatusBedeutungBody
200Je Einheit angelegt oder vorhanden.ZaehlerSammelanlageResponse
400ungültige Eingabe, unbekanntes Feld, doppelte Einheit, Nummer und Nummernkreis zugleich oder Einheit eines anderen Objekts (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent, keine Zuständigkeit für das Objekt oder Testzeitraum abgelaufen (ApiErrorBody, code forbidden)
404unbekanntes ODER fremdes Objekt bzw. unbekannter oder fremder Zähler — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel)
409Objekt oder Einheit ist archiviert (ApiErrorBody, code conflict)

GET/api/zaehler/verbrauch

Verbrauch je Zähler und je (Einheit, Zählerart) für einen Zeitraum. Anfangsstand = letzter Stand bis zum Periodenbeginn (auch aus dem Vorjahr). Fehlt eine Grenze, steht `vollstaendig: false` mit `fehlend` — nie interpoliert.

operationId: getZaehlerVerbrauch · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
objektqueryjastring(uuid)Objekt, dessen Zähler abgeleitet werden.
vonqueryjastring(date)Erster Kalendertag `JJJJ-MM-TT` (inklusiv).
bisqueryjastring(date)Letzter Kalendertag `JJJJ-MM-TT` (inklusiv).
StatusBedeutungBody
200Der Verbrauch; Stände und Verbrauch sind Dezimal-Strings.ZaehlerVerbrauchResponse
400ungültige Query oder Zeitraum (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404unbekanntes ODER fremdes Objekt — dieselbe Meldung (ApiErrorBody, code not_found — kein Existenz-Orakel)

zeit

GET/api/zeit

Die EIGENEN Zeiteinträge im Zeitraum (nach Leistungsdatum), neueste zuerst, einschließlich stornierter. Ohne von/bis: der laufende Kalendermonat (Europe/Berlin).

operationId: listZeit · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
objektqueryneinstring(uuid)Nur Einträge dieses Objekts.
vonqueryneinstring(date)Erster Kalendertag `JJJJ-MM-TT` (inklusiv).
bisqueryneinstring(date)Letzter Kalendertag `JJJJ-MM-TT` (inklusiv).
StatusBedeutungBody
200{ eintraege }ZeiteintraegeResponse
400ungültige Query oder von liegt nach bis (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
404Objektfilter: Objekt unbekannt oder mandantenfremd (ApiErrorBody, code not_found — kein Existenz-Orakel)

POST/api/zeit

Trägt Zeit nachträglich ein (erfasse_zeit, Quelle manuell). Objektbezug ist Pflicht. Derselbe Idempotency-Key legt den Eintrag nur einmal an.

operationId: erfasseZeit · Auth: bearerAuth

Request-Body (Pflicht): application/json → ErfasseZeitRequest

StatusBedeutungBody
201{ zeitId, dauerMinuten, leistungsdatum, hinweise }ZeitErfasstResponse
400ungültige Eingabe, z. B. 0 Minuten oder Datum in der Zukunft (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Objekt oder Bezug unbekannt oder mandantenfremd (ApiErrorBody, code not_found)
409Objekt ist archiviert (ApiErrorBody, code conflict)

PATCH/api/zeit/{id}

Korrigiert einen EIGENEN, beendeten Eintrag (korrigiere_zeit). Ein laufender Timer ist nicht korrigierbar.

operationId: korrigiereZeit · Auth: bearerAuth

Request-Body (Pflicht): application/json → KorrigiereZeitRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200{ zeitId, dauerMinuten, leistungsdatum, hinweise }ZeitErfasstResponse
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Eintrag unbekannt, mandantenfremd oder von einem anderen Mitarbeiter (ApiErrorBody, code not_found)
409der Timer läuft noch, der Eintrag ist storniert oder kein Timer (ApiErrorBody, code conflict)

POST/api/zeit/{id}/stopp

Stoppt einen EIGENEN laufenden Timer (stoppe_zeit); die Dauer wird aus Beginn und Ende gerechnet.

operationId: stoppeZeit · Auth: bearerAuth

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200{ zeitId, ende, dauerMinuten, hinweise }ZeitGestopptResponse
400ungültige Id (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Eintrag unbekannt, mandantenfremd oder von einem anderen Mitarbeiter (ApiErrorBody, code not_found)
409der Timer ist bereits gestoppt, storniert oder kein Timer (ApiErrorBody, code conflict)

POST/api/zeit/{id}/storno

Storniert einen EIGENEN Eintrag (storniere_zeit); er bleibt auffindbar, zählt aber nirgends mehr. Grund ist Pflicht.

operationId: storniereZeit · Auth: bearerAuth

Request-Body (Pflicht): application/json → StorniereZeitRequest

ParameterOrtPflichtTypBeschreibung
idpathjastring(uuid)
StatusBedeutungBody
200{ zeitId, storniert: true }ZeitStorniertResponse
400Grund fehlt oder ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Eintrag unbekannt, mandantenfremd oder von einem anderen Mitarbeiter (ApiErrorBody, code not_found)
409der Eintrag ist bereits storniert (ApiErrorBody, code conflict)

GET/api/zeit/laufend

Die laufenden Timer des Angemeldeten (nicht gestoppt, nicht storniert), ältester zuerst.

operationId: listZeitLaufend · Auth: bearerAuth

StatusBedeutungBody
200{ timer }ZeitLaufendResponse
401nicht authentifiziert — leerer Body (kein Oracle)

POST/api/zeit/start

Startet einen Timer (starte_zeit). Mehrere Timer dürfen gleichzeitig laufen; läuft einer an einem anderen Objekt, kommt der Hinweis timer-an-anderem-objekt.

operationId: starteZeit · Auth: bearerAuth

Request-Body (Pflicht): application/json → StarteZeitRequest

StatusBedeutungBody
201{ zeitId, beginn, leistungsdatum, hinweise }ZeitGestartetResponse
400ungültige Eingabe (ApiErrorBody, code invalid_request)
401nicht authentifiziert — leerer Body (kein Oracle)
403Agent oder keine Zuständigkeit für das Objekt (ApiErrorBody, code forbidden)
404Objekt oder Bezug unbekannt oder mandantenfremd (ApiErrorBody, code not_found)
409Objekt ist archiviert (ApiErrorBody, code conflict)

Schemas

AblesungBerichtigenRequest

FeldTypPflichtBeschreibung
readingstringjaDer richtige Zählerstand. Dezimal-String mit Punkt und höchstens 3 Nachkommastellen (z. B. `161.700`); ein Komma ist 400.
grundstringneinWarum berichtigt wird (Kommando-Log); fehlt er, fehlt er sichtbar.

AblesungBerichtigtResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
zaehlerIdstring(uuid)ja
standstringjaDer neue, kanonische Stand (Skala 3).
vorherigerStandstringjaDer Stand vor der Berichtigung (Skala 3).
abgelesenAmstring(date-time)ja
anlassturnus | wechsel | zwischenablesungja
verbrauchSeitVorablesungstring | nullja
plausibilitaetZaehlerPlausibilitaetja

AbrechnungBerechnetResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
statusentwurf | berechnetja

AbrechnungErgebnisResponse

FeldTypPflichtBeschreibung
runAbrechnungErgebnisRunja
rechenbarbooleanjaABGELEITET: umlage !== null && gegenrechnung !== null. Nie unabhängig gesetzt.
umlageunbekanntja
umlageFehlerstring | nulljaKlartext des fail-closed-Abbruchs oder null (kein leerer String).
gegenrechnungunbekanntja
gegenrechnungFehlerstring | nullja
readinessFindingsunbekanntneinReadiness-Befunde des Startzeitpunkts — der GRUND eines null-Ergebnisses, ohne einen zweiten Endpunkt zu fragen.

AbrechnungErgebnisRun

FeldTypPflichtBeschreibung
idstring(uuid)ja
propertyIdstring(uuid)ja
unitGroupIdstring(uuid) | nullja
periodFromstring(date)ja
periodTostring(date)ja
statusentwurf | berechnetja
bindingContentHashstringjaBindungs-Hash BEIDER Geld-Seiten des Laufs (INV-TIME-01, seit #1812): Umlage-Eingabe UND VZ-Seite (payment_components, contract_term_payments, im Ist-Modus zusätzlich die zugeordneten Zahlungen). Gleicher Hash belegt, dass zwei Lesungen dieselbe Eingabe hatten — auch die der gegenrechnung. EINZIGE Ausnahme: ein vor #1812 gebundener ALT-Lauf trägt keinen vz-Zweig im Snapshot; seine VZ-Seite wird weiterhin live gelesen und ist von diesem Hash nicht gedeckt.
bindingBoundAtstring(date-time)ja

AbrechnungStartResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
statusentwurf | berechnetja
propertyIdstring(uuid)ja
unitGroupIdstring(uuid) | nullja
periodFromstring(date)ja
periodTostring(date)ja
bindingContentHashstringja
bindingBoundAtstring(date-time)ja

AbschlussFreezeResponse

FeldTypPflichtBeschreibung
laufIdstring(uuid)ja
propertyIdstring(uuid)ja
jahrintegerja
zustandoffen | festgeschriebenjafestgeschrieben = bestandskräftiger Beschluss; offen = alles andere.
beschlussRefstringjaDer tragende Beschluss — auch im Zustand `offen` benannt, denn er trägt den Lauf.
korrekturwegstornojaDer EINZIGE Weg zur Korrektur, unabhängig vom Zustand.
snapshotGeprueftbooleanjaWurde die ZWEITE Hälfte von F7 gefahren? `true` nur, wenn der Aufrufer mit `snapshotHash` den am AKTUELLEN Stand gebildeten Hash mitgegeben hat. Ohne ihn beantwortet die Route allein die Status-Frage — sie behauptet nicht, den Stand geprüft zu haben.

AbschlussKettenZeile

FeldTypPflichtBeschreibung
jahrintegerja
stornierterLaufIdstring(uuid)ja
neuerLaufIdstring(uuid)ja

AbschlussKorrekturRequest

FeldTypPflichtBeschreibung
ungueltigerBeschlussRefstringjaDer rechtskräftig für ungültig erklärte Schlüssel-Beschluss, kanonische Referenz aus S12-T02.
verrechnungsjahrintegerjaDas Jahr, in dessen NEUER Abrechnung die Differenzen verrechnet werden.
betroffeneJahrearray<integer>jaDie Jahre der KASKADE, aus `bildeKorrekturkaskade` (S12-T13a) — Pflichtangabe und nie leer. Sie wird ausdrücklich NICHT aus dem Bestand abgeleitet: „jeder aktive Lauf vor dem Verrechnungsjahr" überschritte die Kaskade, sobald das Objekt Läufe aus Jahren VOR der Wirksamkeit des aufgehobenen Beschlusses führt.
idempotenzSchluesselstringjaDer Schlüssel des GANZEN Dispatches, vom Aufrufer gebildet (`abschlussKorrekturSchluessel`). Zwei Aufrufe am selben Schlüssel ergeben GENAU EINE Kette.
grundstringjaWarum korrigiert wird — nie leer.
stichtagstring(date)jaDer Tag des Stornos, striktes `YYYY-MM-DD` (BP §8).
entscheidungenarray<unbekannt>jaDie Gate-Entscheidungen der neuen Läufe, aus `entscheideAbschlussVerrechnung` (S12-T13a) ÜBERNOMMEN — hier wird nicht gerechnet (INV-ROUND-01). Pflichtfeld, aber die LEERE Liste ist zulässig: sie ist dann eine Aussage („dieser Vorgang hat über keine Einheit entschieden") und kein Versehen. Jede Entscheidung muss zu einem Jahr gehören, das in dieser Kaskade auch einen neuen Lauf bekommt.

AbschlussKorrekturResponse

FeldTypPflichtBeschreibung
ausganggeschrieben | bereits_ausgefuehrtja
kettearray<AbschlussKettenZeile>jaJe betroffenem Jahr GENAU EIN Paar; bei `bereits_ausgefuehrt` leer.

AbschlussLauf

FeldTypPflichtBeschreibung
idstring(uuid)ja
propertyIdstring(uuid)ja
wirtschaftsjahrintegerjaDas Wirtschaftsjahr, dessen Abschluss dieser Lauf trägt.
artabschluss | korrekturjaabschluss = der erste Lauf eines Jahres; korrektur = der Nachfolger eines stornierten.
beschlussRefstringjaKanonische Beschluss-Teilgegenstands-Referenz `beschluss-gegenstand:<uuid>` (S12-T02) — die Rechtsgrundlage des Laufs.
beschlussStatusangenommen | abgelehnt | angefochten | bestandskraeftig | aufgehoben | nichtigjaDer Status, unter dem der Lauf steht; `bestandskraeftig` ⇒ Freeze (§ 28 Abs. 2 WEG).
snapshotHashstring | nulljaDer Festschreibungs-Anker (Muster F7), 64 Hex-Zeichen klein. `null`, solange nichts festgeschrieben ist — ein erfundener Anker wäre schlimmer als keiner.
storniertbooleanja
storniertAmstring(date) | nulljaDer Tag des Stornos; `null` ohne Storno. Er kommt vom Aufrufer, nie aus der Uhr des Servers (BP §8).
stornoGrundstring | nulljaWarum storniert wurde — ein Storno ohne Begründung ist im Audit wertlos.
ersetztLaufIdstring(uuid) | nulljaDer Lauf, den DIESER ersetzt; `null` beim ersten Lauf eines Jahres.
ausgeloestVonstring | nulljaWER den Korrekturlauf ausgelöst hat; bei `art = abschluss` `null` (ein anonymer Korrekturlauf ist keiner).

AbschlussLaufListResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
jahrinteger | nulljaDas gefilterte Wirtschaftsjahr (Echo) oder `null` für „alle Jahre".
laeufearray<AbschlussLauf>ja

AbschlussStornoRequest

FeldTypPflichtBeschreibung
grundstringjaWarum storniert wird — nie leer; steht später im Audit.
stichtagstring(date)jaDer Tag des Stornos, striktes `YYYY-MM-DD`. INJIZIERT — kein Server liest hier eine Uhr (BP §8).

AbschlussStornoResponse

FeldTypPflichtBeschreibung
laufIdstring(uuid)ja
stornierttruejaImmer `true`: der einzige Ausgang eines erfolgreichen Stornos. Ein zweites Storno endet mit 409.
stichtagstring(date)ja

AltbestandPosten

FeldTypPflichtBeschreibung
quellSchluesselstringjaDer Schlüssel der Quellzeile im Altsystem — Herkunftsnachweis UND Dubletten-Anker.
artop | mahnung | zahlungja'op' wurde gebucht; 'mahnung'/'zahlung' bewusst NICHT.
datumstring(date)jaOriginalfälligkeit, Mahndatum oder Zahltag — je nach art.
betragCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
currencystringja
contractIdstring(uuid)ja
journalEntryIdstring(uuid) | nulljaDie Eröffnungs-Sollstellung, die aus dieser Zeile entstanden ist — null für Mahn- und Zahlhistorie. Genau dieses Feld macht die beiden Sichten unterscheidbar, ohne dass der Leser die Bedeutung von art kennen müsste.

AltbestandPostenListResponse

FeldTypPflichtBeschreibung
contractIdstring(uuid)ja
postenarray<AltbestandPosten>jaAufsteigend nach (datum, quellSchluessel) — die Ordnung ist Vertrag: eine Auskunft, deren Reihenfolge zwischen zwei Aufrufen wechselt, ist gegen einen Widerspruch nicht verwendbar. Ein fremder Vertrag liefert eine LEERE Liste wie ein nie existierter (kein Existenz-Orakel).

AltbestandProvenienzResponse

FeldTypPflichtBeschreibung
journalEntryIdstring(uuid)ja
provenienzunbekanntja

ApiErrorBody

FeldTypPflichtBeschreibung
errorobjectja

Ausnahme

FeldTypPflichtBeschreibung
exceptionIdstring(uuid)ja
documentIdstring(uuid)ja
exceptionClassstringjaAusnahmeklasse (9 Fachklassen + unroutable) — stabiler Code
reasonstringjamaschinenlesbarer Grund-Code (nie freier Text)
createdAtstring(date-time)ja
documentunbekanntja
historyobjectjaLebenszyklus-Historie desselben Belegs: bereits erledigte Ausnahmen (Count + letzte)

AusnahmeDocument

FeldTypPflichtBeschreibung
subjectstring | nullja
senderstring | nullja
sourcestringjaEingangskanal des Belegs (mail | upload) — stabiler Code
filenamestring | nullja

AusnahmenListResponse

FeldTypPflichtBeschreibung
ausnahmenarray<Ausnahme>ja

AuswertungKatalogEintrag

FeldTypPflichtBeschreibung
namestringja
titelstringja
beschreibungstringjaWozu der Bericht gut ist, in einem Satz.
zeitbezugzeitraum | zeitraum-und-stichtagjaWelche Zeitachsen die Auswertung kennt — damit Bedienfläche und Agent die richtigen Felder anbieten.
waehrungstringja
spaltenarray<AuswertungSpalte>ja

AuswertungKatalogResponse

FeldTypPflichtBeschreibung
auswertungenarray<AuswertungKatalogEintrag>ja

AuswertungQuelle

FeldTypPflichtBeschreibung
mandantstring(uuid)jaMandant, für den die Auswertung gilt — aus der Session, nie aus der Anfrage.
objektIdstring(uuid) | nulljaObjekt (Buchungskreis); `null` nur bei objektübergreifenden Auswertungen.
objektNrstring | nulljaObjekt-Nummer zur Anzeige; `null`, falls nicht auflösbar.
zeitraumVonstring(date) | nullja
zeitraumBisstring(date) | nullja
stichtagstring(date) | nulljaStichtag, falls die Auswertung einen kennt (Verzugstage, Vermögensstand).
letzteBuchungstring(date) | nulljaBuchungsdatum der LETZTEN berücksichtigten Buchung; `null`, wenn im Fenster keine liegt.
letzteBuchungNrstring | nulljaLückenlose Buchungsnummer derselben Buchung (Integer-STRING) — macht den Datenstand nennbar und prüfbar.
buchungenintegerjaZahl der berücksichtigten Buchungssätze.
abgefragtAmstring(date-time)jaZeitpunkt des Abrufs. Sagt, WANN gefragt wurde — der Datenstand sagt, WORAUF.

AuswertungResponse

FeldTypPflichtBeschreibung
namestringjaKatalog-Name der Auswertung (Pfadsegment).
titelstringja
waehrungstringjaWährung ALLER Betrags-Zellen (ISO-4217). Eine Tabelle, zwei Währungen gibt es nicht.
quelleAuswertungQuelleja
spaltenarray<AuswertungSpalte>ja
zeilenarray<array<string | null>>jaZeilen in Spaltenordnung; jede Zelle ein String oder `null` (leere Zelle). Sorte laut `spalten[i].typ`.

AuswertungSpalte

FeldTypPflichtBeschreibung
schluesselstringjaStabiler Maschinenname der Spalte; die Überschrift darf sich ändern, dieser Name nicht.
titelstringjaDeutsche Überschrift — sie steht in der CSV-Kopfzeile.
typtext | betrag | zahl | datumjaWie die Zellen dieser Spalte zu lesen sind. `betrag` ⇒ vorzeichenbehafteter Integer-Cent-STRING.

Bank

FeldTypPflichtBeschreibung
idstring(uuid)ja
propertyIdstring(uuid)ja
propertyNostring | nulljaObjektnummer des Elternobjekts (Anzeige, LEFT JOIN)
ibanstringjaIBAN in kanonischer Form (ohne Leerraum, Großbuchstaben), prüfziffernvalidiert
kindbank | kasse | ruecklage | kautionskontojaKontoart; `kautionskonto` = getrennte Anlage der Mietkaution (§ 551 Abs. 3 BGB, #5178)
glaeubigerIdstring | nulljaSEPA-Gläubiger-Identifikationsnummer (Lastschrift)
glAccountIdstring(uuid) | nulljazugeordnetes Bank-Sachkonto (gl_accounts.id, #1859); null ⇒ nicht gepflegt, der Bankabgleich leitet dann über das Objekt ab
archivedAtstring(date-time) | nulljagesetzt ⇒ archiviert (K5: kein DELETE)
createdAtstring(date-time)ja

BankabgleichVerbuchungResponse

FeldTypPflichtBeschreibung
moduseinzeln | sammelja
anzahlintegerja
ergebnissearray<BankabgleichVerbuchungZeile>ja

BankabgleichVerbuchungZeile

FeldTypPflichtBeschreibung
bankTransactionIdstring(uuid)ja
proposalIdstring(uuid)ja
buchungsanspruchIdstring(uuid)jaGENAU EIN wirksamer Buchungsanspruch je Umsatz (INV-BANK-01).
allocatedCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
creditBalanceCentsstringjaDer nicht verrechnete Teil — BERICHTET, nicht als eigene Zeile gebucht.

BankabgleichVorlageResponse

FeldTypPflichtBeschreibung
bankTransactionIdstring(uuid)ja
proposalIdstring(uuid)ja
versionintegerja
contentHashstringjaDer Inhalts-Hash, an den die Freigabe bindet (INV-APPROVAL-01).
ampelstringja
propertyIdstring(uuid)ja
contractIdstring(uuid)ja
allocatedCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
currencystringja
allocationCountintegerja

BankArchiveResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
archivedAtstring(date-time)ja
alreadyArchivedbooleanjatrue ⇒ die Bankverbindung war bereits archiviert (expliziter No-op).

BankCreateRequest

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
ibanstringjaIBAN — wird normalisiert und prüfziffernvalidiert; ungültig ⇒ 400
kindbank | kasse | ruecklage | kautionskontoja
glaeubigerIdstring | nullneinSEPA-Gläubiger-ID; weglassen ⇒ keine
sourceSystemstring | nullnein
sourceRefstring | nullnein

BankListResponse

FeldTypPflichtBeschreibung
statusalle | aktiv | archiviertjader wirksame 3-Wege-Filter
propertyIdstring(uuid) | nullneindie wirksame Objekt-Eingrenzung (null = alle Objekte des Tenants)
bankverbindungenarray<Bank>ja

BankUmsatz

FeldTypPflichtBeschreibung
transaktionIdstring(uuid)jaGENAU die id, die `POST /api/bankabgleich/vorlegen` als `bankTransactionId` erwartet.
bankAccountIdstring(uuid)ja
quellestringjaHerkunft der Zeile (`camt` · `banksapi` · …).
providerIdstring | nulljaDie eindeutige Referenz der BANK (bei camt `AcctSvcrRef`) — der Schlüssel, über den ein Auszug wiederfindbar ist.
betragCentsstringjaSIGNIERT: > 0 Eingang, < 0 Ausgang.
currencystringja
buchungsdatumstring(date) | nullja
wertstellungsdatumstring(date) | nullja
verwendungszweckstring | nullja
buchungstextstring | nullja
gegenkontoIbanstring | nullja
gegenkontoInhaberstring | nullja
gvCodestring | nullja
endToEndIdstring | nullja
mandateIdstring | nullja
correlationIdstring | nulljaDer Import-Lauf, dem sich der Umsatz zuschreibt.
gebuchtbooleanjaZeigt auf den Umsatz ein WIRKSAMER Buchungsanspruch? Dasselbe Prädikat wie Arbeitsliste und Reconciliation.
importiertAmstring(date-time)jaWann die Zeile ENTSTAND — die Import-Zeit, nicht die Bankzeit.

BankUmsatzImportResponse

FeldTypPflichtBeschreibung
importBatchIdstring(uuid)jaKennung DIESES Import-Laufs (append-only; jeder Aufruf erzeugt eine neue).
bankAccountIdstring(uuid)ja
formatcamt.053 | camt.052 | mt940jaDas aus der DATEI ERKANNTE Format — nicht das per ?format= deklarierte (das wählt nur den Parser).
totalintegerjaQuell-Posten der Datei (gebuchte + beim Parsen verworfene).
importedintegerjain DIESEM Aufruf frisch persistierte Zeilen.
deduplicatedintegerjabereits vorhandene Zeilen (vom Unique-Index verschluckt) — ein Wiederhol-Import ist gefahrlos.
discardedintegerjanicht gebuchte (Status ≠ BOOK) und nicht dedup-fähige Posten.
excludedintegerjaPosten, die wegen Konto-Ausschluss (#998) NICHT importiert wurden.
exclusionobject | nulljaAusschluss-Zustand der Bankverbindung (wann/warum), sonst null.

BankUmsatzListResponse

FeldTypPflichtBeschreibung
bankAccountIdstring(uuid)ja
ibanstringja
propertyIdstring(uuid)ja
stillgelegtbooleanjaAuskunft, kein Filter: eine stillgelegte Verbindung liefert ihren Bestand weiter aus.
importAusgeschlossenbooleanjaIst die Verbindung vom automatisierten Import ausgenommen?
mengealle | offen | gebuchtja
umsaetzearray<BankUmsatz>ja
abgeschnittenbooleanjaGEMESSEN, nicht geraten: true ⇔ es gibt mehr Zeilen als `limit`.

BankUpdateRequest

Partieller Patch — mindestens ein Feld muss gesetzt sein. `propertyId` ist nicht patchbar.

FeldTypPflichtBeschreibung
ibanstringneinwird normalisiert und prüfziffernvalidiert
kindbank | kasse | ruecklage | kautionskontonein
glaeubigerIdstring | nullneinnull setzt die Gläubiger-ID zurück
glAccountIdstring(uuid)neinBank-Sachkonto dieser Bankverbindung (#1859) — muss ein aktives Konto mit kontotyp=bank DESSELBEN Objekts sein. Nicht nullable: gesetzt oder nicht angefasst.

Bankzugang

FeldTypPflichtBeschreibung
idstring(uuid)ja
connectionIdstring(uuid)jaBANKSapi-Verbindung, unter der der Zugang hängt (tenant-intern)
bankAccountIdstring(uuid) | nulljazugeordnete Bankverbindung (Stammdatum); null, solange keine zugeordnet ist
providerBankIdstring | nulljaBank-Kennung beim Anbieter; null, solange der Anbieter keine geliefert hat
accessKindxs2a | ebicsjaZugangsweg
statusausstehend | aktiv | wartet_auf_bank | fehler | getrenntjaLebenszyklus-Status des Zugangs
consentValidUntilstring(date-time) | nulljaAblauf der Einwilligung; null, solange keine vorliegt
scaRequiredbooleanjatrue ⇒ der Zugang wartet auf eine starke Kundenauthentifizierung
lastSyncAtstring(date-time) | nulljaletzter Status-Nachzug beim Anbieter; null bis zum ersten
lastIssueCodesarray<string>jaletzte Anbieter-Meldungscodes (z. B. BA1011, USER_CANCELLED); leer ⇒ keine
createdAtstring(date-time)ja

BankZugangArchiveResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
archivedAtstring(date-time)jaZeitpunkt der Archivierung (UI „Löschen" — keine Zeile wird physisch gelöscht)
objektkontenarray<object>jadie mitarchivierten Objektkonten

BankZugangConfirmRequest

Vier-Augen-Bestätigung: verlangt das Recht `bankverbindung.bestaetigen`. Wer den Stand erfasst hat (Anlage, IBAN-Wechsel, Objekt hinzugefügt), bestätigt ihn bei aktivem Vier-Augen-Prinzip und mindestens zwei Berechtigten nicht selbst.

FeldTypPflichtBeschreibung
gesehenIbanstringjadie IBAN, die die bestätigende Person gesehen hat (beliebige Schreibweise, kanonisch verglichen). Weicht sie vom aktuellen Stand ab ⇒ abgewiesen.
gesehenObjektIdsarray<string(uuid)>jadie Objekte, die die bestätigende Person gesehen hat — als MENGE verglichen. Weicht sie vom aktuellen Stand ab ⇒ abgewiesen.

BankZugangConfirmResponse

FeldTypPflichtBeschreibung
idstring(uuid)jader bestätigte Zugang (bank_zugaenge.id)
bestaetigtVonstringjaKennung der bestätigenden Person (der Aufrufer)
bestaetigtAmstring(date-time)jaZeitpunkt der Bestätigung
ohneVierAugenbooleanjatrue ⇒ die erfassende Person hat selbst bestätigt (Schalter aus oder höchstens eine berechtigte Person) — Audit-Spur

BankZugangCreateRequest

FeldTypPflichtBeschreibung
bezeichnungstringjafrei vergebene Bezeichnung; leer ⇒ „Bitte eine Bezeichnung erfassen."
bankstringjaName der kontoführenden Bank; leer ⇒ „Bitte die Bank erfassen."
ibanstringjaIBAN — wird normalisiert und geprüft (alle SEPA-Länder, mod-97); ungültig ⇒ 400. Schon verbunden ⇒ „Diese IBAN ist bereits als Bankkonto verbunden."
anbindungapi | dateija`api` (Bankanbindung) oder `datei` (Kontoauszug-Import)
objektIdsarray<string(uuid)>neinObjekte des Zugangs — je Objekt entsteht ein Objektkonto derselben IBAN. Weglassen ⇒ Zugang ohne Objekt.

BankZugangCreateResponse

FeldTypPflichtBeschreibung
idstring(uuid)jader angelegte Zugang (bank_zugaenge.id)
statuswartetjaein neuer Zugang wartet immer auf Bestätigung
objektkontenarray<object>jadie Objektkonten in der Reihenfolge von `objektIds`

BankZugangDisconnectResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
getrenntAmstring(date-time)jaZeitpunkt der Trennung; die Bestätigung gilt damit nicht mehr
bankfreigabeGetrenntbooleanjatrue ⇒ in derselben Aktion wurde eine verknüpfte Bankfreigabe getrennt (Anbindung `api`)

BankZugangHauptkontoRequest

FeldTypPflichtBeschreibung
objektIdstring(uuid)jadas Objekt, dessen Hauptkonto das Objektkonto dieses Zugangs wird; ohne Objektkonto dort ⇒ „Dieses Bankkonto ist nicht mit dem Objekt verknüpft."

BankzugangListResponse

FeldTypPflichtBeschreibung
bankzugaengearray<Bankzugang>ja

BankZugangObjekteRequest

FeldTypPflichtBeschreibung
objektIdsarray<string(uuid)>jadie ZIELMENGE der Objekte. Hinzugefügt ⇒ neues Objektkonto (der Zugang wartet wieder); entfernt ⇒ Objektkonto archiviert — nur wenn unbenutzt, sonst „Objekt {Nr} verwendet dieses Konto noch ({Gründe})."

BankZugangObjekteResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
hinzugefuegtarray<object>janeu angelegte Objektkonten
entferntarray<object>jaarchivierte Objektkonten (keine Zeile wird gelöscht)

BankZugangRecheckResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
zuletztGeprueftAmstring(date-time)jaZeitpunkt der Prüfung; der Zugang wartet danach auf eine neue Bestätigung

BankZugangUpdateRequest

Das ganze Formular: Bezeichnung, Bank und IBAN immer, BIC optional.

FeldTypPflichtBeschreibung
bezeichnungstringja
bankstringja
ibanstringjawird normalisiert und geprüft. Ein Wechsel schreibt die neue IBAN in alle Objektkonten und lässt die Bestätigung verfallen (Status `wartet`). Gehört sie einem anderen Zugang ⇒ „Diese IBAN gehört bereits zu einem anderen Bankkonto."
bicstring | nullneinnull oder leer ⇒ keine BIC; weglassen ⇒ unverändert

BankZugangUpdateResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
ibanGeaendertbooleanjatrue ⇒ die IBAN hat gewechselt; der Zugang wartet wieder auf Bestätigung

BauabzugAnmeldungMonat

FeldTypPflichtBeschreibung
anmeldemonatstringjaJJJJ-MM
faelligAmstring(date)ja10. des Folgemonats
summeCentsstringjaSumme der Einbehalte des Monats
currencystringja
anzahlintegerja

BauabzugAnmeldungResponse

FeldTypPflichtBeschreibung
jahrintegerja
monatearray<BauabzugAnmeldungMonat>jaaufsteigend nach Monat; Monate ohne Einbehalt erscheinen nicht

BauabzugBescheinigungsBefund

FeldTypPflichtBeschreibung
statusgueltig | fehlt | abgelaufen | anderer-auftragja
nummerstring | nullja
gueltigBisstring(date) | nullja
auftragsbezugstring | nullja

BauabzugPruefung

FeldTypPflichtBeschreibung
paymentOrderIdstring(uuid)ja
openItemIdstringja
kreditorPersonIdstring(uuid)ja
grundvermieter-hoechstens-zwei-wohnungen | bescheinigung-gueltig | unter-bagatellgrenze | volle-zahlung-begruendet | einbehaltja
rechnungsbetragCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
auszahlungCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
einbehaltCentsstringjabei grund einbehalt die Verbindlichkeit gegenüber dem Finanzamt
currencystringja
zahlungstagstring(date)ja
faelligAmstring(date) | nullja
anmeldemonatstring | nullja
bescheinigungBauabzugBescheinigungsBefundja
volleZahlungBegruendungstring | nullja
volleZahlungErlaubtVonstring | nullja

BauabzugPruefungenResponse

FeldTypPflichtBeschreibung
pruefungenarray<BauabzugPruefung>janach Zahlungstag und Posten geordnet

BelegUploadResponse

FeldTypPflichtBeschreibung
documentIdstring(uuid)ja
outcomereceived | duplicate | quarantinedja
quarantineReasonmalware | unsupported-type | oversize | scan-unavailable | nulljagrober Quarantäne-Grund (nur bei outcome=quarantined gesetzt, sonst null). scan-unavailable = Sicherheitsprüfung war nicht verfügbar (Beleg ungeprüft, NICHT beanstandet — unterscheidbar von malware).
dispatchEnqueuedbooleanjaOb der Dispatch-Job (Router-Naht #350) eingereiht werden konnte. Der Ingest ist bei false trotzdem committet (Beleg sichtbar in „Empfangen"); ein Enqueue-Ausfall ist damit SICHTBAR und wird nicht als Erfolg maskiert (PR #525, Finding 2).

Beschluss

FeldTypPflichtBeschreibung
idstring(uuid)ja
propertyIdstring(uuid)ja
lfdNrintegerjaOrdnungszahl der Sammlung JE OBJEKT (§ 24 Abs. 7 WEG), ab 1
topstring | nulljaTagesordnungspunkt (`2.3`); null beim Umlaufbeschluss
themastringja
wortlautstring | nulljanull ⇒ im Altbestand nicht überliefert (nicht: leerer Wortlaut)
kategoriestring | nulljaKompetenzgrundlage — FREITEXT, konfigurierbarer Default, kein geschlossenes Vokabular
quellestringjaetv | umlauf | alt_import
beschlussDatumstring(date) | nullja
statusstringjaangenommen | abgelehnt | angefochten | bestandskraeftig | aufgehoben | nichtig
statusSeitstring(date-time)ja
stimmenJastring | nulljaKopfzahl als Dezimalstring; null ⇒ nicht überliefert (≠ 0)
stimmenNeinstring | nullja
stimmenEnthaltungstring | nullja
anteileJastring | nulljaAnteilssumme in Zehntausendsteln als Dezimalstring; null ⇒ nicht überliefert
anteileNeinstring | nullja
anteileEnthaltungstring | nullja
importVermerkstring | nulljawas der Alt-Import an dieser Zeile entschieden hat
gegenstaendearray<BeschlussGegenstand>ja
versammlungIdstring(uuid) | nulljaHerkunft: die Versammlung, aus der der Beschluss übernommen wurde; null ⇒ ohne Versammlung (Alt-Import, erfasse_beschluss)
versammlungDatumstring(date) | nulljaDatum der Herkunfts-Versammlung; null ⇒ ohne Versammlung
verkuendetAmstring(date) | nulljaVerkündungsdatum der Versammlung; null ⇒ ohne Versammlung oder noch nicht verkündet
anfechtungsfristEndestring(date) | nulljaEnde der Anfechtungsfrist (§ 45 WEG, ein Monat ab Verkündung, Wochenende verschoben; Feiertage nicht berücksichtigt); aus dem Fachkern berechnet, nicht gespeichert

BeschlussErfasseRequest

Erfasst EINEN Beschluss samt Teil-Gegenständen. Ein Änderungsweg existiert bewusst nicht — Korrektur ist ein Zweitbeschluss.

FeldTypPflichtBeschreibung
lfdNrintegerjaOrdnungszahl der Sammlung, ab 1 — je Objekt eindeutig
topstringnein
themastringja
wortlautstring | nullnein
kategoriestringnein
quellestringjaetv | umlauf | alt_import
beschlussDatumstring(date)nein
statusstringneinAnfangsstatus — NUR ein Verkündungszustand (angenommen | abgelehnt); Default angenommen
stimmenJaintegernein
stimmenNeinintegernein
stimmenEnthaltungintegernein
anteileJaintegerneinAnteilssumme in Zehntausendsteln
anteileNeinintegernein
anteileEnthaltungintegernein
importVermerkstringnein
gegenstaendearray<object>jamindestens EIN Teil-Gegenstand — sonst kann keine Teilanfechtung darauf zeigen
sourceSystemstring | nullnein
sourceRefstring | nullnein

BeschlussErfasseResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
propertyIdstring(uuid)ja
lfdNrintegerja
statusstringja
statusEventIdstring(uuid)jadas Anlage-Ereignis im append-only-Verlauf
gegenstaendearray<object>ja

BeschlussGegenstand

FeldTypPflichtBeschreibung
idstring(uuid)ja
beschlussIdstring(uuid)ja
lfdNrintegerjalaufende Nummer INNERHALB des Beschlusses, ab 1
bezeichnungstringja
wortlautstring | nulljanull ⇒ nicht gesondert überliefert (nicht: leer)
bezugArtstring | nulljaworauf sich der Teil bezieht (ruecklage | wirtschaftsplan | …); null ⇒ kein Bezug
bezugRefstring(uuid) | nullja
wpGegenstaendearray<vorschuesse | ruecklagenzufuehrung | wirtschaftsplan_als_ganzes>jagetragene Wirtschaftsplan-Teil-Gegenstände; leer ⇒ trägt keinen Plan
wpFortgeltungbooleanjaFortgeltung beschlossen (nur an einem Teil mit vorschuesse)
refstringjakanonische Referenzform `beschluss-gegenstand:<uuid>`

BeschlussImportBefund

FeldTypPflichtBeschreibung
artstringjastatus_geraten | status_nicht_uebernommen | datum_fehlt | wortlaut_fehlt | stimmen_widerspruch
quellRefstringja
textstringja

BeschlussImportFehlschlag

FeldTypPflichtBeschreibung
quellRefstringja
lfdNrintegerja
grundstringja

BeschlussImportResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
onrstringjadie übernommene Objektnummer des Altbestands
importiertintegerjaAnzahl wirklich geschriebener Beschlüsse
uebersprungenarray<BeschlussImportUebersprungen>jaTagesordnungspunkte ohne Abstimmung — kein Beschluss
befundearray<BeschlussImportBefund>ja
fehlgeschlagenarray<BeschlussImportFehlschlag>ja

BeschlussImportUebersprungen

FeldTypPflichtBeschreibung
quellRefstringjaRückverweis in den Altbestand: `ONR/VERNR/ID`
themastringja
grundstringja

BeschlussListResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
statusarray<string>jader angewandte Status-Filter; LEER ⇒ die vollständige Sammlung
beschluessearray<Beschluss>ja

BeschlussStatusRequest

Schreibt einen Statuswechsel fort: neue Zeile im append-only-Verlauf plus Projektion, in EINER Transaktion.

FeldTypPflichtBeschreibung
nachStatusstringjader ZIEL-Zustand; der Ist-Zustand wird gelesen, nie mitgegeben
grundstringnein
wirksamAbstring(date)neinWirksamkeitsdatum, falls es vom Erfassungszeitpunkt abweicht (Fristablauf liegt in der Vergangenheit)
uebergangsOptionenobjectneinEinstellungen der KONFIGURIERBAREN Kanten (Instanzrechtsprechung/Praxis). Harte Nichtigkeits-/BGH-Riegel lassen sich hierüber NICHT öffnen.

BeschlussStatusResponse

FeldTypPflichtBeschreibung
beschlussIdstring(uuid)ja
vonStatusstringja
nachStatusstringja
statusEventIdstring(uuid)ja

BrennstoffkontoAktiv

FeldTypPflichtBeschreibung
glAccountIdstring(uuid)ja
accountNostringjaKontonummer
namestringja
zustandunbekanntja
gesetztAmstring(date-time)ja

BrennstoffkontoAufgehobenResponse

FeldTypPflichtBeschreibung
objektIdstring(uuid)ja
glAccountIdstring(uuid)ja
zustandunbekanntja
hinweisearray<BrennstoffkontoHinweis>ja

BrennstoffkontoAufhebenRequest

Hebt das Brennstoffkonto des Objekts auf (die Objekt-Id steht im Pfad); das Konto geht auf seinen Ausgangszustand zurück.

FeldTypPflichtBeschreibung
bestaetigtbooleanjaPflichtfeld ohne Default (true oder false). true ist nötig, wenn der Ausgangszustand das Konto wieder in die Umlage bringt. Fehlt das Feld, wird abgelehnt (400); es gilt nie still false.

BrennstoffkontoBefund

FeldTypPflichtBeschreibung
codebrennstoffkonto-verteilt-doppeltja
glAccountIdstring(uuid)ja
verlustBrennstoffkontoVerlustja
textstringjaKlartext: die Heizkosten würden doppelt verteilt.

BrennstoffkontoGesetztResponse

FeldTypPflichtBeschreibung
objektIdstring(uuid)ja
glAccountIdstring(uuid)ja
vorzustandunbekanntja
abgeloestGlAccountIdstring(uuid) | nulljaDas frühere Brennstoffkonto, falls eines abgelöst wurde.
verlustunbekanntja
hinweisearray<BrennstoffkontoHinweis>ja

BrennstoffkontoHeizkostenKonto

FeldTypPflichtBeschreibung
glAccountIdstring(uuid)ja
accountNostringja
namestringja
zustandBrennstoffkontoZustandja
istBrennstoffkontobooleanjaIst dies das aktive Brennstoffkonto des Objekts?

BrennstoffkontoHinweis

FeldTypPflichtBeschreibung
codevorgaenger-gebucht-nicht-zurueckgesetztja
glAccountIdstring(uuid)ja
textstringja

BrennstoffkontoResponse

FeldTypPflichtBeschreibung
objektIdstring(uuid)ja
aktivunbekanntja
vorzustandunbekanntja
befundearray<BrennstoffkontoBefund>jaLeer, solange kein aktives Brennstoffkonto umlagefähig ist oder einen Schlüssel trägt.
heizkostenKontenarray<BrennstoffkontoHeizkostenKonto>jaDie Konten des Objekts, deren Kostenart (Schlüssel oder BetrKV-Katalog-Schlüssel) eine Heizkostenart ist.

BrennstoffkontoSetzenRequest

Setzt das Brennstoffkonto des Objekts (die Objekt-Id steht im Pfad). Das Brennstoffkonto verteilt die Heizkosten über die Heizkostenabrechnung und darf nicht zusätzlich als Betriebskosten umgelegt werden. Ein bisheriges Brennstoffkonto geht auf seinen gespeicherten Ausgangszustand zurück.

FeldTypPflichtBeschreibung
glAccountIdstring(uuid)jaDas Konto des Objekts, das Brennstoffkonto werden soll.
bestaetigtbooleanjaPflichtfeld ohne Default (true oder false). true ist nötig, wenn das Konto umlagefähig ist oder einen Umlageschlüssel trägt: das Setzen macht es nicht umlagefähig und entfernt den Schlüssel. Fehlt das Feld, wird abgelehnt (400); es gilt nie still false.

BrennstoffkontoVerlust

FeldTypPflichtBeschreibung
umlagefaehigbooleanjaDas Konto war umlagefähig.
schluesselbooleanjaDas Konto trug einen Umlageschlüssel.

BrennstoffkontoZustand

FeldTypPflichtBeschreibung
isUmlagefaehigboolean | nulljaUmlagefähig? null = nie gesetzt (gilt als nicht umlagefähig).
allocationKeyIdstring(uuid) | nulljaUmlageschlüssel des Kontos; null = ohne Schlüssel.

BuchungsperiodeFestschreibungRequest

FeldTypPflichtBeschreibung
vonstring(date)neinBeginn der Periode; Pflicht nur bei der ersten Festschreibung, ein Wirtschaftsjahr-Beginn

BuchungsperiodeFestschreibungResponse

FeldTypPflichtBeschreibung
festschreibungIdstring(uuid)ja
propertyIdstring(uuid)ja
vonstring(date)ja
bisstring(date)ja
neuFestgeschriebenbooleanjatrue ⇒ eine geöffnete Periode wurde mit genau ihrem Zeitraum neu festgeschrieben

BuchungsperiodenFestschreibung

FeldTypPflichtBeschreibung
idstring(uuid)ja
vonstring(date)jaerster Tag der Periode, eingeschlossen
bisstring(date)jaletzter Tag der Periode, eingeschlossen
festgeschriebenAmstring(date-time)ja
festgeschriebenVonstring(uuid)jaopake Auth-Id dessen, der festgeschrieben hat
statusgeltend | geoeffnetjageltend = gesperrt (keine Öffnung); geoeffnet = hat eine Öffnung
oeffnungunbekanntja

BuchungsperiodenOeffnung

FeldTypPflichtBeschreibung
idstring(uuid)ja
grundstringjaPflichtgrund der Öffnung (Freitext, personenbezogen möglich).
geoeffnetVonstring(uuid)jaopake Auth-Id dessen, der geöffnet hat
geoeffnetAmstring(date-time)ja

BuchungsperiodenProtokollEintrag

FeldTypPflichtBeschreibung
festschreibungIdstring(uuid)ja
oeffnungIdstring(uuid)ja
neuFestgeschriebenAmstring(date-time) | nulljaZeitpunkt der Neu-Festschreibung derselben Periode; null = noch offen
saetzearray<BuchungsperiodenProtokollSatz>janur Journalsätze mit Buchungs- oder Abgrenzungsdatum in der Periode, in der Öffnungszeit; sortiert nach Buchungsnummer

BuchungsperiodenProtokollSatz

FeldTypPflichtBeschreibung
journalEntryIdstring(uuid)ja
entryNostringjaBuchungsnummer je Objekt (Integer-STRING)
entryTypestringja
bookingDatestring(date)ja
accrualDatestring(date)ja
reversesEntryIdstring(uuid) | nulljagesetzt bei einem Storno-Satz: der stornierte Satz
erfasstAmstring(date-time)ja

BuchungsperiodenResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
aktivbooleanjaSchalter des Objekts, sonst Mandanten-Vorgabe, sonst false; sperrt nichts Bestehendes
schalterObjektboolean | nulljaeigene Einstellung des Objekts; null = keine
schalterMandantboolean | nulljaMandanten-Vorgabe; null = keine
wirtschaftsjahrBeginnstringja`kalenderjahr`, `abweichend_MM-DD` oder `unklar`
festschreibungenarray<BuchungsperiodenFestschreibung>jaalle Festschreibungen des Objekts, nach Beginn sortiert
protokollarray<BuchungsperiodenProtokollEintrag>jaje Öffnung die Journalsätze; nur Journalsätze, keine offenen Posten

BuchungsperiodeOeffnungRequest

FeldTypPflichtBeschreibung
festschreibungIdstring(uuid)jadie zu öffnende Festschreibung DIESES Objekts
grundstringjaPflichtgrund, getrimmt nicht leer (Freitext)

BuchungsperiodeOeffnungResponse

FeldTypPflichtBeschreibung
oeffnungIdstring(uuid)ja
festschreibungIdstring(uuid)ja
propertyIdstring(uuid)ja
vonstring(date)ja
bisstring(date)ja

CliLoginStartRequest

FeldTypPflichtBeschreibung
statestringjaZufälliger Bindungsnachweis dieser Anmelderunde, URL-sicher, 32–256 Zeichen. KEIN Secret im Token-Sinn — er darf in der Browser-URL stehen. Ein fehlender, fremder oder wiedereingespielter state liefert fail-closed keinen Token; serverseitig ist eine Runde genau einmal bestätigbar und zehn Minuten gültig.
redirectUristringjaRückruf-Adresse des kurzlebigen Servers, den die CLI auf der Loopback-Schnittstelle geöffnet hat. Zulässig ist ausschließlich ein Loopback-Name mit Schema http und explizitem Port; alles andere wird fail-closed abgewiesen.
frischbooleanneinVerlangt eine FRISCHE Browser-Anmeldung (Admin-Step-up, #7110). Ist die Browser-Sitzung älter als 900 Sekunden, schickt die Freigabe-Seite zuerst auf die Sicherheits-Rückfrage (`/login?stepUp=1`); erst eine frische Sitzung bekommt „Freigeben", und nur dann merkt sich der Server die Browser-Freigabe an dieser Sitzung. Fehlt das Feld, gilt `false` (bisheriges Verhalten). Ein Wert, der kein Boolean ist, ergibt 400 `invalid_request`.

ContractOffset

FeldTypPflichtBeschreibung
contractIdstring(uuid)ja
gewerblichbooleanja
ustRatePercentstring | nulljaInteger-STRING oder null (kein Gewerbe).
kostenNettoErgebnisMoneyja
kostenUstunbekanntja
kostenBruttoErgebnisMoneyja
sollVzBkErgebnisMoneyja
sollVzHkErgebnisMoneyja
sollVzErgebnisMoneyja
sollVzBkNettounbekanntja
sollVzHkNettounbekanntja
sollVzNettounbekanntja
istVzBkunbekanntja
istVzHkunbekanntja
istVzunbekanntja
istVzBkNettounbekanntja
istVzHkNettounbekanntja
istVzNettounbekanntja
offeneVzunbekanntja
saldounbekanntja
artnachforderung | guthaben | ausgeglichenja

DatevBelegpaketDatei

FeldTypPflichtBeschreibung
dateinamestringja
sha256stringja
groesseBytesintegerja
belegeintegerjaAnzahl der Belege (Belegdateien) im Paket
inhaltBase64stringja

DatevBelegpaketRequest

FeldTypPflichtBeschreibung
objektearray<string(uuid)>jadie Objekte des Stapels, mindestens eines ("alle" ist eine Wahl, kein Vorgabewert)
jahrintegerjaKalenderjahr: Zeitraum ist JJJJ-01-01 bis JJJJ-12-31, mit abweichendem wirtschaftsjahrBeginn nur der Teil des Jahres, der im Wirtschaftsjahr liegt (Schnitt leer ⇒ 400)
beraternummerstringja1 bis 7 Ziffern, ohne führende Null
mandantennummerstringja1 bis 5 Ziffern, ohne führende Null
sachkontenlaengeintegerja4 bis 8
kontenrahmenskr03 | skr04ja
festschreibung0 | 1jaFestschreibekennzeichen im Kopfsatz (GoBD-Angabe an DATEV), Pflicht, kein Vorgabewert; der Export löst KEINE Festschreibung in casa.ai aus
wirtschaftsjahrBeginnstring(date)neinBeginn des Wirtschaftsjahres; Vorgabe JJJJ-01-01 des Jahres. Ein abweichender Beginn grenzt den Zeitraum auf Wirtschaftsjahr und Kalenderjahr ein: zwei Stapel (zwei Aufrufe)
ustDarstellungautomatikkonto | ust_schluesselnein

DatevBelegpaketResponse

FeldTypPflichtBeschreibung
stapelunbekanntja
belegpaketunbekanntja
ohneBelegarray<DatevBuchungOhneBeleg>jaalle Buchungszeilen ohne Beleg im Paket, aufsteigend nach zeilenNr
hinweisstring | nulljaKlartext genau dann, wenn belegpaket null ist

DatevBuchungOhneBeleg

FeldTypPflichtBeschreibung
zeilenNrintegerja1-basierte Nummer der Buchungszeile im Stapel (ohne Kopf- und Spaltenzeile)
grundkein_beleg | quarantaene | original_fehlt | original_beschaedigt | dateityp_nicht_uebertragbarja

DatevBuchungsstapelDatei

FeldTypPflichtBeschreibung
dateinamestringja
sha256stringja
groesseBytesintegerja
inhaltBase64stringja

DatevBuchungsstapelRequest

FeldTypPflichtBeschreibung
objektearray<string(uuid)>jadie Objekte des Stapels, mindestens eines ("alle" ist eine Wahl, kein Vorgabewert)
jahrintegerjaKalenderjahr: Zeitraum ist JJJJ-01-01 bis JJJJ-12-31, mit abweichendem wirtschaftsjahrBeginn nur der Teil des Jahres, der im Wirtschaftsjahr liegt (Schnitt leer ⇒ 400)
beraternummerstringja1 bis 7 Ziffern, ohne führende Null
mandantennummerstringja1 bis 5 Ziffern, ohne führende Null
sachkontenlaengeintegerja4 bis 8
kontenrahmenskr03 | skr04ja
festschreibung0 | 1jaFestschreibekennzeichen im Kopfsatz (GoBD-Angabe an DATEV), Pflicht, kein Vorgabewert; der Export löst KEINE Festschreibung in casa.ai aus
wirtschaftsjahrBeginnstring(date)neinBeginn des Wirtschaftsjahres; Vorgabe JJJJ-01-01 des Jahres. Ein abweichender Beginn grenzt den Zeitraum auf Wirtschaftsjahr und Kalenderjahr ein: zwei Stapel (zwei Aufrufe)
ustDarstellungautomatikkonto | ust_schluesselnein

DatevBuchungsstapelResponse

FeldTypPflichtBeschreibung
laufIdstring(uuid) | nulljaZeile in der Export-Historie
dateinamestringja
sha256stringja
buchungszeilenintegerja
buchungssaetzeintegerja
summeCentsstringjaInteger-String in Cent
exportiertAmstring(date-time)ja
hinweisearray<string>jaHinweise auf nicht festgeschriebene Perioden; leer = vollständig festgeschrieben. Hinweis, kein Abweis.
dateiDatevBuchungsstapelDateija

DatevDebKredRequest

FeldTypPflichtBeschreibung
objektearray<string(uuid)>jadie Objekte des Stapels, mindestens eines ("alle" ist eine Wahl, kein Vorgabewert)
jahrintegerjaKalenderjahr: Zeitraum ist JJJJ-01-01 bis JJJJ-12-31, mit abweichendem wirtschaftsjahrBeginn nur der Teil des Jahres, der im Wirtschaftsjahr liegt (Schnitt leer ⇒ 400)
beraternummerstringja1 bis 7 Ziffern, ohne führende Null
mandantennummerstringja1 bis 5 Ziffern, ohne führende Null
sachkontenlaengeintegerja4 bis 8
kontenrahmenskr03 | skr04ja
festschreibung0 | 1jaFestschreibekennzeichen im Kopfsatz (GoBD-Angabe an DATEV), Pflicht, kein Vorgabewert; der Export löst KEINE Festschreibung in casa.ai aus
wirtschaftsjahrBeginnstring(date)neinBeginn des Wirtschaftsjahres; Vorgabe JJJJ-01-01 des Jahres. Ein abweichender Beginn grenzt den Zeitraum auf Wirtschaftsjahr und Kalenderjahr ein: zwei Stapel (zwei Aufrufe)
ustDarstellungautomatikkonto | ust_schluesselnein
umfangbuchungsstapel | alle-aktivenjaPflicht, kein Vorgabewert: "buchungsstapel" = genau die Personenkonten des Stapels desselben Zeitraums; "alle-aktiven" = zusätzlich jedes nicht archivierte Personenkonto der Objekte (plus alle Kreditoren des Mandanten)

DatevDebKredResponse

FeldTypPflichtBeschreibung
dateinamestringja
sha256stringja
personenkontenintegerja
mitBankverbindungintegerjaAnzahl der Personenkonten mit bestätigter Bankverbindung (eine Zahl, keine IBAN)
exportiertAmstring(date-time)ja
hinweisearray<string>jau. a. "nicht in der Historie abgelegt, Datei jetzt sichern": die Datei ist nicht erneut abrufbar
dateiDatevBuchungsstapelDateija

DatevHistorieDateiResponse

FeldTypPflichtBeschreibung
laufIdstring(uuid)ja
dateiDatevBuchungsstapelDateija

DatevHistorieEintrag

FeldTypPflichtBeschreibung
laufIdstring(uuid)ja
zeitraumVonstring(date)ja
zeitraumBisstring(date)ja
objektearray<string(uuid)>jaAlle Objekte des Laufs (ein Lauf über A und B steht in der Liste jedes der beiden Objekte)
dateinamestringja
sha256stringja
buchungszeilenintegerja
summeCentsstringjaInteger-String in Cent
erzeugtAmstring(date-time)ja
erzeugtVonstringjaOpake Id der erzeugenden Person
erzeugtVonArtstringjauser | agent | system

DatevHistorieListResponse

FeldTypPflichtBeschreibung
eintraegearray<DatevHistorieEintrag>ja
weiterstring | nulljaOpaker Cursor für die nächste Seite (Query weiter); null = Historie zu Ende

EigentuemerwechselAbgehendRequest

FeldTypPflichtBeschreibung
ownershipIdstring(uuid)ja

EigentuemerwechselAbgehendZeile

FeldTypPflichtBeschreibung
ownershipIdstring(uuid)ja
personIdstring(uuid)ja
anteilstringja
endeExklusivstring(date)ja

EigentuemerwechselErfassenRequest

FeldTypPflichtBeschreibung
grundbuchEintragungAmstring(date)jaStichtag des Wechsels ist die Eintragung im Grundbuch, Abteilung I — nicht der Notartermin.
abgehendarray<EigentuemerwechselAbgehendRequest>ja1 bis 50 abgehende Eigentumszeilen der Einheit.
neuarray<EigentuemerwechselNeuRequest>ja1 bis 50 neue Eigentumszeilen; ihre Anteilssumme muss der der abgehenden gleichen.
verwalterzustimmungAmstring(date) | nullnein
verwalterzustimmungDokumentRefstring(uuid) | nullnein

EigentuemerwechselErfassenResponse

FeldTypPflichtBeschreibung
wechselIdstring(uuid)ja
unitIdstring(uuid)ja
grundbuchEintragungAmstring(date)ja
verwalterzustimmungAmstring(date) | nullja
verwalterzustimmungDokumentRefstring(uuid) | nullja
abgehendarray<EigentuemerwechselAbgehendZeile>ja
neuarray<EigentuemerwechselNeuZeile>ja
sevMandateOffenarray<EigentuemerwechselSevMandatOffen>jaLaufende SEV-Mandate abgehender Eigentümer; sie werden NICHT automatisch beendet.

EigentuemerwechselListeResponse

FeldTypPflichtBeschreibung
unitIdstring(uuid)ja
wechselarray<EigentuemerwechselVorgang>ja

EigentuemerwechselNeuRequest

FeldTypPflichtBeschreibung
personIdstring(uuid)ja
anteilstringjaMiteigentumsanteil in Zehntausendsteln als Integer-String, > 0.
anschreibenEmpfaengerbooleannein
zustellanweisungEigentumZustellanweisungnein
bevollmaechtigungEigentumBevollmaechtigungRequestnein
ustOptionboolean | nullnein

EigentuemerwechselNeuZeile

FeldTypPflichtBeschreibung
ownershipIdstring(uuid)ja
personIdstring(uuid)ja
anteilstringja
vonstring(date)ja

EigentuemerwechselSevMandatOffen

FeldTypPflichtBeschreibung
mandatIdstring(uuid)ja
personIdstring(uuid)ja
ohneEigentumAbstring(date)ja

EigentuemerwechselVorgang

FeldTypPflichtBeschreibung
wechselIdstring(uuid)ja
unitIdstring(uuid)ja
grundbuchEintragungAmstring(date)ja
verwalterzustimmungAmstring(date) | nullja
verwalterzustimmungDokumentRefstring(uuid) | nullja
abgehendeOwnershipIdsarray<string(uuid)>ja
neueOwnershipIdsarray<string(uuid)>ja

EigentumAnteilssummeBefund

FeldTypPflichtBeschreibung
artanteilssummeja
stichtagstring(date)ja
summestringja
sollstringja

EigentumBeendenRequest

FeldTypPflichtBeschreibung
endeExklusivstring(date)jaErster Tag OHNE Eigentum: „zum 30.06. beendet" ⇒ 2025-07-01.

EigentumBeendenResponse

FeldTypPflichtBeschreibung
ownershipIdstring(uuid)ja
unitIdstring(uuid)ja
personIdstring(uuid)ja
vonstring(date)ja
bisExklusivstring(date)ja
beendetbooleanjafalse = dasselbe Ende lag schon vor (Erfolg ohne Änderung).

EigentumBevollmaechtigungAntwort

FeldTypPflichtBeschreibung
personIdstring(uuid)ja
vonstring(date)ja
bisExklusivstring(date) | nullja
vollmachtDokumentRefstring(uuid) | nullja

EigentumBevollmaechtigungRequest

FeldTypPflichtBeschreibung
personIdstring(uuid)ja
fensterEigentumVollmachtFensterja
vollmachtDokumentRefstring(uuid) | nullnein

EigentumEinheit

FeldTypPflichtBeschreibung
unitIdstring(uuid)ja
anteilssummestring | nulljaSumme der am Stichtag wirksamen Anteile in Zehntausendsteln als Integer-String.
befundearray<anteilssumme_ungleich_10000>jaTatsachen, keine Fehler: die Anteile ergeben am Stichtag nicht 10000.
zeilenarray<EigentumZeile>ja

EigentumErfassenRequest

FeldTypPflichtBeschreibung
personIdstring(uuid)ja
anteilstringjaMiteigentumsanteil in Zehntausendsteln als Integer-String, > 0.
vonstring(date)ja
bisExklusivstring(date) | nullneinErster Tag OHNE Eigentum; fehlt ⇒ unbefristet.
anschreibenEmpfaengerbooleanneinFehlt ⇒ Vorbelegung nach der Zustell-Regel.
zustellanweisungEigentumZustellanweisungnein
bevollmaechtigungEigentumBevollmaechtigungRequestnein
ustOptionboolean | nullnein

EigentumErfassenResponse

FeldTypPflichtBeschreibung
ownershipIdstring(uuid)ja
unitIdstring(uuid)ja
personIdstring(uuid)ja
anteilstringja
vonstring(date)ja
bisExklusivstring(date) | nullja
anschreibenEmpfaengerbooleanja
hatZustellanweisungbooleanja
bevollmaechtigungunbekanntja
ustOptionboolean | nullja
befundearray<EigentumAnteilssummeBefund>ja

EigentumListeResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
stichtagstring(date)ja
historiebooleanjatrue ⇒ auch abgelaufene und künftige Zeilen (`istGegenwart` markiert die wirksamen).
einheitenarray<EigentumEinheit>ja

EigentumVollmachtFenster

FeldTypPflichtBeschreibung
vonstring(date)ja
bisExklusivstring(date) | nullnein

EigentumZeile

FeldTypPflichtBeschreibung
ownershipIdstring(uuid)ja
unitIdstring(uuid)ja
personIdstring(uuid)ja
anteilstringjaMiteigentumsanteil in Zehntausendsteln als Integer-String (10000 = 100 %).
vonstring(date) | nullja
endeExklusivstring(date) | nulljaErster Tag OHNE Eigentum; `null` = unbefristet.
anschreibenEmpfaengerbooleanja
bevollmaechtigterPersonIdstring(uuid) | nullja
bevollmaechtigungVonstring(date) | nullja
bevollmaechtigungEndeExklusivstring(date) | nullja
ustOptionboolean | nullja`null` = nicht erfasst (nie still `false`).
hatZustellanweisungbooleanjaKennzeichen, dass eine abweichende Zustellanschrift hinterlegt ist; die Anschrift selbst verlässt das Haus nicht.
istGegenwartbooleanjatrue, wenn die Zeile am Stichtag wirksam ist.

EigentumZustellanweisung

FeldTypPflichtBeschreibung
empfaengerNamestring | nullnein
adressestringjaZustellanschrift als Freitext (1 bis 500 Zeichen).

Einheit

FeldTypPflichtBeschreibung
idstring(uuid)ja
buildingIdstring(uuid)jadas Gebäude; nach der Anlage unveränderlich
propertyIdstring(uuid) | nulljadas Objekt über das Gebäude (LEFT JOIN)
propertyNostring | nulljaObjektnummer (LEFT JOIN)
unitNostringjaEinheitennummer (Freitext) — eindeutig je Objekt unter den aktiven Einheiten (#5534); eine archivierte Nummer ist wieder frei. Identität ist `id`.
unitKindstringjawohnung | gewerbe | stellplatz | sonstige — OFFENES Vokabular (kein CHECK)
bezeichnungstring | nulljaBezeichnung der Einheit (#5534, ≤ 200 Zeichen); `null` ⇒ Bestandseinheit ohne Bezeichnung.
archivedAtstring(date-time) | nulljagesetzt ⇒ archiviert (K5: kein DELETE)
createdAtstring(date-time)ja

EinheitArchiveResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
archivedAtstring(date-time)ja
alreadyArchivedbooleanjatrue ⇒ die Einheit war bereits archiviert (expliziter No-op).

EinheitAttribut

FeldTypPflichtBeschreibung
idstring(uuid)ja
unitIdstring(uuid)ja
attributeKeystringjaAttribut-Schlüssel (OFFENES Vokabular): flaeche | personenzahl | mea | festbetrag | …
attributeValueobjectjaStrukturierter JSON-Wert der Scheibe (z. B. Fläche als Dezimal-String).
validFromstring(date) | nulljaBeginn INKLUSIV; null ⇒ unbegrenzt in die Vergangenheit.
validTostring(date) | nulljaEnde EXKLUSIV; null ⇒ laufend.
validRangestringjaRohes daterange-Literal, z. B. [2026-01-01,).
activebooleanjaIst die Scheibe am Stichtag (asOf) wirksam (valid_range @> asOf)?
createdAtstring(date-time)ja

EinheitAttributListResponse

FeldTypPflichtBeschreibung
unitIdstring(uuid)ja
asOfstring(date)jader wirksame Stichtag, gegen den `active` je Scheibe gemessen wurde
attributearray<EinheitAttribut>ja

EinheitAttributSetRequest

Setzt/ändert eine Attribut-Zeitscheibe „ab validFrom" (SCD-2); Überschneidungen ⇒ 400.

FeldTypPflichtBeschreibung
attributeKeystringjaflaeche | personenzahl | mea | festbetrag | … (offenes Vokabular)
attributeValueobjectjastrukturierter JSON-Wert (leeres Objekt zulässig)
validFromstring(date)jaBeginn der Gültigkeit (INKLUSIV) — das „ab" der Änderung
validTostring(date)neinoptionales Ende (EXKLUSIV); ohne Angabe laufend
sourceSystemstring | nullnein
sourceRefstring | nullnein

EinheitAttributSetResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
unitIdstring(uuid)ja
attributeKeystringja
attributeValueobjectja
validFromstring(date)ja
validTostring(date) | nullja
validRangestringja
supersededPriorSlicebooleanjatrue ⇒ eine zuvor offene Scheibe wurde an validFrom abgeschlossen (SCD-2).

EinheitBelegungBefund

FeldTypPflichtBeschreibung
codebelegung_fehlt | personenzahl_fehlt | zustand_widerspricht_vertragslage | drittnutzer_fehltja
ampelgruen | gelb | rotja
hinweisstringja

EinheitBelegungHistorieResponse

FeldTypPflichtBeschreibung
unitIdstring(uuid)ja
stichtagstring(date)jader Stichtag, gegen den `active` je Scheibe gemessen wurde
scheibenarray<EinheitBelegungScheibe>ja

EinheitBelegungPartei

FeldTypPflichtBeschreibung
artmietpartei | eigentuemer | drittnutzer | leerstandja
personIdstring(uuid) | nulljanull ausschliesslich bei art=leerstand — dort gibt es keine Person, wohl aber eine Identität.
namestringjaAnzeigename; bei art=leerstand die stabile Platzhalter-Identität (nie leer).
contractIdstring(uuid) | nulljaDer casa-Mietvertrag; null ausserhalb von art=mietpartei.

EinheitBelegungResponse

FeldTypPflichtBeschreibung
unitIdstring(uuid)ja
stichtagstring(date)jader wirksame Stichtag, gegen den aufgelöst wurde
verwaltungsartmiet | weg | pro | nulljaVerwaltungsart des Objekts; null, wenn die Kette Einheit→Gebäude→Objekt reisst.
quelleabgeleitet | gepflegtjaabgeleitet = aus der Vertragslage (casa führt den Mietvertrag) · gepflegt = aus der erfassten Zeitscheibe (fremdverwaltete WEG-Einheit).
zustandselbstgenutzt | vermietet | leerstand | unbekanntjaselbstgenutzt | vermietet | leerstand | unbekannt. "unbekannt" ist NICHT speicherbar — es heisst „auf der gepflegten Achse ist am Stichtag nichts erfasst" und ausdrücklich nicht „hier wohnt niemand".
personenzahlinteger | nulljaKopfzahl am Stichtag; null = nicht erfasst.
parteienarray<EinheitBelegungPartei>jaMehrere sind der Normalfall (Miteigentum, zwei Mietparteien); bei Leerstand genau eine.
zeitscheibeunbekanntja
befundearray<EinheitBelegungBefund>ja
ampelgruen | gelb | rotjaDie riskanteste Einzel-Ampel aller Befunde; ohne Befund gruen.

EinheitBelegungScheibe

FeldTypPflichtBeschreibung
idstring(uuid)ja
unitIdstring(uuid)ja
zustandselbstgenutzt | vermietet | leerstandjaselbstgenutzt | vermietet | leerstand (geschlossen).
personenzahlinteger | nulljaKopfzahl der Scheibe; null = NICHT ERFASST (Befund personenzahl_fehlt).
drittnutzerPersonIdstring(uuid) | nulljaDer „Mieter des Eigentümers" als persons.id — reiner Kontakt, kein Vertrag, kein Debitor.
validFromstring(date) | nulljaBeginn INKLUSIV; null ⇒ unbegrenzt in die Vergangenheit.
validTostring(date) | nulljaEnde EXKLUSIV; null ⇒ laufend.
validRangestringjaRohes daterange-Literal, z. B. [2026-01-01,).
activebooleanjaIst die Scheibe am Stichtag wirksam (valid_range @> stichtag)?
createdAtstring(date-time)ja

EinheitBelegungSetRequest

Setzt/ändert die GEPFLEGTE Belegungs-Zeitscheibe „ab validFrom" (SCD-2); Überschneidungen ⇒ 400.

FeldTypPflichtBeschreibung
zustandselbstgenutzt | vermietet | leerstandja
personenzahlinteger | nullneinKopfzahl; weggelassen/null = nicht erfasst. Bei zustand=leerstand ist 0 NICHT wählbar (BGH VIII ZR 159/05).
drittnutzerPersonIdstring(uuid) | nullneinNur bei zustand=vermietet zulässig; die Person muss existieren und aktiv sein.
validFromstring(date)jaBeginn der Gültigkeit (INKLUSIV) — das „ab" der Änderung
validTostring(date)neinoptionales Ende (EXKLUSIV); ohne Angabe laufend
sourceSystemstring | nullnein
sourceRefstring | nullnein

EinheitBelegungSetResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
unitIdstring(uuid)ja
zustandselbstgenutzt | vermietet | leerstandja
personenzahlinteger | nullja
drittnutzerPersonIdstring(uuid) | nullja
validFromstring(date)ja
validTostring(date) | nullja
validRangestringja
supersededPriorSlicebooleanjatrue ⇒ eine zuvor offene Scheibe wurde an validFrom abgeschlossen (SCD-2).

EinheitCreateRequest

FeldTypPflichtBeschreibung
buildingIdstring(uuid)jaDas Gebäude, an dem die Einheit hängt. MUSS aktiv sein (sonst 400).
unitNostringjaEinheitennummer (Freitext) — eindeutig je Objekt unter den aktiven Einheiten (#5534); vergeben ⇒ 409 „Diese Einheitennummer ist bereits vergeben."
unitKindstringjawohnung | gewerbe | stellplatz | sonstige (offenes Vokabular)
bezeichnungstringjaBezeichnung der Einheit — PFLICHT (#5534), 1…200 Zeichen.
sourceSystemstring | nullnein
sourceRefstring | nullnein

EinheitEinnahmeartResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
einnahmeartwohnung | andere_raeume | angehoerige | nicht_steuerpflichtig | nullja
geschossstring | nullja

EinheitEinnahmeartSetRequest

Setzt die Einnahmeart (und optional das Geschoss) einer Einheit für die Gliederung der Mieteinnahmen.

FeldTypPflichtBeschreibung
einnahmeartwohnung | andere_raeume | angehoerige | nicht_steuerpflichtig | nulljawohnung | andere_raeume | angehoerige | nicht_steuerpflichtig; null = Einnahmeart entfernen. PFLICHT im Körper — kein Default, keine Ableitung aus der Einheitenart.
geschossstring | nullneinGeschoss als Freitext (getrimmt 1…50 Zeichen); weggelassen = unverändert, null = entfernen.

Einheitengruppe

FeldTypPflichtBeschreibung
idstring(uuid)ja
propertyIdstring(uuid)ja
namestringja
groupKindstringjaArt (OFFENES Vokabular): untergemeinschaft | wirtschaftseinheit | liegenschaft | … — die Spalte hat keinen CHECK.
archivedAtstring(date-time) | nulljanull ⇒ aktiv
createdAtstring(date-time)ja

EinheitengruppeCreateRequest

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
namestringja
groupKindstringjauntergemeinschaft | wirtschaftseinheit | liegenschaft | … (offenes Vokabular)
sourceSystemstring | nullnein
sourceRefstring | nullnein

EinheitengruppeDetailResponse

FeldTypPflichtBeschreibung
einheitengruppeEinheitengruppeja
asOfstring(date)jader wirksame Stichtag, gegen den `active` je Mitgliedschaft gemessen wurde
mitgliedarray<EinheitengruppeMitglied>ja

EinheitengruppeListResponse

FeldTypPflichtBeschreibung
einheitengruppearray<Einheitengruppe>ja

EinheitengruppeMitglied

FeldTypPflichtBeschreibung
idstring(uuid)ja
unitGroupIdstring(uuid)ja
unitIdstring(uuid)ja
unitNostring | nulljaEinheitennummer (LEFT JOIN); null, wenn die Kette reißt
validFromstring(date) | nulljaBeginn INKLUSIV; null ⇒ unbegrenzt in die Vergangenheit
validTostring(date) | nulljaEnde EXKLUSIV; null ⇒ laufend
validRangestringjaRohes daterange-Literal, z. B. [2026-01-01,)
activebooleanjaIst die Mitgliedschaft am Stichtag (asOf) wirksam?
createdAtstring(date-time)ja

EinheitengruppeMitgliedAddRequest

Nimmt eine Einheit „ab validFrom" in den Kreis auf (SCD-2 je (Kreis, Einheit)). Eine offene Vorgänger-Scheibe derselben Einheit wird an validFrom abgeschlossen; Überschneidungen derselben Einheit IM SELBEN Kreis werden abgelehnt (400).

FeldTypPflichtBeschreibung
unitIdstring(uuid)ja
validFromstring(date)jaBeginn INKLUSIV — das „ab" der Aufnahme
validTostring(date)neinoptionales Ende (EXKLUSIV); ohne Angabe laufend
sourceSystemstring | nullnein
sourceRefstring | nullnein

EinheitengruppeMitgliedAddResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
unitGroupIdstring(uuid)ja
unitIdstring(uuid)ja
validFromstring(date)ja
validTostring(date) | nullja
validRangestringja
supersededPriorSlicebooleanjatrue ⇒ eine zuvor offene Scheibe derselben Einheit wurde an validFrom abgeschlossen.

EinheitengruppeMitgliedEndRequest

Beendet die offene Mitgliedschaft einer Einheit zum Stichtag (obere Bereichsgrenze setzen).

FeldTypPflichtBeschreibung
unitIdstring(uuid)ja
endDatestring(date)jaTag, ab dem die Mitgliedschaft NICHT mehr gilt (EXKLUSIV)

EinheitengruppeMitgliedEndResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
unitGroupIdstring(uuid)ja
unitIdstring(uuid)ja
endDatestring(date)ja
validRangestringja
alreadyEndedbooleanjatrue ⇒ war bereits beendet; endDate trägt das URSPRÜNGLICHE Ende.

EinheitengruppeUpdateRequest

Mindestens ein Feld muss gesetzt sein (leerer Patch ⇒ 400).

FeldTypPflichtBeschreibung
namestringnein
groupKindstringnein

EinheitListResponse

FeldTypPflichtBeschreibung
statusalle | aktiv | archiviertjader wirksame 3-Wege-Filter (wirkt NUR auf units.archived_at)
einheitenarray<Einheit>ja

EinheitReactivateResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
reactivatedAtstring(date-time)ja
alreadyActivebooleanja

EinheitUpdateRequest

Partieller Patch. `buildingId` ist BEWUSST nicht patchbar (potenzieller Rechnungskreis-Wechsel).

FeldTypPflichtBeschreibung
unitNostringneinNeue Einheitennummer — eindeutig je Objekt (#5534), sonst 409.
unitKindstringnein
bezeichnungstringneinNeue Bezeichnung (#5534), 1…200 Zeichen.

EinnahmenAusgabenGegenkontoSumme

FeldTypPflichtBeschreibung
gegenkontostringja
zuflussEinnahmenAusgabenSummeja
abflussEinnahmenAusgabenSummeja

EinnahmenAusgabenPosition

FeldTypPflichtBeschreibung
buchungIdstring(uuid)jaDer Buchungssatz, aus dem diese Zeile stammt (`journal_entries.id`).
datumstring(date)jaBuchungsdatum — die Zeitachse des Geldflusses.
geldkontenarray<string>jaDie Geldkonten, über die diese Zeile gelaufen ist — in der Regel GENAU EINES. Mehrere nur bei mehreren Bankzeilen im Satz; dort wäre die Benennung EINES Kontos eine Erfindung. Nie leer: bei `verrechnet` steht hier das Konto, gegen das verrechnet wurde.
verrechnetbooleanjatrue = die Zeile stand der Geldkonto-Seite nicht unmittelbar gegenüber, sondern wurde INNERHALB des Satzes gegen sie verrechnet (Einbehalt, Abzug). Der Betrag ist über die genannten Geldkonten gelaufen, nur saldiert mit der Gegenzeile desselben Satzes — er zählt deshalb voll als Einnahme bzw. Ausgabe (§ 4 Abs. 3 EStG kennt keine Netto-Einnahme).
gegenkontostringjaDas Gegenkonto der Zeile (Erlös-, Kosten- oder Personenkonto).
richtungzufluss | abflussjazufluss = Einnahme (Geld kam herein), abfluss = Ausgabe.
bruttoCentsstringjaBetrag der Gegenzeile, vorzeichenlos — Brutto (mit USt).
ustCentsstringjaUSt-Anteil; "0", wenn die Zeile keinen nennt.
nettoCentsstringjabrutto − ust.
ustSatzstring | nulljaUSt-Satz der Zeile als Dezimalstring (`19.00`); `null` = keiner erfasst.
ustHerkunftgebucht | abgeleitet | ohnejaGG7, feldweise Provenienz: `gebucht` = der Betrag stand an der Buchungszeile, `abgeleitet` = aus dem Satz gerechnet (kaufmännisch auf den Cent), `ohne` = weder Betrag noch Satz.
belegnummerstring | nulljaBelegnummer des Satzes; `null` = keine erfasst.
belegIdstring(uuid) | nulljaDas verknüpfte Belegdokument (`documents.id`); `null` = die Beleg-Kette löst nicht auf.

EinnahmenAusgabenResponse

FeldTypPflichtBeschreibung
objektIdstring(uuid)ja
vonstring(date)jaErster Tag des Zeitraums (Echo, inklusive).
bisstring(date)jaLetzter Tag des Zeitraums (Echo, inklusive).
gegenkontostring | nulljaDas angefragte EINE Gegenkonto (Echo) oder `null` für „alle Gegenkonten".
positionenarray<EinnahmenAusgabenPosition>ja
jeGegenkontoarray<EinnahmenAusgabenGegenkontoSumme>jaSummen je Gegenkonto, nach Kontonummer geordnet.
einnahmenEinnahmenAusgabenSummeja
ausgabenEinnahmenAusgabenSummeja
umbuchungenarray<EinnahmenAusgabenUmbuchung>ja
eroeffnungenarray<EinnahmenAusgabenPosition>jaBESTANDSVORTRÄGE des Zeitraums (`entry_type = eroeffnung`) in derselben Form wie eine Position — ausdrücklich NICHT in `einnahmen`, `ausgaben` oder `jeGegenkonto`: ein Anfangsbestand sieht aus wie eine Einnahme und ist keine, das Geld war schon da. Sie stehen hier, damit die Geldkonten-Entwicklung (Anfangsbestand + Einnahmen − Ausgaben = Endbestand) aufgeht, ohne den Anfangsbestand aus der Differenz zu erraten. `richtung` sagt, auf welcher Seite der Vortrag stand — nicht, dass Geld geflossen wäre.
ohneGeldkontoSeiteintegerjaSätze des Zeitraums OHNE jede Geldkonto-Zeile (Sollstellung, Bestandsvortrag ohne Bank) — die ehrliche Differenz zum Buchungsjournal, nicht verschwiegen.

EinnahmenAusgabenSumme

FeldTypPflichtBeschreibung
bruttoCentsstringjaΣ Brutto (mit USt), vorzeichenlos.
ustCentsstringjaΣ USt-Anteil.
nettoCentsstringjaΣ Brutto − Σ USt.
anzahlintegerjaAnzahl der Positionen in dieser Summe (eine Summe ohne Zähler ist nicht prüfbar).

EinnahmenAusgabenUmbuchung

FeldTypPflichtBeschreibung
buchungIdstring(uuid)ja
datumstring(date)ja
vonGeldkontenarray<string>jaGeldkonten im HABEN des Satzes (Abgang).
nachGeldkontenarray<string>jaGeldkonten im SOLL des Satzes (Zugang).
betragCentsstringjaÜbertragener Betrag = min(Σ Soll, Σ Haben) der Geldzeilen.

ErfasseZeitRequest

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
leistungsdatumstring(date)jaTag der Leistung, nicht in der Zukunft.
dauerMinutenintegerjaGanze Minuten, 1 bis 1440.
taetigkeitsarttelefonat | aussendienst | schriftverkehr | versammlung | verwaltung | sonstigesja
bezugArtobjekt | anliegen | sonderleistungnein
bezugIdstring(uuid) | nullneinGenau bei bezugArt anliegen oder sonderleistung.
notizstring | nullnein

ErgebnisMoney

FeldTypPflichtBeschreibung
centsstringjaBetrag in Cent als Dezimal-Integer-STRING (nie number, nie gerundet, nie mit Dezimalpunkt).
currencyEURja

ErgebnisRecipient

Leerstand gehört dem EIGENTÜMER und wird EXPLIZIT ausgewiesen: ohne diese Unterscheidung wäre „Σ Mieteranteile ≠ Gesamtbetrag" nicht erklärbar. Bei art = mieter ist contractId PFLICHT; bei art = eigentuemer_leerstand gibt es keinen.

Typ: object | object

EroeffnungsProvenienz

FeldTypPflichtBeschreibung
journalEntryIdstring(uuid)ja
contractIdstring(uuid)ja
quellSchluesselstringjaDie einzelne Quellzeile — ohne sie wäre in einem 2.778-Zeilen-Lauf nur die Datei bekannt.
uebernahmestichtagstring(date)jaDer EINGEGEBENE Übernahmestichtag, unverändert.
quellsystemstringjaDas Altsystem, z. B. 'win-casa'.
exportiertAmstring(date-time)jaDer EXPORT aus dem Altsystem, nicht der Import.
dateiHashstringjaSHA-256 der Sicherungsdatei, 64 Hex, kleingeschrieben.

FestschreibungSchalterRequest

FeldTypPflichtBeschreibung
propertyIdstring(uuid) | nulljadas Objekt; null = Mandanten-Vorgabe
aktivbooleanja

FestschreibungSchalterResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid) | nullja
aktivbooleanja

FinanzstatusResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
stichtagstring(date)jaDer Stichtag der Vermögensübersicht: der angefragte `stichtag` oder — im Zeitraum-Modus — `bis`.
entwicklungunbekanntja
vermoegenVermoegensuebersichtja

Freistellungsbescheinigung

FeldTypPflichtBeschreibung
idstring(uuid)ja
kreditorPersonIdstring(uuid)ja
nummerstringja
gueltigBisstring(date)ja
umfangallgemein | auftragsbezogenja
auftragsbezugstring | nullja
finanzamtstringja

FreistellungsbescheinigungenResponse

FeldTypPflichtBeschreibung
kreditorPersonIdstring(uuid)ja
bescheinigungenarray<Freistellungsbescheinigung>jaabsteigend nach Gültigkeit

FremdvertragAnlegenRequest

FeldTypPflichtBeschreibung
propertyIdstring(uuid)jaPflicht: das Objekt
artversicherung | wartung | dienstleistung | versorgungjaPflicht: versicherung | wartung | dienstleistung | versorgung
partnerPersonIdstring(uuid)jaPflicht: Person mit gültiger Rolle Kreditor oder Dienstleister
bezeichnungstringjaPflicht: 1 bis 140 Zeichen
vertragsnummerstringneinoptional: 1 bis 80 Zeichen
beginnstring(date)ja
laufzeitEndestring(date)nein
kuendigungsfristMonateintegerjaPflicht: 0 bis 60
verlaengerungStillschweigendbooleanneinohne Angabe: Vorgabe der Mandanten-Einstellung, sonst ja
verlaengerungMonateintegerneinohne Angabe bei stillschweigender Verlängerung: Vorgabe der Einstellung, sonst 12
beitragunbekanntnein
beitragIntervallmonatlich | zweimonatlich | quartalsweise | halbjaehrlich | jaehrlichnein
selbstbehaltunbekanntnein
bemerkungstringneinoptional: 1 bis 2000 Zeichen

FremdvertragAnlegenResponse

FeldTypPflichtBeschreibung
vertragIdstring(uuid)ja
konditionenFremdvertragKonditionenErgebnisja

FremdvertragBeendigungRequest

FeldTypPflichtBeschreibung
beendetAmstring(date)ja
grundstringneinoptional: 1 bis 200 Zeichen

FremdvertragBeendigungResponse

FeldTypPflichtBeschreibung
vertragIdstring(uuid)ja
ereignisIdstring(uuid)ja
beendetAmstring(date)ja

FremdvertragBefund

FeldTypPflichtBeschreibung
codelaufzeit-fehlt | kuendigungsfrist-verpasst | beitrag-weicht-von-dauerzahlung-abja
bezugEndestring(date) | nullja
spaetesterZugangstring(date) | nullja

FremdvertragDauerzahlung

FeldTypPflichtBeschreibung
idstring(uuid)ja
gueltigAbstring(date)ja
betragstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
rhythmusstringja
jahresbetragstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.

FremdvertragDauerzahlungAbgleich

FeldTypPflichtBeschreibung
verknuepftbooleanja
dauerzahlungunbekanntja
befundunbekanntja

FremdvertragDauerzahlungBefund

FeldTypPflichtBeschreibung
codebeitrag-weicht-von-dauerzahlung-abja
beitragJahrstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
dauerzahlungJahrstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
differenzstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.

FremdvertragDauerzahlungBefundTransport

FeldTypPflichtBeschreibung
codebeitrag-weicht-von-dauerzahlung-abja
beitragJahrFremdvertragGeldja
dauerzahlungJahrFremdvertragGeldja
differenzunbekanntja

FremdvertragDauerzahlungLoesenRequest

FeldTypPflichtBeschreibung

FremdvertragDauerzahlungLoesenResponse

FeldTypPflichtBeschreibung
vertragIdstring(uuid)ja
dauerzahlungIdstring(uuid)ja

FremdvertragDauerzahlungRequest

FeldTypPflichtBeschreibung
dauerzahlungIdstring(uuid)jaPflicht: Dauerzahlung am selben Objekt, noch an keinem anderen Vertrag

FremdvertragDauerzahlungResponse

FeldTypPflichtBeschreibung
vertragIdstring(uuid)ja
dauerzahlungIdstring(uuid)ja
befundunbekanntja

FremdvertragEinstellungResponse

FeldTypPflichtBeschreibung
vorlaufTageintegerja
verlaengerungStillschweigendVorgabebooleanja
verlaengerungMonateVorgabeintegerja
schadenMeldefristTageintegerja
schadenhonorarProzentBpintegerjaSchadenhonorar in Basispunkten (800 = 8,00 %)
schadenhonorarProzentTextstringja
schadenhonorarAktivbooleanja
herkunftvorgabe | mandantja

FremdvertragEinstellungSetzenRequest

FeldTypPflichtBeschreibung
vorlaufTageintegerja1 bis 365
verlaengerungStillschweigendVorgabebooleanja
verlaengerungMonateVorgabeintegerja1 bis 60
schadenMeldefristTageintegerja1 bis 60
schadenhonorarProzentBpintegerjaBasispunkte, 0 bis 10000 (800 = 8,00 %)
schadenhonorarAktivbooleanja

FremdvertragEinstellungSetzenResponse

FeldTypPflichtBeschreibung
einstellungFremdvertragEinstellungWerteja
vorherFremdvertragEinstellungWerteja
geaendertbooleanja
geaendertVonstringja
geaendertAmstring(date-time)ja

FremdvertragEinstellungWerte

FeldTypPflichtBeschreibung
vorlaufTageintegerja
verlaengerungStillschweigendVorgabebooleanja
verlaengerungMonateVorgabeintegerja
schadenMeldefristTageintegerja
schadenhonorarProzentBpintegerja
schadenhonorarAktivbooleanja

FremdvertragEreignis

FeldTypPflichtBeschreibung
idstring(uuid)ja
artstringja
bezugEndestring(date) | nullja
entscheidungstring | nullja
wirksamZumstring(date) | nullja
grundVorhandenbooleanja
amstring(date-time)ja

FremdvertragFristenResponse

FeldTypPflichtBeschreibung
stichtagstring(date)jader verwendete Stichtag (Berliner Tag der Server-Uhr)
zeilenarray<FremdvertragFristZeile>jaleer ohne Fristen

FremdvertragFristenStand

FeldTypPflichtBeschreibung
statusohne-laufzeit | laeuft | gekuendigt | beendet | ausgelaufenja
naechstesEndestring(date) | nullja
spaetesterZugangstring(date) | nulljaLetzter Tag, an dem die Kündigung dem Vertragspartner zugehen muss
aufgabeAbstring(date) | nulljaAb diesem Tag steht die Aufgabe offen (Zugangstermin minus Vorlauf)
aufgabeOffenbooleanja
verpasstesEndestring(date) | nullja
verpasstOffenbooleanja
befundearray<FremdvertragBefund>ja

FremdvertragFristEntscheidRequest

FeldTypPflichtBeschreibung
bezugEndestring(date)jadas Vertragsende, auf das sich die Entscheidung bezieht
entscheidungverlaengern | kuendigen | neu_ausschreibenja
grundstringneinoptional: 1 bis 200 Zeichen

FremdvertragFristEntscheidResponse

FeldTypPflichtBeschreibung
vertragIdstring(uuid)ja
bezugEndestring(date)ja
entscheidungverlaengern | kuendigen | neu_ausschreibenja
ereignisIdstring(uuid)ja
kuendigungAngelegtfalseja
hinweisstringja

FremdvertragFristZeile

FeldTypPflichtBeschreibung
kategoriekuendigungsfrist | frist-verpasst | ohne-laufzeitja
schluesselstringja
titelstringja
objektIdstring(uuid)ja
artversicherung | wartung | dienstleistung | versorgungja
partnerstring | nullja
vertragsendestring(date) | nullja
spaetesterZugangstring(date) | nullja
aufgabeAbstring(date) | nullja
tageBisFristinteger | nulljaTage vom Stichtag bis zum Zugangstermin; negativ, wenn er verstrichen ist
ampelgruen | gelb | rotja
friststring(date) | nullja
refIdstring(uuid)jader Vertrag
offenbooleanja

FremdvertragGeld

FeldTypPflichtBeschreibung
centsstringjaCent als Integer-STRING, nie eine JSON-Zahl
currencyEURja

FremdvertragKonditionen

FeldTypPflichtBeschreibung
versionintegerja
gueltigAbstring(date)ja
laufzeitEndestring(date) | nullja
kuendigungsfristMonateintegerja
verlaengerungStillschweigendbooleanja
verlaengerungMonateinteger | nullja
beitragstring | nulljaBeitrag je Intervall in Cent als Integer-STRING
beitragIntervallstring | nullja
jahresbeitragstring | nulljaJahresbeitrag in Cent als Integer-STRING
selbstbehaltstring | nulljaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
bemerkungVorhandenbooleanjaDer Freitext selbst wird nie ausgegeben, nur das Kennzeichen.

FremdvertragKonditionenErgebnis

FeldTypPflichtBeschreibung
versionintegerja
gueltigAbstring(date)ja
verlaengerungStillschweigendbooleanja
verlaengerungMonateinteger | nullja

FremdvertragKonditionenRequest

FeldTypPflichtBeschreibung
gueltigAbstring(date)jamuss nach dem gueltigAb der letzten Version liegen
laufzeitEndestring(date) | nullja
kuendigungsfristMonateintegerja0 bis 60
verlaengerungStillschweigendbooleanja
verlaengerungMonateinteger | nulljabei stillschweigender Verlängerung Pflicht, sonst null
beitragunbekanntja
beitragIntervallmonatlich | zweimonatlich | quartalsweise | halbjaehrlich | jaehrlich | nullja
selbstbehaltunbekanntja
bemerkungstring | nullja

FremdvertragKonditionenResponse

FeldTypPflichtBeschreibung
vertragIdstring(uuid)ja
konditionenFremdvertragKonditionenErgebnisja

FremdvertragKuendigungRequest

FeldTypPflichtBeschreibung
wirksamZumstring(date)janicht vor heute
grundstringneinoptional: 1 bis 200 Zeichen

FremdvertragKuendigungResponse

FeldTypPflichtBeschreibung
vertragIdstring(uuid)ja
ereignisIdstring(uuid)ja
wirksamZumstring(date)ja
fruehestesEndestring(date) | nulljanächstes Vertragsende, zu dem die Kündigung nach Frist wirkt; null ohne Laufzeitende
spaetesterZugangstring(date) | nulljaspätester Kündigungszugang zu fruehestesEnde

FremdvertragListenZeile

FeldTypPflichtBeschreibung
idstring(uuid)ja
artversicherung | wartung | dienstleistung | versorgungja
bezeichnungstringja
vertragsnummerVorhandenbooleanja
propertyIdstring(uuid)ja
partnerFremdvertragPartnerja
beginnstring(date)ja
konditionenunbekanntja
fristenunbekanntja
beendetbooleanja
dauerzahlungVerknuepftbooleanja
anzahlSchadenfaelleintegerja

FremdvertragListeResponse

FeldTypPflichtBeschreibung
stichtagstring(date)jader verwendete Stichtag (Berliner Tag der Server-Uhr)
zeilenarray<FremdvertragListenZeile>janur Verträge der Objekte, für die der Aufrufer zuständig ist; leer ohne Verträge
gesamtintegerja
limitintegerja
offsetintegerja

FremdvertragPartner

FeldTypPflichtBeschreibung
personIdstring(uuid)ja
anzeigenamestring | nullja

FremdvertragResponse

FeldTypPflichtBeschreibung
stichtagstring(date)ja
vertragFremdvertragStammja
beendetbooleanja
konditionenunbekanntja
historiearray<FremdvertragKonditionen>ja
ereignissearray<FremdvertragEreignis>ja
fristenunbekanntja
dauerzahlungAbgleichFremdvertragDauerzahlungAbgleichja
schadenfaellearray<FremdvertragSchadenfallKurz>ja

FremdvertragSchadenfallKurz

FeldTypPflichtBeschreibung
idstring(uuid)ja
nummerstringja
statuserfasst | gemeldet | deckung_zugesagt | deckung_abgelehnt | reguliert | abgeschlossenja
schadensdatumstring(date)ja

FremdvertragStamm

FeldTypPflichtBeschreibung
idstring(uuid)ja
artversicherung | wartung | dienstleistung | versorgungja
bezeichnungstringja
vertragsnummerVorhandenbooleanja
propertyIdstring(uuid)ja
objektstring | nullja
partnerFremdvertragPartnerja
beginnstring(date)ja
dauerzahlungIdstring(uuid) | nullja

Gebaeude

FeldTypPflichtBeschreibung
idstring(uuid)ja
propertyIdstring(uuid)jadas Objekt; nach der Anlage unveränderlich
propertyNostring | nulljaObjektnummer des Elternobjekts (LEFT JOIN)
addressobjectjafreies Adress-JSON — KEIN erzwungenes Adressmodell
archivedAtstring(date-time) | nulljagesetzt ⇒ archiviert (K5: kein DELETE)
createdAtstring(date-time)ja

GebaeudeArchiveResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
archivedAtstring(date-time)ja
alreadyArchivedbooleanjatrue ⇒ das Gebäude war bereits archiviert (expliziter No-op).

GebaeudeCreateRequest

FeldTypPflichtBeschreibung
propertyIdstring(uuid)jaDas Objekt, an dem das Gebäude hängt. MUSS aktiv sein (sonst 400).
addressobjectneinfreies Adress-JSON; ohne Angabe {}
sourceSystemstring | nullnein
sourceRefstring | nullnein

GebaeudeListResponse

FeldTypPflichtBeschreibung
statusalle | aktiv | archiviertjader wirksame 3-Wege-Filter
gebaeudearray<Gebaeude>ja

GebaeudeReactivateResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
reactivatedAtstring(date-time)ja
alreadyActivebooleanja
reactivatedUnitsintegerja

GebaeudeUpdateRequest

Partieller Patch. `propertyId` ist BEWUSST nicht patchbar (Umstrukturierung mit eigenem Pfad).

FeldTypPflichtBeschreibung
addressobjectnein

GeldkontenEntwicklung

FeldTypPflichtBeschreibung
zeitraumSaldenlisteZeitraumja
kontenarray<GeldkontoEntwicklung>jaEin Block je Geldkonto (`gl_accounts.kontotyp = bank`), nach Kontonummer geordnet — auch unbebuchte.
anfangsbestandCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
zugaengeCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
abgaengeCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
endbestandCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
currencystringja
stimmtbooleanja`stimmt` gilt für JEDES Konto.

GeldkontoBewegung

FeldTypPflichtBeschreibung
entryIdstring(uuid)jaDer Buchungssatz, aus dem diese Bewegung kommt — der Provenienz-Anker der Zeile.
entryNostringjaLückenlose Buchungsnummer je Objekt als Integer-STRING (bigint in der DB).
lineNointegerja1-basierte Position im Satz.
buchungsdatumstring(date)jaDie AUSWAHL-Achse: nur Sätze mit Buchungsdatum im Zeitraum sind Bewegungen.
wertstellungstring(date)jaDie ORDNUNGS-Achse: die Liste steht in aufsteigender Wertstellung (`accrual_date`).
belegnummerstring | nullja
zugangCentsstringjaSOLL auf dem Geldkonto, vorzeichenlos. Genau eines von zugang/abgang ist > 0.
abgangCentsstringjaHABEN auf dem Geldkonto, vorzeichenlos.
laufenderSaldoCentsstringjaDer Saldo NACH dieser Bewegung, signiert (Soll − Haben) und beim Anfangsbestand beginnend. Der LETZTE ist der Endbestand.
gegenkontenarray<string>jaDie übrigen Kontonummern des Satzes, ohne Dubletten — woher das Geld kam bzw. wohin es ging. Leer nur bei einer Umbuchung innerhalb desselben Geldkontos.

GeldkontoEntwicklung

FeldTypPflichtBeschreibung
glAccountNostringjaKontonummer am Objekt — nur JE OBJEKT eindeutig.
namestringja
anfangsbestandCentsstringjaSaldo aller Sätze VOR `von`, signiert.
anfangsbestandSeiteS | Hja
zugaengeCentsstringjaΣ SOLL im Zeitraum (vorzeichenlos).
abgaengeCentsstringjaΣ HABEN im Zeitraum (vorzeichenlos).
endbestandCentsstringjaSaldo aller Sätze bis `bis`, signiert = Anfangsbestand + Zugänge − Abgänge.
endbestandSeiteS | Hja
bewegungenarray<GeldkontoBewegung>ja
stimmtbooleanjaAnfangsbestand + Zugänge − Abgänge = Endbestand für DIESES Konto. Wird AUSGEWIESEN statt erzwungen — eine Schieflage soll sichtbar sein, nicht die Antwort verhindern.

HausgeldBefund

FeldTypPflichtBeschreibung
regelstringja
fundortstringjaWO der Befund sitzt, maschinenlesbar, z. B. `einzelplan:ENR1`.
meldungstringjaDer Satz für den Menschen — nennt die verletzte Zusage, nie einen Fremdwert roh (BP §4).

HausgeldDifferenzRequest

FeldTypPflichtBeschreibung
jahrintegerja
wirtschaftsplanIdstring(uuid)ja
beschlussRefstringja
vorschlaegearray<unbekannt>jaDie zu buchenden Vorschläge, wie der Lauf sie geliefert hat. MINDESTENS EINER — ein leerer Stapel hätte nichts freizugeben.
quittiertVonstringjaWER quittiert. Ein anonymer Freigabeschritt ist keiner (GoBD).
quittiertAmstring(date)jaWANN, striktes `YYYY-MM-DD`. INJIZIERT — kein Server liest hier eine Uhr (BP §8).

HausgeldDifferenzResponse

FeldTypPflichtBeschreibung
ausgangausgefuehrt | bereits_ausgefuehrtja
schluesselstringja
positionenarray<HausgeldSollPosition>jaDie gebuchten Positionen — Art `differenz`.

HausgeldDifferenzVorschlag

FeldTypPflichtBeschreibung
unitIdstring(uuid)ja
monatstringjaDer betroffene Fachkern-Monat `YYYY-MM`.
bisherCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
neuCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
differenzCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
hausgeldAnteilCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
ruecklagenAnteilCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
schuldnerarray<HausgeldSchuldner>ja
planVersionintegerja
quittungsSchluesselstringjaDer Idempotenz-Schlüssel, unter dem GENAU DIESER Vorschlag quittiert wird.

HausgeldSchuldner

FeldTypPflichtBeschreibung
personIdstring(uuid)ja
ownershipIdstring(uuid)ja
anteilstringjaAnteil am Innenverhältnis (§ 426 BGB) in ZEHNTAUSENDSTELN als Integer-STRING — KEIN Geld, INV-MONEY-01 ist nicht berührt.

HausgeldSollListResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
jahrintegerjaDas abgefragte WIRTSCHAFTSJAHR (Echo) — bei einem Rumpfjahr nicht das Kalenderjahr.
zeilenarray<HausgeldSollZeile>ja

HausgeldSollPosition

FeldTypPflichtBeschreibung
unitIdstring(uuid)ja
monatstringjaDer Fachkern-Monat `YYYY-MM` — nie der Monatserste `YYYY-MM-01`, nie ein Zeitstempel.
artvorschuss | differenzjavorschuss = der laufende Monat aus dem Plan; differenz = eine QUITTIERTE Rückwirkung.
betragCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
hausgeldAnteilCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
ruecklagenAnteilCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
schuldnerarray<HausgeldSchuldner>jaDie Eigentümer DER PERIODE, gesamtschuldnerisch (§ 421 BGB), deterministisch nach ownershipId sortiert.
kontenkreisstringjaTräger der Geldkreis-Trennung (S2-T21) — endet auf `:weg_hausgeld`.
beschlussRefstringjaKanonische Beschluss-Teilgegenstands-Referenz `beschluss-gegenstand:<uuid>` (S12-T02).
planVersionintegerja

HausgeldSollRequest

FeldTypPflichtBeschreibung
jahrintegerjaDas WIRTSCHAFTSJAHR des Plans.
geldkreisstringjaBewusst freier Text: `resolveAbrechnungslaufScope` (S2-T21) ist die eine Instanz, die über Geldkreise urteilt.
wirtschaftsplanIdstring(uuid)ja
planVersionintegerjaDie Plan-Version, aus der die Zellen stammen; > 0.
beschlussRefstringjaKanonische Beschluss-Teilgegenstands-Referenz (S12-T02).
wirtschaftsjahrobjectjaDas geprüfte Wirtschaftsjahr aus S12-T08 — Form: Fachkern.
zellenarray<unbekannt>jaDie Monatszellen je Einzelplan, aus S12-T08 ÜBERNOMMEN — hier wird nicht gerechnet.
episodenarray<unbekannt>jaDie Abrechnungs-Episoden je Einheit (S12-T01) — der Schuldner DER PERIODE.
standobjectjaDer zu buchende Plan-Stand; geht UNVERÄNDERT an das Buchungs-Gate aus S12-T09.

HausgeldSollResponse

FeldTypPflichtBeschreibung
ausgangausgefuehrt | bereits_ausgefuehrtja
schluesselstringjaDer Idempotenz-Schlüssel des Laufs, wie der Fachkern ihn gebildet hat.
geldkreisstringja
kontenkreisstringja
beschlussRefstringjaDie Rechtsgrundlage, wie die FREIGABE sie gemeldet hat — nie aus der Eingabe.
beschlussStatusstringja
positionenarray<HausgeldSollPosition>jaDie GESTELLTEN Positionen, Art `vorschuss`.
differenzVorschlaegearray<HausgeldDifferenzVorschlag>jaDie rückwirkenden Differenzen als VORSCHLAG — NICHT gebucht; leer statt fehlend.
warnungenarray<HausgeldBefund>ja

HausgeldSollZeile

FeldTypPflichtBeschreibung
unitIdstring(uuid)ja
monatstringjaDer Fachkern-Monat `YYYY-MM`.
artvorschuss | differenzja
betragCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
ruecklagenAnteilCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.

HausgeldZahlungResponse

FeldTypPflichtBeschreibung
sollstellungIdstring(uuid)ja
zuordnungnachrangig | quotaljaDie ANGEWANDTE Regel (Präzedenz Objekt > Tenant > Default) — immer mitgeliefert, damit ein Beleg entsteht.
hausgeldCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
ruecklageCentsstringjaDer TATSÄCHLICH vereinnahmte Rücklagenanteil — nur er wird später zugeführt.
unverteiltCentsstringjaÜberzahlung, die keiner der beiden Forderungen zufällt.
positionHausgeldSollPositionja

HealthResponse

FeldTypPflichtBeschreibung
statushealthy | unhealthyja
checksarray<object>ja

HonorarAnpassungenResponse

FeldTypPflichtBeschreibung
anpassungenarray<HonorarAnpassungZeile>ja

HonorarAnpassungHinweis

FeldTypPflichtBeschreibung
codestringja
textstringja

HonorarAnpassungPauschale

FeldTypPflichtBeschreibung
einheitentypstringja
altobject | nullja
neuobject | nullja
aenderungBasispunktestring | nulljaKaufmännisch gerundete Änderung in Basispunkten als Integer-STRING; null ohne tragfähige Basis.

HonorarAnpassungResponse

FeldTypPflichtBeschreibung
anpassungIdstring(uuid)ja
neueScheibeHonorarvereinbarungScheibeja
geschlosseneScheibeunbekanntja
vergleichHonorarAnpassungVergleichja
hinweisearray<HonorarAnpassungHinweis>ja

HonorarAnpassungVergleich

FeldTypPflichtBeschreibung
berechnungsartAltstringja
berechnungsartNeustringja
pauschalenarray<HonorarAnpassungPauschale>ja
satzBasispunkteobjectja

HonorarAnpassungZeile

FeldTypPflichtBeschreibung
idstring(uuid)ja
propertyIdstring(uuid)ja
wirksamAbstring(date)ja
grundlagebeschluss | zustimmung | klauselja
beschlussIdstring(uuid) | nullja
zustimmungAmstring(date) | nullja
begruendungstringja
scheibeAltHonorarvereinbarungScheibeja
scheibeNeuHonorarvereinbarungScheibeja
createdAtstring(date-time)ja

HonorarBasiswerte

FeldTypPflichtBeschreibung
sollmieteCentsstringjaMietforderungen (Sollstellungen) mit fachlicher Periode im Monat (accrual_date) abzüglich Storno und Gutschrift; ohne Kosten, Zinsen und sonstige Geldkreise.
istmieteCentsstringjaWirksam einer Mietforderung zugeordnete Bankeingänge mit Zahlungsdatum im Monat (Zahlungszuordnungen ohne Zuordnungsstornos; ohne stornierte Zahlungen). Zahlungen auf Kosten, Hausgeld oder ohne Zuordnung zählen nicht.
currencystringja

HonorarEinheit

FeldTypPflichtBeschreibung
einheitIdstring(uuid)ja
bezeichnungstringjaEinheitennummer (`units.unit_no`).
einheitentypstringja`unit_kind` — offenes Vokabular (wohnung, gewerbe, stellplatz, …).
belegtbooleanjaAm Monatsletzten durch einen laufenden Vertrag belegt. `false` ⇒ Leerstandsregel greift.

HonorarPosition

FeldTypPflichtBeschreibung
artgrundverguetung | leerstand | mindestbetrag | hoechstbetrag | zuschlagjagrundverguetung | leerstand | mindestbetrag | hoechstbetrag | zuschlag — Deckel sind eigene Zeilen, keine stille Korrektur.
bezeichnungstringja
einheitIdstring(uuid) | nulljanull ⇒ objektweite Zeile (Prozentbetrag, Deckel).
einheitentypstring | nullja
anzahlintegerjaWie oft der Einzelbetrag zählt (Zuschlag: Zahl der Ereignisse).
nettoCentsstringjaNEGATIV bei `hoechstbetrag` (Kürzung) — die Aufstellung bleibt addierbar.
currencystringja

HonorarSonderleistungPosition

FeldTypPflichtBeschreibung
sonderleistungIdstring(uuid)ja
leistungsdatumstring(date)jaTag der Leistung — bestimmt den Honorarmonat; eine Leistung gehört genau EINEM Monat.
schluesselstringjaSchlüssel der Leistung im Katalog des Objekts (`mahnbescheid`, `bescheinigung_35a`, …).
bezeichnungstringjaAnzeigetext aus dem Katalog zum Erfassungszeitpunkt.
preisartfest | je_stunde | je_einheitjafest | je_stunde | je_einheit.
mengestringjaDezimal-STRING mit Punkt (`"1"`, `"1.25"`), nie eine JSON-number.
einheitIdstring(uuid) | nulljaBezug auf eine Einheit des Objekts; null ⇒ objektweite Leistung.
einzelpreisCentsstringjaNetto-Preis je Vorgang/Stunde/Einheit aus dem Katalog zum Erfassungszeitpunkt.
nettoCentsstringjaEinzelpreis × Menge, kaufmännisch auf den Cent gerundet.
umsatzsteuersatzProzentstringjaGanze Prozent als Integer-STRING aus dem Katalogeintrag.
umsatzsteuerCentsstringjaUSt dieser Position, je Position gerundet.
bruttoCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
currencystringja

HonorarvereinbarungScheibe

FeldTypPflichtBeschreibung
gueltigAbstring(date)ja
gueltigBisstring(date) | nulljaLetzter Tag der Scheibe (einschließlich); null ⇒ läuft weiter.
berechnungsartstringja
pauschaleJeEinheitentypobjectjaPauschale je Einheitentyp als { cents, currency }.
satzBasispunktestring | nulljaProzentsatz in Basispunkten als Integer-STRING; null bei Pauschalen.
mindestbetragobject | nullja
hoechstbetragobject | nullja
leerstandMindestbetragobject | nullja
zuschlaegearray<object>ja
umsatzsteuersatzProzentstringjaGanze Prozent als Integer-STRING.

HonorarVorschauResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
monatstringjaAbrechnungsmonat `JJJJ-MM` (Echo der Anfrage).
vonstring(date)ja
bisstring(date)ja
gueltigAbstring(date)jaBeginn der Zeitscheibe, die gerechnet hat — der Nachweis bei einem Satzwechsel.
gueltigBisstring(date) | nulljaLetzter Tag der Zeitscheibe (EINSCHLIESSLICH); null ⇒ läuft weiter.
berechnungsartpauschal_je_einheit | prozent_sollmiete | prozent_istmieteja
basiswerteHonorarBasiswerteja
einheitenarray<HonorarEinheit>ja
positionenarray<HonorarPosition>jaIn Rechenreihenfolge: Grundvergütung → Leerstand → Deckel → Zuschläge.
grundverguetungCentsstringjaNach Mindest-/Höchstbetrag, VOR Zuschlägen.
zuschlaegeCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
sonderleistungenarray<HonorarSonderleistungPosition>jaDie nicht stornierten Sonderleistungen des Monats (#5189), je Erfassung eine Position mit eigener USt, nach Leistungsdatum.
sonderleistungenNettoCentsstringjaΣ Netto der Sonderleistungen.
sonderleistungenUmsatzsteuerCentsstringjaΣ USt der Sonderleistungen (je Position gerundet).
nettoCentsstringjaΣ aller Positionen einschließlich der Sonderleistungen.
umsatzsteuersatzProzentstringjaGanze Prozent als Integer-STRING ("19"). 0 ist eine Vereinbarung (§ 19 UStG), keine fehlende Angabe.
umsatzsteuerCentsstringjaUSt der Grundvergütung (Satz der Vereinbarung) plus USt der Sonderleistungen (Satz je Position).
bruttoCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
currencystringja
mindestbetragGegriffenbooleanja
hoechstbetragGegriffenbooleanja

IndexanpassungErklaerungResponse

FeldTypPflichtBeschreibung
textstringjader vollständige Erklärungstext im Standardwortlaut (§ 557b Abs. 3 BGB); nie ein Teiltext
vorlageVersionstringjaVersion des Standardwortlauts
dokumentHashstringjaSHA-256 (hex) über den UTF-8-Text
zugangErfasstbooleanjafalse ⇒ kein Zugangstag erfasst; der Wirksamkeitsmonat ist die Vorschau auf Basis des geplanten Wirksamkeitstags des Vorgangs

InkassoAufstellung

FeldTypPflichtBeschreibung
stichtagstring(date)ja
schuldnerstringja
objektstringja
vertragsnummerstringja
zinssatzBasispunkteinteger | nullja
currencystringja
zeilenarray<InkassoAufstellungZeile>ja
summeHauptforderungCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
summeGebuehrenCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
summeVerzugszinsenCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
gesamtCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
tageszinsCentsstring | nulljalaufender Tageszins ab Stichtag; null ohne Zinssatz
hinweisearray<InkassoAufstellungHinweis>ja

InkassoAufstellungDateiResponse

FeldTypPflichtBeschreibung
dateiInkassoDateija
aufstellungHashstringjaHash der kanonischen Aufstellung, wie am Kopf

InkassoAufstellungGebuehr

FeldTypPflichtBeschreibung
stufestringja0, 1, 2, 3 oder anwalt
betragCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
gebuchtAmstring(date)ja

InkassoAufstellungHinweis

FeldTypPflichtBeschreibung
artmahnstufe-unter-3 | kein-zinsansatzja
postenIdstring(uuid) | nulljanur bei mahnstufe-unter-3

InkassoAufstellungZeile

FeldTypPflichtBeschreibung
postenIdstring(uuid)ja
bezeichnungstringja
faelligAmstring(date)ja
hauptforderungCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
mahnstufestringja0, 1, 2, 3 oder anwalt
gebuehrenarray<InkassoAufstellungGebuehr>ja
summeGebuehrenCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
verzugszinsenCentsstringjabis zum Stichtag aufgelaufen
summeCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.

InkassoDatei

FeldTypPflichtBeschreibung
dateinamestringja`forderungsaufstellung-<erste 8 Zeichen der Übergabe-Id>-<Stichtag>.csv` — ohne Personenangaben
sha256stringjaSHA-256 der Datei-Bytes (Hex, 64 Zeichen)
groesseBytesintegerja
inhaltBase64stringjadie Datei-Bytes, Base64 (CSV, Semikolon, UTF-8 mit BOM, Dezimalkomma)

InkassoUebergabe

FeldTypPflichtBeschreibung
idstring(uuid)ja
propertyIdstring(uuid)ja
personIdstring(uuid)jader Schuldner
contractIdstring(uuid) | nullja
weginkasso | gerichtliches-mahnverfahren | klageja
statusentwurf | uebergeben | zurueckgenommen | abgeschlossenja
stichtagstring(date)ja
zinssatzBasispunkteinteger | nulljaVerzugszinssatz in Basispunkten; null = kein Zinsansatz
aufstellungHashstringjaSHA-256 der kanonischen Forderungsaufstellung (Hex)
gesamtCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
currencystringja
empfaengerstring | nulljaInkassounternehmen oder Kanzlei (Freitext)
begruendungMahnstufestring | nulljaPflicht für Posten unter Mahnstufe 3 (Freitext)
uebergebenAmstring(date) | nullja
uebergebenVonstring | nullja
zurueckgenommenAmstring(date-time) | nullja
zuruecknahmeGrundstring | nullja
abgeschlossenAmstring(date-time) | nullja
abschlussArtbezahlt | vergleich | uneinbringlich | sonstiges | nullja
abschlussNotizstring | nullja
createdAtstring(date-time)ja

InkassoUebergabeAbschlussResponse

FeldTypPflichtBeschreibung
uebergabeIdstring(uuid)ja
statusabgeschlossenja
artbezahlt | vergleich | uneinbringlich | sonstigesja
freigegebenePostenintegerja

InkassoUebergabeDetailResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
propertyIdstring(uuid)ja
personIdstring(uuid)jader Schuldner
contractIdstring(uuid) | nullja
weginkasso | gerichtliches-mahnverfahren | klageja
statusentwurf | uebergeben | zurueckgenommen | abgeschlossenja
stichtagstring(date)ja
zinssatzBasispunkteinteger | nulljaVerzugszinssatz in Basispunkten; null = kein Zinsansatz
aufstellungHashstringjaSHA-256 der kanonischen Forderungsaufstellung (Hex)
gesamtCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
currencystringja
empfaengerstring | nulljaInkassounternehmen oder Kanzlei (Freitext)
begruendungMahnstufestring | nulljaPflicht für Posten unter Mahnstufe 3 (Freitext)
uebergebenAmstring(date) | nullja
uebergebenVonstring | nullja
zurueckgenommenAmstring(date-time) | nullja
zuruecknahmeGrundstring | nullja
abgeschlossenAmstring(date-time) | nullja
abschlussArtbezahlt | vergleich | uneinbringlich | sonstiges | nullja
abschlussNotizstring | nullja
createdAtstring(date-time)ja
aufstellungInkassoAufstellungja
postenarray<InkassoUebergabePosten>ja

InkassoUebergabeListeResponse

FeldTypPflichtBeschreibung
uebergabenarray<InkassoUebergabe>janeueste zuerst

InkassoUebergabePosten

FeldTypPflichtBeschreibung
offenerPostenIdstring(uuid)ja
aktivbooleanjafalse ⇔ die Übergabe ist zurückgenommen oder abgeschlossen, der Posten frei

InkassoUebergabeUebergebenResponse

FeldTypPflichtBeschreibung
uebergabeIdstring(uuid)ja
statusuebergebenja
uebergebenAmstring(date)ja
postenarray<InkassoUebergebenPosten>ja

InkassoUebergabeZuruecknahmeResponse

FeldTypPflichtBeschreibung
uebergabeIdstring(uuid)ja
statuszurueckgenommenja
vorherigerStatusentwurf | uebergeben | zurueckgenommen | abgeschlossenja
freigegebenePostenintegerja

InkassoUebergebenPosten

FeldTypPflichtBeschreibung
offenerPostenIdstring(uuid)ja
geaendertbooleanjafalse ⇔ der Mahnstatus stand schon auf anwalt

InstandhaltungAblehnung

FeldTypPflichtBeschreibung
codezu-teuer | angebot-unklar | beschluss-fehlt | sonstigesja
notestringneinhöchstens 500 Zeichen

InstandhaltungAbschlussRequest

FeldTypPflichtBeschreibung
begruendungstringneinoptional: 1 bis 300 Zeichen

InstandhaltungAbschlussResponse

FeldTypPflichtBeschreibung
vorgangIdstring(uuid)ja
vonStatusgemeldet | in_klaerung | angebote_offen | zur_freigabe | freigegeben | beauftragt | ausgefuehrt | abgerechnet | abgeschlossen | storniertja
statusabgeschlossen | storniertja
ereignisIdstring(uuid)ja
begruendungstring | nulljaBegründung bzw. Grund, wie gespeichert; null, wenn keine angegeben wurde

InstandhaltungAngebot

FeldTypPflichtBeschreibung
angebotIdstring(uuid)ja
dienstleisterInstandhaltungPersonVerweisja
statusangefragt | vorliegend | gewaehlt | verworfenja
betragCentsstring | nulljaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
gueltigBisstring(date) | nullja
realisierungAbstring(date) | nullja
dokumentIdstring(uuid) | nullja
angefragtAmstring(date-time)ja

InstandhaltungAngebotErgebnis

FeldTypPflichtBeschreibung
idstring(uuid)ja
vorgangIdstring(uuid)ja
dienstleisterPersonIdstring(uuid)ja
statusstringja
betragunbekanntja
gueltigBisstring(date) | nullja
realisierungAbstring(date) | nullja
dokumentIdstring(uuid) | nullja
angefragtAmstring(date-time)ja

InstandhaltungAngebotRequest

FeldTypPflichtBeschreibung
dienstleisterPersonIdstring(uuid)ja
betragunbekanntja
gueltigBisstring(date)nein
realisierungAbstring(date)nein
dokumentIdstring(uuid)nein

InstandhaltungAngebotResponse

FeldTypPflichtBeschreibung
angebotInstandhaltungAngebotErgebnisja

InstandhaltungAngebotVerwerfenRequest

FeldTypPflichtBeschreibung
angebotIdstring(uuid)ja
grundstringjaPflicht: 1 bis 200 Zeichen

InstandhaltungAngebotWaehlenRequest

FeldTypPflichtBeschreibung
angebotIdstring(uuid)ja

InstandhaltungAngebotWaehlenResponse

FeldTypPflichtBeschreibung
angebotInstandhaltungAngebotErgebnisja
anzahlAngeboteintegerjaAngebote im Status vorliegend oder gewaehlt
befundunbekanntja

InstandhaltungAufgabe

FeldTypPflichtBeschreibung
schluesselstringja
aufgabeArtsofort-unbearbeitet | angebot-ausstehend | freigabe-wartet | rechnung-fehltja
ampelgruen | gelb | rot | nullja
titelstringja
objektIdstring(uuid)ja
objektNrstring | nullja
friststring(date)ja
vorgangIdstring(uuid)ja

InstandhaltungAufgabenResponse

FeldTypPflichtBeschreibung
stichtagstring(date)jader verwendete Stichtag (Berliner Tag der Server-Uhr)
zeilenarray<InstandhaltungAufgabe>ja

InstandhaltungAuftrag

FeldTypPflichtBeschreibung
auftragIdstring(uuid)ja
versionintegerja
statuszur_freigabe | freigegeben | abgelehnt | erteilt | ausgefuehrt | storniertja
lebendbooleanja
angebotIdstring(uuid) | nullja
dienstleisterInstandhaltungPersonVerweisja
betragCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
kostenobergrenzeCentsstring | nulljaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
costCategoryIdstring(uuid) | nullja
auftragsnummerstring | nullja
erteiltAmstring(date-time) | nullja
ausgefuehrtAmstring(date-time) | nullja

InstandhaltungAuftragAusfuehrungRequest

FeldTypPflichtBeschreibung
auftragIdstring(uuid)neinoptional: ohne Angabe gilt der lebende Auftrag des Vorgangs; kein lebender Auftrag ⇒ 404 `not_found`
ausgefuehrtAmstring(date)ja
notizstringnein1 bis 500 Zeichen

InstandhaltungAuftragAusfuehrungResponse

FeldTypPflichtBeschreibung
auftragIdstring(uuid)ja
ausgefuehrtAmstring(date)ja

InstandhaltungAuftragErteilenRequest

FeldTypPflichtBeschreibung
auftragIdstring(uuid)neinoptional: ohne Angabe gilt der lebende Auftrag des Vorgangs; kein lebender Auftrag ⇒ 404 `not_found`

InstandhaltungAuftragErteilenResponse

FeldTypPflichtBeschreibung
auftragIdstring(uuid)ja
auftragsnummerstringja
erteiltAmstring(date)ja
befundearray<InstandhaltungBefund>ja

InstandhaltungAuftragStornierenRequest

FeldTypPflichtBeschreibung
auftragIdstring(uuid)neinoptional: ohne Angabe gilt der lebende Auftrag des Vorgangs; kein lebender Auftrag ⇒ 404 `not_found`
grundstringjaPflicht: 1 bis 200 Zeichen

InstandhaltungAuftragStornierenResponse

FeldTypPflichtBeschreibung
auftragIdstring(uuid)ja
vorgangStatusgemeldet | in_klaerung | angebote_offen | zur_freigabe | freigegeben | beauftragt | ausgefuehrt | abgerechnet | abgeschlossen | storniertja

InstandhaltungBefund

FeldTypPflichtBeschreibung
codeweniger-als-mindestangebote | gestattungsbeschluss-fehlt | kostenobergrenze-ohne-angebot | freistellung-fehlt | freistellung-abgelaufen | freistellung-anderer-auftrag | rechnung-ueber-auftrag | rechnung-kreditor-abweichendja
schwerehinweis | warnungja
textstringja

InstandhaltungDienstleisterRequest

FeldTypPflichtBeschreibung
dienstleisterPersonIdstring(uuid)jaPflicht: die Person mit gültiger Rolle `dienstleister`

InstandhaltungDienstleisterResponse

FeldTypPflichtBeschreibung
vorgangIdstring(uuid)ja
vorgangStatusstringja
angebotInstandhaltungAngebotErgebnisja

InstandhaltungEinheitVerweis

FeldTypPflichtBeschreibung
unitIdstring(uuid)ja
einheitNrstringja

InstandhaltungEinstellungResponse

FeldTypPflichtBeschreibung
zweitfreigabeAbCentsstring | nulljaAuftragswert in Cent, ab dem eine Zweitfreigabe nötig ist; null ⇒ nie
vergleichsangeboteAbCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
mindestangeboteintegerja
herkunftvorgabe | mandantja
geaendertVonstring | nullja
geaendertAmstring(date-time) | nullja

InstandhaltungEinstellungSetzenRequest

FeldTypPflichtBeschreibung
zweitfreigabeAbCentsstring | nulljaAuftragswert in Cent (Integer-String), ab dem eine Zweitfreigabe nötig ist; null ⇒ nie
vergleichsangeboteAbCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
mindestangeboteintegerja

InstandhaltungEinstellungSetzenResponse

FeldTypPflichtBeschreibung
zweitfreigabeAbCentsstring | nulljaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
vergleichsangeboteAbCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
mindestangeboteintegerja
vorherInstandhaltungEinstellungWerteja
geaendertbooleanja
geaendertVonstring | nullja
geaendertAmstring(date-time) | nullja

InstandhaltungEinstellungWerte

FeldTypPflichtBeschreibung
zweitfreigabeAbCentsstring | nulljaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
vergleichsangeboteAbCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
mindestangeboteintegerja

InstandhaltungEreignis

FeldTypPflichtBeschreibung
ereignisIdstring(uuid)ja
vonStatusgemeldet | in_klaerung | angebote_offen | zur_freigabe | freigegeben | beauftragt | ausgefuehrt | abgerechnet | abgeschlossen | storniert | nullja
nachStatusgemeldet | in_klaerung | angebote_offen | zur_freigabe | freigegeben | beauftragt | ausgefuehrt | abgerechnet | abgeschlossen | storniertja
grundstring | nullja
akteurArtstringja
amstring(date-time)ja

InstandhaltungFreigabeBeantragenRequest

FeldTypPflichtBeschreibung
angebotIdstring(uuid)neindas gewählte Angebot; ohne Angebot nur bei Typen mit `ohneAngebotErlaubt`
kostenobergrenzeunbekanntnein
dienstleisterPersonIdstring(uuid)nein
costCategoryIdstring(uuid)nein

InstandhaltungFreigabeBeantragenResponse

FeldTypPflichtBeschreibung
auftragIdstring(uuid)ja
versionintegerja
betragInstandhaltungGeldja
stufenarray<verwalter | zweit>ja
zweitstufeNichtWirksambooleanja
befundearray<InstandhaltungBefund>ja

InstandhaltungFreigabeEntscheidenRequest

FeldTypPflichtBeschreibung
stufeverwalter | zweitja
decisionapproved | rejectedja
rejectReasonunbekanntnein

InstandhaltungFreigabeEntscheidenResponse

FeldTypPflichtBeschreibung
entschiedenapproved | rejectedja
auftragStatusstringja
vorgangStatusstringja
offeneStufenarray<verwalter | zweit>ja
ohneVierAugenbooleanjatrue, wenn der abgeschaltete Vier-Augen-Schalter die Selbstfreigabe getragen hat

InstandhaltungFreigabeStand

FeldTypPflichtBeschreibung
auftragIdstring(uuid)ja
versionintegerja
erforderlicheStufenarray<verwalter | zweit>ja
zweitstufeNichtWirksambooleanja
stufenarray<InstandhaltungStufenStand>ja
offeneStufenarray<verwalter | zweit>ja
abgelehnteStufenarray<verwalter | zweit>ja
vollstaendigbooleanjaalle erforderlichen Stufen stehen auf approved (zum aktuellen Inhalts-Hash)

InstandhaltungGeld

FeldTypPflichtBeschreibung
centsstringjaCent als Integer-STRING, nie eine JSON-Zahl
currencyEURja

InstandhaltungKatalogResponse

FeldTypPflichtBeschreibung
typenarray<InstandhaltungKatalogTyp>janur aktive Typen; mit auchInaktive=true alle

InstandhaltungKatalogSetzenRequest

FeldTypPflichtBeschreibung
schluesselstringja
bezeichnungstringja
ohneAngebotErlaubtbooleanja
aktivbooleanja

InstandhaltungKatalogSetzenResponse

FeldTypPflichtBeschreibung
schluesselstringja
bezeichnungstringja
ohneAngebotErlaubtbooleanja
aktivbooleanja
geaendertbooleanja
geaendertVonstringja
geaendertAmstring(date-time)ja

InstandhaltungKatalogTyp

FeldTypPflichtBeschreibung
schluesselstringja
bezeichnungstringja
ohneAngebotErlaubtbooleanja
aktivbooleanja
vorgabebooleanja

InstandhaltungListeResponse

FeldTypPflichtBeschreibung
stichtagstring(date)jader verwendete Stichtag (Berliner Tag der Server-Uhr)
limitintegerja
offsetintegerja
zeilenarray<InstandhaltungVorgangListenZeile>janur Vorgänge der Objekte, für die der Aufrufer zuständig ist; leer ohne Vorgänge

InstandhaltungMeldenRequest

FeldTypPflichtBeschreibung
propertyIdstring(uuid)jaPflicht: das Objekt
unitIdstring(uuid)nein
typSchluesselstringjaPflicht: Schlüssel eines aktiven Vorgangstyps (Katalog)
titelstringjaPflicht: 1 bis 140 Zeichen
beschreibungstringjaPflicht: 10 bis 5000 Zeichen
dringlichkeitsofort | kurzfristig | langfristigja
melderPersonIdstring(uuid)nein
beginnAmstring(date)nein
haeufigkeitstringneinHäufigkeit in Worten, höchstens 200 Zeichen
baulichVeraenderndbooleanneinVorgabe false

InstandhaltungMeldungResponse

FeldTypPflichtBeschreibung
vorgangIdstring(uuid)ja
nummerstringja
statusgemeldet | in_klaerung | angebote_offen | zur_freigabe | freigegeben | beauftragt | ausgefuehrt | abgerechnet | abgeschlossen | storniertja
naechsteSchrittearray<gemeldet | in_klaerung | angebote_offen | zur_freigabe | freigegeben | beauftragt | ausgefuehrt | abgerechnet | abgeschlossen | storniert>ja
befundearray<InstandhaltungBefund>ja

InstandhaltungObjektVerweis

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
namestringja

InstandhaltungPersonVerweis

FeldTypPflichtBeschreibung
personIdstring(uuid)ja
anzeigenamestring | nullja

InstandhaltungQualifizierenRequest

FeldTypPflichtBeschreibung
typSchluesselstringnein
dringlichkeitsofort | kurzfristig | langfristignein
baulichVeraenderndbooleannein
gestattungsBeschlussGegenstandIdstring(uuid)nein
beginnAmstring(date)nein
haeufigkeitstringneinHäufigkeit in Worten, höchstens 200 Zeichen
beginnUnbekanntbooleanneinausdrücklich „Beginn nicht bekannt"

InstandhaltungQualifizierenResponse

FeldTypPflichtBeschreibung
vorgangIdstring(uuid)ja
nummerstringja
statusgemeldet | in_klaerung | angebote_offen | zur_freigabe | freigegeben | beauftragt | ausgefuehrt | abgerechnet | abgeschlossen | storniertja
naechsteSchrittearray<gemeldet | in_klaerung | angebote_offen | zur_freigabe | freigegeben | beauftragt | ausgefuehrt | abgerechnet | abgeschlossen | storniert>ja
befundearray<InstandhaltungBefund>ja
uebergangbooleanjatrue, wenn dieser Aufruf `gemeldet` nach `in_klaerung` gesetzt hat

InstandhaltungRechnung

FeldTypPflichtBeschreibung
rechnungIdstring(uuid)ja
auftragIdstring(uuid)ja
documentIdstring(uuid)ja
bookingProposalIdstring(uuid) | nullja
rechnungsdatumstring(date)ja
betragCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
auftragswertCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
abweichungCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
befundearray<weniger-als-mindestangebote | gestattungsbeschluss-fehlt | kostenobergrenze-ohne-angebot | freistellung-fehlt | freistellung-abgelaufen | freistellung-anderer-auftrag | rechnung-ueber-auftrag | rechnung-kreditor-abweichend>jabeim Verknüpfen gespeicherte Befund-Codes
zahlungsstandInstandhaltungZahlungsstandja

InstandhaltungRechnungRequest

FeldTypPflichtBeschreibung
auftragIdstring(uuid)neinoptional: ohne Angabe gilt der lebende Auftrag des Vorgangs; kein lebender Auftrag ⇒ 404 `not_found`
documentIdstring(uuid)jaPflicht: der Rechnungsbeleg mit Buchungsvorschlag
rechnungsdatumstring(date)ja

InstandhaltungRechnungResponse

FeldTypPflichtBeschreibung
rechnungIdstring(uuid)ja
betragInstandhaltungGeldja
auftragswertInstandhaltungGeldja
abweichungunbekanntja
summeRechnungenInstandhaltungGeldja
bauleistungja | nein | unbekanntja
befundearray<InstandhaltungBefund>jaCode, Schwere und Klartext; sie sperren die Verknüpfung nicht

InstandhaltungStufenStand

FeldTypPflichtBeschreibung
stufeverwalter | zweitja
entscheidungapproved | rejected | offenja

InstandhaltungVorgangListenZeile

FeldTypPflichtBeschreibung
vorgangIdstring(uuid)ja
nummerstringja
titelstringja
typSchluesselstringja
dringlichkeitsofort | kurzfristig | langfristigja
statusgemeldet | in_klaerung | angebote_offen | zur_freigabe | freigegeben | beauftragt | ausgefuehrt | abgerechnet | abgeschlossen | storniertja
statusSeitstring(date-time)ja
objektInstandhaltungObjektVerweisja
einheitunbekanntja
auftragswertstring | nulljaAuftragswert des lebenden Auftrags in Cent als Integer-STRING; null ohne lebenden Auftrag
auftragsnummerstring | nullja
offeneBefundeintegerjaZahl der aktuellen Befunde des Vorgangs plus gespeicherter Befunde seiner Rechnungen

InstandhaltungVorgangResponse

FeldTypPflichtBeschreibung
vorgangIdstring(uuid)ja
nummerstringja
titelstringja
beschreibungstring | nullja
typSchluesselstringja
dringlichkeitsofort | kurzfristig | langfristigja
statusgemeldet | in_klaerung | angebote_offen | zur_freigabe | freigegeben | beauftragt | ausgefuehrt | abgerechnet | abgeschlossen | storniertja
statusSeitstring(date-time)ja
objektInstandhaltungObjektVerweisja
einheitunbekanntja
melderunbekanntja
baulichVeraenderndbooleanja
abschlussBegruendungstring | nullja
verlaufarray<InstandhaltungEreignis>ja
angebotearray<InstandhaltungAngebot>ja
auftraegearray<InstandhaltungAuftrag>ja
freigabeunbekanntja
rechnungenarray<InstandhaltungRechnung>ja
befundearray<InstandhaltungBefund>ja
naechsteSchrittearray<gemeldet | in_klaerung | angebote_offen | zur_freigabe | freigegeben | beauftragt | ausgefuehrt | abgerechnet | abgeschlossen | storniert>jaStatus, in die der Vorgang als Nächstes wechseln darf

InstandhaltungVorgangStornierenRequest

FeldTypPflichtBeschreibung
grundstringjaPflicht: 1 bis 200 Zeichen

InstandhaltungZahlungsstand

FeldTypPflichtBeschreibung
standnicht-gebucht | nicht-ermittelbar | offen | ausgeglichenja
restbetragCentsstring | nulljaoffener Restbetrag in Cent; nur bei stand offen, sonst null

KautionEinstellungResponse

FeldTypPflichtBeschreibung
rueckbehaltFristMonateintegerjaFrist des Rückbehalts in Monaten (beginnt mit dem Abrechnungsdatum der Kautionsabrechnung)
istVorgabebooleanjatrue ⇒ keine eigene Einstellung, es gilt die Vorgabe (6 Monate)

KautionRueckbehaltFrist

FeldTypPflichtBeschreibung
kautionsabrechnungIdstring(uuid)ja
contractIdstring(uuid)ja
propertyIdstring(uuid)ja
abrechnungsdatumstring(date)jaAbrechnungsdatum der Kautionsabrechnung — Beginn der Frist
rueckbehaltStatusgehalten | teilfreigegebenja
rueckbehaltCentsstringjagesamter Rückbehalt in Cent
restCentsstringjanoch gehaltener Rest in Cent (bei teilfreigegeben kleiner als der Rückbehalt)
fristEndestring(date)jabeim Buchen gespeicherter Termin (Wiedervorlage am): Abrechnungsdatum + Frist des Mandanten zum Buchungszeitpunkt, kalendermonatsgenau mit Monatsende-Kappung; eine spätere Änderung der Frist wirkt nur auf neue Abrechnungen
ueberfaelligbooleanjatrue ⇒ fristEnde liegt vor dem Stichtag
tageUeberfaelligintegerjaTage seit dem Fristende; 0, solange nicht überfällig

KautionRueckbehaltFristenResponse

FeldTypPflichtBeschreibung
stichtagstring(date)jader verwendete Stichtag (Vorgabe: heute, Server-Uhr)
fristMonateintegerjadie für den Mandanten geltende Frist in Monaten
zeilenarray<KautionRueckbehaltFrist>janur Rückbehalte der Objekte, für die der Aufrufer zuständig ist; aufsteigend nach Fristende

KautionsabrechnungStandResponse

FeldTypPflichtBeschreibung
kautionsabrechnungIdstring(uuid)ja
contractIdstring(uuid)ja
stichtagstring(date)jaAbrechnungsstichtag
guthabenCentsstringjaKaution + Zinsen
verrechnetCentsstringjamit offenen Posten verrechneter Teil
auszahlungCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
restforderungCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
rueckbehaltCentsstringja"0" bei Rückbehalt-Status `keiner`
rueckbehaltBegruendungstring | nulljaFreitext eines Menschen (PERSONENBEZOGEN); null ohne Rückbehalt
rueckbehaltStatuskeiner | gehalten | teilfreigegeben | freigegebenja
paymentOrderIdstring(uuid) | nulljaZahlungsauftrag der Auszahlung; null bei Auszahlung 0
rueckbehaltPaymentOrderIdstring(uuid) | nulljaAuftrag aus der Rückbehalt-Freigabe (bei Teilfreigaben: der des letzten Schritts); null solange nicht (oder ohne Auszahlung) freigegeben
rueckbehaltRestCentsstringjanoch gehaltener Rest des Rückbehalts (#6900): Rückbehalt − Σ Teilfreigaben; "0" bei `keiner` und `freigegeben`
rueckbehaltTeilfreigabenarray<object>jadie Teilfreigaben des Rückbehalts (#6900) in Freigabe-Reihenfolge; leer ohne Teilfreigabe (auch bei einer ganz in einem Schritt freigegebenen Abrechnung)
rueckbehaltearray<object>jadie Rückbehalt-Zeilen mit Grundart (#7134) in der Reihenfolge der Erfassung; `rueckbehaltCents` ist ihre Summe. Leer ohne Rückbehalt (und bei einer vor #7134 abgerechneten Abrechnung ohne Rückbehalt).

KautionslisteResponse

FeldTypPflichtBeschreibung
stichtagstring(date)jaStichtag, auf den `erhalten` gemessen wurde
propertyIdstring(uuid) | nulljadie wirksame Objekt-Eingrenzung (null = alle Objekte des Mandanten)
zeilenarray<KautionslisteZeile>ja
summenKautionslisteSummenja
summenFremdwaehrungarray<KautionslisteSummen>jaSummen der Zeilen in ANDEREN Währungen als EUR, je Währung eine Summenzeile (z. B. ein dokumentarisch übernommener CHF-Bestand). Nie in `summen` addiert; leer im Normalfall.
anlagenOhneSachkontoarray<string>jaIBANs von Kautionskonten OHNE zugeordnetes Bank-Sachkonto — ihre Eingänge konnten NICHT mitgezählt werden. Leer heisst: alles gezählt.

KautionslisteSummen

FeldTypPflichtBeschreibung
vereinbartCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
erhaltenCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
offenCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
mahnbarerRestCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
currencystringja
anzahlVertraegeintegerja

KautionslisteZeile

FeldTypPflichtBeschreibung
contractIdstring(uuid)ja
contractNostringja
propertyIdstring(uuid)ja
propertyNostring | nulljaObjektnummer (LEFT JOIN); null, wenn die Kette unerwartet reisst
mietparteistringjaMietpartei(en) für Anzeige und Sortierung; ohne erfasste `mieter`-Rolle die Vertragsnummer. PERSONENBEZOGEN.
vereinbartCentsstring | nulljavereinbarte Kaution; null ⇒ keine vereinbart
currencystring | nullja
erhaltenCentsstringjaΣ der bis zum Stichtag auf der getrennten Anlage EINGEGANGENEN Beträge abzüglich stornierter Eingänge; Auszahlungen mindern erhalten NICHT
offenCentsstringjavereinbart − erhalten; POSITIV = Rückstand, NEGATIV = Überzahlung
statuskeine | eingang-unbekannt | offen | teilweise-erhalten | vollstaendig-erhaltenjaEingangsstatus. `eingang-unbekannt` = dokumentarisch übernommen, Eingang in casa.ai nicht bekannt — dieser Rest wird NICHT gemahnt (§ 551, Bestandsübernahme).
mahnbarerRestCentsstringjader Teil von offenCents, der gemahnt werden darf; "0" beim übernommenen Bestand
anlageformbarkaution | buergschaft | verpfaendungjaAnlageform der Sicherheit; null ⇒ im Bestand nicht erfasst
anlagekontoIdstring(uuid) | nulljaBankverbindung der getrennten Anlage (Kontoart kautionskonto); null ⇒ keine am Objekt
anlagekontoIbanstring | nulljaIBAN der getrennten Anlage; null ⇒ keine
abrechnungobject | nulljaAbrechnungsstand (#6897): die NICHT stornierte Kautionsabrechnung; null ⇒ nicht abgerechnet (auch nach dem Storno, und immer bei einer Sicherheit ohne Geldfluss — Bürgschaft, Verpfändung).

KautionszinsenResponse

FeldTypPflichtBeschreibung
contractIdstring(uuid)ja
gutschriftenarray<KautionszinsGutschrift>jaaufsteigend nach Zeitraum; stornierte Gutschriften erscheinen nicht

KautionszinsGutschrift

FeldTypPflichtBeschreibung
vonstring(date)jaerster Tag des Zinszeitraums (einschliesslich)
bisstring(date)jaletzter Tag des Zinszeitraums (einschliesslich)
bankTransactionIdstring(uuid) | nulljadie Zinsgutschrift der Bank auf dem Kautions-Anlagekonto; null beim Jahreszinslauf (31.12., ohne Bankumsatz)
betragCentsstringjaZinsanteil dieser Kaution
currencystringja
entryIdsarray<string(uuid)>jadie Buchungssätze dieser Gutschrift

KautionZinssaetzeResponse

FeldTypPflichtBeschreibung
bankAccountIdstring(uuid)jaBankverbindung der Kontoart kautionskonto
saetzearray<KautionZinssatz>jaSatzhistorie aufsteigend nach gueltigAb; leer für ein fremdes, unbekanntes oder nicht zuständiges Konto

KautionZinssatz

FeldTypPflichtBeschreibung
idstring(uuid)ja
gueltigAbstring(date)jaerster Tag, an dem der Satz gilt (inklusiv)
basispunkteintegerjaSatz in Basispunkten (150 = 1,50 %)
erfasstVonstringjaopake Akteurs-Id; migration für die Bestandsübernahme
erfasstAmstring(date-time)jaZeitpunkt der Erfassung

KautionZinsstandKonto

FeldTypPflichtBeschreibung
anlagekontoIdstring(uuid)jaBankverbindung der Kontoart kautionskonto
propertyIdstring(uuid)ja
vonstring(date) | nulljaBeginn des zuletzt verzinsten Zeitraums; null ohne gebuchten Zinslauf
bisstring(date) | nulljaEnde des zuletzt verzinsten Zeitraums (einschliesslich); null ohne gebuchten Zinslauf
anzahlBarkautionenintegerjaZahl der Barkautionen auf diesem Konto
festzinsBasispunkteinteger | nulljader am Stichtag (Vorgabe: heute) gültige Satz der Satzhistorie in Basispunkten (150 = 1,50 %); null = an diesem Tag gilt kein Satz. Nur Anzeige.
unverteilteUmsaetzearray<KautionZinsstandUmsatz>jaunbeanspruchte Haben-Umsätze, aufsteigend nach Wertstellung — Kandidaten, nicht festgestellte Zinsen
gebuchteJahrearray<integer>jaKalenderjahre mit wirksam gebuchtem Zinslauf, aufsteigend (Jahreszinslauf und alter Bankumsatz-Lauf)
naechstesOffenesJahrinteger | nulljadas nächste zu buchende Zinsjahr (höchstes gebuchtes + 1, ohne gebuchtes Jahr das Jahr des ersten Kautionseingangs) — die Eingabe jahr des Zinslauf-Vorschlags (POST /api/kaution/zinsen/vorschlag); null ohne Kautionseingang

KautionZinsstandResponse

FeldTypPflichtBeschreibung
kontenarray<KautionZinsstandKonto>janur Anlagekonten der Objekte, für die der Aufrufer zuständig ist

KautionZinsstandUmsatz

FeldTypPflichtBeschreibung
bankTransactionIdstring(uuid)jader Bankumsatz — die Bankgutschrift wird später gegen die Zinsforderung zugeordnet (der Jahreszinslauf liest keinen Umsatz)
betragCentsstringjaHaben-Betrag, streng positiv
currencystringja
wertstellungstring(date) | nulljaWertstellungstag; null, wenn die Bank keinen lieferte

Kontenrahmen

FeldTypPflichtBeschreibung
idstringja
namestringja
versionstringjaInhaltsversion — geht in den Idempotency Key des Einspielens ein
descriptionstringja
accountCountintegerja

KontenrahmenApplyRequest

FeldTypPflichtBeschreibung
propertyIdstring(uuid)jadas Objekt, dessen Kontenplan bestückt wird

KontenrahmenApplyResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
kontenrahmenIdstringja
kontenrahmenVersionstringja
createdarray<object>jadie NEU angelegten Konten (Vorlagen-Reihenfolge)
skippedarray<object>jaKonten, die es am Objekt schon gab — unangetastet (DO NOTHING)
unresolvedCostCategoryKeysarray<string>jaKategorie-Schlüssel der Vorlage, die es im Tenant nicht gibt (sichtbar gemeldet)

KontenrahmenListResponse

FeldTypPflichtBeschreibung
kontenrahmenarray<Kontenrahmen>ja

Konto

FeldTypPflichtBeschreibung
idstring(uuid)ja
propertyIdstring(uuid) | nulljaObjektbindung des Kontos; null ausschließlich beim mandantenweiten Kreditorkonto (#1487)
accountNostringjaKontonummer — je Objekt eindeutig (DB-UNIQUE, keine bloße Konvention)
namestringja
costCategoryIdstring(uuid) | nullja
costCategoryKeystring | nulljaSchlüssel der Betriebskosten-Kategorie (cost_categories.key)
costCategoryNamestring | nullja
ustRatestring | nulljaUSt-Satz als exakter Dezimalstring (numeric), z. B. "19.00" — nie als Gleitkommazahl
isUmlagefaehigboolean | nullja
datevAccountNostring | nulljaDATEV-Zielkonto des Kontos (SKR03/SKR04-Export-Mapping, #2990) — 4–8 Ziffern ohne führende Null; null = nicht zugeordnet (das Konto fällt dann aus dem DATEV-Export)
allocationKeyIdstring(uuid) | nulljazugeordneter Umlageschlüssel (allocation_keys.id); null ⇒ keiner. Bei umlagefähigem Konto ⇒ Readiness-Fund schluessel_fehlt.
lockedAfterFirstBookingbooleanjatrue ⇒ nach Erstbuchung fix: nur name bleibt änderbar. HEUTE setzt noch kein Produktionspfad dieses Flag.
archivedAtstring(date-time) | nulljagesetzt ⇒ archiviert (K5: kein DELETE)
createdAtstring(date-time)ja
kontoartausgabe | einnahme | nulljaKontoart des Sachkontos (#5551): ausgabe | einnahme; null an Geld- und Personenkonten und im noch nicht klassifizierten Bestand (DB-CHECK: nur am Sachkonto)

KontoArchiveResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
archivedAtstring(date-time)ja
alreadyArchivedbooleanjatrue ⇒ das Konto war bereits archiviert (expliziter No-op).

KontoCreateRequest

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
accountNostringja
namestringja
costCategoryKeystring | nullneinunbekannter Schlüssel ⇒ 400 (fail-loud, nie stilles NULL)
ustRatestring | nullneinDezimalstring wie "19.00"
isUmlagefaehigbooleannein
datevAccountNostring | nullneinDATEV-Zielkonto (#2990) — 4–8 Ziffern ohne führende Null; null = nicht zugeordnet
sourceSystemstring | nullnein
sourceRefstring | nullnein

KontoListResponse

FeldTypPflichtBeschreibung
statusalle | aktiv | archiviertjader wirksame 3-Wege-Filter
propertyIdstring(uuid) | nullneindie wirksame Objekt-Eingrenzung (null = alle Objekte des Tenants)
kontenarray<Konto>ja

KontoUmlageschluesselRequest

Setzt/hebt die Konto→Umlageschlüssel-Zuordnung. Der Schlüssel muss demselben Objekt wie das Konto gehören (fremdes Objekt/Tenant ⇒ Fehler, kein stiller No-op).

FeldTypPflichtBeschreibung
allocationKeyIdstring(uuid) | nulljaZiel-Umlageschlüssel; null hebt die Zuordnung auf.

KontoUpdateRequest

Partieller Patch — mindestens ein Feld muss gesetzt sein. Nach Erstbuchung sind nur `name` und `datevAccountNo` änderbar.

FeldTypPflichtBeschreibung
accountNostringnein
namestringnein
costCategoryKeystring | nullnein
ustRatestring | nullnein
isUmlagefaehigbooleannein
datevAccountNostring | nullneinDATEV-Zielkonto (#2990); null hebt die Zuordnung auf. NICHT buchungsrelevant — auch nach der Erstbuchung änderbar.

KorrigiereZeitRequest

FeldTypPflichtBeschreibung
dauerMinutenintegerneinGanze Minuten, 1 bis 1440.
leistungsdatumstring(date)nein
taetigkeitsarttelefonat | aussendienst | schriftverkehr | versammlung | verwaltung | sonstigesnein
notizstring | nullnein

MahnlaufAusfuehrenMarkierung

FeldTypPflichtBeschreibung
mahnschreibenIdstring(uuid)ja
schluesselstringja
ampelstringjagruen, gelb oder rot (rot ist nicht freigebbar)
merkmalearray<string>jaAbweichungs-Merkmale der Heuristik (z. B. erststufe, hoher-betrag)

MahnlaufAusfuehrenPosition

FeldTypPflichtBeschreibung
schluesselstringjaPositionsschlüssel (`mahn:vertrag:<id>`)
objektIdstring(uuid) | nullja
einheitIdstring(uuid) | nullja
vertragIdstring(uuid) | nullja
personIdstring(uuid) | nullja
betragCentstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
statusstringjagebucht, ausgeschlossen, ausnahme oder fehlgeschlagen
grundstring | nulljaKlartext-Grund; null bei gebucht
versandstatusstring | nulljaversendet, download_bereit, heruntergeladen, fehlgeschlagen oder zugestellt; null ohne Schreiben

MahnlaufAusfuehrenResponse

FeldTypPflichtBeschreibung
vorgangIdstring(uuid)ja
erstAusfuehrungbooleanjafalse ⇔ der Vorgang war schon ausgeführt, das Erst-Ergebnis kommt zurück
zeitpunktstring(date-time)ja
gebuchtintegerjaerzeugte Schreiben
ausgeschlossenintegerja
ausnahmenintegerja
fehlgeschlagenintegerja
summeCentstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
positionenarray<MahnlaufAusfuehrenPosition>ja
freigegebenarray<string(uuid)>jain DIESEM Aufruf freigegebene Schreiben; leer beim Erst-Ergebnis
markiertarray<MahnlaufAusfuehrenMarkierung>jaeinzeln freizugebende Schreiben; leer beim Erst-Ergebnis

MahnlaufAusschlussAufhebenResponse

FeldTypPflichtBeschreibung
vorgangIdstring(uuid)ja
positionsSchluesselstringja
zurueckgeholtbooleanjafalse ⇔ es gab keinen Ausschluss, nichts gelöscht

MahnlaufAusschlussResponse

FeldTypPflichtBeschreibung
vorgangIdstring(uuid)ja
positionsSchluesselstringja
neubooleanjafalse ⇔ die Position war schon ausgeschlossen (der jüngere Grund gilt)

MahnlaufBearbeiter

FeldTypPflichtBeschreibung
namestring | nulljaAnzeigename; null, wenn nicht auflösbar (nie die Kennung)
ichSelbstbooleanjatrue ⇔ der Aufrufer selbst

MahnlaufErgebnis

FeldTypPflichtBeschreibung
zeitpunktstring(date-time)ja
textstringja
schreibenarray<MahnlaufErgebnisSchreiben>ja
fehlgeschlagenarray<MahnlaufErgebnisSchreiben>ja
nichtGemahntarray<MahnlaufNichtGemahnt>ja

MahnlaufErgebnisSchreiben

FeldTypPflichtBeschreibung
schluesselstringja
mahnschreibenIdstring(uuid)ja
objektIdstring(uuid)ja
objektNamestringja
einheitIdstring(uuid) | nullja
vertragIdstring(uuid)ja
personIdstring(uuid) | nullja
anzeigestringja„Einheit · Person"
betragCentstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
stufeinteger | nullja
versandstatusstringja

MahnlaufErneutResponse

FeldTypPflichtBeschreibung
vorgangIdstring(uuid)ja
mahnschreibenIdstring(uuid)ja
ausgangversandt | fehlgeschlagenja
zustellnachweisIdstring(uuid)ja
versandstatusstringjaversendet oder fehlgeschlagen

MahnlaufFremdInArbeit

FeldTypPflichtBeschreibung
namestring | nullja
schrittintegerjagespeicherter Schritt + 1 (1…4)
anzahlSchritteintegerja
textstringjaKlartext „… bearbeitet diesen Mahnlauf (Schritt n von 4)"

MahnlaufFruehererEintrag

FeldTypPflichtBeschreibung
vorgangIdstring(uuid)ja
stichtagstring(date)ja
bezeichnungstringja
objektNamenarray<string>ja
ausgefuehrtAmstring(date-time)ja
ausgefuehrtVonstring | nulljaName der ausführenden Person; null, wenn nicht auflösbar
ergebnisTextstringja
gebuchtintegerja
summeCentstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.

MahnlaufNichtGemahnt

FeldTypPflichtBeschreibung
schluesselstringja
statusausnahme | ausgeschlossenja
anzeigestringja
grundstringja
betragCentstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.

MahnlaufObjektBlockiert

FeldTypPflichtBeschreibung
vorgangIdstring(uuid)ja
namestring | nulljaName der bearbeitenden Person; null, wenn niemand oder nicht auflösbar

MahnlaufOffenerEintrag

FeldTypPflichtBeschreibung
vorgangIdstring(uuid)ja
stichtagstring(date)ja
bezeichnungstringja
statusfaellig | in_arbeitja
schrittintegerja0…3
automatischbooleanja
objektNamenarray<string>ja
inArbeitBeiunbekanntja
fremdInArbeitunbekanntja

MahnlaufSchreibenDatei

FeldTypPflichtBeschreibung
dateinamestringja`Mahnschreiben-<Nachname>-<JJJJ-MM-TT>.pdf`
sha256stringjaSHA-256 der Datei-Bytes (Hex, 64 Zeichen)
groesseBytesintegerja
inhaltBase64stringjadie Datei-Bytes, Base64

MahnlaufSchreibenDateiResponse

FeldTypPflichtBeschreibung
dateiMahnlaufSchreibenDateija

MahnlaufSchreibenFreigabeResponse

FeldTypPflichtBeschreibung
vorgangIdstring(uuid)ja
mahnschreibenIdstring(uuid)ja
entscheidungfreigeben | zurueckweisenja
ampelstringjaAmpel der Abweichungs-Heuristik zum Zeitpunkt der Entscheidung
versandunbekanntja

MahnlaufStartResponse

FeldTypPflichtBeschreibung
vorgangIdstring(uuid)ja
stichtagstring(date)ja
statusfaellig | in_arbeit | ausgefuehrtja
schrittintegerja
automatischbooleanja
umfangObjektIdsarray<string(uuid)>ja
abgewaehlteEinheitIdsarray<string(uuid)>ja
neubooleanjafalse ⇔ der eigene vorbereitete Vorgang wurde geöffnet, es entstand keiner

MahnlaufUebersichtResponse

FeldTypPflichtBeschreibung
offenearray<MahnlaufOffenerEintrag>jaoffene sichtbare Vorgänge, Stichtag aufsteigend; ausgeführte nie
gewaehltobject | nulljader Vorgang, den das Register öffnet (Query `lauf` ⇒ deep-link); null, wenn keiner
frueherearray<MahnlaufFruehererEintrag>ja
zuMahnendeDebitoreninteger | nulljanur ohne offenen Vorgang: Zahl der zu mahnenden Debitoren, sonst null

MahnlaufUmfangEinheit

FeldTypPflichtBeschreibung
einheitIdstring(uuid)ja
lagestringja
imUmfangbooleanjafalse ⇔ abgewählt

MahnlaufUmfangObjekt

FeldTypPflichtBeschreibung
objektIdstring(uuid)ja
namestringja
imUmfangbooleanja
einheitenarray<MahnlaufUmfangEinheit>ja
laeuftBereitsBeiunbekanntja
summeCentstringjaGruppensumme der buchbaren Schreiben des Objekts, Cent-String

MahnlaufVersandErgebnis

FeldTypPflichtBeschreibung
versandtintegerja
fehlgeschlagenintegerja
uebersprungenintegerja
positionenarray<MahnlaufVersandPosition>ja

MahnlaufVersandPosition

FeldTypPflichtBeschreibung
mahnschreibenIdstring(uuid)ja
ausgangversandt | fehlgeschlagen | uebersprungen | download_bereitja
fehlerCodestring | nulljaFehler-Code des Versandwegs bei fehlgeschlagen, sonst null (nie Provider-Rohtext)
mahnereignisIdstring(uuid) | nulljawirksam gewordene Stufe; nur bei versandt
gebuehrCentstring | nulljagebuchte Mahngebühr; null ohne Ansatz
zinsenCentstring | nulljagebuchter Zins-Zuwachs; null ohne Ansatz

MahnlaufVersandResponse

FeldTypPflichtBeschreibung
vorgangIdstring(uuid)ja
versandwegmail | druckja
ergebnisMahnlaufVersandErgebnisja

MahnlaufVorbereitetResponse

FeldTypPflichtBeschreibung
vorgangIdstring(uuid)ja
stichtagstring(date)ja
statusfaellig | in_arbeit | ausgefuehrtja
schrittintegerja
automatischbooleanja
umfangObjektIdsarray<string(uuid)>ja
abgewaehlteEinheitIdsarray<string(uuid)>ja
geaendertbooleanjafalse ⇔ der Wert war schon so gesetzt, nichts geschrieben

MahnlaufVorgangKopf

FeldTypPflichtBeschreibung
vorgangIdstring(uuid)ja
stichtagstring(date)ja
bezeichnungstringja
statusfaellig | in_arbeit | ausgefuehrtja
schrittintegerja
automatischbooleanja
objektNamenarray<string>ja
schreibenintegerjabuchbare Schreiben (offen: Ableitung; ausgeführt: Ergebnis)
summeCentstringjaΣ Betrag der buchbaren Schreiben, Cent-String
ausnahmenintegerja
ausgeschlossenintegerja
inArbeitBeiunbekanntja
fremdInArbeitunbekanntja
ausgefuehrtAmstring(date-time) | nullja
ausgefuehrtVonstring | nullja

MahnlaufVorgangPosition

FeldTypPflichtBeschreibung
schluesselstringjaPositionsschlüssel (`mahn:vertrag:<id>`), Eingabe für ausschluss und aufheben
statusstringjaStatus der Position in der Ableitung (z. B. buchbar, ausnahme, ausgeschlossen)
objektIdstring(uuid)ja
objektNamestringja
einheitIdstring(uuid) | nullja
einheitLagestring | nullja
vertragIdstring(uuid) | nullja
personIdstring(uuid) | nullja
personNamestring | nullja
opIdsarray<string(uuid)>ja
stufeintegerjahöchste Mahnstufe vor dem Lauf
stufeNachLaufintegerja
offenerBetragCentstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
guthabenVerrechnetCentstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
betragCentstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
grundstring | nullja
reparaturstring | nullja
versandstatusstring | nullja
hinweisearray<string>ja
kanalstring | nulljaVorbelegter Versandkanal der Person (email oder brief, wie die Kanal-Auswahl); null ohne Person
zahlungszielstring(date) | nullja

MahnlaufVorgangResponse

FeldTypPflichtBeschreibung
kopfMahnlaufVorgangKopfja
umfangarray<MahnlaufUmfangObjekt>jaObjekte der Zuständigkeit des Aufrufers; Objekte außerhalb erscheinen nie
positionenarray<MahnlaufVorgangPosition>jaoffen: Positionen der Ableitung; ausgeführt: leer
karenzTageinteger | nullja
mahnwesenAktivbooleanja
ergebnisunbekanntja

MahnlaufZustellungResponse

FeldTypPflichtBeschreibung
vorgangIdstring(uuid)ja
mahnschreibenIdstring(uuid)ja
zustellnachweisIdstring(uuid)ja
kanalbrief | einschreiben | persoenliche_uebergabeja
zugestelltAmstring(date)ja
versandstatusstringjaimmer zugestellt
mahnereignisIdsarray<string(uuid)>ja

Mandat

FeldTypPflichtBeschreibung
idstring(uuid)ja
contractIdstring(uuid) | nullja
contractNostring | nulljaVertragsnummer des zugehörigen Vertrags (LEFT JOIN)
personIdstring(uuid) | nullja
personNamestring | nulljaName des Zahlungspflichtigen (LEFT JOIN)
mandateRefstringjaMandatsreferenz (UMR), je Tenant eindeutig
glaeubigerIdstring | nullja
mandateTypecore | b2b | nulljacore = Basis-Lastschrift, b2b = Firmen-Lastschrift
statuspending | active | revoked | expiredja
signedAtstring(date-time) | nullja
lastUsedAtstring(date-time) | nullja
restrictedToCategoriesarray<string> | nulljaKategorie-Scope; null ⇒ kein Scope
archivedAtstring(date-time) | nullja
createdAtstring(date-time)ja

MandatCreateRequest

Legt ein SEPA-Mandat zu einem AKTIVEN Vertrag an (Status pending). Übergänge laufen über den Status-Endpunkt.

FeldTypPflichtBeschreibung
contractIdstring(uuid)jader Vertrag; MUSS aktiv sein (sonst 404)
personIdstring(uuid) | nullneinZahlungspflichtiger (optional; wird geprüft, wenn gesetzt)
mandateRefstringjaMandatsreferenz (UMR), je Tenant eindeutig (Dublette ⇒ 400)
glaeubigerIdstring | nullnein
mandateTypecore | b2b | nullnein
signedAtstring(date-time) | nullneinUnterzeichnungszeitpunkt (ISO 8601)
restrictedToCategoriesarray<string> | nullnein
sourceSystemstring | nullnein
sourceRefstring | nullnein

MandatListResponse

FeldTypPflichtBeschreibung
statusalle | pending | active | revoked | expiredjader wirksame Status-Filter (alle ODER genau ein Status). Unbekannter Wert ⇒ 400.
mandatearray<Mandat>ja

MandatStatusRequest

FeldTypPflichtBeschreibung
statusactive | revoked | expiredjaZiel-Status. pending ist rein initial und kein gültiges Ziel. Ungültiger Übergang ⇒ 400.

MandatStatusResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
statuspending | active | revoked | expiredjader jetzt wirksame Status
previousStatuspending | active | revoked | expiredjader Status vor diesem Aufruf
changedbooleanjatrue ⇒ dieser Aufruf hat den Status geändert (sonst No-op/Replay).

MeResponse

FeldTypPflichtBeschreibung
tenantIdstring(uuid)ja
userobjectja
authenticatedAtnumbernein
stepUpobjectja

MessdienstCo2Energiemix

FeldTypPflichtBeschreibung
artstringjaEnergieträger-Schlüssel (01 Braunkohle … 06 Erneuerbare, 99 Sonstige).
prozentstringjaProzentanteil als Ziffern-String mit (2,1) impliziten Stellen — „035" bedeutet 3,5 %.
faktorstringjaCO2-Emissionsfaktor kg/kWh als Ziffern-String mit (6,3) impliziten Stellen.

MessdienstCo2Position

FeldTypPflichtBeschreibung
idstring(uuid) | nulljaDie GESPEICHERTE Ausweis-Zeile (#1602); null, falls dieser Ausweis nicht persistiert wurde.
kostenartSchluesselstringjaSchlüssel der Kostenart des tragenden K-Satzes.
kostenbezeichnungstringja
emissionsartstring | nullja01 = kg/kWh, 02 = t/MWh, 03 = kg gesamt; null, wenn die Datei nichts ausweist.
emissionstring | nulljaCO2-Emission als Ziffern-String mit (6,3) impliziten Stellen.
mengestring | nulljaCO2-Emissionsmenge in kg als Ziffern-String mit (6,3) impliziten Stellen (ab Standard 3.10).
kostenBruttoCentsstring | nulljaCO2-Kosten brutto in ganzen Cents als ZIFFERN-STRING (nie eine JSON-Zahl).
kostenNettoCentsstring | nulljaCO2-Kosten netto in ganzen Cents als ZIFFERN-STRING (nie eine JSON-Zahl).
energiemixarray<MessdienstCo2Energiemix>ja

MessdienstImportResponse

FeldTypPflichtBeschreibung
importBatchIdstring(uuid)jaKennung DIESES Batches — append-only, jeder Aufruf legt einen neuen an (Korrektur = Re-Import, K5).
propertyIdstring(uuid)ja
allocationKeyIdstring(uuid)jaDer befüllte Umlageschlüssel; er MUSS vom Typ „extern" sein.
periodobjectjaDie GESPEICHERTE Abrechnungsperiode (beide Grenzen einschließlich) — gegen die eigene Abrechnungsperiode halten.
rowCountintegerja
unmatchedCountintegerjaZeilen ohne aufgelösten Vertrag/Einheit (bewusst unaufgelöst, kein Fehler).
emissionCountintegerjaAnzahl GESPEICHERTER CO2-Ausweis-Zeilen (#1602) — nicht Teil von rowCount: ein Ausweis ist kein Festbetrag eines Mieters.
rowsarray<MessdienstImportZeile>ja
co2array<MessdienstCo2Position>jaDie CO2-Angaben, die die ARGE-Datei AUSGEWIESEN hat (W1 übernimmt den Messdienst-Ausweis, keine Eigenberechnung). Seit #1602 werden sie GESPEICHERT; je Position steht die id der gespeicherten Zeile dabei. Beim CSV-Import immer leer.

MessdienstImportZeile

FeldTypPflichtBeschreibung
idstring(uuid)ja
externalRefstringjaRoh-Kennung der Messdienst-Quellzeile (Nutzer-/Objektnummer), für die Rückverfolgung.
contractIdstring(uuid) | nullja
unitIdstring(uuid) | nullja
amountCentsstringjaFestbetrag in ganzen Cents als ZIFFERN-STRING (bigint-Cents, GG3/INV-MONEY-01) — nie eine JSON-Zahl.
matchedbooleanjafalse ⇒ die Zeile ist bewusst unaufgelöst (kein Vertrag/keine Einheit).

MieterhoehungFaelligParagraph557b

FeldTypPflichtBeschreibung
statusvorschau | keine-aenderung | vpi-fehlt | basisjahr-abweichend | nicht-berechenbarjavpi-fehlt: kein VPI-Monat zum Bezug; basisjahr-abweichend: der aktuelle VPI stammt aus einer anderen Reihe — beides ohne Betrag
basisjahrintegerjaBasisjahr der vereinbarten VPI-Reihe
fruehesterTerminstring(date) | nulljafrühester Anpassungstermin (letzte Änderung + 12 Monate); null, solange nicht gerechnet
faelligboolean | nulljatrue ⇒ eine Erklärung zum Stichtag wäre nicht zu früh; null, solange nicht gerechnet
juengsterVpiMonatstring | nulljajüngster zum Stichtag veröffentlichter VPI-Monat (YYYY-MM)
neueKaltmieteCentsstring | nulljaneue Kaltmiete der Vorschau in Cent; nur bei vorschau / keine-aenderung
wirksamAbstring(date) | nulljaWirksamkeitstag der Vorschau
grundstring | nulljanur bei nicht-berechenbar: Grund-Code der Fachschicht

MieterhoehungFaelligParagraph558

FeldTypPflichtBeschreibung
statusfaellig | noch-nicht-faellig | gesperrtja
fruehesterTerminstring(date) | nulljafrühester zulässiger Wirksamkeitstag (letzte Erhöhung + 12 Monate); null ohne Sperrfrist oder bei gesperrt
grundkollision-indexmiete | kollision-staffelmiete | nulljanur bei gesperrt: welche Vereinbarung das Verfahren ausschließt

MieterhoehungFaelligResponse

FeldTypPflichtBeschreibung
stichtagstring(date)jader verwendete Stichtag (Vorgabe: heute, Server-Uhr)
zeilenarray<MieterhoehungFaelligZeile>janur laufende Wohnraumverträge der Objekte, für die der Aufrufer zuständig ist

MieterhoehungFaelligVorgang

FeldTypPflichtBeschreibung
mieterhoehungIdstring(uuid)ja
zugangAmstring(date)ja
zustimmungsfristEndestring(date)jaZugang + 3 Kalendermonate (§ 558b Abs. 2), nie gespeichert

MieterhoehungFaelligZeile

FeldTypPflichtBeschreibung
contractIdstring(uuid)ja
propertyIdstring(uuid)ja
kaltmieteCentsstringjaheute geschuldete Kaltmiete in Cent
letzteErhoehungAmstring(date) | nulljaWirksamkeitstag der letzten Erhöhung bzw. Vertragsbeginn; null = seit jeher
paragraph558MieterhoehungFaelligParagraph558ja
paragraph557bunbekanntja
offenerVorgangunbekanntja

MieterwechselAltVertrag

FeldTypPflichtBeschreibung
idstring(uuid)ja
endDatestring(date)jaerster Tag ohne den Altmieter (exklusive obere Grenze)
endReasonstring | nullja
closedTermIdsarray<string(uuid)>ja
closedUnitLinkIdstring(uuid) | nulljadie geschlossene Belegungs-Zeitscheibe; null, wenn der Altvertrag auf dieser Einheit keine offene hatte

MieterwechselMietpartei

die Mietpartei, die MIT dem Neuvertrag entstanden ist (#1910) — in derselben Transaktion geschrieben

FeldTypPflichtBeschreibung
partyRoleIdstring(uuid)jaId der party_roles-Zeile
personIdstring(uuid)jadie Person, die den Neuvertrag als Mietpartei trägt
rolestringjaimmer "mieter" — ein Mieterwechsel erzeugt genau diese Rolle
validRangestringjadaterange der Rolle, z. B. [2026-07-01,) — untere Grenze = Beginn des Neuvertrags

MieterwechselNeuerVertrag

FeldTypPflichtBeschreibung
idstring(uuid)ja
contractNostringja
startDatestring(date)jaerster Tag mit dem Neumieter (inklusive untere Grenze)
termIdstring(uuid)ja
kaltmieteCentsstringjaKaltmiete in Cents als Ziffern-String (nie bigint/number an der Grenze, GG3)
currencystringja
termValidRangestringjadaterange der initialen Konditions-Scheibe, z. B. [2026-07-01,)
unitLinkIdstring(uuid)ja
unitValidRangestringjadaterange der neuen Belegung, z. B. [2026-07-01,)
paymentsarray<VertragZahlungChangeResultPayment>ja
mietparteiMieterwechselMietparteija

MieterwechselPayment

FeldTypPflichtBeschreibung
componentIdstring(uuid)jamuss existieren und aktiv sein (Prüfung im Tool-Layer)
amountCentsinteger | stringjaBetrag in Cents, GANZZAHLIG (kein Float): ganze Zahl ODER Ziffern-String
currencystringja

MieterwechselRequest

Mieterwechsel auf EINER Einheit als EIN Kommando: Altvertrag beenden, Neuvertrag anlegen, Konditions- und Belegungs-Zeitscheiben fortschreiben — alles in EINER Transaktion.

FeldTypPflichtBeschreibung
unitIdstring(uuid)jadie Einheit, auf der gewechselt wird; das Objekt folgt aus ihr (kein eigenes Feld)
altVertragIdstring(uuid)jader noch LAUFENDE Altvertrag (bereits beendet ⇒ 409)
endDatestring(date)jaerster Tag OHNE den Altmieter (EXKLUSIVE obere Grenze seiner Zeitscheiben). Kündigung zum 30.06. ⇒ 2026-07-01. Gleiche Bedeutung wie endDate in POST /api/vertrag/{id}/end.
endReasonstring | nullneinGrund der Beendigung (optional)
startDatestring(date)neinerster Tag MIT dem Neumieter (INKLUSIVE untere Grenze). Ohne Angabe = endDate, also nahtlos. Kleiner als endDate ⇒ Überlappung (400). Größer ⇒ Leerstand, nur mit leerstandAkzeptiert.
leerstandAkzeptiertbooleanneinbestätigt einen GEWOLLTEN Leerstand zwischen Alt- und Neuvertrag (sonst 400)
contractNostringjaVertragsnummer des Neuvertrags (Ordnungsnummer ohne erzwungene Eindeutigkeit, #416)
mieterPersonIdstring(uuid)jadie MIETPARTEI des Neuvertrags — PFLICHT seit #1910. Muss eine aktive Person dieses Mandanten sein (unbekannt, mandantenfremd oder archiviert ⇒ 404, ununterscheidbar). Die party_roles-Zeile entsteht in DERSELBEN Transaktion wie der Neuvertrag.
kaltmieteCentsinteger | stringjaKaltmiete des Neuvertrags in Cents, GANZZAHLIG (GG3/K4)
currencystringja
ustOptionbooleannein
ustRateintegerneinUSt-Satz in ganzen Prozent, nur bei ustOption true; ohne Angabe bei Option 19. Angeboten wird heute nur 19 (#5988).
dueRulemonatserster | monatsdritter-werktag | quartalsbeginn | fester-tagneinFälligkeitsregel (geschlossenes Vokabular): monatserster = fällig am 1. des Monats, monatsdritter-werktag = 3. Werktag (§ 556b BGB, braucht das Bundesland des Objekts), quartalsbeginn = 1. Tag des Quartals, fester-tag = am Tag dueDay des Monats (in kürzeren Monaten der Monatsletzte; braucht dueDay).
dueDayintegerneinFälligkeitstag 1–31 der Regel fester-tag (in kürzeren Monaten der Monatsletzte). Gesetzt GENAU bei dueRule = fester-tag — fester-tag ohne Tag und ein Tag an einer anderen Regel werden abgewiesen.
paymentMethodstringnein
mahnsperrebooleannein
depositCentsinteger | stringneinKaution in Cents (dokumentarisch); depositCurrency dann Pflicht
depositCurrencystringnein
paymentsarray<MieterwechselPayment>nein
rentSharestringneinMiet-Anteil der Einheit am Neuvertrag als Dezimal-STRING (kein number — numeric-Spalte)
sourceSystemstring | nullnein
sourceRefstring | nullnein

MieterwechselResponse

FeldTypPflichtBeschreibung
unitIdstring(uuid)ja
propertyIdstring(uuid)jadas Objekt, das aus der Einheit folgt
altVertragMieterwechselAltVertragja
neuerVertragMieterwechselNeuerVertragja
vacancyMieterwechselVacancyja
sepaMieterwechselSepaja

MieterwechselSepa

rein informativ — dieser Vorgang ändert KEINEN Mandatsstatus

FeldTypPflichtBeschreibung
altMandateIdsarray<string(uuid)>janoch gültige (pending/active) Mandate des Altvertrags
neuerVertragHatMandatbooleanja
hinweisstringja

MieterwechselVacancy

die Naht zwischen Alt und Neu

FeldTypPflichtBeschreibung
daysintegerjaTage ohne Belegung (0 ⇒ nahtlos)
akzeptiertbooleanjawurde eine Lücke ausdrücklich bestätigt? (false bei days = 0)

MigrationsvergleichAbweichung

FeldTypPflichtBeschreibung
fachbereichsalden | offene-posten | nk-abrechnung | hausgeldabrechnung | vermoegensbericht | ruecklagen | mahnlisteja
procedurestringja
onrintegerjaWinCASA-Objektnummer (ONR) = properties.property_no
jahrintegerja
schluesselstringjadie Identität der Position innerhalb von Auswertung, Objekt und Jahr (z. B. knr=200100)
feldstringja
kontostring | nulljadas Konto (WinCASA-KNR als Text); null, wenn die Position an keinem Konto hängt
personobject | nulljaInhaber, wenn konto ein Personenkonto des casa.ai-Bestands ist; sonst null
erwartetCentsstring | nulljaWinCASA-Wert in Cent als Ganzzahl-Text; null ⇔ die Position fehlt auf der WinCASA-Seite
istCentsstring | nulljacasa.ai-Wert in Cent als Ganzzahl-Text; null ⇔ die Position fehlt auf der casa.ai-Seite
differenzCentsstring | nulljaist − erwartet in Cent als Ganzzahl-Text; null, wenn eine Seite fehlt
erklaerungstring | nulljaBegründung aus dem Erklärungs-Register; null ⇔ unerklärt
korpusfallMigrationsvergleichKorpusfallja

MigrationsvergleichFachbereich

FeldTypPflichtBeschreibung
fachbereichsalden | offene-posten | nk-abrechnung | hausgeldabrechnung | vermoegensbericht | ruecklagen | mahnlisteja
statusgleich | abweichend | nicht-vergleichbarjagleich ⇔ Positionen > 0 ohne Abweichung; abweichend ⇔ mindestens eine Abweichung; nicht-vergleichbar ⇔ keine Position (dann grund + grundText)
positionenintegerjaverglichene Positionen (Vereinigung beider Seiten, nur zugeordnete Objekte)
gleichintegerjadavon centgenau gleich
abweichungenarray<MigrationsvergleichAbweichung>ja
unerklaertintegerjaZahl der Abweichungen ohne Erklärung
nichtZugeordnetarray<integer>jaONRs mit WinCASA-Werten, die keinem casa.ai-Objekt zugeordnet sind
grundkeine-vergleichswerte | auswertung-fehlt | zuordnung-fehlt | nullja
grundTextstring | nullja

MigrationsvergleichKorpusfall

FeldTypPflichtBeschreibung
formatcasa-migrationsvergleich-korpusfall/v1ja
fachbereichsalden | offene-posten | nk-abrechnung | hausgeldabrechnung | vermoegensbericht | ruecklagen | mahnlisteja
procedurestringjadie WinCASA-Auswertung (gespeicherte Prozedur), aus der der Wert stammt
paramsobjectjadie Parameter des Aufrufs, anonymisiert: Zahlen, Daten und J/N-Schalter wie im Satz, jeder andere Text ersetzt
onrintegerja
jahrintegerja
schluesselstringja
feldstringja
kontostring | nullja
erwartetCentsstring | nulljaWinCASA-Wert in Cent als Ganzzahl-Text; null, wenn die Position dort fehlt
istCentsstring | nulljacasa.ai-Wert in Cent als Ganzzahl-Text; null, wenn die Position dort fehlt
differenzCentsstring | nulljaist − erwartet in Cent als Ganzzahl-Text; null, wenn eine Seite fehlt
zeilenarray<object>jadie WinCASA-Zeilen dieses Aufrufs, ANONYMISIERT (jede Textzelle, die weder Zahl noch Datum ist, ist ersetzt)

MigrationsvergleichResponse

FeldTypPflichtBeschreibung
importIdstring(uuid)jader Import-Vorgang (Kanal direktimport)
satzIdstring(uuid)jader verglichene (jüngste) Satz WinCASA-Vergleichswerte
satzVersionintegerja
objektearray<object>jajede ONR des Satzes, aufsteigend, mit ihrer Zuordnung
fachbereichearray<MigrationsvergleichFachbereich>jaalle sieben Fachbereiche in fester Reihenfolge
abgenommenbooleanja„Alt = Neu maschinell belegt": jedes Objekt des Satzes zugeordnet, keine unerklärte Abweichung und jeder Paritäts-Fachbereich gleich oder erklärt abweichend

Objekt

FeldTypPflichtBeschreibung
idstring(uuid)ja
propertyNostringja
namestringja
adressestring | nulljaKurzanschrift zur BESCHRIFTUNG des Objekts („Schloßallee 21, München", #2483) — abgeleitet aus dem ÄLTESTEN AKTIVEN Gebäude, ohne PLZ. null ⇒ kein aktives Gebäude oder keine brauchbare Anschrift hinterlegt. Reine Anzeige und NICHT pflegbar; die pflegbare Anschrift ist `Gebaeude.address`.
verwaltungsartmiet | weg | projaVerwaltungsart des Objekts (geschlossenes Vokabular): miet = Mietverwaltung, weg = Verwaltung der Eigentümergemeinschaft, pro = WEG mit Mietverwaltung (PRO).
verwaltungsverhaeltniseigen | fremdjaVerwaltungsverhältnis des Objekts (geschlossenes Vokabular, orthogonal zur Verwaltungsart): eigen = Eigenverwaltung/Eigenbestand (der Verwalter verwaltet eigenes Eigentum), fremd = Fremdverwaltung (fremdes Eigentum im Auftrag; Regelfall/Default).
bundeslandbb | be | bw | by | hb | he | hh | mv | ni | nw | rp | sh | sl | sn | st | th | nulljaBundesland des Objekts (#947); null ⇒ nicht erfasst.
bankentscheidverbunden | ohne_bankanbindung | nulljaDer Bankentscheid am Objekt (#3297): `verbunden` = an eine Bankverbindung angebunden, `ohne_bankanbindung` = bewusst ohne. null ⇒ NICHT ENTSCHIEDEN — der Zustand jedes vor #3297 entstandenen Objekts. Er wird über die eigene Fachhandlung `set_property_bank_decision` gesetzt und geändert, NICHT über `update_property`.
anteilNachkommastelleninteger | nulljaNachkommastellen der Anteile (#2066); null ⇒ nicht erfasst.
grundkostenAchsenobject | nulljaDie vier Grundkosten-Achsen (#2304); null ⇒ das Objekt rechnet keinen § 7-Split (reine Verbrauchsverteilung).
billingPeriodstring | nullja
istSollVersteuerungstring | nullja
ustSettingsobjectja
accountingCircleIdstring(uuid) | nullja
accountingCircleNamestring | nullja
managementStartDatestring(date) | nulljaVerwaltungsbeginn — ERSTER betreuter Tag (inklusiv); null ⇒ nicht erfasst / offener Beginn.
managementEndDatestring(date) | nulljaVerwaltungsende — LETZTER betreuter Tag (inklusiv); null ⇒ das Mandat läuft weiter.
archivedAtstring(date-time) | nulljagesetzt ⇒ archiviert (K5: kein DELETE)
createdAtstring(date-time)ja

ObjektArchiveResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
archivedAtstring(date-time)ja
accountingCircleIdstring(uuid) | nullja
alreadyArchivedbooleanjatrue ⇒ das Objekt war bereits archiviert (expliziter No-op).
hinweisearray<object>jaHinweise zum erfolgreichen Archivieren; leeres Array ⇒ kein Befund. Ein `verwaltungsende_fehlt` meldet fehlendes Verwaltungsende.

ObjektCheckBefund

FeldTypPflichtBeschreibung
codestringjaMaschinenlesbarer Befund-Code. Struktur: objekt_ohne_gebaeude | objekt_ohne_einheiten | gebaeude_ohne_einheiten. Fläche (§20 NMV): flaeche_fehlt | flaeche_unplausibel | flaeche_mehrdeutig. Miteigentumsanteil: mea_fehlt | mea_summe_abweichung | mea_nenner_uneinheitlich | mea_unplausibel. Die Flächenpflicht ist fail-closed (DENYLIST): pflichtig ist jede Einheiten-Art, die nicht nachweislich befreit ist (Stellplatz/Garage/„sonstige") — unit_kind ist offenes Vokabular ohne CHECK.
ampelgruen | gelb | rotjaAmpel dieses Befunds (zentrale Definition, GG6/BP #13).
scopeobjekt | gebaeude | einheitjaBezugsebene des Befunds.
refIdstring(uuid) | nulljaID der betroffenen Einheit/des Gebäudes; null bei Objekt-Ebene.
messagestringjaDeutsche Klartext-Meldung (Anzeige; die Wahrheit ist code).

ObjektCheckGebaeudeFlaeche

FeldTypPflichtBeschreibung
buildingIdstring(uuid)ja
summeQmstring | nulljaSumme der lesbaren Einheiten-Flächen als m²-Dezimalstring; null ⇒ keine.
einheitenintegerjaAnzahl aktiver Einheiten des Gebäudes am Stichtag.

ObjektCheckResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
asOfstring(date)jaWirksamer Stichtag, gegen den die Attribut-Scheiben gemessen wurden.
ampelgruen | gelb | rotjaObjekt-Ampel = riskanteste Einzel-Ampel aller Befunde; ohne Befund gruen.
einheitenGesamtintegerjaAnzahl aktiver Einheiten des Objekts am Stichtag.
gesamtflaecheQmstring | nulljaSumme der lesbaren Einheiten-Flächen des Objekts als m²-Dezimalstring; null ⇒ keine.
flaecheJeGebaeudearray<ObjektCheckGebaeudeFlaeche>ja
befundearray<ObjektCheckBefund>ja

ObjektCreateRequest

FeldTypPflichtBeschreibung
propertyNostringjaObjektnummer — fachliche Ordnungsnummer, KEINE erzwungene Eindeutigkeit (kein Unique-Index; s. #416). Die Identität eines Objekts ist `id`.
verwaltungsartmiet | weg | projaVerwaltungsart des Objekts (geschlossenes Vokabular): miet = Mietverwaltung, weg = Verwaltung der Eigentümergemeinschaft, pro = WEG mit Mietverwaltung (PRO).
verwaltungsverhaeltniseigen | fremdneinEigen-/Fremdverwaltung; ohne Angabe gilt der Default fremd (#590).
bundeslandbb | be | bw | by | hb | he | hh | mv | ni | nw | rp | sh | sl | sn | st | th | nullneinBundesland des Objekts (#947); ohne Angabe/null nicht erfasst.
anteilNachkommastelleninteger | nullneinNachkommastellen der Anteile (#2066); ohne Angabe/null nicht erfasst.
grundkostenAchsenobject | nullneinDie vier Grundkosten-Achsen (#2304); ohne Angabe/null rechnet das Objekt keinen § 7-Split.
namestringneinAnzeigename; ohne Angabe gilt die Objektnummer
billingPeriodstring | nullnein
istSollVersteuerungstring | nullnein
ustSettingsobjectnein
sourceSystemstring | nullnein
sourceRefstring | nullnein

ObjektListResponse

FeldTypPflichtBeschreibung
statusalle | aktiv | archiviertjader wirksame 3-Wege-Filter
objektearray<Objekt>ja

ObjektReactivateResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
reactivatedAtstring(date-time)ja
accountingCircleIdstring(uuid) | nullja
alreadyActivebooleanjatrue ⇒ das Objekt war bereits aktiv (expliziter No-op, kein Write).
reactivatedBuildingsintegerjaAnzahl der von DIESER Kaskade zurückgeholten Gebäude.
reactivatedUnitsintegerjaAnzahl der von DIESER Kaskade zurückgeholten Einheiten.

ObjektUpdateRequest

Partieller Patch — mindestens ein Feld muss gesetzt sein.

FeldTypPflichtBeschreibung
propertyNostringnein
verwaltungsartmiet | weg | proneinVerwaltungsart des Objekts (geschlossenes Vokabular): miet = Mietverwaltung, weg = Verwaltung der Eigentümergemeinschaft, pro = WEG mit Mietverwaltung (PRO).
verwaltungsverhaeltniseigen | fremdneinVerwaltungsverhältnis des Objekts (geschlossenes Vokabular, orthogonal zur Verwaltungsart): eigen = Eigenverwaltung/Eigenbestand (der Verwalter verwaltet eigenes Eigentum), fremd = Fremdverwaltung (fremdes Eigentum im Auftrag; Regelfall/Default).
bundeslandbb | be | bw | by | hb | he | hh | mv | ni | nw | rp | sh | sl | sn | st | th | nullneinBundesland des Objekts (#947); null setzt zurück auf nicht erfasst.
anteilNachkommastelleninteger | nullneinNachkommastellen der Anteile (#2066); null setzt zurück auf nicht erfasst.
grundkostenAchsenobject | nullneinDie vier Grundkosten-Achsen (#2304) — immer GEMEINSAM; null setzt alle vier zurueck auf kein § 7-Split.
namestringnein
billingPeriodstring | nullnein
istSollVersteuerungstring | nullnein
ustSettingsobjectnein

OffenePostenListResponse

FeldTypPflichtBeschreibung
postenarray<OffenerPosten>ja
summenOffenePostenSummenja

OffenePostenSummen

FeldTypPflichtBeschreibung
rueckstandCentsstringjaΣ Restbetrag der FORDERUNGEN, vorzeichenlos.
guthabenCentsstringjaΣ |Restbetrag| der GUTHABEN, vorzeichenlos.
verbindlichkeitenCentsstring | nulljaΣ |Restbetrag| der VERBINDLICHKEITEN; null, wenn der Read sie nicht ausweist.
saldoCentsstringjarueckstand − guthaben, signiert — die EINZIGE gegenrechnende Zahl.
nominalForderungenCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
nominalGuthabenCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
nominalVerbindlichkeitenCentsstring | nulljaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
currencystringja
anzahlForderungenintegerja
anzahlGuthabenintegerja
anzahlVerbindlichkeiteninteger | nullja

OffenerPosten

FeldTypPflichtBeschreibung
idstring(uuid)jajournal_entries.id der Sollstellung — bei einer freien Zahlung die der Zahlung.
quellesollstellung | freie-zahlungja
propertyIdstring(uuid)ja
propertyNostring | nulljaObjekt-Nummer zur Anzeige; null, falls nicht auflösbar.
contractIdstring(uuid) | nulljaDebitor-Dimension; null bei objektbezogenen Posten ohne Vertrag.
forderungsartkosten | zinsen | hauptforderungja
geldkreismiete | weg_hausgeld | sevja
faelligAmstring(date)ja
nominalbetragCentsstringjaWAS GESTELLT WURDE (signiert).
zugeordnetCentsstringjaSumme der wirksamen Zuordnungen, im Vorzeichen des Nominalbetrags.
restbetragCentsstringjaWAS NOCH OFFEN IST (signiert) — nie mit nominalbetragCents verwechseln.
currencystringja
statusoffen | teilweise | erledigtja
richtungforderung | guthaben | verbindlichkeitja
tageUeberfaelligintegerjaTage seit Fälligkeit am Stichtag; <= 0, solange nicht fällig.

Option

FeldTypPflichtBeschreibung
idstring(uuid)ja
scopeTypetenant | objekt | einheit | vertragjaScope-Ebene (Spezifitäts-Leiter)
scopeIdstring(uuid) | nulljaZiel-UUID der Ebene; NULL beim tenant-globalen Default
keystringja
valueunbekanntneinbeliebiges JSON (jsonb)
valueTypestring | nulljaoptionaler Typ-Hinweis (z. B. boolean/string)
createdAtstring(date-time)ja

OptionListResponse

FeldTypPflichtBeschreibung
filterobjectjader WIRKSAME Filter (die Antwort sagt, was sie zeigt)
optionsarray<Option>ja

OptionResolveResponse

FeldTypPflichtBeschreibung
keystringja
foundbooleanjafalse ⇒ auf keiner berücksichtigten Ebene gesetzt
valueunbekanntneineffektiver Wert (beliebiges JSON) oder null, wenn nicht gefunden
valueTypestring | nullja
scopeTypetenant | objekt | einheit | vertrag | nulljader GEWINNENDE (spezifischste vorhandene) Scope; null ⇒ nicht gefunden
scopeIdstring(uuid) | nullja

OptionSetRequest

FeldTypPflichtBeschreibung
scopeTypetenant | objekt | einheit | vertragja
scopeIdstring(uuid) | nullneinPflicht für objekt/einheit/vertrag; beim tenant-Scope weglassen.
keystringja
valueunbekanntneinbeliebiges NICHT-NULL JSON. null UND fehlend ⇒ 400; false/0/""/{}/[] sind erlaubt.
valueTypestring | nullnein

OptionSetResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
scopeTypetenant | objekt | einheit | vertragja
scopeIdstring(uuid) | nullja
keystringja
valueunbekanntneinder wirksam gewordene Wert (beliebiges JSON)
valueTypestring | nullja
createdbooleanjatrue ⇒ neu angelegt; false ⇒ bestehender Wert überschrieben

PasseHonorarvereinbarungAnRequest

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
wirksamAbstring(date)jaMonatserster, ab dem die neue Scheibe gilt.
neueVereinbarungobjectjaDie neue Vereinbarung ohne gueltigAb/gueltigBis; Beträge als { cents: Integer-STRING, currency: "EUR" }, Sätze als Integer-STRINGS.
grundlagebeschluss | zustimmung | klauselja
beschlussIdstring(uuid) | nullneinGenau bei grundlage = beschluss.
zustimmungAmstring(date) | nullnein
begruendungstringja

Person

FeldTypPflichtBeschreibung
idstring(uuid)ja
personTypestringjanatuerlich | juristisch (Doc 20 §5) — nicht schema-seitig geschlossen
namestringjaAnzeigename — KEINE erzwungene Eindeutigkeit. Die Identität einer Person ist `id`.
contactPersonContactja
archivedAtstring(date-time) | nulljagesetzt ⇒ archiviert (K5: kein DELETE)
createdAtstring(date-time)ja
kreditorKategoriehandwerker | dienstleister | behoerde | versicherung | amt | nulljaKategorie eines Kreditors — geschlossenes Vokabular (`KREDITOR_KATEGORIEN`, `@casaai/domain`); `null` ⇒ keine
archiveReasonstring | nulljaGrund der Archivierung (Freitext, personenbezogen); nur gesetzt, wenn `archivedAt` gesetzt ist

PersonArchiveResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
archivedAtstring(date-time)ja
alreadyArchivedbooleanjatrue ⇒ die Person war bereits archiviert (expliziter No-op). Rollen werden NICHT mitbeendet.

PersonContact

Kontaktangaben (personenbezogen — nie in Logs/URLs). Benannte Felder sind typisiert; UNBEKANNTE Zusatzschlüssel bleiben erhalten (kein Datenverlust beim Round-Trip).

FeldTypPflichtBeschreibung
emailstring(email)neinE-Mail — einziges formatgeprüftes Feld (Anker der Portal-Identität)
telefonstringneinTelefon privat/allgemein — der im Bestand vorhandene Schlüssel
mobilstringneinMobilnummer
telefonGeschaeftlichstringneinTelefon geschäftlich
adresseobjectneinPostanschrift
anredeherr | frau | divers | familie | firmaneinAnrede — geschlossenes Vokabular (`ANREDEN`, `@casaai/domain`)
titelstringneinTitel, z. B. „Dr.“ — freier Text
briefanredestringneinBriefanrede, z. B. „Sehr geehrter Herr Dr. Kellner,“ — Vorschlag `briefanredeVorschlag` (`@casaai/domain`), überschreibbar
kommunikationobjectneinKommunikationspräferenzen

PersonCreateRequest

FeldTypPflichtBeschreibung
personTypestringja
namestringja
contactPersonContactnein
sourceSystemstring | nullnein
sourceRefstring | nullnein

PersonListResponse

FeldTypPflichtBeschreibung
statusalle | aktiv | archiviertjader wirksame 3-Wege-Filter
personenarray<Person>ja

PersonUpdateRequest

Partieller Patch — mindestens ein Feld muss gesetzt sein. `contact` ersetzt das GANZE Kontakt-Objekt (kein Merge): wer nur ein Feld ändert, schickt die übrigen Schlüssel mit, sonst gehen sie verloren.

FeldTypPflichtBeschreibung
personTypestringnein
namestringnein
contactPersonContactnein

PosteingangListResponse

FeldTypPflichtBeschreibung
vorschlaegearray<PosteingangVorschlag>ja

PosteingangVorschlag

FeldTypPflichtBeschreibung
documentIdstring(uuid)ja
proposalIdstring(uuid)ja
proposalVersionintegerjamonoton steigende Version des Vorschlags (P12.6)
ampelgruen | gelb | rotjaP12.3-Ampel (Review-Aufwand) — die UI gruppiert hiernach
kreditorIdstring | nullja
kontostring | nullja
betragCentsstring | nulljaBrutto in Cents als Ziffern-String (GG3: nie Float/number)
betragCurrencystring | nullja
provenanceCountsobjectjaAnzahl entscheidungsrelevanter Felder je Herkunft (origin), z. B. { regel: 1, struktur: 1, modell: 1 }
createdAtstring(date-time)ja

RentabilitaetMonat

FeldTypPflichtBeschreibung
monatstringjaMonat `JJJJ-MM`.
ertragNettoCentsstring | nulljaHonorar netto des Monats (Sonderleistungen mit); null, wenn der Monat kein Honorar trägt.
grundvereinbarung-fehlt | eigenbestand | ausserhalb-verwaltungszeitraum | nullja
gueltigAbstring(date) | nulljaBeginn der Zeitscheibe, die gerechnet hat; null ohne Honorar.

RentabilitaetResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
vonstringjaErster Monat `JJJJ-MM` (Echo).
bisstringjaLetzter Monat `JJJJ-MM` (Echo).
urteilwirtschaftlich | unwirtschaftlich | nicht-beurteilbarja
gruendearray<keine-zeit-erfasst | kein-honorar>ja
ertragNettostring | nulljaΣ Honorar netto in Cent; null ohne jedes Honorar im Zeitraum.
aufwandstringjaErfasste Zeit mal Kalkulationssatz in Cent.
deckungsbeitragstringjaErtrag minus Aufwand in Cent, vorzeichenbehaftet.
margeBasispunktestring | nulljaDeckungsbeitrag je Ertrag in Basispunkten (kaufmännisch gerundet); null ohne Ertrag.
minutenstringjaErfasste Minuten als Integer-STRING.
kapazitaetsanteilBasispunktestringjaAnteil der produktiven Zeit in Basispunkten.
currencystringja
monatearray<RentabilitaetMonat>ja
kalkulationobjectja

Rolle

FeldTypPflichtBeschreibung
idstring(uuid)ja
personIdstring(uuid)ja
personNamestringja
rolestringjamieter | eigentuemer | dienstleister | beirat … — nicht schema-seitig geschlossen
targetKindobjekt | einheit | vertrag | mehrdeutig | nulljaabgeleitet; `mehrdeutig` = mehrere Ziel-Spalten gesetzt (Datendefekt, sichtbar gemacht)
targetIdstring(uuid) | nulljanull bei `mehrdeutig` und ohne Ziel
validFromstring(date) | nulljainklusiv; null ⇒ unbegrenzt in die Vergangenheit
validTostring(date) | nulljaEXKLUSIV; null ⇒ laufend
validRangestringjadas rohe Postgres-daterange-Literal, z. B. `[2026-01-01,)`
createdAtstring(date-time)ja

RolleAssignRequest

Genau EIN Ziel angeben: propertyId (Objekt) ODER unitId (Einheit). Beides oder keines ⇒ 400.

FeldTypPflichtBeschreibung
personIdstring(uuid)ja
rolestringja
propertyIdstring(uuid)nein
unitIdstring(uuid)nein
validFromstring(date)neininklusiv (YYYY-MM-DD); ohne Angabe unbegrenzt
validTostring(date)neinEXKLUSIV (YYYY-MM-DD); ohne Angabe laufend
sourceSystemstring | nullnein
sourceRefstring | nullnein

RolleEndRequest

FeldTypPflichtBeschreibung
endDatestring(date)jaTag, ab dem die Rolle NICHT mehr gilt (exklusive obere Grenze)

RolleEndResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
endDatestring(date)ja
validRangestringja
alreadyEndedbooleanjatrue ⇒ die Rolle war bereits beendet; `endDate` trägt dann das URSPRÜNGLICHE Ende.

RolleListResponse

FeldTypPflichtBeschreibung
statusalle | aktiv | beendetjader wirksame 3-Wege-GÜLTIGKEITS-Filter. ACHTUNG: aktiv ∪ beendet ≠ alle (zukünftige Rollen nur unter `alle`).
asOfstring(date)jader wirksame Stichtag, gegen den aktiv/beendet gemessen wurde
rollenarray<Rolle>ja

RuecklageAnlegenRequest

FeldTypPflichtBeschreibung
arterhaltung | zweckgebundenjaerhaltung = die Erhaltungsrücklage (je Objekt genau eine) · zweckgebunden = Rücklage mit Zweckbindung.
bezeichnungstringja
zweckbindungstring | nullneinPflicht bei `zweckgebunden`, verboten bei `erhaltung`.
verteilerschluesselstringneinVorgabe: Miteigentumsanteil.
unitGroupIdstring(uuid) | nullneinoptionale Untergruppe desselben Objekts
kontoinhaberArtgdwe | verwalter | dritterja
kontoinhaberNamestringja
aktivKontoIdstring(uuid) | nullneinein bestehendes Bestandskonto (Bank) des Objekts; ohne Angabe wird eines angelegt.

RuecklageAnlegenResponse

FeldTypPflichtBeschreibung
ausgangangelegt | bereits_ausgefuehrtjabereits_ausgefuehrt = derselbe Aufruf (Idempotenz-Schlüssel) wurde wiederholt; das gespeicherte Erstergebnis, nichts neu angelegt.
ruecklageIdstring(uuid)ja
arterhaltung | zweckgebundenja
aktivKontoIdstring(uuid)ja
aktivKontoNummerstring | nulljanull, wenn ein bestehendes aktives Konto genannt war (dann wurde keines angelegt).
passivKontoIdstring(uuid)ja
passivKontoNummerstringja
verteilerschluesselstringja
kontoinhaberArtgdwe | verwalter | dritterja

RuecklagenAbstimmungBefund

FeldTypPflichtBeschreibung
klasseumbuchung_giro_festgeld_fehlt | konto_ohne_gegenstueckja
betroffeneRuecklagenarray<string(uuid)>ja
betragRuecklagenGeldja

RuecklagenAbstimmungResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
stichtagstring(date)jaStichtag (INKLUSIV), zu dem abgestimmt wurde.
abgestimmtbooleanja
aktivBestandRuecklagenGeldja
passivBestandRuecklagenGeldja
differenzRuecklagenGeldja
jeRuecklagearray<RuecklagenAbstimmungZeile>ja
befundearray<RuecklagenAbstimmungBefund>ja

RuecklagenAbstimmungZeile

FeldTypPflichtBeschreibung
ruecklageIdstring(uuid)ja
aktivRuecklagenGeldja
passivRuecklagenGeldja
differenzRuecklagenGeldja

RuecklagenAufloesungRequest

FeldTypPflichtBeschreibung
ruecklageIdstring(uuid)ja
aufhebungsBeschlussRefstringjaAufhebungsbeschluss (Teilgegenstands-Referenz); ohne ihn 400.
aufgeloestAmstring(date)ja

RuecklagenAufloesungResponse

FeldTypPflichtBeschreibung
ausgangaufgeloest | bereits_ausgefuehrtjabereits_ausgefuehrt = derselbe Aufruf (Idempotenz-Schlüssel) wurde wiederholt; keine zweite Auflösung.
aufloesungIdstring(uuid)ja
ruecklageIdstring(uuid)ja
aufgeloestAmstring(date)ja

RuecklagenBuchungRequest

FeldTypPflichtBeschreibung
ruecklageIdstring(uuid)ja
betragCentsstringjaVorzeichenbehaftet in Cent als Ziffern-String: "5000" = Zuführung von 50,00 €, "-5000" = Entnahme von 50,00 €.
buchungsdatumstring(date)jaBuchungstag; der Server liest keine Uhr für ein fehlendes Datum.
gegenkontoIdstring(uuid)jaGegenkonto (gl_accounts.id) am Objekt; nicht Teil des Rücklagenpaars.
periodestring | nullneinNur Zuführung, Format YYYY-MM: dieselbe Periode wird nur EINMAL gebucht (zweite Antwort `bereits_gebucht`).
zweckwartung | inspektion | instandsetzung | modernisierende_instandsetzung | bauliche_veraenderung | modernisierung | nullneinPflicht bei einer Entnahme, verboten bei Zuführung und Korrektur.
beschlussGegenstandRefstring | nullneinNur Entnahme: tragender Beschluss-Teilgegenstand.
umwidmungsBeschlussRefstring | nullneinNur Entnahme: Pflicht, sobald der Zweck bauliche_veraenderung oder modernisierung ist.
korrigiertBewegungIdstring(uuid) | nullneinGesetzt ⇒ diese Bewegung ist die Gegenbewegung zu der genannten.

RuecklagenBuchungResponse

FeldTypPflichtBeschreibung
ausganggebucht | bereits_gebuchtjabereits_gebucht = die Periode war schon gebucht oder derselbe Aufruf (Idempotenz-Schlüssel) wurde wiederholt; es entstand KEIN zweiter Journalsatz.
bewegungIdstring(uuid)ja
kategoriestringjazufuehrung · entnahme · korrektur
journalEntryIdstring(uuid)ja

RuecklagenGeld

FeldTypPflichtBeschreibung
centsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
currencyEURja

RuecklagenKatalogEintrag

FeldTypPflichtBeschreibung
idstring(uuid)ja
arterhaltung | zweckgebundenjaerhaltung = Erhaltungsrücklage · zweckgebunden = Rücklage mit Zweckbindung.
bezeichnungstringja
zweckbindungstring | nullja
aktivKontoIdstring(uuid)jadas aktive Bestandskonto (gl_accounts.id)
passivKontoIdstring(uuid)jadas passive Rücklagenkonto (gl_accounts.id)
verteilerschluesselstringja
unitGroupIdstring(uuid) | nullja
kontoinhaberArtgdwe | verwalter | dritterja
kontoinhaberNamestringja
istBestandRuecklagenGeld | nulljaIst-Bestand (Summe der Bewegungen bis einschließlich Stichtag); null, wenn kein `stichtag` angefragt wurde — der Server rät keinen.
aufgeloestbooleanjatrue, sobald die Rücklage aufgelöst wurde; sie bleibt im Katalog.

RuecklagenKatalogResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
stichtagstring(date) | nulljaEcho des angefragten Stichtags (INKLUSIV); null, wenn keiner angefragt wurde.
ruecklagenarray<RuecklagenKatalogEintrag>ja

RuecklagenRueckfuehrungRequest

FeldTypPflichtBeschreibung
ruecklageIdstring(uuid)ja
zwischenfinanzierungBewegungIdstring(uuid)ja
buchungsdatumstring(date)ja
gegenkontoIdstring(uuid)ja

RuecklagenRueckfuehrungResponse

FeldTypPflichtBeschreibung
ausgangzurueckgefuehrt | bereits_ausgefuehrtjabereits_ausgefuehrt = derselbe Aufruf (Idempotenz-Schlüssel) wurde wiederholt; keine zweite Bewegung.
bewegungIdstring(uuid)ja
journalEntryIdstring(uuid)ja
betragRuecklagenGeldja

RuecklagenSollIstResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
stichtagstring(date)jaEcho des Stichtags (INKLUSIV).
ruecklagenarray<RuecklagenSollIstZeile>jaAlle Rücklagen des Objekts, oder genau die angefragte; eine unbekannte oder fremde `ruecklageId` ist ein 404.

RuecklagenSollIstZeile

FeldTypPflichtBeschreibung
ruecklageIdstring(uuid)ja
sollRuecklagenGeldja
istRuecklagenGeldja
istVereinnahmtRuecklagenGeldja
istKorrekturenRuecklagenGeldja
rueckstandRuecklagenGeldja

RuecklagenSollRequest

FeldTypPflichtBeschreibung
ruecklageIdstring(uuid)ja
beschlussGegenstandRefstringjaKanonische Beschluss-Teilgegenstands-Referenz `beschluss-gegenstand:<uuid>`; ohne sie 400.
betragCentsstringjaSoll-Zuführung in Cent als Ziffern-String, > 0 (z. B. "120000" = 1.200,00 €).
faelligZumstring(date)ja

RuecklagenSollResponse

FeldTypPflichtBeschreibung
ausgangfestgelegt | bereits_ausgefuehrtjabereits_ausgefuehrt = derselbe Aufruf (Idempotenz-Schlüssel) wurde wiederholt; das gespeicherte Erstergebnis, nichts neu festgelegt.
sollZufuehrungIdstring(uuid)ja
ruecklageIdstring(uuid)ja
beschlussGegenstandRefstringja
betragRuecklagenGeldja
faelligZumstring(date)ja

RuecklagenWiedervorlage

FeldTypPflichtBeschreibung
bewegungIdstring(uuid)ja
ruecklageIdstring(uuid)ja
faelligAmstring(date)ja
fristMonateintegerja
betragRuecklagenGeldja
beschlussRefstring | nulljaKanonische Beschluss-Referenz; null bei Altbestand ohne Beschluss.
ueberfaelligbooleanjatrue, wenn die Fälligkeit VOR `bis` liegt. Auskunft, keine Sperre.

RuecklagenWiedervorlagenResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
bisstring(date)jaEcho des Bezugstags für `ueberfaellig`.
wiedervorlagenarray<RuecklagenWiedervorlage>ja

RuecklagenZinsRequest

FeldTypPflichtBeschreibung
ruecklageIdstring(uuid)ja
bruttoCentsstringjaBruttozins in Cent als Ziffern-String, > 0; Steuer, Soli und netto werden aufgeteilt.
buchungsdatumstring(date)ja
zinsKontoIdstring(uuid)jaZins-Sachkonto des Objekts, ohne Verteilerschlüssel
steuerKontoIdstring(uuid)jaSachkonto für Kapitalertragsteuer und Solidaritätszuschlag

RuecklagenZinsResponse

FeldTypPflichtBeschreibung
ausganggebucht | bereits_gebuchtjabereits_gebucht = derselbe Aufruf (Idempotenz-Schlüssel) wurde wiederholt; keine zweite Bewegung.
ruecklageIdstring(uuid)ja
journalEntryIdstring(uuid)ja
bewegungIdstring(uuid)ja
bruttoRuecklagenGeldja
kapitalertragsteuerRuecklagenGeldja
solidaritaetszuschlagRuecklagenGeldja
nettoRuecklagenGeldja

RuecklagenZwischenfinanzierungRequest

FeldTypPflichtBeschreibung
ruecklageIdstring(uuid)ja
betragCentsstringjaEntnommener Betrag in Cent als POSITIVER Ziffern-String.
entnahmeDatumstring(date)ja
beschlussRefstringjaTragender Beschluss-Teilgegenstand; ohne ihn 400.
fristMonateintegerneinüberschreibt die Policy-Frist (Objekt vor Mandant vor 3 Monaten); ganze Zahl ≥ 1
gegenkontoIdstring(uuid) | nullneinohne Angabe geht die Gegenbuchung auf das Bestandskonto der Rücklage

RuecklagenZwischenfinanzierungResponse

FeldTypPflichtBeschreibung
ausgangentnommen | bereits_ausgefuehrtjabereits_ausgefuehrt = derselbe Aufruf (Idempotenz-Schlüssel) wurde wiederholt; keine zweite Bewegung.
bewegungIdstring(uuid)ja
journalEntryIdstring(uuid)ja
faelligAmstring(date)ja
fristMonateintegerja
beschlussRefstringja

S35aBescheinigung

FeldTypPflichtBeschreibung
contractIdstring(uuid)ja
contractNostringjaVertragsnummer zur Anzeige.
unitIdsarray<string(uuid)>jaEinheiten des Vertrags im Lauf, aufsteigend, ohne Dubletten.
zeitraumobjectjaNutzungszeitraum im Abrechnungszeitraum (beide Grenzen einschließlich).
kategorienarray<S35aBescheinigungKategorie>jaJe Kategorie mit Betrag > 0 eine Zeile; Mehrfachbuchungen sind summiert.
summeErgebnisMoneyja

S35aBescheinigungenResponse

FeldTypPflichtBeschreibung
laufIdstring(uuid)ja
propertyIdstring(uuid)ja
periodobjectja
bescheinigungenarray<S35aBescheinigung>ja
nichtBescheinigtarray<S35aNichtBescheinigt>ja
summeS35aKostenErgebnisMoneyja
summeBescheinigungenErgebnisMoneyja
summeNichtBescheinigtErgebnisMoneyja

S35aBescheinigungKategorie

FeldTypPflichtBeschreibung
kategoriebeschaeftigungsverhaeltnis | haushaltsnah | handwerkerja
betragErgebnisMoneyja

S35aNichtBescheinigt

FeldTypPflichtBeschreibung
costItemIdstring(uuid)ja
kategoriebeschaeftigungsverhaeltnis | haushaltsnah | handwerkerja
betragErgebnisMoneyja
grundgesamtausweis | ohne_wohnraum_verteilbasisja

SaldenlisteKlasse

FeldTypPflichtBeschreibung
kontenklassestringja
bezeichnungstringjaÜberschrift der Klasse in der Liste.
zeilenarray<SaldenlisteZeile>ja
summeSaldenlisteSummeja

SaldenlisteResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
zeitraumSaldenlisteZeitraumja
klassenarray<SaldenlisteKlasse>ja
summeSaldenlisteSummeja
ausgeglichenbooleanjaKONTROLLSUMME der Doppik: Σ Soll = Σ Haben. Wird AUSGEWIESEN statt erzwungen — eine Schieflage soll sichtbar sein, nicht die Antwort verhindern.
nurBewegteKontenbooleanja
gefilterteKontenintegerjaZahl der wegen fehlender Bewegung NICHT ausgewiesenen Konten — damit die Liste sagen kann, was sie verschweigt.

SaldenlisteSumme

FeldTypPflichtBeschreibung
vortragCentsstringjaΣ der vorzeichenbehafteten Anfangsbestände.
sollCentsstringjaΣ SOLL des Zeitraums (vorzeichenlos).
habenCentsstringjaΣ HABEN des Zeitraums (vorzeichenlos).
saldoCentsstringjaΣ der vorzeichenbehafteten Endsalden.
currencystringja

SaldenlisteZeile

FeldTypPflichtBeschreibung
glAccountNostringjaKontonummer am Objekt — nur JE OBJEKT eindeutig.
namestringja
kontenklassestringjaGruppierungsschlüssel (`gl_accounts.kontotyp`, ADR 0014).
vortragCentsstringjaANFANGSBESTAND: Saldo aller Sätze VOR `von`.
vortragSeiteS | Hja
sollCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
habenCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
saldoCentsstringjaENDSALDO = Vortrag + Soll − Haben.
saldoSeiteS | Hja
currencystringja
bewegungenintegerjaBuchungszeilen auf diesem Konto IM Zeitraum. 0 ⇒ keine Bewegung (und genau diese Zeilen entfernt `nurBewegt`).

SaldenlisteZeitraum

FeldTypPflichtBeschreibung
vonstring(date)ja
bisstring(date)ja

SchadenfallAbschlussRequest

FeldTypPflichtBeschreibung
begruendungstringneinoptional: 1 bis 300 Zeichen

SchadenfallAbschlussResponse

FeldTypPflichtBeschreibung
schadenfallIdstring(uuid)ja
vonStatuserfasst | gemeldet | deckung_zugesagt | deckung_abgelehnt | reguliert | abgeschlossenja
statusabgeschlossenja
begruendungstring | nullja
bilanzSchadenfallBilanzja
befundunbekanntja

SchadenfallAnlegenRequest

FeldTypPflichtBeschreibung
propertyIdstring(uuid)jaPflicht: das Objekt
unitIdstring(uuid)nein
versicherungsvertragIdstring(uuid)neinoptional: Versicherungsvertrag desselben Objekts
instandhaltungVorgangIdstring(uuid)neinoptional: Instandhaltungs-Vorgang desselben Objekts
schadensdatumstring(date)janicht nach heute
schadenartstringjaPflicht: 1 bis 60 Zeichen
beschreibungstringjaPflicht: 10 bis 5000 Zeichen

SchadenfallBefund

FeldTypPflichtBeschreibung
codemeldefrist-verstrichen | schaden-ausserhalb-laufzeit | versicherung-fehlt | erstattung-weicht-abja
textstringja

SchadenfallBilanz

FeldTypPflichtBeschreibung
schadenssummestring | nulljaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
selbstbehaltAnteilstring | nulljaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
erwarteteErstattungstring | nulljaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
erstattetstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
differenzstring | nulljaerwartet minus erstattet; negativ = mehr erstattet als erwartet
befundunbekanntja

SchadenfallDeckungRequest

FeldTypPflichtBeschreibung
entscheidungzugesagt | abgelehntja
deckungAmstring(date)janicht nach heute, nicht vor der Meldung
schadenssummeSchadenfallGeldnein
selbstbehaltSchadenfallGeldnein

SchadenfallDeckungResponse

FeldTypPflichtBeschreibung
schadenfallIdstring(uuid)ja
nummerstringja
statuserfasst | gemeldet | deckung_zugesagt | deckung_abgelehnt | reguliert | abgeschlossenja
selbstbehaltunbekanntja
befundearray<SchadenfallBefund>ja
uebergangbooleanjatrue, wenn der Status gewechselt hat
schadenssummeunbekanntja

SchadenfallErgebnis

FeldTypPflichtBeschreibung
schadenfallIdstring(uuid)ja
nummerstringja
statuserfasst | gemeldet | deckung_zugesagt | deckung_abgelehnt | reguliert | abgeschlossenja
selbstbehaltunbekanntja
befundearray<SchadenfallBefund>ja

SchadenfallErstattung

FeldTypPflichtBeschreibung
idstring(uuid)ja
betragstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
eingangAmstring(date)ja
buchungsstandgebucht | vorgeschlagenja

SchadenfallErstattungRequest

FeldTypPflichtBeschreibung
bankAccountIdstring(uuid)ja
bankTransactionIdstring(uuid)jader Eingang der Erstattung; ein Umsatz gehört höchstens einem Schadenfall
asOfstring(date)ja
bankGlAccountNostringja
sachkontoNostringja
buchungstextstringja1 bis 140 Zeichen

SchadenfallErstattungResponse

FeldTypPflichtBeschreibung
schadenfallIdstring(uuid)ja
statuserfasst | gemeldet | deckung_zugesagt | deckung_abgelehnt | reguliert | abgeschlossenja
erstattungobjectja
bilanzSchadenfallBilanzja
vorschlagobjectja

SchadenfallGeld

FeldTypPflichtBeschreibung
centsstringjaCent als Integer-STRING, nie eine JSON-Zahl
currencyEURja

SchadenfallHonorar

FeldTypPflichtBeschreibung
vorschlagunbekanntja
grundaus | schadenssumme-unbekannt | noch-nicht-reguliert | nullja
automatischAbgerechnetfalseja
hinweisstringja

SchadenfallHonorarVorschlag

FeldTypPflichtBeschreibung
nettoCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
prozentBpintegerja
grundlageschadenssummeja

SchadenfallListenZeile

FeldTypPflichtBeschreibung
idstring(uuid)ja
nummerstringja
statuserfasst | gemeldet | deckung_zugesagt | deckung_abgelehnt | reguliert | abgeschlossenja
schadensdatumstring(date)ja
schadenartstringja
propertyIdstring(uuid)ja
objektstring | nullja
schadenssummestring | nulljaSchadenssumme in Cent als Integer-STRING; null, wenn unbekannt
anzahlBefundeintegerja

SchadenfallListeResponse

FeldTypPflichtBeschreibung
stichtagstring(date)ja
zeilenarray<SchadenfallListenZeile>janur Schadenfälle der Objekte, für die der Aufrufer zuständig ist; leer ohne Fälle
gesamtintegerja
limitintegerja
offsetintegerja

SchadenfallMeldenRequest

FeldTypPflichtBeschreibung
gemeldetAmstring(date)janicht nach heute, nicht vor dem Schadensdatum
aktenzeichenstringneinoptional: 1 bis 60 Zeichen
versicherungsvertragIdstring(uuid)neinoptional: nur, wenn dem Fall noch keine Versicherung zugeordnet ist

SchadenfallResponse

FeldTypPflichtBeschreibung
stichtagstring(date)ja
schadenfallSchadenfallStammja
versicherungsvertragunbekanntja
instandhaltungVorgangunbekanntja
befundearray<SchadenfallBefund>ja
bilanzSchadenfallBilanzja
erstattungenarray<SchadenfallErstattung>ja
honorarSchadenfallHonorarja

SchadenfallStamm

FeldTypPflichtBeschreibung
idstring(uuid)ja
nummerstringja
statuserfasst | gemeldet | deckung_zugesagt | deckung_abgelehnt | reguliert | abgeschlossenja
statusSeitstring(date-time)ja
propertyIdstring(uuid)ja
objektstring | nullja
unitIdstring(uuid) | nullja
schadensdatumstring(date)ja
schadenartstringja
beschreibungVorhandenbooleanja
gemeldetAmstring(date) | nullja
versichererAktenzeichenVorhandenbooleanja
deckungAmstring(date) | nullja
selbstbehaltstring | nulljaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
schadenssummestring | nulljaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
abschlussBegruendungVorhandenbooleanja

SchadenfallVersicherungsvertrag

FeldTypPflichtBeschreibung
idstring(uuid)ja
bezeichnungstringja
partnerFremdvertragPartnerja

SchadenfallVorgangVerweis

FeldTypPflichtBeschreibung
idstring(uuid)ja
nummerstringja
statusstringja

SevAnfangsbestandRequest

Übernimmt den Saldo des Eigentümer-Verrechnungskontos aus dem Altbestand — GENAU EINE Buchung im Geldkreis Sondereigentum je Mandat. Ein zweiter aktiver Anfangsbestand ⇒ 409; Korrektur über Storno und neue Erfassung.

FeldTypPflichtBeschreibung
stichtagstring(date)jaÜbernahmestichtag YYYY-MM-DD — wird das Buchungsdatum der Anfangsbestands-Buchung. Ein Tag in der Zukunft ⇒ 400.
betragCentsstringjaDer übernommene Saldo aus Sicht des EIGENTÜMERS in ganzen Cents als vorzeichenbehafteter Ziffern-String (nie eine JSON-number): positiv = Guthaben des Eigentümers, negativ = der Eigentümer schuldet. "0" ⇒ 400.
sourceSystemstring | nullnein
sourceRefstring | nullnein

SevAnfangsbestandResponse

FeldTypPflichtBeschreibung
entryIdstring(uuid)jader geschriebene Buchungssatz (journal_entries.id)
mandatIdstring(uuid)ja
glAccountIdstring(uuid)jadas Verrechnungskonto (gl_accounts.id)
artanfangsbestandjadie SEV-Buchungsart des Satzes
buchungsdatumstring(date)ja
betragCentsstringjader Bestand aus Sicht des Eigentümers, vorzeichenbehafteter Cent-String
currencyEURja

SevAuszahlungStellenRequest

Stellt die Auszahlungen des Monats: je Mandat der Entnahme-Satz auf dem Verrechnungskonto und EIN Zahlungsauftrag awaiting-approval an das Privatkonto des Eigentümers. Idempotent je Mandat und Monat. Betrag und Empfänger kommen nie aus der Eingabe.

FeldTypPflichtBeschreibung
monatstringjader Auszahlungsmonat im Format JJJJ-MM
vorschlagHashstringjader `vorschlagHash` des GESEHENEN Vorschlags (GET); weicht die frische Rechnung ab ⇒ 409, nichts geschrieben
objektBankkontoIdstring(uuid)jadas abgehende Bankkonto des Objekts (bank_accounts.id)
requestedExecutionDatestring(date)jaAusführungstag der Zahlungsaufträge — explizit, nie implizit „heute"

SevAuszahlungStellenResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
monatstringjader Auszahlungsmonat im Format JJJJ-MM
auszahlungenarray<object>ja
uebersprungenarray<object>ja

SevAuszahlungVorschlagResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
monatstringjader Auszahlungsmonat im Format JJJJ-MM
stichtagstring(date)jader Monatsletzte
vorschlagHashstringjasha256-Hex über genau diesen Inhalt; POST bestätigt ihn
auszahlungenarray<object>ja
uebersprungenarray<object>ja

SevBetrag

FeldTypPflichtBeschreibung
standbekannt | offen | nicht-verfuegbarjabekannt = es gibt einen Betrag; offen = die Quelle steht, hat für diesen Monat aber noch keinen Wert; nicht-verfuegbar = die Quelle ist noch nicht gebaut.
centsstring | nulljaBetrag in Cent als Integer-STRING — und `null`, sobald `stand` nicht `bekannt` ist. Ausdrücklich NIE `"0"` für einen unbekannten Wert: eine Geldanzeige, die „nicht gemessen" und „null Euro" zusammenfallen lässt, meldet einen ausgeglichenen Eigentümer, wo niemand nachgesehen hat.
textstringjaAnzeigetext — „1.234,56 €", „nicht verfügbar" oder „noch nicht gelaufen".
grundstring | nulljaWarum kein Betrag dasteht; `null`, wenn einer dasteht.

SevEigentuemerabrechnungBlock

Ein Block der Abrechnung (Einnahmen, Ausgaben oder Auszahlungen).

FeldTypPflichtBeschreibung
positionenarray<SevEigentuemerabrechnungPosition> | nulljaje Buchungsart mit mindestens einer Buchung im Zeitraum eine Position, in der Ordnung des Buchungsvokabulars; null NUR beim ausgeblendeten Auszahlungsblock (mitAuszahlung=false)
summeCentsstringjaΣ der Positionen in ganzen Cents, exakt — steht auch bei ausgeblendeten Positionen

SevEigentuemerabrechnungEmpfaenger

Der Empfänger der Abrechnung — der Eigentümer mit der Zustellanweisung seiner Eigentümerzeile.

FeldTypPflichtBeschreibung
personIdstring(uuid)jader Eigentümer des Mandats (persons.id)
anredestringjadie Briefanrede (persons.contact.briefanrede, sonst der Vorschlag aus Anrede und Name); nie leer
namestringjader Personenname des Eigentümers — die Zustellanweisung ersetzt den Briefkasten, nie den Empfänger; nie leer
anschriftarray<string>jadie Anschriftzeilen: mit Zustellanweisung die abweichende Adresse (samt Empfängername), sonst Straße Hausnummer, PLZ Ort, Land aus persons.contact; nie leer

SevEigentuemerabrechnungPosition

EINE Position eines Blocks — alle Buchungen EINER Art im Zeitraum.

FeldTypPflichtBeschreibung
artmietgutschrift | mehrerloes_garantiemiete | mietzuschuss | garantiegeber | sonstige_einnahme | verwalterverguetung | hausgeld_an_weg | zufuehrung_sonderruecklage | entnahme_an_eigentuemer | sonstige_ausgabe | entnahme_sonderruecklage | ertragsumbuchung_abgang | ertragsumbuchung_zugangjadie SEV-Buchungsart der Position (jede außer anfangsbestand — der steht im Geldbestand); ertragsumbuchung_abgang/_zugang = Umbuchung von Mieterträgen zwischen altem und neuem Eigentümer (#5228)
gruppemiete | umlagen | sonstige_einnahmen | umlagefaehige_kosten | instandhaltung | verwaltung | sonstige_werbungskosten | kaution | durchlaufend | ruecklage | eigentuemerjadie Kostengruppe der Art — dieselbe Gruppierung wie die Einnahmen-Überschuss-Aufstellung
betragCentsstringjaBetrag in der Richtung des Blocks in ganzen Cents (Einnahme = Σ Saldowirkung, Ausgabe/Auszahlung = −Σ Saldowirkung); ein Storno mindert ihn
anzahlBuchungenintegerjaAnzahl der Buchungen dieser Art im Zeitraum (Stornos zählen mit)

SevEigentuemerabrechnungResponse

Jahresabrechnung der Sondereigentumsverwaltung für den Eigentümer über einen Zeitraum: Einnahmen, Ausgaben und Auszahlungen je Buchungsart, Mieteinnahmen (Soll, Ist, Ausfall, Ertrag je m²), Kosten der Wohnung und die Entwicklung des Geldbestands mit Probe gegen das Verrechnungskonto.

FeldTypPflichtBeschreibung
mandatIdstring(uuid)ja
propertyIdstring(uuid)ja
unitIdstring(uuid)ja
zeitraumobjectjader abgerechnete Zeitraum nach Buchungsdatum, beide Grenzen inklusiv
mitAuszahlungbooleanjafalse = die Positionen des Auszahlungsblocks sind ausgeblendet (Summe und Geldbestand zählen sie trotzdem)
currencyEURja
empfaengerSevEigentuemerabrechnungEmpfaengerja
einnahmenSevEigentuemerabrechnungBlockja
ausgabenSevEigentuemerabrechnungBlockja
auszahlungenSevEigentuemerabrechnungBlockja
mieteobjectjaMieteinnahmen: Soll, Ist, Ausfall und Mietertrag je m²
kostenobjectjaKosten der Wohnung: Hausgeld und Verwaltervergütung, aufgeteilt in „auf den Mieter umlegbar" und „bleibt beim Eigentümer"
geldbestandobjectjadie Entwicklung des Geldbestands — die Probe als Felder
sonderruecklageobjectneinder Block „Sonderrücklage des Eigentümers": Anfangsbestand, Zuführungen, Entnahmen je Anlass und Endbestand mit eigener Probe gegen den Saldo der Rücklage — Geld des Eigentümers, nie die Erhaltungsrücklage der Gemeinschaft. Fehlt, wenn das Mandat keine Sonderrücklage-Regel hat und die Rücklage im oder vor dem Zeitraum keine Bewegung hatte.

SevEigentuemerwechselBefundeResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
monatstringjader geprüfte Monat im Format JJJJ-MM
befundearray<object>ja

SevErtragsumbuchungBuchenRequest

Bucht Mieterträge eines Zeitraums vom Mandat im Pfad (alter Eigentümer) auf das Mandat `nachMandatId` (neuer Eigentümer) um — als eigene Buchungsart mit Beleg, beide Seiten in EINER Transaktion.

FeldTypPflichtBeschreibung
nachMandatIdstring(uuid)jadas EMPFANGENDE Mandat (neuer Eigentümer derselben Wohnung); das abgebende steht im Pfad
zeitraumobjectja
betragCentsstringjaBetrag in ganzen Cents als Ganzzahl-String > 0 — höchstens die im Zeitraum gutgeschriebene, noch nicht umgebuchte Miete
belegobjectja

SevErtragsumbuchungBuchenResponse

FeldTypPflichtBeschreibung
umbuchungIdstring(uuid)ja
vonMandatIdstring(uuid)ja
nachMandatIdstring(uuid)ja
abgangEntryIdstring(uuid)jader Satz ertragsumbuchung_abgang auf dem Verrechnungskonto des abgebenden Mandats
zugangEntryIdstring(uuid)jader Satz ertragsumbuchung_zugang auf dem Verrechnungskonto des empfangenden Mandats
betragCentsstringjader umgebuchte Betrag in ganzen Cents
zeitraumobjectja
belegobjectja

SevErtragsumbuchungListResponse

FeldTypPflichtBeschreibung
mandatIdstring(uuid)ja
umbuchungenarray<object>ja

SevGarantieAbstimmlisteResponse

Abstimmliste der Garantiemieten eines Objekts: garantierte gegen erzielte Miete je Wohnung, die Differenz, die Gutschrift an den Eigentümer und die Belastung des Garantiegebers — gerechnet aus dem Bestand, unabhängig davon, ob die Gutschrift schon vorgelegt oder freigegeben ist.

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
monatearray<string>jader abgefragte Zeitraum: lückenlose Monatsfolge in Kalenderfolge
zeilenarray<SevGarantieAbstimmZeile>jaje Mandat MIT Garantie, das im Zeitraum wirkt, eine Zeile — aufsteigend nach unitNo
summenobjectjaΣ der Zeilen je Spalte, centgenau
nichtBemessbararray<object>jaGarantiemandate, die im Zeitraum nicht bemessen werden konnten, mit Grund — nicht in zeilen und nicht in den Summen; aufsteigend nach unitNo

SevGarantieAbstimmZeile

EIN Mandat (eine Wohnung) mit Garantie über den Zeitraum — nur die Monate, in denen das Mandat wirkt.

FeldTypPflichtBeschreibung
mandatIdstring(uuid)ja
unitIdstring(uuid)ja
unitNostringjadie Wohnungsbezeichnung (units.unit_no)
artgarantiemiete | mindestmietejagarantiemiete = Gutschrift ist der Garantiebetrag; mindestmiete = Gutschrift ist max(erzielte Miete, Mindestbetrag)
basiskalt | warmjakalt oder warm — welche erzielte Miete dem Betrag gegenübersteht
garantiegeberPersonIdstring(uuid)jader Garantiegeber (persons.id)
garantiertCentsstringjaΣ der zugesicherten Beträge (Garantie- bzw. Mindestbetrag je Monat) in ganzen Cents
erzieltCentsstringjaΣ der erzielten Miete (Ist, nach Buchungsperiode, auf der Basis der Garantie) in ganzen Cents
differenzCentsstringjaerzielt − garantiert in ganzen Cents (vorzeichenbehaftet)
gutschriftCentsstringjaΣ dessen, was dem Eigentümer zusteht, in ganzen Cents
belastungGarantiegeberCentsstringjagutschrift − erzielt in ganzen Cents — positiv: der Garantiegeber zahlt; negativ: er erhält den Mehrerlös

SevHausgeldBefund

FeldTypPflichtBeschreibung
mandatIdstring(uuid)ja
unitIdstring(uuid)ja
hausgeldCentsstringjaSumme der zu zahlenden Posten in ganzen Cents
guthabenCentsstringjaSaldo des Verrechnungskontos in ganzen Cents (darf negativ sein)
fehlbetragCentsstringjaHausgeld − max(Guthaben, 0) in ganzen Cents
regeleinziehen | nicht_zahlen | aus_sonderruecklagejaRegel bei Unterdeckung: einziehen (Forderung an den Eigentümer), nicht_zahlen (OP bleibt offen) oder aus_sonderruecklage
entnahmeSonderruecklageCentsstringjaaus der Sonderrücklage entnommen (nur aus_sonderruecklage), sonst "0"
restFehlbetragCentsstringjawas beim Eigentümer offen bleibt

SevHausgeldPosten

FeldTypPflichtBeschreibung
sollstellungIdstring(uuid) | nulljadie Hausgeld-Sollstellung (hausgeld_sollstellungen.id); null bei Hausgeld-Quelle festbetrag
monatstringjaJJJJ-MM
arthausgeld | sonderumlagejahausgeld oder sonderumlage
offenCentsstringjader offene Betrag in ganzen Cents (Ziffern-String)
grundsonderumlage_nicht_vereinbartneinnur an einem AUSGESCHLOSSENEN Posten: Sonderumlage ohne Vereinbarung mit_sonderumlage

SevHausgeldUebersprungen

FeldTypPflichtBeschreibung
mandatIdstring(uuid)ja
unitIdstring(uuid)ja
grundkein_mietinkasso | hausgeld_selbstzahler | verguetung_ausstehendjakein_mietinkasso · hausgeld_selbstzahler (Hausgeld-Quelle keine) · verguetung_ausstehend (erst die Vergütung des Monats buchen)

SevHausgeldVorschlagResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
monatstringjader Monat im Format JJJJ-MM
zeilenarray<SevHausgeldZeile>jaje betrachtetem, nicht übersprungenem Mandat eine Zeile, nach Einheit sortiert
befundearray<SevHausgeldBefund>jajede Unterdeckung (Einheit, Betrag, Regel)
uebersprungenarray<SevHausgeldUebersprungen>ja
vorschlagHashstringjasha256-Hex über genau diesen Inhalt; POST bestätigt ihn
currencyEURja

SevHausgeldZahlenRequest

Der Monatslauf eines Objekts nach der Mietgutschrift in zwei Runden über diese eine Route: Runde 1 bestätigt die Vergütungen (`verguetungen`) und liefert den Hausgeld-Vorschlag NACH der Vergütung; Runde 2 bestätigt dessen Hash (`vorschlagHash`), zahlt das Hausgeld (Belastung des Verrechnungskontos, Art hausgeld_an_weg; Ausgleich der Hausgeld-Sollstellung bzw. Ausgabe an den Kreditor) und führt danach der Sonderrücklage zu. Mindestens eines der beiden Felder ist Pflicht (sonst 400).

FeldTypPflichtBeschreibung
monatstringjader Monat im Format JJJJ-MM
vorschlagHashstringneinRunde 2: der `vorschlagHash` des GESEHENEN Hausgeld-Vorschlags (GET bzw. `hausgeldVorschlag` aus Runde 1); weicht die frische Rechnung ab ⇒ 409, nichts bezahlt
verguetungenarray<SevMonatslaufVerguetungBestaetigung>neinRunde 1: die gesehenen Vergütungsvorschläge, höchstens ein Eintrag je Mandat — eindeutig ist das Feld `mandatId` (`x-unique-by`), nicht das ganze Objekt: zwei Einträge mit derselben mandatId (auch mit verschiedenen Hashes) ⇒ 400; alle Hashes werden vor der ersten Buchung geprüft

SevHausgeldZahlung

FeldTypPflichtBeschreibung
mandatIdstring(uuid)ja
unitIdstring(uuid)ja
zahlungswegop_ausgleich | kreditorja
belastungCentsstringja
entryIdstring(uuid)jader Belastungssatz (journal_entries.id, Art hausgeld_an_weg)
entnahmeEntryIdstring(uuid) | nulljader Entnahme-Satz aus der Sonderrücklage — oder null
ausgeglichenarray<string(uuid)>jadie ausgeglichenen Sollstellungen (bei kreditor leer)

SevHausgeldZahlungResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
monatstringjader Monat im Format JJJJ-MM
zahlungenarray<SevHausgeldZahlung>jaje Mandat mit Belastung > 0 genau eine Zahlung; leer, solange das Hausgeld nicht bezahlt ist
befundearray<SevHausgeldBefund>ja
uebersprungenarray<SevHausgeldUebersprungen>ja
hausgeldStatusbezahlt | nicht_bestaetigt | neu_zu_bestaetigenjabezahlt = Runde 2 hat gezahlt; nicht_bestaetigt = Runde 1 ohne Hausgeld-Hash — `hausgeldVorschlag` ist zu bestätigen
hausgeldVorschlagSevHausgeldVorschlagResponse | nulljader Hausgeld-Vorschlag NACH der Vergütung samt `vorschlagHash` (ihn bestätigt Runde 2); null nach der Zahlung
verguetungenarray<SevVerguetungBuchungResponse>jaje in diesem Aufruf bestätigtem Mandat das Ergebnis der Vergütungsbuchung (Netto, USt, Brutto als Ganzzahl-Strings), nach Mandat sortiert
sonderruecklagearray<SevMonatslaufSonderruecklage>jaje Mandat, dem nach dem Hausgeld zugeführt wurde, das Ergebnis; nach Mandat sortiert
sonderruecklageBefundearray<SevMonatslaufZufuehrungAusgesetzt>jaje Mandat ohne Zuführung ein Befund `zufuehrung_ausgesetzt` mit Grund — nie still
currencyEURja

SevHausgeldZeile

FeldTypPflichtBeschreibung
mandatIdstring(uuid)ja
unitIdstring(uuid)ja
quelleweg_soll | festbetragja
zahlungswegop_ausgleich | kreditorjaop_ausgleich = Ausgleich der Hausgeld-Sollstellung · kreditor = Ausgabe an die fremd verwaltete WEG
postenarray<SevHausgeldPosten>jadie zu zahlenden Posten
ausgeschlossenarray<SevHausgeldPosten>jaoffen, aber nicht zu zahlen (Sonderumlage ohne Vereinbarung) — mit grund
fallnichts_offen | gedeckt | unterdeckungja
hausgeldCentsstringja
guthabenCentsstringja
belastungCentsstringjawas dem Verrechnungskonto belastet würde
regeleinziehen | nicht_zahlen | aus_sonderruecklagejaRegel bei Unterdeckung: einziehen (Forderung an den Eigentümer), nicht_zahlen (OP bleibt offen) oder aus_sonderruecklage
befundunbekanntja

SevMandat

FeldTypPflichtBeschreibung
idstring(uuid)ja
unitIdstring(uuid)ja
personIdstring(uuid)jaDie auftraggebende Eigentümerperson (persons.id).
validFromstring(date) | nulljaBeginn INKLUSIV; null ⇒ unbegrenzt in die Vergangenheit.
validTostring(date) | nulljaEnde EXKLUSIV; null ⇒ laufend. „Zum 30.06. beendet" steht hier als 2025-07-01.
validRangestringjaRohes daterange-Literal, z. B. [2025-01-01,).
activebooleanjaIst das Mandat am Stichtag wirksam (valid_range @> stichtag)?
mitMietinkassobooleanjaUMFANG: zieht der Verwalter auch die Miete ein? false ⇒ Betreuung/Vermietung ja, Mieteinzug nein (dann ist mietgutschriftBasis zwingend "keine").
mietgutschriftBasisist | soll | festbetrag | keinejaist = vereinnahmte Miete · soll = geschuldete Miete · festbetrag = Garantiemiete/Pauschale · keine = keine Mietgutschrift (Umfang ohne Mietinkasso).
mietgutschriftFestbetragCentsstring | nullja
verguetungVermietetSevVerguetungsregelja
verguetungLeerstandSevVerguetungsregelja
hausgeldQuelleweg_soll | festbetrag | keinejaweg_soll = aus der Hausgeld-Sollstellung dieser Einheit · festbetrag = vereinbarter Betrag (nötig, wenn casa die WEG-Seite nicht führt) · keine = der Eigentümer zahlt selbst.
hausgeldFestbetragCentsstring | nullja
sonderruecklageRegelprozent_mietgutschrift | festbetrag | keineja
sonderruecklageProzentSkaliertstring | nullja
sonderruecklageBetragCentsstring | nullja
auszahlungRhythmusmonatlich | quartalsweise | halbjaehrlich | jaehrlich | auf_abrufja
sockelbetragCentsstringjaUntergrenze, die auf dem Eigentümer-Konto stehen bleibt statt ausgezahlt zu werden, in ganzen Cents als Ziffern-String. "0" = kein Sockel (eine getroffene Entscheidung).
currencyEURjaWährung ALLER Beträge dieses Mandats — geschlossen auf EUR (Geldkern).
eigentuemerBankkontoIdstring(uuid) | nulljaPrivatkonto des Eigentümers als person_bank_accounts.id — bewusst eine REFERENZ und keine IBAN: dort hängt das Vier-Augen-Gate der Bankverbindung. null = keins hinterlegt.
garantieArtkeine | garantiemiete | mindestmietejaMietgarantie: keine (auch jedes Mandat von vor der Garantie), garantiemiete (Gutschrift = Garantiebetrag) oder mindestmiete (Gutschrift = max(erzielte Miete, Mindestbetrag)).
garantieBetragCentsstring | nulljaGarantie- bzw. Mindestbetrag JE MONAT als Ziffern-String in ganzen Cents; null bei garantieArt keine.
garantieBasiskalt | warm | nulljakalt oder warm — welche erzielte Miete dem Betrag gegenübersteht; null bei garantieArt keine.
garantiegeberPersonIdstring(uuid) | nulljaDer Garantiegeber (persons.id); null bei garantieArt keine.

SevMandatAnlegenRequest

Legt die Sondereigentumsverwaltung als Zeitabschnitt an. Nur in einem Objekt der Verwaltungsart "pro" möglich; Überschneidungen mit einem bestehenden Mandat DERSELBEN Wohnung ⇒ 400.

FeldTypPflichtBeschreibung
personIdstring(uuid)jaDie auftraggebende Eigentümerperson. Sie muss im GESAMTEN Mandatszeitraum Eigentümerin der Einheit sein (unit_ownerships).
validFromstring(date)jaBeginn der Gültigkeit (INKLUSIV) — das „ab" der Vereinbarung.
validTostring(date)neinoptionales Ende (EXKLUSIV); ohne Angabe laufend
mitMietinkassobooleanjaUMFANG — Pflicht, kein Default. Nachträglich NICHT änderbar: der Wechsel ist ein NEUER Zeitabschnitt (beenden + neu anlegen).
mietgutschriftBasisist | soll | festbetrag | keineja
mietgutschriftFestbetragCentsstring | nullnein
verguetungVermietetSevVerguetungsregelInputja
verguetungLeerstandSevVerguetungsregelInputja
hausgeldQuelleweg_soll | festbetrag | keineja
hausgeldFestbetragCentsstring | nullnein
sonderruecklageRegelprozent_mietgutschrift | festbetrag | keineja
sonderruecklageProzentSkaliertstring | nullnein
sonderruecklageBetragCentsstring | nullnein
sonderruecklageHoechstbetragCentsstring | nullneinHöchststand der Sonderrücklage in ganzen Cents (Ziffern-String): steht ihr Saldo darauf, wird nichts mehr zugeführt. Ohne Angabe/null = ohne Höchststand. Nur bei sonderruecklageRegel ≠ keine.
auszahlungRhythmusmonatlich | quartalsweise | halbjaehrlich | jaehrlich | auf_abrufja
sockelbetragCentsstringjaZiffern-String in ganzen Cents; "0" = kein Sockel.
eigentuemerBankkontoIdstring(uuid) | nullneinPflicht, sobald es eine Mietgutschrift gibt (mietgutschriftBasis ≠ keine); muss DER auftraggebenden Person gehören.
currencyEURneinOhne Angabe EUR; andere Währungen kennt der Geldkern nicht.
hausgeldUnterdeckungeinziehen | nicht_zahlen | aus_sonderruecklageneinRegel bei Unterdeckung des Hausgelds: einziehen, nicht_zahlen (Vorgabe) oder aus_sonderruecklage.
hausgeldSonderumlageohne_sonderumlage | mit_sonderumlageneinSonderumlagen aus der Miete nur bei mit_sonderumlage; Vorgabe ohne_sonderumlage (Known Issue 258695).
garantieArtkeine | garantiemiete | mindestmieteneinMietgarantie: keine (Vorgabe), garantiemiete (Gutschrift = Garantiebetrag) oder mindestmiete (Gutschrift = max(erzielte Miete, Mindestbetrag)). Nur mit Mietinkasso und mietgutschriftBasis ist.
garantieBetragCentsstring | nullneinGarantie- bzw. Mindestbetrag JE MONAT als Ziffern-String in ganzen Cents (> 0); nur bei garantieArt ≠ keine.
garantieBasiskalt | warm | nullneinkalt oder warm — welche erzielte Miete dem Betrag gegenübersteht; nur bei garantieArt ≠ keine.
garantiegeberPersonIdstring(uuid) | nullneinDer Garantiegeber (eine Person DIESES Mandanten, nicht der Eigentümer); nur bei garantieArt ≠ keine. Unbekannt oder fremder Mandant ⇒ 404.
sourceSystemstring | nullnein
sourceRefstring | nullnein

SevMandatAnlegenResponse

Identität und Zeitabschnitt der angelegten Vereinbarung. Die vollständigen Vertragswerte liest GET /api/einheit/{id}/sev-mandat.

FeldTypPflichtBeschreibung
idstring(uuid)ja
unitIdstring(uuid)ja
personIdstring(uuid)ja
validFromstring(date)ja
validTostring(date) | nullja
validRangestringja
mitMietinkassobooleanja

SevMandatBeendenRequest

Beendet den Zeitabschnitt durch KÜRZUNG (nicht durch Löschen — eine abgerechnete Periode bleibt erklärbar). Beenden kürzt nur: ein Ende nach einem bestehenden Ende ⇒ 400, ein Ende am Beginntag ⇒ 400.

FeldTypPflichtBeschreibung
endeExklusivstring(date)jaDer erste Tag OHNE Sondereigentumsverwaltung (EXKLUSIVE obere Grenze). „Zum 30.06. beendet" ⇒ 2025-07-01.

SevMandatBeendenResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
unitIdstring(uuid)ja
personIdstring(uuid)ja
validFromstring(date) | nullja
validTostring(date)jadas gesetzte Ende (EXKLUSIV)
validRangestringja
beendetbooleanjafalse ⇒ das Mandat endete bereits GENAU an diesem Tag; es wurde nichts geändert (No-op-Erfolg statt Fehler).

SevMandatHistorieResponse

FeldTypPflichtBeschreibung
unitIdstring(uuid)ja
stichtagstring(date)jader Stichtag, gegen den `active` je Mandat gemessen wurde
mandatearray<SevMandat>jaAlle Zeitabschnitte, nach Beginn geordnet. Aufeinanderfolgende Abschnitte sind der Weg „mit Mietinkasso → ohne".

SevMandatResponse

FeldTypPflichtBeschreibung
unitIdstring(uuid)ja
stichtagstring(date)jader wirksame Stichtag, gegen den aufgelöst wurde
mandatunbekanntja

SevMieterKostenposition

FeldTypPflichtBeschreibung
sevRechnungIdstring(uuid)ja
unitIdstring(uuid)ja
rechnungsdatumstring(date)ja
kreditorstringja
rechnungsnummerstringja
kostenartstringja
betragCentsstringjaRechnungsbetrag, Cents
currencyEURja

SevMieterKostenResponse

FeldTypPflichtBeschreibung
unitIdstring(uuid)ja
vonstring(date)jaBeginn des Zeitraums (inklusiv)
bisstring(date)jaEnde des Zeitraums (inklusiv)
positionenarray<SevMieterKostenposition>ja

SevMietgutschriftAblehnungResponse

FeldTypPflichtBeschreibung
vorlageIdstring(uuid)ja
mandatIdstring(uuid)ja
monatearray<string>jadie Monate, deren Reservierung gelöst wurde

SevMietgutschriftFreigabeRequest

Gibt einen Mietgutschrift-Vorschlag frei: je Monat mit Anteil eine Buchung (Art Mietgutschrift) auf dem Verrechnungskonto.

FeldTypPflichtBeschreibung
inhaltsHashstringjader `inhaltsHash` des GESEHENEN Vorschlags; weicht er ab ⇒ 409, nichts gebucht

SevMietgutschriftFreigabeResponse

FeldTypPflichtBeschreibung
vorlageIdstring(uuid)ja
mandatIdstring(uuid)ja
betragCentsstringjader gebuchte Betrag in ganzen Cents
buchungenarray<object>ja

SevMietgutschriftLaufRequest

Legt die Mietgutschriften der SEV-Mandate des Objekts für die Periode als Vorschläge vor — Σ der Einzelmonate, idempotent je Mandat und Monat. Verweigert sich mit dem fehlenden Schritt, solange die Miet-Sollstellung eines Monats nicht abgeschlossen ist.

FeldTypPflichtBeschreibung
monatearray<string>jadie Periode: ein Monat (monatlich) oder mehrere lückenlose Monate (z. B. ein Quartal), höchstens zwölf

SevMietgutschriftLaufResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
monatearray<string>ja
textstringjader Buchungstext der Periode, z. B. „Mietgutschrift März 2025"
gutschriftenarray<object>ja
uebersprungenarray<object>ja
rueckbelastungenarray<object>ja

SevMonatslaufSonderruecklage

FeldTypPflichtBeschreibung
mandatIdstring(uuid)ja
statusgebucht | keine_zufuehrung | replayjagebucht = dieser Lauf hat zugeführt; keine_zufuehrung = die Regel ergibt nichts; replay = der Monat lief bereits
grundzugefuehrt | keine_regel | hoechststand_erreicht | betrag_nullja
zugefuehrtCentsstringjader zugeführte Betrag in Cent als Ganzzahl-String ("0" ohne Zuführung)

SevMonatslaufVerguetungBestaetigung

eine bestätigte Vergütung: das Mandat und der Hash des gesehenen Vergütungsvorschlags

FeldTypPflichtBeschreibung
mandatIdstring(uuid)ja
vorschlagHashstringjader `vorschlagHash` des GESEHENEN Vergütungsvorschlags (`GET /api/sev-mandat/{id}/verguetung`); weicht er ab ⇒ 409, keine Vergütung gebucht

SevMonatslaufZufuehrungAusgesetzt

FeldTypPflichtBeschreibung
befundzufuehrung_ausgesetztja
mandatIdstring(uuid)ja
grundhausgeld_nicht_bezahlt | hausgeld_unterdeckung | verguetung_ausstehend | mietgutschrift_fehlt | deckung_fehltja

SevMonatsstandResponse

FeldTypPflichtBeschreibung
objektstringjaAnzeigename des Objekts — keine Kennung (die UUID kennt der Aufrufer, er hat sie gefragt).
monatstringjaDer angefragte Monat als `JJJJ-MM` (Echo).
monatTextstringjaDerselbe Monat als Anzeigetext („Oktober 2026").
wohnungenarray<SevWohnungStand>jaJe SEV-Mandat eine Zeile, in der Ordnung der Quelle. LEER, solange die SEV-Kette (#5216–#5223) nicht gebaut ist — dann steht der Grund in `hinweise` und `vollstaendig` ist `false`. Eine leere Liste ist hier NIE die Aussage „dieses Objekt hat keine Sondereigentumsverwaltung".
hinweisearray<string>jaGrundsätzliche, kundentaugliche Hinweise zum ganzen Objekt.
vollstaendigbooleanja`false`, sobald IRGENDEIN Wert oder Schritt nicht verfügbar ist — die eine Angabe, an der ein Aufrufer erkennt, dass die Auskunft unvollständig ist.

SevNaechsterSchritt

FeldTypPflichtBeschreibung
artschritt | nicht-ermittelbar | keinerjaschritt = dieser Schritt ist als Nächstes fällig; nicht-ermittelbar = die Pflicht-Reihenfolge stösst auf einen Schritt, dessen Quelle fehlt (weder er noch der danach darf genannt werden); keiner = der Monat ist durch.
schrittmietgutschrift | verguetung | hausgeld | sonderruecklage | auszahlung | nulljaDer Schritt; `null` bei `nicht-ermittelbar` und `keiner`.
bezeichnungstring | nulljaSeine kundentaugliche Bezeichnung; `null` wie oben.
textstringjaDer Satz, der dem Verwalter angezeigt wird.

SevRechnung

FeldTypPflichtBeschreibung
sevRechnungIdstring(uuid)ja
mandatIdstring(uuid)ja
unitIdstring(uuid)ja
rechnungsdatumstring(date)ja
kreditorstringja
rechnungsnummerstringja
betragCentsstringjaRechnungsbetrag, Cents
kostenartstringja
umlagefaehigbooleanja
statusbezahlt | nicht_bezahlt | storniertja
entryIdstring(uuid) | nullja
documentIdstring(uuid) | nullja
befundunbekanntja
currencyEURja

SevRechnungBefund

FeldTypPflichtBeschreibung
massnahmeeinziehen | nicht_zahlen | sonderruecklageja
fehlbetragCentsstringjaFehlbetrag in Cents (Betrag − Guthaben).
entnahmeSonderruecklageCentsstringjaaus der Sonderrücklage entnommen, Cents
restFehlbetragCentsstringjabeim Eigentümer offen, Cents

SevRechnungBuchenRequest

Gibt eine Rechnung des Sondereigentums zur Zahlung aus der Miete des Eigentümers frei: Belastung des Verrechnungskontos, Kennzeichen Kostenart + umlagefähig. Nie in der Abrechnung der Gemeinschaft.

FeldTypPflichtBeschreibung
rechnungsdatumstring(date)jaRechnungsdatum YYYY-MM-DD — Stichtag der Mieterabrechnung.
zahlungsdatumstring(date)neinBuchungsdatum der Belastung; Vorgabe: das Rechnungsdatum. Zukunft ⇒ 400.
betragCentsstringjaRechnungsbetrag brutto in ganzen Cents als positiver Ziffern-String (nie eine JSON-number).
kreditorstringjaDer Rechnungssteller (Handwerker, Dienstleister).
rechnungsnummerstringjaRechnungsnummer des Kreditors — mit dem Kreditor der Schlüssel der Rechnung je Mandat.
kostenartstringjaKostenart-Schlüssel (BetrKV-Katalog oder Sonderschlüssel).
umlagefaehigbooleanjaAuf den Mieter der Wohnung umlagefähig?
beiUnterdeckungeinziehen | nicht_zahlen | sonderruecklageneinEntscheid bei fehlender Deckung; ohne ihn ⇒ 400.
documentIdstring(uuid) | nullneinOptionaler Bezug auf die Eingangsrechnung im Posteingang (documents.id).

SevRechnungBuchenResponse

FeldTypPflichtBeschreibung
ergebnisgebucht | nicht_bezahlt | unveraendertja
sevRechnungIdstring(uuid)ja
mandatIdstring(uuid)ja
unitIdstring(uuid)jadie Einheit des Mandats (der Kostenträger)
entryIdstring(uuid) | nulljader Satz auf dem Verrechnungskonto; null bei nicht_bezahlt
betragCentsstringjaRechnungsbetrag, Cents
belastetCentsstringjadem Verrechnungskonto belastet, Cents ("0" bei nicht_bezahlt)
kostenartstringja
umlagefaehigbooleanja
befundunbekanntja
currencyEURja

SevRechnungListResponse

FeldTypPflichtBeschreibung
mandatIdstring(uuid)ja
rechnungenarray<SevRechnung>ja

SevSchlussauszahlungStellenRequest

Stellt die Schlussauszahlung nach dem Mandatsende: der Entnahme-Satz über den GANZEN Saldo (ohne Sockel) und EIN Zahlungsauftrag awaiting-approval an das Privatkonto des bisherigen Eigentümers. Betrag und Empfänger kommen nie aus der Eingabe.

FeldTypPflichtBeschreibung
vorschlagHashstringjader `vorschlagHash` des GESEHENEN Vorschlags (GET); weicht die frische Rechnung ab ⇒ 409, nichts geschrieben
objektBankkontoIdstring(uuid)jadas abgehende Bankkonto des Objekts (bank_accounts.id)
requestedExecutionDatestring(date)jaAusführungstag des Zahlungsauftrags — explizit, nie implizit „heute"

SevSchlussauszahlungStellenResponse

FeldTypPflichtBeschreibung
mandatIdstring(uuid)ja
betragCentsstringjader ausgezahlte Betrag (der ganze Saldo) in ganzen Cents
entryIdstring(uuid)jader Entnahme-Satz auf dem Verrechnungskonto (journal_entries.id)
paymentOrderIdstring(uuid)jader Zahlungsauftrag (awaiting-approval) — Freigabe über die bestehende Zahlungsfreigabe
paymentOrderContentHashstringjaInhalts-Hash des Zahlungsauftrags; die Freigabe bestätigt ihn

SevSchlussauszahlungVorschlagResponse

FeldTypPflichtBeschreibung
mandatIdstring(uuid)ja
unitIdstring(uuid)ja
personIdstring(uuid)jader bisherige Eigentümer (Person des Mandats), der das Geld bekommt
endeExklusivstring(date)jaEnde des Mandats (exklusiv)
stichtagstring(date)jader letzte Tag des Mandats — Stichtag der offenen Posten
saldoCentsstringjaSaldo des Verrechnungskontos über alle Buchungen in ganzen Cents
sockelCentsstringjader vereinbarte Sockelbetrag — nur ausgewiesen, er wird beim Mandatsende NICHT einbehalten
betragCentsstringjawas hinausgeht: der ganze Saldo, oder "0" wenn gesperrt
auszahlbarbooleanja
grundoffene_posten | kein_ueberschuss | nulljaoffene_posten = ein Hausgeld-Posten aus dem Mandatszeitraum ist offen; kein_ueberschuss = der Saldo ist ≤ 0; null = auszahlbar
offenePostenarray<object>jabei offene_posten die sperrenden Posten, ältester zuerst; sonst leer
empfaengerIbanstringjadie IBAN des Privatkontos des bisherigen Eigentümers aus dem Mandat — der Empfänger des Zahlungsauftrags
vorschlagHashstringjasha256-Hex über genau diesen Inhalt; POST bestätigt ihn

SevSchritt

FeldTypPflichtBeschreibung
schrittmietgutschrift | verguetung | hausgeld | sonderruecklage | auszahlungjaDer Schritt — in der PFLICHT-REIHENFOLGE aus UC-SEV-001.
bezeichnungstringjaKundentaugliche Bezeichnung des Schritts (keine interne Kennung).
standerledigt | offen | nicht-verfuegbarjaerledigt | offen | nicht-verfuegbar. `nicht-verfuegbar` heisst: die Quelle dieses Schritts ist noch nicht gebaut — ausdrücklich NICHT „erledigt".
textstringjaDer Satz, der dem Verwalter angezeigt wird.
hinweisstring | nulljaZusatz zum Schritt; `null`, wenn keiner vorliegt.

SevSonderruecklageSaldoResponse

FeldTypPflichtBeschreibung
mandatIdstring(uuid)ja
stichtagstring(date)jader Stichtag (INKLUSIV), zu dem summiert wurde
saldoCentsstringjaBestand der Sonderrücklage des Eigentümers als Cent-String ("0" ohne Bewegungen), nie negativ. Geld des Eigentümers, aber NICHT Teil des Saldos des Verrechnungskontos und nicht der Rücklage der Gemeinschaft.
hoechstbetragCentsstring | nulljavereinbarter Höchststand als Cent-String; null = ohne Höchststand (nicht 0 — 0 hiesse „nie zuführen").
currencyEURja

SevUnterdeckung

FeldTypPflichtBeschreibung
bezeichnungstringjaWofür die Deckung fehlt, kundentauglich (z. B. „Hausgeld Oktober").
wohnungstringjaDie Wohnung, zu der die Unterdeckung gehört — an JEDER Zeile, damit sie aus dem Zusammenhang gerissen (Export, Mail) noch stimmt.
betragCentsstringjaDer fehlende Betrag in Cent als Integer-STRING.
betragTextstringjaDerselbe Betrag als deutscher Anzeigetext („245,00 €").
textstringjaDer vollständige Satz: Betrag, Anlass und Wohnung.

SevVerguetungBuchenRequest

Bucht die Verwaltervergütung eines Monats: Belastung des Verrechnungskontos (Art Verwaltervergütung), Ertrag beim Verwalter, USt getrennt. Genau einmal je Mandat und Monat.

FeldTypPflichtBeschreibung
monatstringjader Monat im Format JJJJ-MM
vorschlagHashstringjader `vorschlagHash` des GESEHENEN Vorschlags (GET); weicht die frische Rechnung ab ⇒ 409, nichts gebucht

SevVerguetungBuchungResponse

FeldTypPflichtBeschreibung
ergebnisgebucht | unveraendert | keine_verguetungjagebucht = neuer Satz; unveraendert = derselbe Satz war schon gebucht; keine_verguetung = Netto 0, nichts gebucht
mandatIdstring(uuid)ja
monatstringjader Monat im Format JJJJ-MM
entryIdstring(uuid) | nulljader Vergütungssatz (journal_entries.id); null bei keine_verguetung
glAccountIdstring(uuid)jadas belastete Verrechnungskonto (gl_accounts.id)
ertragGlAccountIdstring(uuid) | nulljadas Ertragskonto des Verwalters; null bei keine_verguetung
nettoCentsstringja
ustSatzProzentstringja
umsatzsteuerCentsstringja
bruttoCentsstringja
buchungsdatumstring(date) | nulljader Monatsletzte; null bei keine_verguetung
currencyEURja

SevVerguetungsregel

Art + GENAU EINE Angabe dazu. Der Leerstand hat seine eigene Regel: dort gibt es keine Miete, auf die ein Prozentsatz anwendbar wäre.

FeldTypPflichtBeschreibung
artprozent | festbetrag | keinejaprozent | festbetrag | keine (geschlossen). "keine" heisst NICHT VEREINBART — wer 0 € vereinbart hat, wählt festbetrag mit 0.
prozentSkaliertstring | nulljaProzentsatz in SEV_PROZENT_SKALA als ZIFFERN-STRING (1 % = "10000"); null ausserhalb von art=prozent.
betragCentsstring | nulljaMonats-Festbetrag in ganzen Cents als ZIFFERN-STRING; null ausserhalb von art=festbetrag.

SevVerguetungsregelInput

Vergütungsregel; genau eine Angabe je Art (die Kopplung prüft der Tool-Layer und der DB-CHECK).

FeldTypPflichtBeschreibung
artprozent | festbetrag | keineja
prozentSkaliertstring | nullneinPflicht bei art=prozent, sonst verboten. Ziffern-String in SEV_PROZENT_SKALA.
betragCentsstring | nullneinPflicht bei art=festbetrag, sonst verboten. Ziffern-String in ganzen Cents.

SevVerguetungVorschlagResponse

FeldTypPflichtBeschreibung
mandatIdstring(uuid)ja
monatstringjader Monat im Format JJJJ-MM
fallvermietet | leerstandjavermietet = die Einheit ist am Monatsletzten belegt; sonst gilt die Leerstandsregel
artprozent | festbetrag | keinejadie Art der angewandten Regel (prozent | festbetrag | keine)
bemessungist | solljaist = Mietgutschrift des Monats, soll = Soll-Miete der Einheit im Monat
basisMieteCentsstringjadie verwendete Bemessungsgrundlage in ganzen Cents (Ziffern-String)
nettoCentsstringjaVergütung netto in ganzen Cents (nach Mindest-/Höchstbetrag)
ustSatzProzentstringjaUSt-Satz in ganzen Prozent ("0" = ohne USt)
umsatzsteuerCentsstringjadie getrennt ausgewiesene Umsatzsteuer in ganzen Cents
bruttoCentsstringjadie Belastung des Verrechnungskontos in ganzen Cents (netto + USt)
mindestbetragGegriffenbooleanja
hoechstbetragGegriffenbooleanja
bereitsGebuchtobject | nulljader für den Monat bereits gebuchte, nicht stornierte Vergütungssatz — oder null
vorschlagHashstringjasha256-Hex über genau diesen Inhalt; POST bestätigt ihn
currencyEURja

SevVerrechnungskontoSaldoResponse

FeldTypPflichtBeschreibung
mandatIdstring(uuid)ja
glAccountIdstring(uuid)jadas Verrechnungskonto (gl_accounts.id)
stichtagstring(date)jader Stichtag (INKLUSIV), zu dem summiert wurde
saldoCentsstringjaSaldo aus Sicht des Eigentümers als vorzeichenbehafteter Cent-String ("0" ohne Buchungen): positiv = Guthaben des Eigentümers.
currencyEURja

SevWohnungStand

FeldTypPflichtBeschreibung
wohnungstringjaBezeichnung der Wohnung — keine UUID, keine interne Kennung (Abnahme 4 von #5229).
eigentuemerstringjaName des Eigentümers — keine UUID, keine interne Kennung.
schrittearray<SevSchritt>jaALLE Schritte in der Pflicht-Reihenfolge, nie gefiltert — eine Liste ohne einen Schritt sähe aus wie eine Kette ohne ihn.
saldounbekanntja
sockelunbekanntja
sonderruecklageunbekanntja
unterdeckungenStandbekannt | offen | nicht-verfuegbarja`bekannt` mit LEERER Liste heisst „geprüft, keine" — eine andere Aussage als „nicht nachgesehen" und deshalb ein eigener Stand.
unterdeckungenarray<SevUnterdeckung>ja
unterdeckungenTextstringjaZusammenfassung der Unterdeckungen als Anzeigetext.
naechsterSchrittSevNaechsterSchrittja

SollstellungBefund

FeldTypPflichtBeschreibung
klassestringja
contractIdstring(uuid)ja
contractNostring | nullja
periodeVonstring(date) | nullja
periodeBisstring(date) | nullja
meldungstringja

SollstellungFreigabeEintrag

FeldTypPflichtBeschreibung
approvalIdstring(uuid)ja
proposalIdstring(uuid)ja
versionintegerja
contentHashstringja

SollstellungFreigabeResponse

FeldTypPflichtBeschreibung
decisionapprovedja
countintegerja
approvalsarray<SollstellungFreigabeEintrag>ja

SollstellungslaufStartResponse

FeldTypPflichtBeschreibung
sollstellungslaufIdstring(uuid)ja
statusgeplantja
vorschlaegeobjectja
uebersprungenintegerja
uebergangenbooleanjatrue, wenn offene Readiness-Befunde MIT Begründung übergangen wurden (auditiert).

SollstellungVorschlaegeResponse

FeldTypPflichtBeschreibung
sollstellungslaufIdstring(uuid)ja
propertyIdstring(uuid)ja
stichtagstring(date)ja
statusstringja
uebergangenbooleanjatrue, wenn der Start nur durch ein auditiertes Übergehen zustande kam.
vorschlaegearray<SollstellungVorschlag>ja
befundearray<SollstellungBefund>ja

SollstellungVorschlag

FeldTypPflichtBeschreibung
proposalIdstring(uuid)jaGENAU die id, die `POST /api/sollstellung/freigabe` in `proposalIds` erwartet.
versionintegerjaFassung des Vorschlags — nach einer Korrektur die NEUE (die Kette ist aufgelöst).
bindungIdstring(uuid)jaDie Planungs-Bindung dahinter — der Gegenstand einer Herausnahme aus dem Lauf.
artneu | storno | ersatzja
contractIdstring(uuid)ja
contractNostring | nulljaVertragsnummer zur Anzeige; null, falls nicht auflösbar.
periodeVonstring(date)ja
periodeBisstring(date)ja
faelligAmstring(date)ja
betragCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
currencystringja
ampelstringjaAus dem Lauf gelesen, hier nie gerechnet. ALL-GREEN: ein nicht-grüner Vorschlag lässt die Freigabe scheitern.
entschiedenbooleanjaLiegt bereits eine Entscheidung (Freigabe/Ablehnung) vor? Sagt NICHT, ob sie den aktuellen Stand noch bindet.
bindetAktuellenStandbooleanjatrue ⇔ die Entscheidung hängt an der AKTUELLEN Fassung. false bei „noch offen" UND bei „durch Korrektur ungültig".

SonderumlageAnlegenRequest

FeldTypPflichtBeschreibung
beschlussGegenstandRefstringjaKanonische Beschluss-Teilgegenstands-Referenz `beschluss-gegenstand:<uuid>`; ohne sie 400.
zweckstringjaZweck laut Beschluss (Pflichtinhalt).
faelligkeitstring(date)jaFälligkeit; bei Raten der Termin der ersten Rate.
zahlweiseeinmalzahlung | ratenja
ratenFaelligkeitenarray<string(date)>neinPflicht bei `raten`, verboten bei `einmalzahlung`.
betragCentsstringjaGesamtbetrag in Cent als Ziffern-String, > 0 (z. B. "1200000" = 12.000,00 €).
zufuehrungsSchluesselstringneinVorgabe: mea (Miteigentumsanteil).
entnahmeSchluesselstring | nullnein
abweichungsBeschlussRefstring | nullneinBeschluss, der einen abweichenden Entnahmeschlüssel trägt.

SonderumlageAnlegenResponse

FeldTypPflichtBeschreibung
ausgangangelegt | bereits_ausgefuehrtjabereits_ausgefuehrt = derselbe Aufruf (Idempotenz-Schlüssel) wurde wiederholt; das gespeicherte Erstergebnis, nichts neu angelegt.
sonderumlageIdstring(uuid)ja
sonderkontoIdstring(uuid)ja
sonderkontoNummerstringja
beschlussGegenstandRefstringja
betragRuecklagenGeldja
ratenarray<SonderumlageRate>ja
warnungenarray<SonderumlageGapWarnung>ja

SonderumlageGapWarnung

FeldTypPflichtBeschreibung
klassezufuehrung_entnahme_schluessel_weichen_abja
zufuehrungsSchluesselstringja
entnahmeSchluesselstringja
beschlussRefFehltbooleanja
meldungstringja

SonderumlageListenEintrag

FeldTypPflichtBeschreibung
sonderumlageIdstring(uuid)ja
zweckstringja
betragRuecklagenGeldja
zahlweiseeinmalzahlung | ratenja
faelligkeitstring(date)jaBei Raten die Fälligkeit der ersten Rate.
faelligkeitenarray<string(date)>jaAlle Raten-Fälligkeiten aufsteigend; leer ohne Raten.
gestelltbooleanjatrue, sobald das Soll gestellt ist (Lauf vorhanden).
zufuehrungsSchluesselstringja
entnahmeSchluesselstring | nullja
schluesselAbweichungbooleanjaTatsache, keine Warnung: beide Schlüssel gesetzt und verschieden.

SonderumlageListeResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
sonderumlagenarray<SonderumlageListenEintrag>ja

SonderumlageRate

FeldTypPflichtBeschreibung
nrintegerja
faelligkeitstring(date)ja

SonderumlageSollEinheit

FeldTypPflichtBeschreibung
unitIdstring(uuid)ja
gesamtanteilRuecklagenGeldja
summeRuecklagenGeldja
zeilenarray<SonderumlageSollZeile>ja

SonderumlageSollResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
sonderumlageIdstring(uuid)ja
gesamtsummeRuecklagenGeldja
einheitenarray<SonderumlageSollEinheit>ja

SonderumlageSollSchuldner

FeldTypPflichtBeschreibung
ownershipIdstring(uuid)ja
personIdstring(uuid)ja
anteilstringjaInnenverhältnis in Zehntausendsteln als Ziffern-String — KEIN Geld.

SonderumlageSollStellenEinheit

FeldTypPflichtBeschreibung
unitIdstring(uuid)ja
gesamtanteilRuecklagenGeldja
ratenarray<SonderumlageSollStellenRate>ja

SonderumlageSollStellenRate

FeldTypPflichtBeschreibung
nrintegerja
faelligkeitstring(date)ja
betragRuecklagenGeldja

SonderumlageSollStellenRequest

FeldTypPflichtBeschreibung
sonderumlageIdstring(uuid)ja
laufTypsonderzufuehrung | umbuchung_abrechnungsspitzeneinVorgabe sonderzufuehrung; umbuchung_abrechnungsspitze ist (noch) nicht verdrahtet und ergibt 409.
abweichungsBeschlussRefstring | nullnein

SonderumlageSollStellenResponse

FeldTypPflichtBeschreibung
ausgangausgefuehrt | bereits_ausgefuehrtjabereits_ausgefuehrt = das Soll stand schon (oder derselbe Idempotenz-Schlüssel wurde wiederholt); es wurde nichts neu gestellt.
laufIdstring(uuid)ja
schluesselstringja
warnungenarray<SonderumlageGapWarnung>ja
einheitenarray<SonderumlageSollStellenEinheit>ja

SonderumlageSollZeile

FeldTypPflichtBeschreibung
sollstellungIdstring(uuid)ja
rateNrintegerja
faelligkeitstring(date)ja
betragRuecklagenGeldja
schuldnerarray<SonderumlageSollSchuldner>ja

StaffelmieteListeResponse

FeldTypPflichtBeschreibung
stichtagstring(date)jader verwendete Stichtag (Vorgabe: heute, Server-Uhr)
zeilenarray<StaffelmieteListeZeile>janur Verträge der Objekte, für die der Aufrufer zuständig ist; aufsteigend nach Objekt und Vertragsnummer

StaffelmieteListeZeile

FeldTypPflichtBeschreibung
contractIdstring(uuid)ja
contractNostringja
propertyIdstring(uuid)ja
currencystring | nullja
aktuellunbekanntja
vorherunbekanntja
differenzCentsstring | nulljaaktuell − vorher in Cent (vorzeichenbehaftet); null ohne Vorgänger oder bei Währungswechsel
naechsteunbekanntja
herkunftanlage | konditionswechseljaanlage ⇒ die aktuelle Stufe entstand im Anlage-Kommando des Vertrags; sonst konditionswechsel

StaffelmieteStufe

FeldTypPflichtBeschreibung
kaltmieteCentsstringjaKaltmiete der Stufe in Cent
currencystring | nulljaWährung dieser Stufe (je Stufe geführt; Wechsel der Währung ist ein Stufenwechsel)
gueltigAbstring(date) | nulljaGültigkeitsbeginn der Stufe; null ⇒ ohne untere Grenze (von Anfang an)

StarteZeitRequest

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
taetigkeitsarttelefonat | aussendienst | schriftverkehr | versammlung | verwaltung | sonstigesja
bezugArtobjekt | anliegen | sonderleistungnein
bezugIdstring(uuid) | nullnein
notizstring | nullnein

StorniereZeitRequest

FeldTypPflichtBeschreibung
grundstringja

UebernahmeAbrechnungenListResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
laeufearray<UebernahmeAbrechnungLauf>jaNeueste zuerst. Ein fremdes oder unbekanntes Objekt liefert eine LEERE Liste (kein Existenz-Orakel).

UebernahmeAbrechnungEroeffnungsbuchung

FeldTypPflichtBeschreibung
sourceKeystringjaQuellschlüssel der Zeile (`bk-bestand:<Lauf-Id>:<Vertrags-Id>`), Grundlage der Wiederholungssicherheit.
journalEntryIdstring(uuid)ja
accrualDatestring(date)ja
bruttoCentsstringjaInteger-STRING in Cent, signiert.
replaybooleanjatrue ⇔ der Posten existierte schon (Wiederholung), es wurde nichts neu gebucht.

UebernahmeAbrechnungLauf

FeldTypPflichtBeschreibung
idstring(uuid)ja
propertyIdstring(uuid)ja
periodFromstring(date)ja
periodTostring(date)ja
statusstringjaStatus des Laufs; ein übernommener Lauf ist `festgeschrieben`.
herkunftstring | nullja`uebernahme` = als Bestand übernommen (nicht gerechnet); `null` = eigener, in casa.ai gerechneter Lauf.
uebernommenbooleanjatrue ⇔ herkunft = `uebernahme`. Ein übernommener Lauf kennt keine § 35a-Bescheinigung und keinen Einwand (409).
createdAtstring(date-time)ja

UebernahmeAbrechnungUebernommenResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
laufIdstring(uuid)ja
periodFromstring(date)ja
periodTostring(date)ja
statusfestgeschriebenja
herkunftuebernahmeja
uebernahmestichtagstring(date)ja
bindingContentHashstringjaSHA-256 (hex) über den Snapshot aller übergebenen Werte (das Siegel).
anzahlVertraegeintegerja
anzahlEroeffnungspostenintegerja
eroeffnungobject | nulljanull, wenn kein Vertrag als „offen" gekennzeichnet war (nichts über die Migrationsnaht gebucht).

UebernahmeAbrechnungVorschauPosten

FeldTypPflichtBeschreibung
contractIdstring(uuid)ja
artsollstellung | gutschriftja
nominalCentsstringjaInteger-STRING in Cent, signiert.
originalFaelligkeitstring(date)ja

UebernahmeAbrechnungVorschauResponse

FeldTypPflichtBeschreibung
pruefungtrueja
geschriebenfalseja
propertyIdstring(uuid)ja
periodFromstring(date)ja
periodTostring(date)ja
uebernahmestichtagstring(date)ja
bindingContentHashstringjaSHA-256 (hex) über den Snapshot aller übergebenen Werte — derselbe, den die Übernahme siegelt.
anzahlVertraegeintegerja
summeNachzahlungCentsstringjaInteger-STRING in Cent; Summe der Ergebnisse > 0.
summeGuthabenCentsstringjaInteger-STRING in Cent (negativ); Summe der Ergebnisse < 0.
eroeffnungspostenarray<UebernahmeAbrechnungVorschauPosten>ja

UmlageArchiveResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
archivedAtstring(date-time)ja
alreadyArchivedbooleanja

UmlageResult

FeldTypPflichtBeschreibung
linesarray<UmlageResultLine>ja
totalUmlagefaehigErgebnisMoneyja
totalVerteiltNettoErgebnisMoneyja
skippedNichtUmlagefaehigarray<string>jaids der NICHT verteilten Positionen — ohne sie wäre „Σ verteilt < Σ gebucht" nicht erklärbar.

UmlageResultLine

FeldTypPflichtBeschreibung
costItemIdstring(uuid)ja
recipientErgebnisRecipientja
fromstring(date)ja
tostring(date)ja
nettoErgebnisMoneyja
ustRatePercentstring | nulljaUSt-Satz in ganzen Prozent als Integer-STRING oder null (Wohnraum hat KEINEN Satz — das ist etwas anderes als 0 %).
ustAmountunbekanntja
bruttoErgebnisMoneyja

Umlageschluessel

FeldTypPflichtBeschreibung
idstring(uuid)ja
propertyIdstring(uuid)ja
unitGroupIdstring(uuid) | nulljaAbrechnungskreis-Scope; null ⇒ objektweit
keyTypestringjaGrundtyp (OFFENES Vokabular): festbetrag | flaeche | personen_zeit | verbrauch | extern | …
namestringja
configobjectjastrukturierter JSON-Wert (leeres Objekt zulässig)
archivedAtstring(date-time) | nulljanull ⇒ aktiv
createdAtstring(date-time)ja
keyNointeger | nulljaNummer des Schlüssels im Objekt (#5551, allocation_keys.key_no) — je Objekt eindeutig (DB-UNIQUE); null ⇒ noch nicht vergeben

UmlageschluesselCreateRequest

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
keyTypestringjafestbetrag | flaeche | personen_zeit | verbrauch | extern | … (offenes Vokabular)
namestringja
configobjectneinstrukturierter JSON-Wert (leer zulässig)
unitGroupIdstring(uuid)neinoptionaler Abrechnungskreis-Scope schon bei der Anlage (muss zum selben Objekt gehören)
sourceSystemstring | nullnein
sourceRefstring | nullnein

UmlageschluesselListResponse

FeldTypPflichtBeschreibung
umlageschluesselarray<Umlageschluessel>ja

UmlageschluesselScopeRequest

Setzt (unitGroupId) oder löst (null) den Abrechnungskreis-Scope. Der Kreis muss zum selben Objekt wie der Schlüssel gehören.

FeldTypPflichtBeschreibung
unitGroupIdstring(uuid) | nulljaZiel-Abrechnungskreis oder null (objektweit)

UmlageschluesselScopeResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
propertyIdstring(uuid)ja
unitGroupIdstring(uuid) | nullja

UmlageschluesselUpdateRequest

Mindestens ein Feld muss gesetzt sein (leerer Patch ⇒ 400). Der Scope wird NICHT hier gesetzt (⇒ /scope).

FeldTypPflichtBeschreibung
keyTypestringnein
namestringnein
configobjectnein

UmlaufEroeffnenRequest

Eröffnet den Umlauf einer Versammlung der Art umlauf (Status entwurf, genau ein Beschluss-TOP): legt je Eigentümer-Person eine Rücklaufzeile an. Allstimmigkeit ist der Default. versammlungId steht im Pfad, im Body ist es ein Fehler.

FeldTypPflichtBeschreibung
fristEndestring(date)jaEnde der Antwortfrist; nicht vor dem Eröffnungstag. Keine Ausschlussfrist: Antworten bis zur Feststellung zählen.
mehrheitsregelallstimmig | mehrheit_abgegebeneneinallstimmig (Default: alle Eigentümer in Textform, § 23 Abs. 3 S. 1 WEG) | mehrheit_abgegebene (§ 23 Abs. 3 S. 2 WEG)
absenkungBeschlussIdstring(uuid)neinPflicht bei mehrheit_abgegebene: der vorher gefasste, tragende Beschluss (angenommen oder bestandskraeftig); ob er sich auf diesen Gegenstand bezieht, prüft das System nicht
stimmgewichtearray<object>neinEingegebenes Stimmgewicht je Eigentümer-Person (Köpfe: 1, mea: Zehntausendstel, objekt: Zahl der Einheiten)

UmlaufEroeffnetResponse

FeldTypPflichtBeschreibung
versammlungIdstring(uuid)ja
propertyIdstring(uuid)ja
mehrheitsregelstringjaallstimmig | mehrheit_abgegebene
fristEndestring(date)ja
eroeffnetAmstring(date)ja
absenkungBeschlussIdstring(uuid) | nullja
stimmprinzipstringjakoepfe | mea | objekt — das Stimmprinzip der Versammlung
anzahlRuecklaeufeintegerjaZahl der angelegten Rücklaufzeilen (eine je Eigentümer-Person)
hinweisearray<VersammlungHinweis>jafrist-kurz | gegenstandsbezug-nicht-geprueft

UmlaufFeststellenRequest

Stellt das Ergebnis des Umlaufs fest (einmalig): friert die Zählung ein und schreibt das Ergebnis in den TOP. Leerer Body {}. Feststellbar, sobald alle geantwortet haben (Allstimmigkeit: auch bei einem Nein) oder das Fristende vorbei ist; ein nicht zustande gekommener Umlauf geht als abgelehnt in die Sammlung.

FeldTypPflichtBeschreibung

UmlaufFeststellungResponse

FeldTypPflichtBeschreibung
versammlungIdstring(uuid)ja
propertyIdstring(uuid)ja
feststellungstringjaangenommen | abgelehnt | nicht_zustande_gekommen
festgestelltAmstring(date-time)ja
topErgebnisstringjaangenommen | abgelehnt — wie im Beschluss-TOP (nicht zustande gekommen ⇒ abgelehnt)
topIdstring(uuid)ja
versammlungsdatumstring(date)jaDatum der Beschlussfassung
zaehlungUmlaufZaehlungja
hinweisearray<VersammlungHinweis>ja

UmlaufRuecklaufRequest

Erfasst die Antwort EINER Person; eine spätere Antwort überschreibt die frühere, solange nicht festgestellt ist. Eine Antwort nach dem Fristende wird gespeichert (Hinweis nach-fristablauf). versammlungId steht im Pfad.

FeldTypPflichtBeschreibung
personIdstring(uuid)jaDie Eigentümer-Person auf der Rücklaufliste
antwortja | nein | enthaltungja
eingegangenAmstring(date)jaEingangsdatum der Antwort; nicht vor der Eröffnung, nicht in der Zukunft
eingangskanalportal | email | post | sonstigesja
textformBestaetigtbooleanneinZustimmung (ja) gilt nur in Textform; Vorgabe false
notizstringneinFreitext der Verwaltung

UmlaufRuecklaufResponse

FeldTypPflichtBeschreibung
versammlungIdstring(uuid)ja
personIdstring(uuid)ja
antwortstringjaja | nein | enthaltung
eingegangenAmstring(date)ja
eingangskanalstringjaportal | email | post | sonstiges
textformBestaetigtbooleanja
vorherigeAntwortstring | nulljadie überschriebene Antwort; null bei der ersten Antwort
hinweisearray<VersammlungHinweis>janach-fristablauf: die Frist ist keine Ausschlussfrist
zaehlungUmlaufZwischenstandja

UmlaufRuecklaufZeile

FeldTypPflichtBeschreibung
personIdstring(uuid)ja
namestringjaAnzeigename der Eigentümer-Person
stimmgewichtstringjaStimmgewicht als Integer-String
antwortstring | nulljaja | nein | enthaltung; null ⇒ noch keine Antwort
eingegangenAmstring(date) | nullja
eingangskanalstring | nulljaportal | email | post | sonstiges
textformBestaetigtbooleanja
notizstring | nulljaFreitext der Erfassung; null ⇒ keine Notiz

UmlaufStandResponse

FeldTypPflichtBeschreibung
vorgangUmlaufVorgangja
ruecklaufarray<UmlaufRuecklaufZeile>janach Name
zaehlungUmlaufZaehlungja
fristAbgelaufenbooleanja
feststellbarbooleanjawahr, wenn die Feststellung jetzt möglich ist
ausstehendarray<string(uuid)>jaPersonen ohne Antwort

UmlaufVerkuendenRequest

Verkündet den festgestellten Umlauf (einmalig) und hält Mitteilungsdatum und -form fest. Ohne Verkündung gibt es keinen Beschluss in der Sammlung. Auch ein nicht zustande gekommener Umlauf wird verkündet.

FeldTypPflichtBeschreibung
verkuendetAmstring(date)jaDatum der Verkündung; nicht vor dem Versammlungsdatum, nicht in der Zukunft
mitteilungFormtextform | briefjaForm der Mitteilung an die Eigentümer

UmlaufVerkuendungResponse

Typ: unbekannt

UmlaufVorgang

FeldTypPflichtBeschreibung
versammlungIdstring(uuid)ja
mehrheitsregelstringjaallstimmig | mehrheit_abgegebene
fristEndestring(date)ja
absenkungBeschlussIdstring(uuid) | nullja
eroeffnetAmstring(date)ja
festgestelltAmstring(date-time) | nullja
feststellungstring | nulljaangenommen | abgelehnt | nicht_zustande_gekommen; null ⇒ noch nicht festgestellt
mitteilungAmstring(date) | nullja
mitteilungFormstring | nulljatextform | brief

UmlaufZaehlung

Typ: unbekannt

UmlaufZwischenstand

FeldTypPflichtBeschreibung
stimmenJaintegerja
stimmenNeinintegerja
stimmenEnthaltungintegerja
anteileJastringjaSumme der Stimmgewichte als Integer-String
anteileNeinstringjaSumme der Stimmgewichte als Integer-String
anteileEnthaltungstringjaSumme der Stimmgewichte als Integer-String
ausstehendarray<string(uuid)>jaPersonen ohne Antwort
fristAbgelaufenbooleanja
feststellbarbooleanja

UstListeBefund

FeldTypPflichtBeschreibung
codesteuerschluessel_fehlt | satz_weicht_vom_konto_abja
kontoNrstringja
kontoBezeichnungstringja
seiteausgang | eingangja
satzProzentstring | nulljaGebuchter Satz; null bei fehlendem Steuerschlüssel.
kontoSatzProzentstring | nulljaSatz am Konto (Stammdatum); null, wenn dort nicht gepflegt.
bruttoCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
zeilenarray<string>jaKennungen der betroffenen Buchungszeilen.
hinweisstringja

UstListeKontoSeite

FeldTypPflichtBeschreibung
kontoNrstringja
kontoBezeichnungstringja
seiteausgang | eingangja
herkunftvorgabe | deklariert | abgeleitetja

UstListePeriode

FeldTypPflichtBeschreibung
vonstring(date)ja
bisstring(date)ja
labelstringjaBeschriftung: "2024-03" (Monat), "2024-Q1" (Quartal), "2024" (Jahr).
umsatzsteuerCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
vorsteuerCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
zahllastCentsstringjaumsatzsteuer − vorsteuer; negativ = Erstattungsanspruch.
saetzearray<UstListeSatzSumme>ja

UstListeResponse

FeldTypPflichtBeschreibung
objektIdstring(uuid)ja
vonstring(date)ja
bisstring(date)ja
rhythmusmonat | quartal | jahrja
umsatzsteuerpflichtigbooleanjafalse ⇒ leere Liste; `hinweis` sagt warum.
hinweisstring | nullja"keine umsatzsteuerpflichtigen Umsätze" bei leerer Liste, sonst null.
umsatzsteuerCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
vorsteuerCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
zahllastCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
periodenarray<UstListePeriode>ja
befundearray<UstListeBefund>ja
zeilenarray<UstListeZeile> | nulljaDetail je Konto und Satz — null, wenn nicht angefordert (`jeKonto`); [] = angefordert und leer.
kontoSeitenarray<UstListeKontoSeite>jaWie die Seite jedes beteiligten Kontos aufgelöst wurde.

UstListeSatzSumme

FeldTypPflichtBeschreibung
seiteausgang | eingangja
satzProzentstringjaUSt-Satz in ganzen Prozent als String, z. B. "19".
nettoCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
ustCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
bruttoCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.

UstListeZeile

FeldTypPflichtBeschreibung
kontoNrstringja
kontoBezeichnungstringja
seiteausgang | eingangja
satzProzentstringjaUSt-Satz in ganzen Prozent als String, z. B. "19".
sollBruttoCentsstringjaΣ SOLL der Zeilen dieser Zelle, vorzeichenlos.
habenBruttoCentsstringjaΣ HABEN der Zeilen dieser Zelle, vorzeichenlos.
bruttoCentsstringjaSeitenrichtiges Brutto (ausgang: Haben−Soll, eingang: Soll−Haben) — kann negativ sein.
nettoCentsstringjaBemessungsgrundlage (Entgelt).
ustCentsstringjabrutto − netto: Umsatzsteuer (ausgang) bzw. abziehbare Vorsteuer (eingang).
buchungenintegerjaAnzahl der eingeflossenen Buchungszeilen.

VermoegensberichtAblageRequest

FeldTypPflichtBeschreibung
stichtagstring(date)jaDer Stichtag des Berichts, `YYYY-MM-DD`.
idempotenzSchluesselstringjaDer Ausschluss gegen den Doppel-Dispatch. Kommt vom AUFRUFER (BP §8), nie aus einer Uhr — sonst wäre ein Retry ein zweiter Stand.
auftragobjectjaDie Bestände, aus denen der Rechenkern den Bericht bildet — Form: Fachkern. OHNE `scope`.

VermoegensberichtAblageResponse

FeldTypPflichtBeschreibung
standIdstring(uuid)ja
standNrintegerja
schluesselstringja
stichtagstring(date)ja
konsistentbooleanjaABGELEITET aus den Befunden des Kerns, nie neu entschieden.
readinessBefundearray<VermoegensberichtReadinessBefund>ja
konsistenzBefundearray<VermoegensberichtKonsistenzBefund>ja

VermoegensberichtKonsistenzBefund

FeldTypPflichtBeschreibung
regelstringjaruecklage_bericht_gegen_konto · ruecklage_aktiv_gegen_passiv · forderung_/verbindlichkeit_gegen_jahresabrechnung.
positionstringjaDIE BENANNTE Position, z. B. `ruecklage:RL-998` — „inkonsistent" ohne Fundort ist keine Aussage.
differenzunbekanntja

VermoegensberichtReadinessBefund

FeldTypPflichtBeschreibung
regelstringjageldkonto_ohne_iban · geldkonto_ohne_bic · fremdsystem_kollision.
fundortstringjaWO der Befund sitzt, maschinenlesbar, z. B. `konto:K-giro`.
hinweisstringjaDer Satz für den Menschen — nennt den Mangel, nie einen Rohwert (BP §4).

VermoegensberichtStandListeneintrag

FeldTypPflichtBeschreibung
standIdstring(uuid)ja
propertyIdstring(uuid)ja
stichtagstring(date)jaDer Tag, zu dem der Bestand ausgewiesen ist.
standNrintegerjaDie VERSION je Objekt und Stichtag, `1`-basiert. Ältere Stände verschwinden nicht (GoBD).
schluesselstringjaDie Adresse aus `vermoegensberichtSchluessel` (Mandant × Objekt × Stichtag).
erstelltAmstring(date-time)jaDer Ausführungszeitpunkt der Ablage — NICHT Teil des Berichts.
konsistentbooleanjaDie AUSKUNFT des Checks, wie sie abgelegt wurde — hier nicht neu abgeleitet.
readinessBefundearray<VermoegensberichtReadinessBefund>ja
konsistenzBefundearray<VermoegensberichtKonsistenzBefund>ja

VermoegensberichtStandListResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
stichtagstring(date) | nulljaEcho des `?stichtag`-Filters; `null` heisst „alle Stichtage".
staendearray<VermoegensberichtStandListeneintrag>jaJüngster Stichtag zuerst, innerhalb dessen der aktuelle Stand vor seinen Vorgängern.

VermoegensberichtStandResponse

FeldTypPflichtBeschreibung
standIdstring(uuid)ja
propertyIdstring(uuid)ja
stichtagstring(date)jaDer Tag, zu dem der Bestand ausgewiesen ist.
standNrintegerjaDie VERSION je Objekt und Stichtag, `1`-basiert. Ältere Stände verschwinden nicht (GoBD).
schluesselstringjaDie Adresse aus `vermoegensberichtSchluessel` (Mandant × Objekt × Stichtag).
erstelltAmstring(date-time)jaDer Ausführungszeitpunkt der Ablage — NICHT Teil des Berichts.
konsistentbooleanjaDie AUSKUNFT des Checks, wie sie abgelegt wurde — hier nicht neu abgeleitet.
readinessBefundearray<VermoegensberichtReadinessBefund>ja
konsistenzBefundearray<VermoegensberichtKonsistenzBefund>ja
serialisatstringjaDer Bericht als byte-stabiler JSON-TEXT (#3006). Cent-Beträge stehen darin als Dezimaltext, nie als JSON-number.

Vermoegensuebersicht

FeldTypPflichtBeschreibung
stichtagstring(date)jaDer Tag, ZU DEM diese Aussage gilt — EINSCHLIESSLICH.
positionenarray<VermoegensuebersichtPosition>jaGeordnet: Seite (aktiva zuerst), Art, Kontonummer. Geldkonten stehen auch mit Saldo 0 darin, Personenkonten nur mit Saldo ≠ 0.
geldkontenCentsstringjaΣ der SIGNIERTEN Geldkonto-Salden (eine Überziehung mindert sie).
forderungenCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
verbindlichkeitenCentsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
guthabenCentsstringjaWas wir Mietern/Eigentümern schulden — getrennt ausgewiesen, weil es verrechnet und nicht bezahlt wird.
reinvermoegenCentsstringjaGeldkonten + offene Forderungen − offene Verbindlichkeiten. Die offenen Verbindlichkeiten sind beide Habenseiten der Personenkonten, einzeln ausgewiesen als `verbindlichkeitenCents` (Lieferanten) und `guthabenCents` (Mieter/Eigentümer).
sachkontenSaldoCentsstringjaΣ der SIGNIERTEN Sachkonten-Salden — die Gegenseite, die keine Position ist. Sie steht hier, weil sie die Rechnung überprüfbar macht.
currencystringja
bilanzgleichgewichtbooleanjaReinvermögen + Σ Sachkonten = 0 (Doppik). Wird AUSGEWIESEN statt erzwungen — eine Schieflage soll sichtbar sein, nicht die Antwort verhindern.

VermoegensuebersichtPosition

FeldTypPflichtBeschreibung
glAccountNostringja
namestringja
kontotypbank | debitor | kreditorjaSachkonten sind KEINE Positionen — sie sind die Gegenseite (s. `sachkontenSaldoCents`).
artgeldkonto | forderung | verbindlichkeit | guthabenjaBei Personenkonten die zum Stichtag ABGELEITETE Ausweisrichtung (ADR 0014, § 266 HGB) — ein Kreditorkonto im Soll ist ein DEBITORISCHER KREDITOR und damit `forderung`, nicht eine negative Verbindlichkeit.
seiteaktiva | passivaja
saldoCentsstringjaDer signierte Kontosaldo zum Stichtag (Soll − Haben).
saldoSeiteS | Hja
betragCentsstringjaDer vorzeichenlose Betrag, mit dem die Position in ihre Seite eingeht (`|saldo|`).

Versammlung

FeldTypPflichtBeschreibung
idstring(uuid)ja
propertyIdstring(uuid)ja
artstringjaordentlich | ausserordentlich | umlauf
statusstringjaentwurf | durchgefuehrt | abgeschlossen | abgesagt
versammlungsdatumstring(date)jabei Art umlauf: das Datum der Beschlussfassung
einladungsdatumstring(date) | nulljanull beim Umlaufbeschluss und wenn nicht erfasst
einladungsfristBegruendungstring | nullja
stimmprinzipstring | nulljakoepfe | mea | objekt; null beim Umlaufbeschluss (wird dort nicht geführt)
beschlussfaehigboolean | nulljanull beim Umlaufbeschluss (wird dort nicht geführt)
beschlussfaehigkeitNotizstring | nullja
verkuendetAmstring(date) | nullja
anfechtungsfristEndestring(date) | nulljanur mit verkuendetAm (Anfechtungsfrist § 45 WEG); sonst null
anfechtungsfristEndeRechnerischstring(date) | nulljarechnerisches Fristende nach § 188 Abs. 2 BGB, vor der Verschiebung auf einen Werktag; nur mit verkuendetAm, sonst null
anfechtungsfristHinweisstring | nulljaHinweis zur Fristberechnung (Feiertage nicht berücksichtigt); nur mit verkuendetAm, sonst null
beschluesseGeneriertAmstring(date-time) | nulljagesetzt ⇒ die Versammlung ist abgeschlossen und unveränderlich
createdAtstring(date-time)ja

VersammlungAendernRequest

Ändert eine Versammlung. art und propertyId sind nicht änderbar; ab beschluesse_generiert_am ist sie unveränderlich (409).

FeldTypPflichtBeschreibung
versammlungsdatumstring(date)nein
einladungsdatumstring(date) | nullnein
einladungsfristBegruendungstring | nullnein
stimmprinzipstringnein
beschlussfaehigbooleannein
beschlussfaehigkeitNotizstring | nullnein
statusstringneinnur entwurf → durchgefuehrt und entwurf|durchgefuehrt → abgesagt; abgeschlossen setzt allein „Beschlüsse generieren“

VersammlungAnlegenRequest

Legt eine Versammlung an. Unter 3 Wochen Einladungsfrist: Warnung (Hinweis) und Begründung Pflicht, aber keine Sperre. Der Umlaufbeschluss ist nur eine Art; die Abstimmung läuft nicht über casa.ai.

FeldTypPflichtBeschreibung
artstringjaordentlich | ausserordentlich | umlauf
versammlungsdatumstring(date)ja
einladungsdatumstring(date)neinnicht beim Umlaufbeschluss; ohne Angabe ⇒ Hinweis einladung-nicht-erfasst
einladungsfristBegruendungstringneinPflicht, wenn die Einladung weniger als 3 Wochen vor der Versammlung liegt
stimmprinzipstringneinkoepfe (Default) | mea | objekt; nicht beim Umlaufbeschluss
beschlussfaehigbooleanneinDefault true; nicht beim Umlaufbeschluss
beschlussfaehigkeitNotizstringnein

VersammlungBeschluesseGenerierenRequest

Übernimmt die verkündeten Beschluss-TOPs in die Beschluss-Sammlung des Objekts (genau einmal). Leerer Body `{}`. Voraussetzung: verkündet, mindestens ein Beschluss-TOP, jeder Beschluss-TOP hat ein Ergebnis. Geschäftsordnungs- und Notiz-TOPs werden nicht übernommen.

FeldTypPflichtBeschreibung

VersammlungBeschluesseGenerierenResponse

FeldTypPflichtBeschreibung
versammlungIdstring(uuid)ja
propertyIdstring(uuid)ja
beschluessearray<object>jaübernommene Beschlüsse in TOP-Reihenfolge
uebersprungenarray<object>janicht übernommene TOPs (Geschäftsordnung, Notiz) mit Grund
anzahlintegerjaAnzahl übernommener Beschlüsse

VersammlungDetail

Die Beschlussfähigkeit wird nicht berechnet: `beschlussfaehig` bleibt wie gespeichert (Änderung über PATCH /api/versammlung/{id}).

Typ: unbekannt

VersammlungHinweis

FeldTypPflichtBeschreibung
codestringjaeinladungsfrist-unterschritten | einladung-nicht-erfasst
textstringja
istTageintegerneinIst-Tage zwischen Einladung und Versammlung (nur bei Unterschreitung)

VersammlungListResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
versammlungenarray<Versammlung>ja

VersammlungSchreibResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
propertyIdstring(uuid)ja
artstringja
statusstringja
versammlungsdatumstring(date)ja
einladungsdatumstring(date) | nullja
hinweisearray<VersammlungHinweis>ja

VersammlungTeilnehmer

FeldTypPflichtBeschreibung
idstring(uuid)ja
personIdstring(uuid)ja
personNamestringjaAnzeigename aus dem Personenstamm (personenbezogen)
personTypestringjaPersonenart aus dem Personenstamm
anwesenheitstringjapraesent | online | vertreten
stimmgewichtintegerjakoepfe: 1; mea: Zehntausendstel; objekt: Anzahl der Einheiten
vertretenDurchstring | nulljaFreitext (personenbezogen)

VersammlungTeilnehmerErfassenRequest

Setzt den Teilnehmer (Upsert je Person: erneutes Setzen überschreibt). Ein Entfernen gibt es nicht; wer nicht erschienen ist, wird nicht erfasst. Ob die Person Eigentümer ist, prüft casa.ai nicht (Gäste, Vertreter, Verwalter sind Teilnehmer). Umlaufbeschluss ⇒ umlauf-ohne-teilnehmer.

FeldTypPflichtBeschreibung
personIdstring(uuid)ja
anwesenheitstringjapraesent | online | vertreten
stimmgewichtintegerneinkoepfe: nur 1 (Default); mea: Zehntausendstel (> 0, Pflicht); objekt: Anzahl der Einheiten (> 0, Pflicht)
vertretenDurchstringnein

VersammlungTeilnehmerSchreibResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
versammlungIdstring(uuid)ja
personIdstring(uuid)ja
anwesenheitstringja
stimmgewichtintegerja
angelegtbooleanjatrue: neu erfasst; false: die bestehende Zeile dieser Person wurde überschrieben

VersammlungTop

FeldTypPflichtBeschreibung
idstring(uuid)ja
lfdNrintegerjalaufende TOP-Nummer ab 1, je Versammlung eindeutig; die Reihenfolge ändert sich nie
bezeichnungstringja
topArtstringjabeschluss | geschaeftsordnung | notiz
beschlusstextstring | nullja
kategoriestring | nullja
ergebnisstring | nulljaangenommen | abgelehnt; null = noch nicht erfasst (und bei Nicht-Beschluss-TOPs immer)
stimmenJainteger | nulljaKöpfe; null = nicht genannt
stimmenNeininteger | nullja
stimmenEnthaltunginteger | nullja
anteileJainteger | nulljaAnteile in Zehntausendsteln; null = nicht genannt
anteileNeininteger | nullja
anteileEnthaltunginteger | nullja

VersammlungTopAendernRequest

Ändert Text und Art eines TOP; die laufende Nummer (Reihenfolge) ist nicht änderbar.

FeldTypPflichtBeschreibung
bezeichnungstringnein
topArtstringnein
beschlusstextstring | nullnein
kategoriestring | nullnein

VersammlungTopErfassenRequest

Erfasst einen TOP. Beim Umlaufbeschluss genau ein TOP (umlauf-genau-ein-top). Abgeschlossene Versammlung ⇒ 409.

FeldTypPflichtBeschreibung
bezeichnungstringja
topArtstringneinbeschluss (Default) | geschaeftsordnung | notiz
beschlusstextstringnein
kategoriestringnein
lfdNrintegerneinnur wenn ausdrücklich gewünscht; ohne Angabe vergibt der Server die nächste freie Nummer. Vergeben ⇒ 409

VersammlungTopErgebnisRequest

Setzt Feststellung und Zahlen EINES Beschluss-TOP; erneutes Setzen überschreibt (nicht genannte Zahlen werden null), solange die Versammlung nicht abgeschlossen ist. Geschäftsordnungs- und Notiz-TOPs ⇒ top-ohne-abstimmung. Beim Umlaufbeschluss sind die Zahlen optional, die Feststellung ist Pflicht.

FeldTypPflichtBeschreibung
ergebnisstringjaangenommen | abgelehnt — die Feststellung; sie wird nie aus den Zahlen abgeleitet
stimmenJaintegerneinKöpfe, ganze Zahl >= 0; nicht genannt ⇒ null
stimmenNeinintegernein
stimmenEnthaltungintegernein
anteileJaintegerneinAnteile in Zehntausendsteln, ganze Zahl >= 0; nicht genannt ⇒ null
anteileNeinintegernein
anteileEnthaltungintegernein

VersammlungTopErgebnisResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
versammlungIdstring(uuid)ja
lfdNrintegerja
ergebnisstringja
stimmenJainteger | nullja
stimmenNeininteger | nullja
stimmenEnthaltunginteger | nullja
anteileJainteger | nullja
anteileNeininteger | nullja
anteileEnthaltunginteger | nullja
hinweisearray<VersammlungHinweis>jaergebnis-widerspricht-zahlen: angenommen bei mehr Nein- als Ja-Stimmen — gespeichert wird trotzdem wie festgestellt

VersammlungTopSchreibResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
versammlungIdstring(uuid)ja
lfdNrintegerja
bezeichnungstringja
topArtstringja

VersammlungVerkuendenRequest

Verkündet die Versammlung (setzt verkuendet_am EINMAL). Voraussetzung: Status durchgefuehrt, mindestens ein Beschluss-TOP, jeder Beschluss-TOP hat ein Ergebnis. Zweites Verkünden ⇒ 409 bereits-verkuendet.

FeldTypPflichtBeschreibung
verkuendetAmstring(date)jaDatum der Verkündung; nicht vor dem Versammlungsdatum, nicht in der Zukunft

VersammlungVerkuendungResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
propertyIdstring(uuid)ja
artstringja
statusstringja
versammlungsdatumstring(date)ja
verkuendetAmstring(date)ja
anfechtungsfristEndestring(date)jaEnde der Anfechtungsfrist: ein Monat ab Verkündung (§ 45 WEG), auf einen Werktag verschoben; berechnet, nicht gespeichert
anfechtungsfristEndeRechnerischstring(date)jarechnerisches Fristende nach § 188 Abs. 2 BGB, vor der Verschiebung
anfechtungsfristHinweisstringjaFeiertage sind nicht berücksichtigt

VersionResponse

FeldTypPflichtBeschreibung
buildIdstringja

Vertrag

FeldTypPflichtBeschreibung
idstring(uuid)ja
propertyIdstring(uuid)ja
propertyNostring | nulljaObjektnummer des Elternobjekts (LEFT JOIN)
contractNostringjaOrdnungsnummer ohne erzwungene Eindeutigkeit (s. #416); Identität ist id
startDatestring(date) | nulljaBeginn (inklusiv); null ⇒ unbegrenzt in die Vergangenheit
endDatestring(date) | nulljaEnde (exklusiv); null ⇒ laufend
endReasonstring | nullja
depositCentsstring | nulljaKaution in Cents als Ziffern-String (dokumentarisch in 1.0, GG3)
depositCurrencystring | nullja
archivedAtstring(date-time) | nulljaANDERE Achse als endDate (K5)
createdAtstring(date-time)ja
termsarray<VertragTerm>janur im Detail (GET /{id}) gefüllt; in der Liste leer

VertragCreatePayment

FeldTypPflichtBeschreibung
componentIdstring(uuid)jamuss existieren und aktiv sein (Prüfung im Tool-Layer)
amountCentsinteger | stringjaBetrag in Cents, GANZZAHLIG (kein Float): ganze Zahl ODER Ziffern-String
currencystringja

VertragCreateRequest

Legt ein Mietverhältnis samt initialer Konditionen-Zeitscheibe (Kaltmiete) + optionalen Zahlungen an. Objekt muss aktiv sein.

FeldTypPflichtBeschreibung
propertyIdstring(uuid)jadas Objekt; MUSS aktiv sein (sonst 404)
contractNostringja
startDatestring(date)neinVertragsbeginn = untere Grenze der initialen Zeitscheibe; ohne Angabe unbegrenzt
mieterPersonIdstring(uuid)jadie MIETPARTEI des Vertrags — PFLICHT seit #1965 (wortgleich zu MieterwechselRequest, dieselbe Fachregel). Muss eine aktive Person dieses Mandanten sein (unbekannt, mandantenfremd oder archiviert ⇒ 404, ununterscheidbar). Die party_roles-Zeile entsteht in DERSELBEN Transaktion wie der Vertrag.
kaltmieteCentsinteger | stringjaKaltmiete in Cents, GANZZAHLIG (GG3/K4)
currencystringja
ustOptionbooleannein
ustRateintegerneinUSt-Satz in ganzen Prozent, nur bei ustOption true; ohne Angabe bei Option 19. Angeboten wird heute nur 19 (#5988).
dueRulemonatserster | monatsdritter-werktag | quartalsbeginn | fester-tagneinFälligkeitsregel (geschlossenes Vokabular): monatserster = fällig am 1. des Monats, monatsdritter-werktag = 3. Werktag (§ 556b BGB, braucht das Bundesland des Objekts), quartalsbeginn = 1. Tag des Quartals, fester-tag = am Tag dueDay des Monats (in kürzeren Monaten der Monatsletzte; braucht dueDay).
dueDayintegerneinFälligkeitstag 1–31 der Regel fester-tag (in kürzeren Monaten der Monatsletzte). Gesetzt GENAU bei dueRule = fester-tag — fester-tag ohne Tag und ein Tag an einer anderen Regel werden abgewiesen.
paymentMethodstringnein
mahnsperrebooleannein
depositCentsinteger | stringneinvereinbarte Kaution in Cents; depositCurrency dann Pflicht. Ohne Kautionsabrede dokumentarisch (nie sollgestellt)
depositCurrencystringnein
kautionAnlageformbarkaution | buergschaft | verpfaendungneinKautionsabrede (#5178): Anlageform der Sicherheit; setzt depositCents voraus
kautionRatenintegerneinRaten nach § 551 Abs. 2 BGB (1…3) — Pflicht bei barkaution, sonst verboten (400)
kautionAnlagekontoIdstring(uuid)neingetrennte Anlage: Bankverbindung der Kontoart kautionskonto am Objekt (nur barkaution; unbekannt/fremd ⇒ 404)
paymentsarray<VertragCreatePayment>nein
sourceSystemstring | nullnein
sourceRefstring | nullnein

VertragEndRequest

FeldTypPflichtBeschreibung
endDatestring(date)jaTag, ab dem der Vertrag NICHT mehr gilt (exklusive obere Grenze der Zeitscheiben)
endReasonstring | nullneinGrund der Beendigung (optional)

VertragEndResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
endDatestring(date)ja
endReasonstring | nullja
closedTermIdsarray<string(uuid)>jadie IDs der durch diesen Aufruf geschlossenen Konditionen-Zeitscheiben
alreadyEndedbooleanjatrue ⇒ der Vertrag war bereits beendet; `endDate` = URSPRÜNGLICHES Ende.

VertragKuendigenRequest

FeldTypPflichtBeschreibung
zugangstring(date)jaTag des Zugangs der Kündigung
kuendigendermieter | vermieterjaWer kündigt (mieter | vermieter).
vereinbartesEndestring(date)neinabweichend vereinbartes Vertragsende (LETZTER Tag, einschliesslich), z. B. aus einem Aufhebungsvertrag; fehlt es, gilt der Vorschlag

VertragKuendigenResponse

FeldTypPflichtBeschreibung
contractIdstring(uuid)ja
zugangstring(date)ja
kuendigendermieter | vermieterjaWer kündigt (mieter | vermieter).
vorschlagVertragKuendigenVorschlagja
vertragsendestring(date)jadas WIRKSAME Vertragsende (letzter Tag, einschliesslich)
endDatestring(date)javertragsende + 1 Tag — das exklusive Ende am Vertrag (wie endDate bei /end)
abweichendVereinbartbooleanjatrue ⇒ vereinbartesEnde war gesetzt UND weicht vom Vorschlag ab
alreadyEndedbooleanjatrue ⇒ der Vertrag war bereits beendet; nichts geschrieben, vertragsende/endDate = BESTEHENDES Ende

VertragKuendigenVorschlag

FeldTypPflichtBeschreibung
vertragsendestring(date) | nulljaerrechnetes Vertragsende nach § 573c BGB — LETZTER Tag (einschliesslich), immer ein Monatsletzter; null ⇒ nicht berechnet (nur im No-op eines anders beendeten Vertrags ohne § 573c-Stammdaten)
fristMonateinteger | nulljaangewandte Frist in Monaten (Mieter 3; Vermieter 3/6/9 nach 0/5/8 Jahren Überlassung); null ⇒ nicht berechnet
karenzGewahrtboolean | nulljatrue ⇒ Zugang spätestens am dritten Werktag des Monats (Samstag zählt mit, BGH VIII ZR 206/04; fällt der dritte Werktag auf einen Samstag, endet die Karenz am nächsten Werktag, § 193 BGB; Sonn- und Landesfeiertage zählen nicht); null ⇒ nicht berechnet

VertragKuendigungErfasst

FeldTypPflichtBeschreibung
zugangstring(date)jaTag des Zugangs der Kündigung
kuendigendermieter | vermieterjaWer kündigt (mieter | vermieter).
vorgeschlagenesEndestring(date)jader bei der Erfassung errechnete Vorschlag (letzter Tag, einschliesslich)
vertragsendestring(date)jadas WIRKSAME Vertragsende (letzter Tag, einschliesslich)
abweichendVereinbartbooleanjatrue ⇒ das wirksame Ende weicht vom Vorschlag ab („abweichend vereinbart", z. B. Aufhebungsvertrag)

VertragKuendigungResponse

FeldTypPflichtBeschreibung
contractIdstring(uuid)ja
vorschlagunbekanntja
kuendigungunbekanntja

VertragKuendigungsVorschlag

FeldTypPflichtBeschreibung
vertragsendestring(date)jaerrechnetes Vertragsende nach § 573c BGB — LETZTER Tag (einschliesslich), immer ein Monatsletzter
fristMonateintegerjaangewandte Frist in Monaten (Mieter 3; Vermieter 3/6/9 nach 0/5/8 Jahren Überlassung)
karenzGewahrtbooleanjatrue ⇒ Zugang spätestens am dritten Werktag des Monats (Samstag zählt mit, BGH VIII ZR 206/04; fällt der dritte Werktag auf einen Samstag, endet die Karenz am nächsten Werktag, § 193 BGB; Sonn- und Landesfeiertage zählen nicht)

VertragListResponse

FeldTypPflichtBeschreibung
statusalle | aktiv | beendetjader wirksame 3-Wege-GÜLTIGKEITS-Filter (gemessen an end_date). ACHTUNG: aktiv ∪ beendet ≠ alle.
asOfstring(date)jader wirksame Stichtag, gegen den aktiv/beendet gemessen wurde
vertraegearray<Vertrag>ja

VertragPersonen

FeldTypPflichtBeschreibung
idstring(uuid)ja
contractIdstring(uuid)ja
personCountintegerjaKopfzahl der Bewohner (Kinder wie Erwachsene), ganzzahlig ≥ 0. 0 = erfasster Leerstand.
validFromstring(date) | nulljaBeginn INKLUSIV; null ⇒ unbegrenzt in die Vergangenheit.
validTostring(date) | nulljaEnde EXKLUSIV (rohe daterange-Grenze); null ⇒ laufend.
validRangestringjaRohes daterange-Literal, z. B. [2025-01-01,).
activebooleanjaIst die Scheibe am Stichtag (asOf) wirksam (valid_range @> asOf)?
createdAtstring(date-time)ja

VertragPersonenListResponse

FeldTypPflichtBeschreibung
contractIdstring(uuid)ja
asOfstring(date)jader wirksame Stichtag, gegen den `active` je Scheibe gemessen wurde
personenarray<VertragPersonen>ja

VertragPersonenRemoveResponse

FeldTypPflichtBeschreibung
idstring(uuid)jaId der entfernten (stillgelegten, K5) Scheibe
contractIdstring(uuid)ja
predecessorIdstring(uuid)jaId der Vorgänger-Scheibe, die die Lücke wieder deckt
predecessorValidTostring(date) | nulljaletzter Gültigkeitstag der Vorgängerin nach dem Entfernen (EINSCHLIESSLICH) oder null (wieder laufend — die entfernte Scheibe war die letzte)

VertragPersonenSetRequest

Setzt/ändert eine Kopfzahl-Zeitscheibe „ab validFrom" (SCD-2: eine offene Vorgänger-Scheibe wird abgeschlossen). Beide Grenzen sind EINSCHLIESSLICH; Überschneidungen ⇒ 400.

FeldTypPflichtBeschreibung
personCountintegerjaKopfzahl, ganzzahlig ≥ 0 (0 ist eine ERFASSTE Aussage, nicht „unbekannt")
validFromstring(date)jaerster Tag, an dem die Kopfzahl gilt (EINSCHLIESSLICH) — das „ab" der Änderung
validTostring(date)neinletzter Tag, an dem sie gilt (EINSCHLIESSLICH); ohne Angabe laufend
sourceSystemstring | nullnein
sourceRefstring | nullnein

VertragPersonenSetResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
contractIdstring(uuid)ja
personCountintegerja
validFromstring(date)jaerster Gültigkeitstag (EINSCHLIESSLICH)
validTostring(date) | nulljaletzter Gültigkeitstag (EINSCHLIESSLICH) oder null (laufend)
supersededPriorSlicebooleanjatrue ⇒ eine zuvor offene Scheibe wurde an validFrom abgeschlossen (SCD-2).

VertragTerm

FeldTypPflichtBeschreibung
idstring(uuid)ja
kaltmieteCentsstring | nulljaKaltmiete in Cents als Ziffern-String (GG3)
currencystring | nullja
ustOptionboolean | nullja
ustRatestring | nulljaUSt-Satz der Scheibe in Prozent, Spaltenform mit zwei Nachkommastellen (z. B. `19.00`); null ohne USt-Option (#5988)
dueRulemonatserster | monatsdritter-werktag | quartalsbeginn | fester-tag | nulljaFälligkeitsregel (geschlossenes Vokabular): monatserster = fällig am 1. des Monats, monatsdritter-werktag = 3. Werktag (§ 556b BGB, braucht das Bundesland des Objekts), quartalsbeginn = 1. Tag des Quartals, fester-tag = am Tag dueDay des Monats (in kürzeren Monaten der Monatsletzte; braucht dueDay).
dueDayinteger | nulljaFälligkeitstag 1–31 der Regel fester-tag; null bei jeder anderen Regel
paymentMethodstring | nullja
mahnsperreboolean | nullja
validFromstring(date) | nulljainklusiv; null ⇒ unbegrenzt in die Vergangenheit
validTostring(date) | nulljaEXKLUSIV; null ⇒ offen (laufend)
validRangestringjadas rohe Postgres-daterange-Literal, z. B. `[2026-01-01,)`
archivedAtstring(date-time) | nullja
paymentsarray<VertragTermPayment>ja

VertragTermPayment

FeldTypPflichtBeschreibung
idstring(uuid)ja
componentIdstring(uuid)ja
componentNamestring | nulljaName der Komponente (LEFT JOIN); null, wenn die Kette reißt
amountCentsstring | nulljaBetrag in Cents als Ziffern-String (GG3: nie Float/number)
currencystring | nullja

VertragZahlungChangePayment

FeldTypPflichtBeschreibung
componentIdstring(uuid)jamuss existieren und aktiv sein (Prüfung im Tool-Layer)
amountCentsinteger | stringjaBetrag in Cents, GANZZAHLIG (kein Float): ganze Zahl ODER Ziffern-String
currencystringja

VertragZahlungChangeRequest

Konditionswechsel als Zeitscheibe (SCD-2). `ab` MUSS echt nach dem Beginn der offenen Scheibe liegen (sonst 400).

FeldTypPflichtBeschreibung
abstring(date)jaWirksamkeitstag: untere Grenze der neuen, exklusive obere Grenze der alten Scheibe
kaltmieteCentsinteger | stringjaneue Kaltmiete in Cents, GANZZAHLIG (GG3/K4)
currencystringja
ustOptionbooleannein
ustRateintegerneinUSt-Satz in ganzen Prozent, nur bei ustOption true; ohne Angabe bei Option 19. Angeboten wird heute nur 19 (#5988).
dueRulemonatserster | monatsdritter-werktag | quartalsbeginn | fester-tagneinFälligkeitsregel (geschlossenes Vokabular): monatserster = fällig am 1. des Monats, monatsdritter-werktag = 3. Werktag (§ 556b BGB, braucht das Bundesland des Objekts), quartalsbeginn = 1. Tag des Quartals, fester-tag = am Tag dueDay des Monats (in kürzeren Monaten der Monatsletzte; braucht dueDay).
dueDayintegerneinFälligkeitstag 1–31 der Regel fester-tag (in kürzeren Monaten der Monatsletzte). Gesetzt GENAU bei dueRule = fester-tag — fester-tag ohne Tag und ein Tag an einer anderen Regel werden abgewiesen.
paymentMethodstringnein
mahnsperrebooleannein
paymentsarray<VertragZahlungChangePayment>nein
sourceSystemstring | nullnein
sourceRefstring | nullnein

VertragZahlungChangeResponse

FeldTypPflichtBeschreibung
idstring(uuid)jader gewechselte Vertrag
abstring(date)ja
closedTermIdstring(uuid)jadie alte, nun auf `ab` geschlossene Scheibe
closedValidRangestringjadaterange der geschlossenen Scheibe
newTermIdstring(uuid)jadie neu geöffnete Scheibe
newValidRangestringjadaterange der neuen (offenen) Scheibe
kaltmieteCentsstringjaneue Kaltmiete in Cents als Ziffern-String (nie bigint an der Grenze, GG3)
currencystringja
paymentsarray<VertragZahlungChangeResultPayment>jadie vereinbarten Zahlungen der neuen Scheibe

VertragZahlungChangeResultPayment

FeldTypPflichtBeschreibung
idstring(uuid)ja
componentIdstring(uuid)ja
amountCentsstringjaBetrag in Cents als Ziffern-String (GG3: nie Float/number/bigint)
currencystringja

VzGegenrechnungResult

FeldTypPflichtBeschreibung
vzModussoll | istjaGegen WELCHE Vorauszahlungen gerechnet wurde: soll = sollgestellt (Default), ist = geleistet. Der Modus ist eine Option DES LAUFS, kein globaler Zustand.
vertraegearray<ContractOffset>ja
totalKostenBruttoErgebnisMoneyja
totalSollVzErgebnisMoneyja
totalIstVzunbekanntja
totalOffeneVzunbekanntja
totalNachforderungErgebnisMoneyja
totalGuthabenErgebnisMoneyja
istStichtagstring(date) | nulljaBis zu welchem WERTSTELLUNGSDATUM eine Zahlung als geleistet gilt; null im Modus soll.

WechselzeitraumBefund

FeldTypPflichtBeschreibung
ungeprueftKennungstringneinZeilen-Id der Basiszeile, deren Beginn unbekannt ist (nur bei beginn-unbekannt).
konfliktKennungstringneinZeilen-Id der überlappten bestehenden Zeile (nur bei ueberlappt).
lueckeVonstring(date)neinErster freier Tag der Lücke zum nächsten bestehenden Zeitraum (inklusive).
lueckeBisstring(date)neinLetzter freier Tag der Lücke (inklusive).

WechselzeitraumResponse

FeldTypPflichtBeschreibung
codeok | ueberlappt | zeitraum-verdreht | beginn-unbekannt | kein-personenkontoja
befundWechselzeitraumBefundja
artbewohner | eigentuemerja
basisBeginnstring(date) | nulljaBeginn der Basis (Eigentums- bzw. Vertrags-/Belegungsbeginn), inklusive; null = unbekannt.
anzahlZeilenintegerjaAnzahl der gelesenen Bestandszeilen der Einheit.

WirtschaftsplanAnlegenRequest

FeldTypPflichtBeschreibung
jahrintegerjaDas WIRTSCHAFTSJAHR des Plans.
positionenarray<WirtschaftsplanPosition>jaMindestens eine Position.
beginnstringneinNur bei einem Objekt mit GO-Vereinbarung (dann Pflicht): erster Tag, `YYYY-MM-DD`.
endestringneinNur bei einem Objekt mit GO-Vereinbarung (dann Pflicht): letzter Tag, `YYYY-MM-DD`.

WirtschaftsplanBefund

FeldTypPflichtBeschreibung
regelstringja
fundortstringja
meldungstringja

WirtschaftsplanBerechnung

FeldTypPflichtBeschreibung
gesamtplanWirtschaftsplanGesamtja
einzelplaenearray<WirtschaftsplanEinzelplan>ja
befundearray<WirtschaftsplanBefund>ja

WirtschaftsplanBeschliessenRequest

FeldTypPflichtBeschreibung
jahrintegerja
versionintegerjaDie zu beschließende Version; nur die höchste Version des Jahres, nur im Status entwurf.
beschlussRefstringjaReferenz `beschluss-gegenstand:<uuid>` aus `casa objekt beschluss list`; der Beschluss muss tragend sein.

WirtschaftsplanBeschliessenResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
jahrintegerja
versionintegerja
statusbeschlossenja
ausgangbeschlossen | bereits_beschlossenja
beschlussRefstringja
beschlussStatusstringja
abweichungsStufestring | nullja`null` bei `bereits_beschlossen`: nichts wurde neu geprüft.
befundearray<WirtschaftsplanBefund> | nullja
warnungenarray<WirtschaftsplanBefund> | nullja
fortgeltungbooleanjaWert von `wp_fortgeltung` am Teil-Gegenstand.

WirtschaftsplanDiff

FeldTypPflichtBeschreibung
vonVersionintegerja
nachVersionintegerja
zeilenarray<WirtschaftsplanDiffZeile>ja

WirtschaftsplanDiffZeile

FeldTypPflichtBeschreibung
kostenartstringja
artkosten | einnahme | ruecklagenzufuehrungjaPositionsart; das Vorzeichen trägt die Art, der Betrag ist immer > 0.
vorherunbekanntja
nachherunbekanntja

WirtschaftsplanEinzelplan

FeldTypPflichtBeschreibung
unitIdsarray<string(uuid)>ja
eigentuemerIdstringja
positionenarray<WirtschaftsplanEinzelposition>ja
jahresSollWirtschaftsplanGeldja
monatsHausgeldarray<WirtschaftsplanGeld>jaEin Betrag je Monat des Wirtschaftsjahres.

WirtschaftsplanEinzelposition

FeldTypPflichtBeschreibung
kostenartstringja
artkosten | einnahme | ruecklagenzufuehrungjaPositionsart; das Vorzeichen trägt die Art, der Betrag ist immer > 0.
betragWirtschaftsplanGeldja

WirtschaftsplanEntwurfRequest

FeldTypPflichtBeschreibung
jahrintegerja
positionenarray<WirtschaftsplanPosition>jaVOLLSTÄNDIGE Positionsliste der neuen Version — kein Teil-Patch.

WirtschaftsplanGeld

FeldTypPflichtBeschreibung
centsstringjaMinor-Units-Integer-STRING, vorzeichenbehaftet (z. B. "-125000"). Nie eine JSON-number.
currencyEURja

WirtschaftsplanGesamt

FeldTypPflichtBeschreibung
kostenWirtschaftsplanGeldja
einnahmenWirtschaftsplanGeldja
ruecklagenzufuehrungWirtschaftsplanGeldja
jahresSollWirtschaftsplanGeldja

WirtschaftsplanPosition

FeldTypPflichtBeschreibung
kostenartstringja
artkosten | einnahme | ruecklagenzufuehrungjaPositionsart; das Vorzeichen trägt die Art, der Betrag ist immer > 0.
betragWirtschaftsplanGeldja
verteilerschluesselstring | nullneinBei `kosten`/`einnahme` Pflicht, bei `ruecklagenzufuehrung` verboten.
ruecklageIdstring(uuid) | nullneinBei `ruecklagenzufuehrung` Pflicht, sonst verboten.

WirtschaftsplanStandResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
jahrintegerja
versionintegerja
statusentwurf | beschlossen | verworfenja
beginnstringja
endestringja
goReferenzstring | nullja
positionenarray<WirtschaftsplanPosition>ja
diffunbekanntja
berechnungunbekanntja
beschlussRefstring | nulljaReferenz `beschluss-gegenstand:<uuid>` des tragenden Beschlusses; `null`, solange die Version nicht beschlossen ist.
beschlussStatusstring | nulljaStatus, unter dem das Gate freigegeben hat; `null` ohne Bindung.
fortgeltungboolean | nulljaWert von `wp_fortgeltung` am Teil-Gegenstand: gilt der Plan für Folgejahre weiter? `null` ohne Bindung.

WirtschaftsplanUebernahmeRequest

FeldTypPflichtBeschreibung
jahrintegerjaDas Wirtschaftsjahr, für das fällig gestellt wird (bei Fortgeltung das Folgejahr des Plans).
geldkreisstringjaBewusst freier Text; der Fachkern urteilt über Geldkreise (hier: `weg_hausgeld`).

WirtschaftsplanUebernahmeResponse

FeldTypPflichtBeschreibung
ausgangausgefuehrt | bereits_ausgefuehrtja
schluesselstringjaDer Idempotenz-Schlüssel des Laufs, wie der Fachkern ihn gebildet hat.
geldkreisstringja
kontenkreisstringja
beschlussRefstringjaDie Rechtsgrundlage, wie die FREIGABE sie gemeldet hat — nie aus der Eingabe.
beschlussStatusstringja
positionenarray<HausgeldSollPosition>jaDie GESTELLTEN Positionen, Art `vorschuss`.
differenzVorschlaegearray<HausgeldDifferenzVorschlag>jaDie rückwirkenden Differenzen als VORSCHLAG — NICHT gebucht; leer statt fehlend.
warnungenarray<HausgeldBefund>ja
quelleeigener_plan | fortgeltungjaWoher der Plan kam: eigener beschlossener Plan des Jahres oder Fortgeltung eines früheren.
quelleJahrintegerjaDas Wirtschaftsjahr des Plans, aus dem die Positionen stammen.

WirtschaftsplanVersionenResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
jahrinteger | nulljaEcho des Filters `jahr`; `null` ohne Filter.
versionenarray<WirtschaftsplanVersionZeile>ja

WirtschaftsplanVersionResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
jahrintegerja
versionintegerja
statusentwurfja
positionenintegerjaAnzahl der gespeicherten Positionen.

WirtschaftsplanVersionZeile

FeldTypPflichtBeschreibung
jahrintegerja
versionintegerja
statusentwurf | beschlossen | verworfenja
beginnstringjaErster Tag des Plan-Zeitraums, `YYYY-MM-DD`.
endestringjaLetzter Tag des Plan-Zeitraums (inklusiv), `YYYY-MM-DD`.
goReferenzstring | nullja
positionenintegerja
jahresSollunbekanntja
angelegtAmstring(date-time)ja
beschlussRefstring | nulljaReferenz `beschluss-gegenstand:<uuid>` des tragenden Beschlusses; `null`, solange die Version nicht beschlossen ist.
beschlussStatusstring | nulljaStatus, unter dem das Gate freigegeben hat; `null` ohne Bindung.
fortgeltungboolean | nulljaWert von `wp_fortgeltung` am Teil-Gegenstand: gilt der Plan für Folgejahre weiter? `null` ohne Bindung.

WirtschaftsplanVerwerfenRequest

FeldTypPflichtBeschreibung
jahrintegerja
versionintegerjaDie zu verwerfende Version; nur ein Entwurf lässt sich verwerfen.

WirtschaftsplanVerwerfenResponse

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
jahrintegerja
versionintegerja
statusverworfenja

ZaehlerAbgelesenResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
zaehlerIdstring(uuid)ja
zaehlerstandstringjaKanonischer Stand, Skala 3.
abgelesenAmstring(date-time)ja
anlassturnus | wechsel | zwischenablesungja
verbrauchSeitVorablesungstring | nulljaVerbrauch seit dem zeitlichen Vorgänger; `null` bei der Erst-Ablesung.
plausibilitaetZaehlerPlausibilitaetja

ZaehlerAblesenRequest

FeldTypPflichtBeschreibung
readingstringjaZählerstand. Dezimal-String mit Punkt und höchstens 3 Nachkommastellen (z. B. `161.700`); ein Komma ist 400.
readAtstringjaAblesezeitpunkt, ISO-8601-Datum oder -Zeitpunkt; ein Kalendertag zählt als 00:00 UTC.
occasionturnus | wechsel | zwischenablesungjaAnlass (geschlossen). Die Zwischenablesung am Tag des Mieterwechsels ist Voraussetzung der Verbrauchs-Zuordnung je Vertrag.
sourcestringneinErhebungsart (`ablesung` · `schaetzung` · `portal`); Standard `ablesung`.
sourceSystemstring | nullneinQuellsystem eines Imports; systemseitige Werte sind verboten.
sourceRefstring | nullneinReferenz im Quellsystem.

ZaehlerAblesung

FeldTypPflichtBeschreibung
idstring(uuid)ja
zaehlerIdstring(uuid)ja
zaehlerstandstring | nulljanull bei defektem Bestand.
abgelesenAmstring(date-time) | nullja
quellestring | nullja
anlassstring | nullja
plausibilitaetstring | nullja
erfasstAmstring(date-time)ja

ZaehlerAblesungenResponse

FeldTypPflichtBeschreibung
zaehlerIdstring(uuid)ja
ablesungenarray<ZaehlerAblesung>ja

ZaehlerAendernRequest

FeldTypPflichtBeschreibung
meterTypestringnein
meterNostringnein
unitOfMeasurestringnein

ZaehlerAnlegenRequest

FeldTypPflichtBeschreibung
propertyIdstring(uuid)jaDas Objekt; nach der Anlage fest.
unitIdstring(uuid)neinDie Einheit (Standort); ohne Angabe ein Allgemein-Zähler. Nach der Anlage fest.
meterTypestringjaZählerart, z. B. `wasser_kalt`, `wasser_warm`, `waerme`, `strom`.
meterNostringneinFeste Zählernummer. Entweder eine feste Nummer ODER ein Nummernkreis (Präfix/Turnusjahr), nie beides (400). Ohne beides und ohne Turnusjahr bleibt die Nummer leer.
meterNoPrefixstringneinPräfix des Nummernkreises (Nummer = Präfix + dreistellig laufend). Entweder eine feste Nummer ODER ein Nummernkreis (Präfix/Turnusjahr), nie beides (400). Ohne beides und ohne Turnusjahr bleibt die Nummer leer.
turnusjahrintegerneinTurnusjahr des Vorgabe-Präfixes `KW|WW|HZ|ST-<Turnusjahr>-` (nur ohne Nummer und Präfix).
unitOfMeasurestringneinMaßeinheit, z. B. `m3`, `kwh`.
sourceSystemstring | nullneinQuellsystem eines Imports (z. B. `win-casa`); systemseitige Werte sind verboten.
sourceRefstring | nullneinReferenz im Quellsystem.

ZaehlerArchiviertResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
archiviertAmstring(date-time)ja
bereitsArchiviertbooleanjatrue ⇒ der Zähler war schon archiviert; nichts wurde geschrieben.

ZaehlerGespeichertResponse

FeldTypPflichtBeschreibung
idstring(uuid)ja
objektIdstring(uuid)ja
einheitIdstring(uuid) | nullja
zaehlerartstringja
zaehlernummerstring | nulljaDie vergebene Nummer, auch wenn sie aus dem Nummernkreis stammt.
masseinheitstring | nullja
ersetztZaehlerIdstring(uuid) | nullja

ZaehlerGetauschtResponse

FeldTypPflichtBeschreibung
altZaehlerIdstring(uuid)ja
neuZaehlerIdstring(uuid)ja
endstandAblesungIdstring(uuid)ja
anfangsstandAblesungIdstring(uuid)ja
endstandstringja
anfangsstandstringja
abgelesenAmstring(date-time)ja
altArchiviertAmstring(date-time)ja

ZaehlerListeResponse

FeldTypPflichtBeschreibung
zaehlerarray<ZaehlerZeile>ja

ZaehlerPflichtResponse

FeldTypPflichtBeschreibung
objektIdstring(uuid)ja
zaehlerartstringja
anzahlWohneinheitenintegerjaAktive Einheiten der Art wohnung; Gewerbe zählt nicht mit.
pflichtja | nein | ausnahme | nicht-heizkostenvja
ausnahmeGrundunwirtschaftlich | pauschal-wechselnd-belegt | nulljaGrund der Objekt-Option `zaehler.erfassungspflicht_ausnahme`; die Begründung bleibt im Objekt.
hinweisearray<unter-schwelle | kaltwasser-nicht-zwingend | ausnahme-begruendungspflicht | gewerbe-nicht-gezaehlt>ja
blockiertfalsejaImmer false: die Prüfung ist ein Hinweis und sperrt nichts.

ZaehlerPlausibilitaet

FeldTypPflichtBeschreibung
statusok | warnungja
warnungenarray<ZaehlerPlausibilitaetMeldung>ja
hinweisearray<ZaehlerPlausibilitaetMeldung>ja

ZaehlerPlausibilitaetMeldung

FeldTypPflichtBeschreibung
codeVERBRAUCH_NULL | AUSREISSER | ABLESEFENSTERja
messagestringja
basisvorjahr | letzter_standneinNur AUSREISSER: Grundlage des Urteils.

ZaehlerSammelanlageEinheit

FeldTypPflichtBeschreibung
einheitIdstring(uuid)ja
zaehlerIdstring(uuid)ja
statusangelegt | vorhandenja`vorhanden`: die Einheit hatte schon einen aktiven Zähler dieser Art.
zaehlernummerstring | nullja

ZaehlerSammelanlageRequest

FeldTypPflichtBeschreibung
propertyIdstring(uuid)ja
meterTypestringja
unitOfMeasurestringnein
meterNoPrefixstringnein
turnusjahrintegernein
sourceSystemstring | nullneinQuellsystem eines Imports (z. B. `win-casa`); systemseitige Werte sind verboten.
sourceRefstring | nullneinReferenz im Quellsystem.
einheitenarray<object>jaHöchstens 500 Einheiten, jede nur einmal; je Einheit optional eine eigene Nummer (nie zusammen mit einem Nummernkreis).

ZaehlerSammelanlageResponse

FeldTypPflichtBeschreibung
objektIdstring(uuid)ja
zaehlerartstringja
angelegtintegerja
vorhandenintegerja
einheitenarray<ZaehlerSammelanlageEinheit>ja

ZaehlerTauschRequest

FeldTypPflichtBeschreibung
readAtstringjaZeitpunkt des Tauschs, ISO-8601-Datum oder -Zeitpunkt (Kalendertag = 00:00 UTC).
endReadingstringjaEndstand des Altzählers. Dezimal-String mit Punkt und höchstens 3 Nachkommastellen (z. B. `161.700`); ein Komma ist 400.
startReadingstringneinAnfangsstand des Neuzählers; Standard `0.000`. Dezimal-String mit Punkt und höchstens 3 Nachkommastellen (z. B. `161.700`); ein Komma ist 400.
newMeterNostringneinZählernummer des Neugeräts.
meterTypestringneinArt des Neugeräts; Standard die des Altzählers.
unitOfMeasurestringneinMaßeinheit des Neugeräts; Standard die des Altzählers.
sourceSystemstring | nullneinQuellsystem eines Imports; systemseitige Werte sind verboten.
sourceRefstring | nullneinReferenz im Quellsystem.

ZaehlerVerbrauchEinheit

FeldTypPflichtBeschreibung
einheitIdstring(uuid) | nullja
einheitNrstring | nullja
zaehlerartstringja
masseinheitstring | nullja
verbrauchstring | nulljaSumme der vollständigen Segmente; null, wenn kein Segment vollständig ist.
vollstaendigbooleanjatrue NUR, wenn JEDES beteiligte Segment vollständig ist.
zaehlerIdsarray<string(uuid)>ja

ZaehlerVerbrauchResponse

FeldTypPflichtBeschreibung
objektIdstring(uuid)ja
vonstring(date)ja
bisstring(date)ja
vollstaendigbooleanjafalse, sobald irgendein Segment eine Grenze nicht hat (siehe `fehlend` je Zähler).
zaehlerarray<ZaehlerVerbrauchZaehler>ja
einheitenarray<ZaehlerVerbrauchEinheit>ja

ZaehlerVerbrauchZaehler

FeldTypPflichtBeschreibung
zaehlerIdstring(uuid)ja
einheitIdstring(uuid) | nullja
einheitNrstring | nullja
zaehlerartstringja
zaehlernummerstring | nullja
masseinheitstring | nullja
ersetztZaehlerIdstring(uuid) | nullja
anfangsstandobject | nullja
endstandobject | nullja
verbrauchstring | nulljanull, solange eine Grenze fehlt.
vollstaendigbooleanja
fehlendarray<anfangsstand | endstand>jaEhrlicher Fehlbestand — nie interpoliert.

ZaehlerZeile

FeldTypPflichtBeschreibung
idstring(uuid)ja
objektIdstring(uuid)ja
einheitIdstring(uuid) | nulljanull ⇒ Allgemein-Zähler des Objekts.
einheitNrstring | nulljaEinheitsnummer; null bei Allgemein-Zählern.
zaehlerartstringja
zaehlernummerstring | nullja
masseinheitstring | nullja
ersetztZaehlerIdstring(uuid) | nulljaVorgänger bei Zählertausch; null ⇒ kein Tausch.
archiviertAmstring(date-time) | nulljanull ⇒ aktiv.
angelegtAmstring(date-time)ja

ZaehlerZwischenstandResponse

FeldTypPflichtBeschreibung
zaehlerIdstring(uuid)ja
stichtagstring(date)ja
artvorschlag | kein-vorschlagja
zaehlerstandstring | nulljaDer vorgeschlagene Stand; null bei `kein-vorschlag`. Ein VORSCHLAG, nie ein gebuchter Wert.
vorherunbekanntja
nachherunbekanntja
tageunbekanntja
codestand-vorhanden | kein-vorher-wert | kein-nachher-wert | stand-faellt | luecke-zu-lang | nulljaWarum es keinen Vorschlag gibt; null bei `vorschlag`.
begruendungstringjaKlartext: wie der Vorschlag entstand bzw. warum keiner entsteht.
gebuchtfalsejaImmer false: der Vorschlag wird nicht gebucht und ist nie ein Wert des Abrechnungslaufs.

ZaehlerZwischenstandStand

FeldTypPflichtBeschreibung
abgelesenAmstring(date)ja
zaehlerstandstringjaDezimal-STRING mit Punkt, Skala 3 (z. B. "161.700"). Nie eine JSON-number.

ZaehlerZwischenstandTage

FeldTypPflichtBeschreibung
lueckeintegerjaKalendertage zwischen dem Stand davor und dem Stand danach.
bisStichtagintegerjaKalendertage zwischen dem Stand davor und dem Stichtag.

ZeiteintraegeResponse

FeldTypPflichtBeschreibung
eintraegearray<Zeiteintrag>ja

Zeiteintrag

FeldTypPflichtBeschreibung
idstring(uuid)ja
propertyIdstring(uuid)ja
bezugArtobjekt | anliegen | sonderleistungja
bezugIdstring(uuid) | nullja
taetigkeitsarttelefonat | aussendienst | schriftverkehr | versammlung | verwaltung | sonstigesja
quelletimer | manuellja
leistungsdatumstring(date)ja
beginnstring(date-time) | nulljaNur Timer.
endestring(date-time) | nulljanull ⇒ der Timer läuft noch (oder manueller Eintrag).
dauerMinuteninteger | nulljanull ⇒ der Timer läuft noch.
notizstring | nullja
storniertAmstring(date-time) | nullja
stornoGrundstring | nullja
createdAtstring(date-time)ja

ZeitErfasstResponse

FeldTypPflichtBeschreibung
zeitIdstring(uuid)ja
dauerMinutenintegerja
leistungsdatumstring(date)ja
hinweisearray<ZeitHinweis>ja

ZeitGestartetResponse

FeldTypPflichtBeschreibung
zeitIdstring(uuid)ja
beginnstring(date-time)ja
leistungsdatumstring(date)ja
hinweisearray<ZeitHinweis>ja

ZeitGestopptResponse

FeldTypPflichtBeschreibung
zeitIdstring(uuid)ja
endestring(date-time)ja
dauerMinutenintegerja
hinweisearray<ZeitHinweis>ja

ZeitHinweis

FeldTypPflichtBeschreibung
codestringja
timerIdsarray<string(uuid)>neinNur bei `timer-an-anderem-objekt`: die laufenden Timer an anderen Objekten.

ZeitLaufendResponse

FeldTypPflichtBeschreibung
timerarray<Zeiteintrag>ja

ZeitStorniertResponse

FeldTypPflichtBeschreibung
zeitIdstring(uuid)ja
stornierttrueja