{"openapi":"3.1.0","info":{"title":"Datenbrücke API","version":"1.0.0","summary":"Lesender Zugriff auf die Auswertungen der DATEV-Buchhaltung deiner Mandanten.","description":"Dieselben Werkzeuge wie der KI-Konnektor (MCP), als REST-Endpunkte. Jede Antwort ist auf die Mandanten des angemeldeten Nutzers beschränkt (Daten-Sicht der Datenbrücke), nichts wird geschrieben.\n\n**Zugang:** OAuth 2.1 (Authorization Code + PKCE, Clerk) oder ein persönlicher API-Schlüssel `dbk_…` aus dem Bereich „KI-Konnektor & API“ — beide als `Authorization: Bearer …`.\n\n**Antwort:** `{ ok, columns, rows, meta }`. Standard `format=arrays`: `rows` sind Arrays in der Reihenfolge von `columns`. `format=objects`: `rows` sind Objekte `{ spalte: wert }` — für Power Query, Skripte, Codegen; `columns` kommt in beiden Formen mit. GET mit Query-Parametern oder POST mit JSON-Body, gleiche Felder.\n\n**Paging:** `top` = Seitengröße, `offset` = Zeilen überspringen (bei allen Listen-Endpunkten). `meta.truncated = true` heißt: es gibt mehr — nächste Seite mit `offset = offset + top`. Höchstens 500 Zeilen je Aufruf, je Endpunkt teils weniger (Maximum von `top`). Beim Durchblättern langer Listen zählt das Rate-Limit: 60 Aufrufe je Person und Minute, 300 je Organisation — bei 429 die Sekunden aus `Retry-After` warten.\n\n**Filter:** Feste, benannte Parameter statt Operatoren: `<feld>_von`/`<feld>_bis` = Bereich, beide Grenzen inklusive (Datum als YYYY-MM-DD, Kontonummern als Zahl); `<feld>_min` = Schwelle (≥, Beträge als Absolutwert in EUR); exakte Werte unter dem Feldnamen selbst (`kundennummer`, `lieferantennummer`, `konto`). Kontonummern werden auf 8 Stellen normalisiert: Einzelwert und Untergrenze rechts mit Nullen (1460 → 14600000, 4000 → 40000000), Obergrenze rechts mit Neunen (4999 → 49999999). Unbekannte Parameter ergeben 400.\n\n**Daten:** Nächtlicher Abzug der DATEV-Buchhaltung; `meta.datenstand` nennt Jahr und letzten Monat der Quelle. BWA-Zeilen sind kundenindividuell (Nummer und Name vergibt jeder Kunde selbst); mandantenübergreifend vergleichbar ist die Bilanz über ihre Kennzahl-Labels (`/bilanz` mit `monat` oder `label`). Kostenstellen: nur die Struktur, keine Werte — Werte sind geplant.\n\n**Zeit:** `tage_ueberfaellig` und `ueberfaellig` rechnen gegen das Datum zum Abfragezeitpunkt (Serverzeit UTC), nicht gegen den Datenstand — seit dem Nachtlauf bezahlte Posten erscheinen bis zum nächsten Abzug als offen.\n\n**Rechte:** Jede Antwort ist auf die Mandanten der angemeldeten Person beschränkt (Daten-Sicht der Datenbrücke); Kostenstellen-Einschränkungen sperren die API ganz. Kunden-/Lieferantennamen sind enthalten, sofern die Organisation sie freigibt; Buchungs- und Belegtexte nie. Nichts wird geschrieben.\n\n**404** (`unbekanntes_tool`) gibt es nur für Pfade, die nicht in dieser Spec stehen — deshalb an keiner Operation deklariert.\n\nReferenz mit Beispielen je Parameter: `/api/v1/docs`.","contact":{"name":"Datenbrücke","url":"https://www.datenbruecke.com"}},"externalDocs":{"description":"Hilfe zum Konnektor und zur API","url":"https://mcp.datenbruecke.com/hilfe"},"servers":[{"url":"https://mcp.datenbruecke.com"}],"tags":[{"name":"Datenbrücke","description":"Die 16 Fähigkeiten (GET) — für Toolgeneratoren die vollständige Liste."},{"name":"Alternative Aufrufform","description":"Dieselben Fähigkeiten als POST mit JSON-Body. Für Toolgeneratoren ausblenden (x-datenbruecke-alternative)."}],"paths":{"/api/v1/mandanten":{"get":{"operationId":"list_mandanten","summary":"Mandanten auflisten","description":"Alle Mandanten (Firmen), die der Aufrufer sehen darf — als Einstieg für jeden anderen Endpunkt. Eingeschränkte Nutzer sehen nur ihre freigegebenen Mandanten; ohne Freigabe kommt eine leere Liste.","tags":["Datenbrücke"],"parameters":[{"name":"format","in":"query","required":false,"description":"Antwortformat: arrays (Standard, rows als Arrays in Spaltenreihenfolge) oder objects (rows als Objekte { spalte: wert }).","schema":{"type":"string","enum":["arrays","objects"],"default":"arrays"}}],"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MandantenAntwort"},"examples":{"arrays":{"summary":"format=arrays (Standard): rows als Arrays in der Reihenfolge von columns","value":{"ok":true,"columns":["mandant_id","mandant_name","mandant_nummer","kontenrahmen","kontenlaenge"],"rows":[["bed9e862-2525-44a2-a12c-b40fbecb63b9","Musterküchen GmbH","55039","4","4"]],"meta":{"tool":"list_mandanten","rowCount":1,"truncated":false,"postfilterEntfernt":0,"demo":true}}},"objects":{"summary":"format=objects: rows als Objekte","value":{"ok":true,"columns":["mandant_id","mandant_name","mandant_nummer","kontenrahmen","kontenlaenge"],"rows":[{"mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","mandant_name":"Musterküchen GmbH","mandant_nummer":"55039","kontenrahmen":"4","kontenlaenge":"4"}],"meta":{"tool":"list_mandanten","rowCount":1,"truncated":false,"postfilterEntfernt":0,"demo":true}}}}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]},"post":{"operationId":"list_mandanten_post","summary":"Mandanten auflisten (JSON-Body)","description":"Alternative Aufrufform von GET /api/v1/mandanten — gleiche Fähigkeit, Felder im JSON-Body (lange Filterlisten, Clients ohne Query-Strings). Toolgeneratoren: den Tag „Alternative Aufrufform“ bzw. x-datenbruecke-alternative ausblenden, damit je Fähigkeit ein Tool bleibt.","tags":["Alternative Aufrufform"],"x-datenbruecke-alternative":true,"requestBody":{"description":"Dieselben Felder wie die Query-Parameter, als JSON-Objekt — für lange Filterlisten oder Clients ohne Query-Strings.","required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"format":{"type":"string","enum":["arrays","objects"],"default":"arrays"}},"required":[],"additionalProperties":false}}}},"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MandantenAntwort"},"examples":{"arrays":{"summary":"format=arrays (Standard): rows als Arrays in der Reihenfolge von columns","value":{"ok":true,"columns":["mandant_id","mandant_name","mandant_nummer","kontenrahmen","kontenlaenge"],"rows":[["bed9e862-2525-44a2-a12c-b40fbecb63b9","Musterküchen GmbH","55039","4","4"]],"meta":{"tool":"list_mandanten","rowCount":1,"truncated":false,"postfilterEntfernt":0,"demo":true}}},"objects":{"summary":"format=objects: rows als Objekte","value":{"ok":true,"columns":["mandant_id","mandant_name","mandant_nummer","kontenrahmen","kontenlaenge"],"rows":[{"mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","mandant_name":"Musterküchen GmbH","mandant_nummer":"55039","kontenrahmen":"4","kontenlaenge":"4"}],"meta":{"tool":"list_mandanten","rowCount":1,"truncated":false,"postfilterEntfernt":0,"demo":true}}}}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]}},"/api/v1/datenumfang":{"get":{"operationId":"get_datenumfang","summary":"Datenstand je Mandant","description":"Welche Jahre und Monate je Datenquelle vorliegen. Vier Zeilen je Mandant (bwa, konten, belege, bilanz). letzter_monat < 12 heißt: das jüngste Jahr ist unvollständig; bei bilanz ist letzter_monat leer.","tags":["Datenbrücke"],"parameters":[{"name":"mandant_id","in":"query","required":true,"description":"Mandanten-ID aus list_mandanten.","schema":{"type":"string","format":"uuid"},"example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},{"name":"format","in":"query","required":false,"description":"Antwortformat: arrays (Standard, rows als Arrays in Spaltenreihenfolge) oder objects (rows als Objekte { spalte: wert }).","schema":{"type":"string","enum":["arrays","objects"],"default":"arrays"}}],"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatenumfangAntwort"}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]},"post":{"operationId":"get_datenumfang_post","summary":"Datenstand je Mandant (JSON-Body)","description":"Alternative Aufrufform von GET /api/v1/datenumfang — gleiche Fähigkeit, Felder im JSON-Body (lange Filterlisten, Clients ohne Query-Strings). Toolgeneratoren: den Tag „Alternative Aufrufform“ bzw. x-datenbruecke-alternative ausblenden, damit je Fähigkeit ein Tool bleibt.","tags":["Alternative Aufrufform"],"x-datenbruecke-alternative":true,"requestBody":{"description":"Dieselben Felder wie die Query-Parameter, als JSON-Objekt — für lange Filterlisten oder Clients ohne Query-Strings.","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mandant_id":{"type":"string","format":"uuid","description":"Mandanten-ID aus list_mandanten.","example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},"format":{"type":"string","enum":["arrays","objects"],"default":"arrays"}},"required":["mandant_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatenumfangAntwort"}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]}},"/api/v1/bwa":{"get":{"operationId":"get_bwa","summary":"BWA (G&V) abrufen","description":"BWA-Zeilen eines Mandanten für ein Jahr, optional für einen Monat. Zeilennummern und -namen sind kundenindividuell (BWA-Editor) — mandantenübergreifend vergleichbar ist nur die Bilanz über ihre Labels. vorjahr=true hängt die Zeilen des Vorjahres an (Spalte jahr unterscheidet). nur_gv=true filtert auf die Erfolgsrechnung. Leeres Ergebnis: Jahr ohne Daten (siehe /datenumfang).","tags":["Datenbrücke"],"parameters":[{"name":"mandant_id","in":"query","required":true,"description":"Mandanten-ID aus list_mandanten.","schema":{"type":"string","format":"uuid"},"example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},{"name":"jahr","in":"query","required":true,"description":"Geschäftsjahr, z. B. 2025.","schema":{"type":"integer","minimum":2000,"maximum":2100},"example":2024},{"name":"monat","in":"query","required":false,"description":"Monat 1–12. Ohne Angabe: Jahreswert.","schema":{"type":"integer","minimum":1,"maximum":12},"example":3},{"name":"vorjahr","in":"query","required":false,"description":"Auch das Vorjahr liefern (gleiche Zeilen, jahr - 1).","schema":{"type":"boolean"},"example":true},{"name":"nur_gv","in":"query","required":false,"description":"Nur Erfolgsrechnung (bereich = Erfolgsrechnung oder Zeile < 2000).","schema":{"type":"boolean"},"example":true},{"name":"format","in":"query","required":false,"description":"Antwortformat: arrays (Standard, rows als Arrays in Spaltenreihenfolge) oder objects (rows als Objekte { spalte: wert }).","schema":{"type":"string","enum":["arrays","objects"],"default":"arrays"}}],"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BwaAntwort"},"examples":{"objects":{"summary":"format=objects, Jahreswerte","value":{"ok":true,"columns":["mandant_id","jahr","bwa_zeilennummer","bwa_zeile","bereich","betrag"],"rows":[{"mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","jahr":2024,"bwa_zeilennummer":1010,"bwa_zeile":"Umsatzerlöse","bereich":"Erfolgsrechnung","betrag":1284530.12},{"mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","jahr":2024,"bwa_zeilennummer":1060,"bwa_zeile":"Personalkosten","bereich":"Erfolgsrechnung","betrag":-154140.68}],"meta":{"tool":"get_bwa","mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","rowCount":2,"truncated":false,"postfilterEntfernt":0,"demo":true,"datenstand":{"quelle":"bwa","jahr_bis":2024,"letzter_monat":3}}}}}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]},"post":{"operationId":"get_bwa_post","summary":"BWA (G&V) abrufen (JSON-Body)","description":"Alternative Aufrufform von GET /api/v1/bwa — gleiche Fähigkeit, Felder im JSON-Body (lange Filterlisten, Clients ohne Query-Strings). Toolgeneratoren: den Tag „Alternative Aufrufform“ bzw. x-datenbruecke-alternative ausblenden, damit je Fähigkeit ein Tool bleibt.","tags":["Alternative Aufrufform"],"x-datenbruecke-alternative":true,"requestBody":{"description":"Dieselben Felder wie die Query-Parameter, als JSON-Objekt — für lange Filterlisten oder Clients ohne Query-Strings.","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mandant_id":{"type":"string","format":"uuid","description":"Mandanten-ID aus list_mandanten.","example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},"jahr":{"type":"integer","minimum":2000,"maximum":2100,"description":"Geschäftsjahr, z. B. 2025.","example":2024},"monat":{"type":"integer","minimum":1,"maximum":12,"description":"Monat 1–12. Ohne Angabe: Jahreswert.","example":3},"vorjahr":{"type":"boolean","description":"Auch das Vorjahr liefern (gleiche Zeilen, jahr - 1).","example":true},"nur_gv":{"type":"boolean","description":"Nur Erfolgsrechnung (bereich = Erfolgsrechnung oder Zeile < 2000).","example":true},"format":{"type":"string","enum":["arrays","objects"],"default":"arrays"}},"required":["mandant_id","jahr"],"additionalProperties":false}}}},"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BwaAntwort"},"examples":{"objects":{"summary":"format=objects, Jahreswerte","value":{"ok":true,"columns":["mandant_id","jahr","bwa_zeilennummer","bwa_zeile","bereich","betrag"],"rows":[{"mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","jahr":2024,"bwa_zeilennummer":1010,"bwa_zeile":"Umsatzerlöse","bereich":"Erfolgsrechnung","betrag":1284530.12},{"mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","jahr":2024,"bwa_zeilennummer":1060,"bwa_zeile":"Personalkosten","bereich":"Erfolgsrechnung","betrag":-154140.68}],"meta":{"tool":"get_bwa","mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","rowCount":2,"truncated":false,"postfilterEntfernt":0,"demo":true,"datenstand":{"quelle":"bwa","jahr_bis":2024,"letzter_monat":3}}}}}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]}},"/api/v1/bilanz":{"get":{"operationId":"get_bilanz","summary":"Bilanz-Bestände abrufen","description":"Bilanzpositionen mit Bestand in EUR. Ohne monat und label: Jahresbestand je Zeile. Mit monat oder label: kumulierter Stand zum Monatsende aus der Monatsbilanz, inklusive label (kundenunabhängiges Kennzahl-Label wie LIQUIDE_MITTEL, FORDERUNGEN, EIGENKAPITAL). label ohne monat nimmt den letzten gebuchten Monat.","tags":["Datenbrücke"],"parameters":[{"name":"mandant_id","in":"query","required":true,"description":"Mandanten-ID aus list_mandanten.","schema":{"type":"string","format":"uuid"},"example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},{"name":"jahr","in":"query","required":true,"description":"Geschäftsjahr, z. B. 2025.","schema":{"type":"integer","minimum":2000,"maximum":2100},"example":2024},{"name":"monat","in":"query","required":false,"description":"Monat 1–12. Ohne Angabe: Jahreswert.","schema":{"type":"integer","minimum":1,"maximum":12},"example":3},{"name":"label","in":"query","required":false,"description":"Nur Zeilen mit diesem Kennzahl-Label, z. B. LIQUIDE_MITTEL.","schema":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{1,39}$"},"example":"LIQUIDE_MITTEL"},{"name":"format","in":"query","required":false,"description":"Antwortformat: arrays (Standard, rows als Arrays in Spaltenreihenfolge) oder objects (rows als Objekte { spalte: wert }).","schema":{"type":"string","enum":["arrays","objects"],"default":"arrays"}}],"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BilanzAntwort"},"examples":{"jahr":{"summary":"Variante Jahr (ohne monat/label)","value":{"ok":true,"columns":["mandant_id","jahr","bwa_zeilennummer","bwa_zeile","bereich","bestand"],"rows":[{"mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","jahr":2024,"bwa_zeilennummer":3010,"bwa_zeile":"Kasse und Bank","bereich":"Bewegungsbilanz","bestand":512345.67}],"meta":{"tool":"get_bilanz","mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","rowCount":1,"truncated":false,"postfilterEntfernt":0,"demo":true,"datenstand":{"quelle":"bilanz","jahr_bis":2024,"letzter_monat":null}}}},"monat":{"summary":"Variante Monat (monat oder label gesetzt) — mit label","value":{"ok":true,"columns":["mandant_id","jahr","monat","label","bwa_zeilennummer","bwa_zeile","bereich","bestand"],"rows":[{"mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","jahr":2024,"monat":3,"label":"LIQUIDE_MITTEL","bwa_zeilennummer":3010,"bwa_zeile":"Kasse und Bank","bereich":"Bewegungsbilanz","bestand":519437.05}],"meta":{"tool":"get_bilanz","mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","rowCount":1,"truncated":false,"postfilterEntfernt":0,"demo":true,"datenstand":{"quelle":"bilanz","jahr_bis":2024,"letzter_monat":null}}}}}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]},"post":{"operationId":"get_bilanz_post","summary":"Bilanz-Bestände abrufen (JSON-Body)","description":"Alternative Aufrufform von GET /api/v1/bilanz — gleiche Fähigkeit, Felder im JSON-Body (lange Filterlisten, Clients ohne Query-Strings). Toolgeneratoren: den Tag „Alternative Aufrufform“ bzw. x-datenbruecke-alternative ausblenden, damit je Fähigkeit ein Tool bleibt.","tags":["Alternative Aufrufform"],"x-datenbruecke-alternative":true,"requestBody":{"description":"Dieselben Felder wie die Query-Parameter, als JSON-Objekt — für lange Filterlisten oder Clients ohne Query-Strings.","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mandant_id":{"type":"string","format":"uuid","description":"Mandanten-ID aus list_mandanten.","example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},"jahr":{"type":"integer","minimum":2000,"maximum":2100,"description":"Geschäftsjahr, z. B. 2025.","example":2024},"monat":{"type":"integer","minimum":1,"maximum":12,"description":"Monat 1–12. Ohne Angabe: Jahreswert.","example":3},"label":{"type":"string","pattern":"^[A-Z][A-Z0-9_]{1,39}$","description":"Nur Zeilen mit diesem Kennzahl-Label, z. B. LIQUIDE_MITTEL.","example":"LIQUIDE_MITTEL"},"format":{"type":"string","enum":["arrays","objects"],"default":"arrays"}},"required":["mandant_id","jahr"],"additionalProperties":false}}}},"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BilanzAntwort"},"examples":{"jahr":{"summary":"Variante Jahr (ohne monat/label)","value":{"ok":true,"columns":["mandant_id","jahr","bwa_zeilennummer","bwa_zeile","bereich","bestand"],"rows":[{"mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","jahr":2024,"bwa_zeilennummer":3010,"bwa_zeile":"Kasse und Bank","bereich":"Bewegungsbilanz","bestand":512345.67}],"meta":{"tool":"get_bilanz","mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","rowCount":1,"truncated":false,"postfilterEntfernt":0,"demo":true,"datenstand":{"quelle":"bilanz","jahr_bis":2024,"letzter_monat":null}}}},"monat":{"summary":"Variante Monat (monat oder label gesetzt) — mit label","value":{"ok":true,"columns":["mandant_id","jahr","monat","label","bwa_zeilennummer","bwa_zeile","bereich","bestand"],"rows":[{"mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","jahr":2024,"monat":3,"label":"LIQUIDE_MITTEL","bwa_zeilennummer":3010,"bwa_zeile":"Kasse und Bank","bereich":"Bewegungsbilanz","bestand":519437.05}],"meta":{"tool":"get_bilanz","mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","rowCount":1,"truncated":false,"postfilterEntfernt":0,"demo":true,"datenstand":{"quelle":"bilanz","jahr_bis":2024,"letzter_monat":null}}}}}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]}},"/api/v1/konten":{"get":{"operationId":"get_konten","summary":"Sachkonten unter einer BWA-Zeile","description":"Drill-down unter eine BWA-Zeile: die Sachkonten mit Betrag und Buchungsanzahl, größte zuerst. Auswahl über genau eine Zeilenangabe (bwa_zeilennummer oder bwa_zeile, beide aus /bwa) oder über einen Kontenbereich (konto, konto_von/konto_bis — Kontonummern werden auf 8 Stellen normalisiert, 4000–4999 heißt 40000000–49999999); beides zusammen schneidet. Ohne jede Auswahl 400. Summe der Beträge je Zeile = Betrag der Zeile in /bwa. Achtung bei Kontenbereichen ohne Zeile: Ein Konto steht unter jeder BWA-Zeile, der es zugeordnet ist (auch Summenzeilen wie „Umsatzerlöse“ UND „Gesamtleistung“) — Kontensummen deshalb je konto_intern nur einmal zählen oder eine Zeile mitgeben. Paging über top und offset; meta.truncated sagt, ob es mehr gibt.","tags":["Datenbrücke"],"parameters":[{"name":"mandant_id","in":"query","required":true,"description":"Mandanten-ID aus list_mandanten.","schema":{"type":"string","format":"uuid"},"example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},{"name":"jahr","in":"query","required":true,"description":"Geschäftsjahr, z. B. 2025.","schema":{"type":"integer","minimum":2000,"maximum":2100},"example":2024},{"name":"monat","in":"query","required":false,"description":"Monat 1–12. Ohne Angabe: Jahreswert.","schema":{"type":"integer","minimum":1,"maximum":12},"example":3},{"name":"bwa_zeilennummer","in":"query","required":false,"description":"BWA-Zeilennummer aus get_bwa.","schema":{"type":"integer","minimum":0,"maximum":99999},"example":1060},{"name":"bwa_zeile","in":"query","required":false,"description":"Alternativ: Name der BWA-Zeile aus get_bwa (exakt).","schema":{"type":"string","maxLength":60},"example":"Personalkosten"},{"name":"konto","in":"query","required":false,"description":"Einzelne Kontonummer (4–8 Stellen; kürzere werden rechts mit Nullen auf 8 Stellen aufgefüllt: 1460 → 14600000).","schema":{"type":"integer","minimum":1,"maximum":99999999},"example":1460},{"name":"konto_von","in":"query","required":false,"description":"Kontonummernbereich ab (inklusive; rechts mit Nullen aufgefüllt: 4000 → 40000000). Ohne Zeilenangabe erscheint jedes Konto unter JEDER zugeordneten BWA-Zeile (auch Summenzeilen) — für Kontensummen bwa_zeilennummer mitgeben oder je konto_intern nur eine Zeile zählen.","schema":{"type":"integer","minimum":1,"maximum":99999999},"example":4000},{"name":"konto_bis","in":"query","required":false,"description":"Kontonummernbereich bis (inklusive; rechts mit Neunen aufgefüllt: 4999 → 49999999).","schema":{"type":"integer","minimum":1,"maximum":99999999},"example":4999},{"name":"top","in":"query","required":false,"description":"Maximale Zeilenzahl (Standard 100, höchstens 200).","schema":{"type":"integer","minimum":1,"maximum":200},"example":50},{"name":"offset","in":"query","required":false,"description":"Zeilen überspringen (Paging): offset=0 erste Seite, offset=top zweite Seite usw. Sortierung ist stabil.","schema":{"type":"integer","minimum":0,"maximum":1000000},"example":50},{"name":"format","in":"query","required":false,"description":"Antwortformat: arrays (Standard, rows als Arrays in Spaltenreihenfolge) oder objects (rows als Objekte { spalte: wert }).","schema":{"type":"string","enum":["arrays","objects"],"default":"arrays"}}],"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KontenAntwort"}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]},"post":{"operationId":"get_konten_post","summary":"Sachkonten unter einer BWA-Zeile (JSON-Body)","description":"Alternative Aufrufform von GET /api/v1/konten — gleiche Fähigkeit, Felder im JSON-Body (lange Filterlisten, Clients ohne Query-Strings). Toolgeneratoren: den Tag „Alternative Aufrufform“ bzw. x-datenbruecke-alternative ausblenden, damit je Fähigkeit ein Tool bleibt.","tags":["Alternative Aufrufform"],"x-datenbruecke-alternative":true,"requestBody":{"description":"Dieselben Felder wie die Query-Parameter, als JSON-Objekt — für lange Filterlisten oder Clients ohne Query-Strings.","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mandant_id":{"type":"string","format":"uuid","description":"Mandanten-ID aus list_mandanten.","example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},"jahr":{"type":"integer","minimum":2000,"maximum":2100,"description":"Geschäftsjahr, z. B. 2025.","example":2024},"monat":{"type":"integer","minimum":1,"maximum":12,"description":"Monat 1–12. Ohne Angabe: Jahreswert.","example":3},"bwa_zeilennummer":{"type":"integer","minimum":0,"maximum":99999,"description":"BWA-Zeilennummer aus get_bwa.","example":1060},"bwa_zeile":{"type":"string","maxLength":60,"description":"Alternativ: Name der BWA-Zeile aus get_bwa (exakt).","example":"Personalkosten"},"konto":{"type":"integer","minimum":1,"maximum":99999999,"description":"Einzelne Kontonummer (4–8 Stellen; kürzere werden rechts mit Nullen auf 8 Stellen aufgefüllt: 1460 → 14600000).","example":1460},"konto_von":{"type":"integer","minimum":1,"maximum":99999999,"description":"Kontonummernbereich ab (inklusive; rechts mit Nullen aufgefüllt: 4000 → 40000000). Ohne Zeilenangabe erscheint jedes Konto unter JEDER zugeordneten BWA-Zeile (auch Summenzeilen) — für Kontensummen bwa_zeilennummer mitgeben oder je konto_intern nur eine Zeile zählen.","example":4000},"konto_bis":{"type":"integer","minimum":1,"maximum":99999999,"description":"Kontonummernbereich bis (inklusive; rechts mit Neunen aufgefüllt: 4999 → 49999999).","example":4999},"top":{"type":"integer","minimum":1,"maximum":200,"description":"Maximale Zeilenzahl (Standard 100, höchstens 200).","example":50},"offset":{"type":"integer","minimum":0,"maximum":1000000,"description":"Zeilen überspringen (Paging): offset=0 erste Seite, offset=top zweite Seite usw. Sortierung ist stabil.","example":50},"format":{"type":"string","enum":["arrays","objects"],"default":"arrays"}},"required":["mandant_id","jahr"],"additionalProperties":false,"oneOf":[{"required":["bwa_zeilennummer"],"not":{"required":["bwa_zeile"]}},{"required":["bwa_zeile"],"not":{"required":["bwa_zeilennummer"]}}]}}}},"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KontenAntwort"}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]}},"/api/v1/forderungen":{"get":{"operationId":"get_forderungen","summary":"Offene Forderungen (Debitoren)","description":"Offene Posten der Kunden. Standard: Einzelposten, kleinster Betrag (größte Forderung) zuerst; nur_ueberfaellig=true filtert. aging=true liefert stattdessen die Altersstruktur je Kunde und Fälligkeitsband (andere Spalten, siehe Schema). Filter: kundennummer und betrag_min in beiden Varianten; faelligkeit_von/bis, belegdatum_von/bis, tage_ueberfaellig_min nur bei Einzelposten (bei aging=true 400). Vorzeichen debitorisch: offene Forderung negativ, Summe je Kunde = Saldo. Paging über top und offset; meta.truncated sagt, ob es mehr gibt.","tags":["Datenbrücke"],"parameters":[{"name":"mandant_id","in":"query","required":true,"description":"Mandanten-ID aus list_mandanten.","schema":{"type":"string","format":"uuid"},"example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},{"name":"nur_ueberfaellig","in":"query","required":false,"description":"Nur überfällige Posten (Einzelposten-Variante). Bei aging=true ohne Wirkung — die Altersstruktur enthält immer alle Bänder.","schema":{"type":"boolean"},"example":true},{"name":"aging","in":"query","required":false,"description":"Altersstruktur (Fälligkeitsbänder) statt Einzelposten.","schema":{"type":"boolean"},"example":true},{"name":"kundennummer","in":"query","required":false,"description":"Nur dieser Kunde (Debitorennummer aus get_kunden) — in beiden Varianten.","schema":{"type":"string","pattern":"^[0-9]{1,20}$"},"example":"100020000"},{"name":"faelligkeit_von","in":"query","required":false,"description":"Fälligkeit ab (inklusive, YYYY-MM-DD) — nur Einzelposten.","schema":{"type":"string","format":"date"},"example":"2024-10-01"},{"name":"faelligkeit_bis","in":"query","required":false,"description":"Fälligkeit bis (inklusive) — nur Einzelposten.","schema":{"type":"string","format":"date"},"example":"2024-12-31"},{"name":"belegdatum_von","in":"query","required":false,"description":"Belegdatum ab (inklusive) — nur Einzelposten.","schema":{"type":"string","format":"date"},"example":"2024-01-01"},{"name":"belegdatum_bis","in":"query","required":false,"description":"Belegdatum bis (inklusive) — nur Einzelposten.","schema":{"type":"string","format":"date"},"example":"2024-12-31"},{"name":"tage_ueberfaellig_min","in":"query","required":false,"description":"Nur Posten mit mindestens so vielen Verzugstagen — nur Einzelposten.","schema":{"type":"integer","minimum":0,"maximum":3650},"example":60},{"name":"betrag_min","in":"query","required":false,"description":"Nur Zeilen mit Absolutbetrag ≥ diesem Wert (EUR, ganzzahlig).","schema":{"type":"integer","minimum":0,"maximum":1000000000},"example":1000},{"name":"top","in":"query","required":false,"description":"Maximale Zeilenzahl (Standard 100, höchstens 500).","schema":{"type":"integer","minimum":1,"maximum":500},"example":50},{"name":"offset","in":"query","required":false,"description":"Zeilen überspringen (Paging): offset=0 erste Seite, offset=top zweite Seite usw. Sortierung ist stabil.","schema":{"type":"integer","minimum":0,"maximum":1000000},"example":50},{"name":"format","in":"query","required":false,"description":"Antwortformat: arrays (Standard, rows als Arrays in Spaltenreihenfolge) oder objects (rows als Objekte { spalte: wert }).","schema":{"type":"string","enum":["arrays","objects"],"default":"arrays"}}],"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForderungenAntwort"},"examples":{"posten":{"summary":"Variante Posten (Standard)","value":{"ok":true,"columns":["mandant_id","kundennummer","kunde","betrag","faelligkeit","belegdatum","mahnstufe","ueberfaellig","tage_ueberfaellig"],"rows":[{"mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","kundennummer":"100020000","kunde":"Seltentest","betrag":-21524.27,"faelligkeit":"2024-02-15","belegdatum":"2024-01-16","mahnstufe":1,"ueberfaellig":1,"tage_ueberfaellig":930}],"meta":{"tool":"get_forderungen","mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","rowCount":1,"truncated":false,"postfilterEntfernt":0,"demo":true}}},"aging":{"summary":"Variante Aging (aging=true)","value":{"ok":true,"columns":["mandant_id","kundennummer","kunde","bucket","bucket_sort","betrag","anzahl"],"rows":[{"mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","kundennummer":"100020000","kunde":"Seltentest","bucket":"ueber_90","bucket_sort":4,"betrag":-21524.27,"anzahl":3}],"meta":{"tool":"get_forderungen","mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","rowCount":1,"truncated":false,"postfilterEntfernt":0,"demo":true}}}}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]},"post":{"operationId":"get_forderungen_post","summary":"Offene Forderungen (Debitoren) (JSON-Body)","description":"Alternative Aufrufform von GET /api/v1/forderungen — gleiche Fähigkeit, Felder im JSON-Body (lange Filterlisten, Clients ohne Query-Strings). Toolgeneratoren: den Tag „Alternative Aufrufform“ bzw. x-datenbruecke-alternative ausblenden, damit je Fähigkeit ein Tool bleibt.","tags":["Alternative Aufrufform"],"x-datenbruecke-alternative":true,"requestBody":{"description":"Dieselben Felder wie die Query-Parameter, als JSON-Objekt — für lange Filterlisten oder Clients ohne Query-Strings.","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mandant_id":{"type":"string","format":"uuid","description":"Mandanten-ID aus list_mandanten.","example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},"nur_ueberfaellig":{"type":"boolean","description":"Nur überfällige Posten (Einzelposten-Variante). Bei aging=true ohne Wirkung — die Altersstruktur enthält immer alle Bänder.","example":true},"aging":{"type":"boolean","description":"Altersstruktur (Fälligkeitsbänder) statt Einzelposten.","example":true},"kundennummer":{"type":"string","pattern":"^[0-9]{1,20}$","description":"Nur dieser Kunde (Debitorennummer aus get_kunden) — in beiden Varianten.","example":"100020000"},"faelligkeit_von":{"type":"string","format":"date","description":"Fälligkeit ab (inklusive, YYYY-MM-DD) — nur Einzelposten.","example":"2024-10-01"},"faelligkeit_bis":{"type":"string","format":"date","description":"Fälligkeit bis (inklusive) — nur Einzelposten.","example":"2024-12-31"},"belegdatum_von":{"type":"string","format":"date","description":"Belegdatum ab (inklusive) — nur Einzelposten.","example":"2024-01-01"},"belegdatum_bis":{"type":"string","format":"date","description":"Belegdatum bis (inklusive) — nur Einzelposten.","example":"2024-12-31"},"tage_ueberfaellig_min":{"type":"integer","minimum":0,"maximum":3650,"description":"Nur Posten mit mindestens so vielen Verzugstagen — nur Einzelposten.","example":60},"betrag_min":{"type":"integer","minimum":0,"maximum":1000000000,"description":"Nur Zeilen mit Absolutbetrag ≥ diesem Wert (EUR, ganzzahlig).","example":1000},"top":{"type":"integer","minimum":1,"maximum":500,"description":"Maximale Zeilenzahl (Standard 100, höchstens 500).","example":50},"offset":{"type":"integer","minimum":0,"maximum":1000000,"description":"Zeilen überspringen (Paging): offset=0 erste Seite, offset=top zweite Seite usw. Sortierung ist stabil.","example":50},"format":{"type":"string","enum":["arrays","objects"],"default":"arrays"}},"required":["mandant_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForderungenAntwort"},"examples":{"posten":{"summary":"Variante Posten (Standard)","value":{"ok":true,"columns":["mandant_id","kundennummer","kunde","betrag","faelligkeit","belegdatum","mahnstufe","ueberfaellig","tage_ueberfaellig"],"rows":[{"mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","kundennummer":"100020000","kunde":"Seltentest","betrag":-21524.27,"faelligkeit":"2024-02-15","belegdatum":"2024-01-16","mahnstufe":1,"ueberfaellig":1,"tage_ueberfaellig":930}],"meta":{"tool":"get_forderungen","mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","rowCount":1,"truncated":false,"postfilterEntfernt":0,"demo":true}}},"aging":{"summary":"Variante Aging (aging=true)","value":{"ok":true,"columns":["mandant_id","kundennummer","kunde","bucket","bucket_sort","betrag","anzahl"],"rows":[{"mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","kundennummer":"100020000","kunde":"Seltentest","bucket":"ueber_90","bucket_sort":4,"betrag":-21524.27,"anzahl":3}],"meta":{"tool":"get_forderungen","mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","rowCount":1,"truncated":false,"postfilterEntfernt":0,"demo":true}}}}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]}},"/api/v1/verbindlichkeiten":{"get":{"operationId":"get_verbindlichkeiten","summary":"Offene Verbindlichkeiten (Kreditoren)","description":"Offene Posten gegenüber Lieferanten. Standard: Einzelposten nach Betragshöhe; nur_ueberfaellig=true filtert. aging=true liefert die Altersstruktur je Lieferant und Fälligkeitsband (andere Spalten, siehe Schema). Filter: lieferantennummer und betrag_min in beiden Varianten; faelligkeit_von/bis, belegdatum_von/bis, tage_ueberfaellig_min nur bei Einzelposten (bei aging=true 400). Größe über den Absolutbetrag vergleichen. Paging über top und offset; meta.truncated sagt, ob es mehr gibt.","tags":["Datenbrücke"],"parameters":[{"name":"mandant_id","in":"query","required":true,"description":"Mandanten-ID aus list_mandanten.","schema":{"type":"string","format":"uuid"},"example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},{"name":"nur_ueberfaellig","in":"query","required":false,"description":"Nur überfällige Posten (Einzelposten-Variante). Bei aging=true ohne Wirkung — die Altersstruktur enthält immer alle Bänder.","schema":{"type":"boolean"},"example":true},{"name":"aging","in":"query","required":false,"description":"Altersstruktur (Fälligkeitsbänder) statt Einzelposten.","schema":{"type":"boolean"},"example":true},{"name":"lieferantennummer","in":"query","required":false,"description":"Nur dieser Lieferant (Kreditorennummer aus get_lieferanten) — in beiden Varianten.","schema":{"type":"string","pattern":"^[0-9]{1,20}$"},"example":"700010000"},{"name":"faelligkeit_von","in":"query","required":false,"description":"Fälligkeit ab (inklusive, YYYY-MM-DD) — nur Einzelposten.","schema":{"type":"string","format":"date"},"example":"2024-10-01"},{"name":"faelligkeit_bis","in":"query","required":false,"description":"Fälligkeit bis (inklusive) — nur Einzelposten.","schema":{"type":"string","format":"date"},"example":"2024-12-31"},{"name":"belegdatum_von","in":"query","required":false,"description":"Belegdatum ab (inklusive) — nur Einzelposten.","schema":{"type":"string","format":"date"},"example":"2024-01-01"},{"name":"belegdatum_bis","in":"query","required":false,"description":"Belegdatum bis (inklusive) — nur Einzelposten.","schema":{"type":"string","format":"date"},"example":"2024-12-31"},{"name":"tage_ueberfaellig_min","in":"query","required":false,"description":"Nur Posten mit mindestens so vielen Verzugstagen — nur Einzelposten.","schema":{"type":"integer","minimum":0,"maximum":3650},"example":60},{"name":"betrag_min","in":"query","required":false,"description":"Nur Zeilen mit Absolutbetrag ≥ diesem Wert (EUR, ganzzahlig).","schema":{"type":"integer","minimum":0,"maximum":1000000000},"example":1000},{"name":"top","in":"query","required":false,"description":"Maximale Zeilenzahl (Standard 100, höchstens 500).","schema":{"type":"integer","minimum":1,"maximum":500},"example":50},{"name":"offset","in":"query","required":false,"description":"Zeilen überspringen (Paging): offset=0 erste Seite, offset=top zweite Seite usw. Sortierung ist stabil.","schema":{"type":"integer","minimum":0,"maximum":1000000},"example":50},{"name":"format","in":"query","required":false,"description":"Antwortformat: arrays (Standard, rows als Arrays in Spaltenreihenfolge) oder objects (rows als Objekte { spalte: wert }).","schema":{"type":"string","enum":["arrays","objects"],"default":"arrays"}}],"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerbindlichkeitenAntwort"}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]},"post":{"operationId":"get_verbindlichkeiten_post","summary":"Offene Verbindlichkeiten (Kreditoren) (JSON-Body)","description":"Alternative Aufrufform von GET /api/v1/verbindlichkeiten — gleiche Fähigkeit, Felder im JSON-Body (lange Filterlisten, Clients ohne Query-Strings). Toolgeneratoren: den Tag „Alternative Aufrufform“ bzw. x-datenbruecke-alternative ausblenden, damit je Fähigkeit ein Tool bleibt.","tags":["Alternative Aufrufform"],"x-datenbruecke-alternative":true,"requestBody":{"description":"Dieselben Felder wie die Query-Parameter, als JSON-Objekt — für lange Filterlisten oder Clients ohne Query-Strings.","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mandant_id":{"type":"string","format":"uuid","description":"Mandanten-ID aus list_mandanten.","example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},"nur_ueberfaellig":{"type":"boolean","description":"Nur überfällige Posten (Einzelposten-Variante). Bei aging=true ohne Wirkung — die Altersstruktur enthält immer alle Bänder.","example":true},"aging":{"type":"boolean","description":"Altersstruktur (Fälligkeitsbänder) statt Einzelposten.","example":true},"lieferantennummer":{"type":"string","pattern":"^[0-9]{1,20}$","description":"Nur dieser Lieferant (Kreditorennummer aus get_lieferanten) — in beiden Varianten.","example":"700010000"},"faelligkeit_von":{"type":"string","format":"date","description":"Fälligkeit ab (inklusive, YYYY-MM-DD) — nur Einzelposten.","example":"2024-10-01"},"faelligkeit_bis":{"type":"string","format":"date","description":"Fälligkeit bis (inklusive) — nur Einzelposten.","example":"2024-12-31"},"belegdatum_von":{"type":"string","format":"date","description":"Belegdatum ab (inklusive) — nur Einzelposten.","example":"2024-01-01"},"belegdatum_bis":{"type":"string","format":"date","description":"Belegdatum bis (inklusive) — nur Einzelposten.","example":"2024-12-31"},"tage_ueberfaellig_min":{"type":"integer","minimum":0,"maximum":3650,"description":"Nur Posten mit mindestens so vielen Verzugstagen — nur Einzelposten.","example":60},"betrag_min":{"type":"integer","minimum":0,"maximum":1000000000,"description":"Nur Zeilen mit Absolutbetrag ≥ diesem Wert (EUR, ganzzahlig).","example":1000},"top":{"type":"integer","minimum":1,"maximum":500,"description":"Maximale Zeilenzahl (Standard 100, höchstens 500).","example":50},"offset":{"type":"integer","minimum":0,"maximum":1000000,"description":"Zeilen überspringen (Paging): offset=0 erste Seite, offset=top zweite Seite usw. Sortierung ist stabil.","example":50},"format":{"type":"string","enum":["arrays","objects"],"default":"arrays"}},"required":["mandant_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerbindlichkeitenAntwort"}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]}},"/api/v1/dso_dpo":{"get":{"operationId":"get_dso_dpo","summary":"DSO / DPO","description":"Forderungs- und Verbindlichkeitslaufzeit, vor-aggregiert: zwei Zeilen (seite debitoren = DSO, kreditoren = DPO) mit offenem Bestand, überfälligem Anteil, Quote, betragsgewichteten Verzugstagen, Volumen der letzten zwölf Monate und Laufzeit in Tagen.","tags":["Datenbrücke"],"parameters":[{"name":"mandant_id","in":"query","required":true,"description":"Mandanten-ID aus list_mandanten.","schema":{"type":"string","format":"uuid"},"example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},{"name":"format","in":"query","required":false,"description":"Antwortformat: arrays (Standard, rows als Arrays in Spaltenreihenfolge) oder objects (rows als Objekte { spalte: wert }).","schema":{"type":"string","enum":["arrays","objects"],"default":"arrays"}}],"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DsoDpoAntwort"}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]},"post":{"operationId":"get_dso_dpo_post","summary":"DSO / DPO (JSON-Body)","description":"Alternative Aufrufform von GET /api/v1/dso_dpo — gleiche Fähigkeit, Felder im JSON-Body (lange Filterlisten, Clients ohne Query-Strings). Toolgeneratoren: den Tag „Alternative Aufrufform“ bzw. x-datenbruecke-alternative ausblenden, damit je Fähigkeit ein Tool bleibt.","tags":["Alternative Aufrufform"],"x-datenbruecke-alternative":true,"requestBody":{"description":"Dieselben Felder wie die Query-Parameter, als JSON-Objekt — für lange Filterlisten oder Clients ohne Query-Strings.","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mandant_id":{"type":"string","format":"uuid","description":"Mandanten-ID aus list_mandanten.","example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},"format":{"type":"string","enum":["arrays","objects"],"default":"arrays"}},"required":["mandant_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DsoDpoAntwort"}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]}},"/api/v1/liquiditaet":{"get":{"operationId":"get_liquiditaet","summary":"Fälligkeiten / Liquiditätsvorschau","description":"Kommende Zahlungsströme nach Fälligkeit: Forderungen (AR, Einzahlung positiv), Verbindlichkeiten (AP, Auszahlung negativ) und Bank. Standard aggregiert je Fälligkeitstag und Quelle; aggregiert=false liefert Einzelposten mit Konto (andere Spalten, siehe Schema). von/bis grenzen den Zeitraum ein. Paging über top und offset; meta.truncated sagt, ob es mehr gibt.","tags":["Datenbrücke"],"parameters":[{"name":"mandant_id","in":"query","required":true,"description":"Mandanten-ID aus list_mandanten.","schema":{"type":"string","format":"uuid"},"example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},{"name":"von","in":"query","required":false,"description":"Fälligkeit ab (YYYY-MM-DD).","schema":{"type":"string","format":"date"},"example":"2024-10-01"},{"name":"bis","in":"query","required":false,"description":"Fälligkeit bis (YYYY-MM-DD).","schema":{"type":"string","format":"date"},"example":"2024-12-31"},{"name":"quelle","in":"query","required":false,"description":"Nur diese Quelle.","schema":{"type":"string","enum":["AR","AP","BANK"]},"example":"AR"},{"name":"aggregiert","in":"query","required":false,"description":"Je Fälligkeitstag und Quelle summieren (Standard true).","schema":{"type":"boolean"},"example":false},{"name":"top","in":"query","required":false,"description":"Maximale Zeilenzahl (Standard 200, höchstens 500).","schema":{"type":"integer","minimum":1,"maximum":500},"example":50},{"name":"offset","in":"query","required":false,"description":"Zeilen überspringen (Paging): offset=0 erste Seite, offset=top zweite Seite usw. Sortierung ist stabil.","schema":{"type":"integer","minimum":0,"maximum":1000000},"example":50},{"name":"format","in":"query","required":false,"description":"Antwortformat: arrays (Standard, rows als Arrays in Spaltenreihenfolge) oder objects (rows als Objekte { spalte: wert }).","schema":{"type":"string","enum":["arrays","objects"],"default":"arrays"}}],"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LiquiditaetAntwort"},"examples":{"aggregiert":{"summary":"Variante Aggregiert (Standard)","value":{"ok":true,"columns":["mandant_id","faelligkeit","quelle","betrag","anzahl","ueberfaellig"],"rows":[{"mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","faelligkeit":"2024-10-15","quelle":"AR","betrag":18250.4,"anzahl":3,"ueberfaellig":0}],"meta":{"tool":"get_liquiditaet","mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","rowCount":1,"truncated":false,"postfilterEntfernt":0,"demo":true}}},"posten":{"summary":"Variante Posten (aggregiert=false)","value":{"ok":true,"columns":["mandant_id","faelligkeit","quelle","betrag","ueberfaellig","konto"],"rows":[{"mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","faelligkeit":"2024-10-15","quelle":"AP","betrag":-4210,"ueberfaellig":0,"konto":70001234}],"meta":{"tool":"get_liquiditaet","mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","rowCount":1,"truncated":false,"postfilterEntfernt":0,"demo":true}}}}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]},"post":{"operationId":"get_liquiditaet_post","summary":"Fälligkeiten / Liquiditätsvorschau (JSON-Body)","description":"Alternative Aufrufform von GET /api/v1/liquiditaet — gleiche Fähigkeit, Felder im JSON-Body (lange Filterlisten, Clients ohne Query-Strings). Toolgeneratoren: den Tag „Alternative Aufrufform“ bzw. x-datenbruecke-alternative ausblenden, damit je Fähigkeit ein Tool bleibt.","tags":["Alternative Aufrufform"],"x-datenbruecke-alternative":true,"requestBody":{"description":"Dieselben Felder wie die Query-Parameter, als JSON-Objekt — für lange Filterlisten oder Clients ohne Query-Strings.","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mandant_id":{"type":"string","format":"uuid","description":"Mandanten-ID aus list_mandanten.","example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},"von":{"type":"string","format":"date","description":"Fälligkeit ab (YYYY-MM-DD).","example":"2024-10-01"},"bis":{"type":"string","format":"date","description":"Fälligkeit bis (YYYY-MM-DD).","example":"2024-12-31"},"quelle":{"type":"string","enum":["AR","AP","BANK"],"description":"Nur diese Quelle.","example":"AR"},"aggregiert":{"type":"boolean","description":"Je Fälligkeitstag und Quelle summieren (Standard true).","example":false},"top":{"type":"integer","minimum":1,"maximum":500,"description":"Maximale Zeilenzahl (Standard 200, höchstens 500).","example":50},"offset":{"type":"integer","minimum":0,"maximum":1000000,"description":"Zeilen überspringen (Paging): offset=0 erste Seite, offset=top zweite Seite usw. Sortierung ist stabil.","example":50},"format":{"type":"string","enum":["arrays","objects"],"default":"arrays"}},"required":["mandant_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LiquiditaetAntwort"},"examples":{"aggregiert":{"summary":"Variante Aggregiert (Standard)","value":{"ok":true,"columns":["mandant_id","faelligkeit","quelle","betrag","anzahl","ueberfaellig"],"rows":[{"mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","faelligkeit":"2024-10-15","quelle":"AR","betrag":18250.4,"anzahl":3,"ueberfaellig":0}],"meta":{"tool":"get_liquiditaet","mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","rowCount":1,"truncated":false,"postfilterEntfernt":0,"demo":true}}},"posten":{"summary":"Variante Posten (aggregiert=false)","value":{"ok":true,"columns":["mandant_id","faelligkeit","quelle","betrag","ueberfaellig","konto"],"rows":[{"mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","faelligkeit":"2024-10-15","quelle":"AP","betrag":-4210,"ueberfaellig":0,"konto":70001234}],"meta":{"tool":"get_liquiditaet","mandant_id":"bed9e862-2525-44a2-a12c-b40fbecb63b9","rowCount":1,"truncated":false,"postfilterEntfernt":0,"demo":true}}}}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]}},"/api/v1/kostenstellen_struktur":{"get":{"operationId":"get_kostenstellen_struktur","summary":"Kostenstellen-Struktur","description":"Kostenstellen-Gruppen und ihre Kostenstellen mit Hierarchie (Ebene, Pfad). Liefert bewusst nur die Struktur, keine Werte: kostenstellen-genaue Auswertungen unterliegen einer eigenen Rechteprüfung und sind in der Datenbrücke in Power BI abgebildet; Werte über die API sind geplant. Pseudo-Gruppen „_alle Kostenstellen“ und „_ohne Kostenstellen“ haben keine group_id. Paging über top und offset; meta.truncated sagt, ob es mehr gibt.","tags":["Datenbrücke"],"parameters":[{"name":"mandant_id","in":"query","required":true,"description":"Mandanten-ID aus list_mandanten.","schema":{"type":"string","format":"uuid"},"example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},{"name":"kost_type","in":"query","required":false,"description":"Nur diese Kostenstellen-Art.","schema":{"type":"string","enum":["KOST1","KOST2"]},"example":"KOST1"},{"name":"top","in":"query","required":false,"description":"Maximale Zeilenzahl (Standard 500, höchstens 500).","schema":{"type":"integer","minimum":1,"maximum":500},"example":50},{"name":"offset","in":"query","required":false,"description":"Zeilen überspringen (Paging): offset=0 erste Seite, offset=top zweite Seite usw. Sortierung ist stabil.","schema":{"type":"integer","minimum":0,"maximum":1000000},"example":50},{"name":"format","in":"query","required":false,"description":"Antwortformat: arrays (Standard, rows als Arrays in Spaltenreihenfolge) oder objects (rows als Objekte { spalte: wert }).","schema":{"type":"string","enum":["arrays","objects"],"default":"arrays"}}],"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KostenstellenStrukturAntwort"}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]},"post":{"operationId":"get_kostenstellen_struktur_post","summary":"Kostenstellen-Struktur (JSON-Body)","description":"Alternative Aufrufform von GET /api/v1/kostenstellen_struktur — gleiche Fähigkeit, Felder im JSON-Body (lange Filterlisten, Clients ohne Query-Strings). Toolgeneratoren: den Tag „Alternative Aufrufform“ bzw. x-datenbruecke-alternative ausblenden, damit je Fähigkeit ein Tool bleibt.","tags":["Alternative Aufrufform"],"x-datenbruecke-alternative":true,"requestBody":{"description":"Dieselben Felder wie die Query-Parameter, als JSON-Objekt — für lange Filterlisten oder Clients ohne Query-Strings.","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mandant_id":{"type":"string","format":"uuid","description":"Mandanten-ID aus list_mandanten.","example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},"kost_type":{"type":"string","enum":["KOST1","KOST2"],"description":"Nur diese Kostenstellen-Art.","example":"KOST1"},"top":{"type":"integer","minimum":1,"maximum":500,"description":"Maximale Zeilenzahl (Standard 500, höchstens 500).","example":50},"offset":{"type":"integer","minimum":0,"maximum":1000000,"description":"Zeilen überspringen (Paging): offset=0 erste Seite, offset=top zweite Seite usw. Sortierung ist stabil.","example":50},"format":{"type":"string","enum":["arrays","objects"],"default":"arrays"}},"required":["mandant_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KostenstellenStrukturAntwort"}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]}},"/api/v1/kunden_umsatz":{"get":{"operationId":"get_kunden_umsatz","summary":"Kundenumsatz (Größe der Kunden)","description":"Fakturiertes Brutto-Volumen je Kunde und Jahr (optional Monat), größte zuerst, mit Zahlungseingang und Beleganzahl. Filter: kundennummer (ein Kunde), umsatz_min (Schwelle). Das ist Umsatz, nicht der offene Saldo (dafür /forderungen). Paging über top und offset; meta.truncated sagt, ob es mehr gibt.","tags":["Datenbrücke"],"parameters":[{"name":"mandant_id","in":"query","required":true,"description":"Mandanten-ID aus list_mandanten.","schema":{"type":"string","format":"uuid"},"example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},{"name":"jahr","in":"query","required":true,"description":"Geschäftsjahr, z. B. 2025.","schema":{"type":"integer","minimum":2000,"maximum":2100},"example":2024},{"name":"monat","in":"query","required":false,"description":"Monat 1–12. Ohne Angabe: Jahreswert.","schema":{"type":"integer","minimum":1,"maximum":12},"example":3},{"name":"kundennummer","in":"query","required":false,"description":"Nur dieser Kunde (Debitorennummer aus get_kunden).","schema":{"type":"string","pattern":"^[0-9]{1,20}$"},"example":"100020000"},{"name":"umsatz_min","in":"query","required":false,"description":"Nur Kunden mit Umsatz ≥ diesem Wert (EUR, ganzzahlig).","schema":{"type":"integer","minimum":0,"maximum":1000000000},"example":10000},{"name":"top","in":"query","required":false,"description":"Maximale Zeilenzahl (Standard 50, höchstens 200).","schema":{"type":"integer","minimum":1,"maximum":200},"example":50},{"name":"offset","in":"query","required":false,"description":"Zeilen überspringen (Paging): offset=0 erste Seite, offset=top zweite Seite usw. Sortierung ist stabil.","schema":{"type":"integer","minimum":0,"maximum":1000000},"example":50},{"name":"format","in":"query","required":false,"description":"Antwortformat: arrays (Standard, rows als Arrays in Spaltenreihenfolge) oder objects (rows als Objekte { spalte: wert }).","schema":{"type":"string","enum":["arrays","objects"],"default":"arrays"}}],"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KundenUmsatzAntwort"}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]},"post":{"operationId":"get_kunden_umsatz_post","summary":"Kundenumsatz (Größe der Kunden) (JSON-Body)","description":"Alternative Aufrufform von GET /api/v1/kunden_umsatz — gleiche Fähigkeit, Felder im JSON-Body (lange Filterlisten, Clients ohne Query-Strings). Toolgeneratoren: den Tag „Alternative Aufrufform“ bzw. x-datenbruecke-alternative ausblenden, damit je Fähigkeit ein Tool bleibt.","tags":["Alternative Aufrufform"],"x-datenbruecke-alternative":true,"requestBody":{"description":"Dieselben Felder wie die Query-Parameter, als JSON-Objekt — für lange Filterlisten oder Clients ohne Query-Strings.","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mandant_id":{"type":"string","format":"uuid","description":"Mandanten-ID aus list_mandanten.","example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},"jahr":{"type":"integer","minimum":2000,"maximum":2100,"description":"Geschäftsjahr, z. B. 2025.","example":2024},"monat":{"type":"integer","minimum":1,"maximum":12,"description":"Monat 1–12. Ohne Angabe: Jahreswert.","example":3},"kundennummer":{"type":"string","pattern":"^[0-9]{1,20}$","description":"Nur dieser Kunde (Debitorennummer aus get_kunden).","example":"100020000"},"umsatz_min":{"type":"integer","minimum":0,"maximum":1000000000,"description":"Nur Kunden mit Umsatz ≥ diesem Wert (EUR, ganzzahlig).","example":10000},"top":{"type":"integer","minimum":1,"maximum":200,"description":"Maximale Zeilenzahl (Standard 50, höchstens 200).","example":50},"offset":{"type":"integer","minimum":0,"maximum":1000000,"description":"Zeilen überspringen (Paging): offset=0 erste Seite, offset=top zweite Seite usw. Sortierung ist stabil.","example":50},"format":{"type":"string","enum":["arrays","objects"],"default":"arrays"}},"required":["mandant_id","jahr"],"additionalProperties":false}}}},"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KundenUmsatzAntwort"}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]}},"/api/v1/lieferanten_volumen":{"get":{"operationId":"get_lieferanten_volumen","summary":"Einkaufsvolumen (Größe der Lieferanten)","description":"Einkaufsvolumen je Lieferant und Jahr, größte zuerst, mit Zahlungsausgang und Beleganzahl. Filter: lieferantennummer, volumen_min. Pendant zu /kunden_umsatz. Paging über top und offset; meta.truncated sagt, ob es mehr gibt.","tags":["Datenbrücke"],"parameters":[{"name":"mandant_id","in":"query","required":true,"description":"Mandanten-ID aus list_mandanten.","schema":{"type":"string","format":"uuid"},"example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},{"name":"jahr","in":"query","required":true,"description":"Geschäftsjahr, z. B. 2025.","schema":{"type":"integer","minimum":2000,"maximum":2100},"example":2024},{"name":"lieferantennummer","in":"query","required":false,"description":"Nur dieser Lieferant (Kreditorennummer aus get_lieferanten).","schema":{"type":"string","pattern":"^[0-9]{1,20}$"},"example":"700010000"},{"name":"volumen_min","in":"query","required":false,"description":"Nur Lieferanten mit Einkaufsvolumen ≥ diesem Wert (EUR, ganzzahlig).","schema":{"type":"integer","minimum":0,"maximum":1000000000},"example":10000},{"name":"top","in":"query","required":false,"description":"Maximale Zeilenzahl (Standard 50, höchstens 200).","schema":{"type":"integer","minimum":1,"maximum":200},"example":50},{"name":"offset","in":"query","required":false,"description":"Zeilen überspringen (Paging): offset=0 erste Seite, offset=top zweite Seite usw. Sortierung ist stabil.","schema":{"type":"integer","minimum":0,"maximum":1000000},"example":50},{"name":"format","in":"query","required":false,"description":"Antwortformat: arrays (Standard, rows als Arrays in Spaltenreihenfolge) oder objects (rows als Objekte { spalte: wert }).","schema":{"type":"string","enum":["arrays","objects"],"default":"arrays"}}],"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LieferantenVolumenAntwort"}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]},"post":{"operationId":"get_lieferanten_volumen_post","summary":"Einkaufsvolumen (Größe der Lieferanten) (JSON-Body)","description":"Alternative Aufrufform von GET /api/v1/lieferanten_volumen — gleiche Fähigkeit, Felder im JSON-Body (lange Filterlisten, Clients ohne Query-Strings). Toolgeneratoren: den Tag „Alternative Aufrufform“ bzw. x-datenbruecke-alternative ausblenden, damit je Fähigkeit ein Tool bleibt.","tags":["Alternative Aufrufform"],"x-datenbruecke-alternative":true,"requestBody":{"description":"Dieselben Felder wie die Query-Parameter, als JSON-Objekt — für lange Filterlisten oder Clients ohne Query-Strings.","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mandant_id":{"type":"string","format":"uuid","description":"Mandanten-ID aus list_mandanten.","example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},"jahr":{"type":"integer","minimum":2000,"maximum":2100,"description":"Geschäftsjahr, z. B. 2025.","example":2024},"lieferantennummer":{"type":"string","pattern":"^[0-9]{1,20}$","description":"Nur dieser Lieferant (Kreditorennummer aus get_lieferanten).","example":"700010000"},"volumen_min":{"type":"integer","minimum":0,"maximum":1000000000,"description":"Nur Lieferanten mit Einkaufsvolumen ≥ diesem Wert (EUR, ganzzahlig).","example":10000},"top":{"type":"integer","minimum":1,"maximum":200,"description":"Maximale Zeilenzahl (Standard 50, höchstens 200).","example":50},"offset":{"type":"integer","minimum":0,"maximum":1000000,"description":"Zeilen überspringen (Paging): offset=0 erste Seite, offset=top zweite Seite usw. Sortierung ist stabil.","example":50},"format":{"type":"string","enum":["arrays","objects"],"default":"arrays"}},"required":["mandant_id","jahr"],"additionalProperties":false}}}},"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LieferantenVolumenAntwort"}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]}},"/api/v1/kunden":{"get":{"operationId":"get_kunden","summary":"Kunden suchen / Stammliste","description":"Kundenstamm (Debitoren) mit Nummer und Name, alphabetisch; suche filtert auf einen Namensteil. 403, wenn die Organisation Namen für den Konnektor abgeschaltet hat. Paging über top und offset; meta.truncated sagt, ob es mehr gibt.","tags":["Datenbrücke"],"parameters":[{"name":"mandant_id","in":"query","required":true,"description":"Mandanten-ID aus list_mandanten.","schema":{"type":"string","format":"uuid"},"example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},{"name":"suche","in":"query","required":false,"description":"Namensteil (Groß-/Kleinschreibung egal), z. B. „Müller“.","schema":{"type":"string","maxLength":60},"example":"Müller"},{"name":"top","in":"query","required":false,"description":"Maximale Zeilenzahl (Standard 100, höchstens 200).","schema":{"type":"integer","minimum":1,"maximum":200},"example":50},{"name":"offset","in":"query","required":false,"description":"Zeilen überspringen (Paging): offset=0 erste Seite, offset=top zweite Seite usw. Sortierung ist stabil.","schema":{"type":"integer","minimum":0,"maximum":1000000},"example":50},{"name":"format","in":"query","required":false,"description":"Antwortformat: arrays (Standard, rows als Arrays in Spaltenreihenfolge) oder objects (rows als Objekte { spalte: wert }).","schema":{"type":"string","enum":["arrays","objects"],"default":"arrays"}}],"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KundenAntwort"}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht); namen (Organisation hat Namen abgeschaltet).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]},"post":{"operationId":"get_kunden_post","summary":"Kunden suchen / Stammliste (JSON-Body)","description":"Alternative Aufrufform von GET /api/v1/kunden — gleiche Fähigkeit, Felder im JSON-Body (lange Filterlisten, Clients ohne Query-Strings). Toolgeneratoren: den Tag „Alternative Aufrufform“ bzw. x-datenbruecke-alternative ausblenden, damit je Fähigkeit ein Tool bleibt.","tags":["Alternative Aufrufform"],"x-datenbruecke-alternative":true,"requestBody":{"description":"Dieselben Felder wie die Query-Parameter, als JSON-Objekt — für lange Filterlisten oder Clients ohne Query-Strings.","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mandant_id":{"type":"string","format":"uuid","description":"Mandanten-ID aus list_mandanten.","example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},"suche":{"type":"string","maxLength":60,"description":"Namensteil (Groß-/Kleinschreibung egal), z. B. „Müller“.","example":"Müller"},"top":{"type":"integer","minimum":1,"maximum":200,"description":"Maximale Zeilenzahl (Standard 100, höchstens 200).","example":50},"offset":{"type":"integer","minimum":0,"maximum":1000000,"description":"Zeilen überspringen (Paging): offset=0 erste Seite, offset=top zweite Seite usw. Sortierung ist stabil.","example":50},"format":{"type":"string","enum":["arrays","objects"],"default":"arrays"}},"required":["mandant_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KundenAntwort"}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht); namen (Organisation hat Namen abgeschaltet).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]}},"/api/v1/lieferanten":{"get":{"operationId":"get_lieferanten","summary":"Lieferanten suchen / Stammliste","description":"Lieferantenstamm (Kreditoren) mit Nummer und Name, alphabetisch; suche filtert auf einen Namensteil. 403, wenn die Organisation Namen abgeschaltet hat. Paging über top und offset; meta.truncated sagt, ob es mehr gibt.","tags":["Datenbrücke"],"parameters":[{"name":"mandant_id","in":"query","required":true,"description":"Mandanten-ID aus list_mandanten.","schema":{"type":"string","format":"uuid"},"example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},{"name":"suche","in":"query","required":false,"description":"Namensteil (Groß-/Kleinschreibung egal).","schema":{"type":"string","maxLength":60},"example":"Müller"},{"name":"top","in":"query","required":false,"description":"Maximale Zeilenzahl (Standard 100, höchstens 200).","schema":{"type":"integer","minimum":1,"maximum":200},"example":50},{"name":"offset","in":"query","required":false,"description":"Zeilen überspringen (Paging): offset=0 erste Seite, offset=top zweite Seite usw. Sortierung ist stabil.","schema":{"type":"integer","minimum":0,"maximum":1000000},"example":50},{"name":"format","in":"query","required":false,"description":"Antwortformat: arrays (Standard, rows als Arrays in Spaltenreihenfolge) oder objects (rows als Objekte { spalte: wert }).","schema":{"type":"string","enum":["arrays","objects"],"default":"arrays"}}],"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LieferantenAntwort"}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht); namen (Organisation hat Namen abgeschaltet).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]},"post":{"operationId":"get_lieferanten_post","summary":"Lieferanten suchen / Stammliste (JSON-Body)","description":"Alternative Aufrufform von GET /api/v1/lieferanten — gleiche Fähigkeit, Felder im JSON-Body (lange Filterlisten, Clients ohne Query-Strings). Toolgeneratoren: den Tag „Alternative Aufrufform“ bzw. x-datenbruecke-alternative ausblenden, damit je Fähigkeit ein Tool bleibt.","tags":["Alternative Aufrufform"],"x-datenbruecke-alternative":true,"requestBody":{"description":"Dieselben Felder wie die Query-Parameter, als JSON-Objekt — für lange Filterlisten oder Clients ohne Query-Strings.","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mandant_id":{"type":"string","format":"uuid","description":"Mandanten-ID aus list_mandanten.","example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},"suche":{"type":"string","maxLength":60,"description":"Namensteil (Groß-/Kleinschreibung egal).","example":"Müller"},"top":{"type":"integer","minimum":1,"maximum":200,"description":"Maximale Zeilenzahl (Standard 100, höchstens 200).","example":50},"offset":{"type":"integer","minimum":0,"maximum":1000000,"description":"Zeilen überspringen (Paging): offset=0 erste Seite, offset=top zweite Seite usw. Sortierung ist stabil.","example":50},"format":{"type":"string","enum":["arrays","objects"],"default":"arrays"}},"required":["mandant_id"],"additionalProperties":false}}}},"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LieferantenAntwort"}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht); namen (Organisation hat Namen abgeschaltet).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]}},"/api/v1/geldkonten":{"get":{"operationId":"get_geldkonten","summary":"Bank- und Kassenbestände je Monat","description":"Bestand der Geldkonten (Bank, Kasse) zum Monatsende je Konto; ohne monat alle Monate des Jahres, mit konto die Zeitreihe eines Kontos. Vorzeichen wie Bilanz. Leeres Ergebnis: Monat noch nicht gebucht. Paging über top und offset; meta.truncated sagt, ob es mehr gibt.","tags":["Datenbrücke"],"parameters":[{"name":"mandant_id","in":"query","required":true,"description":"Mandanten-ID aus list_mandanten.","schema":{"type":"string","format":"uuid"},"example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},{"name":"jahr","in":"query","required":true,"description":"Geschäftsjahr, z. B. 2025.","schema":{"type":"integer","minimum":2000,"maximum":2100},"example":2024},{"name":"monat","in":"query","required":false,"description":"Monat 1–12. Ohne Angabe: Jahreswert.","schema":{"type":"integer","minimum":1,"maximum":12},"example":3},{"name":"konto","in":"query","required":false,"description":"Einzelne Kontonummer (4–8 Stellen; kürzere werden rechts mit Nullen auf 8 Stellen aufgefüllt: 1460 → 14600000).","schema":{"type":"integer","minimum":1,"maximum":99999999},"example":1460},{"name":"top","in":"query","required":false,"description":"Maximale Zeilenzahl (Standard 500, höchstens 500).","schema":{"type":"integer","minimum":1,"maximum":500},"example":50},{"name":"offset","in":"query","required":false,"description":"Zeilen überspringen (Paging): offset=0 erste Seite, offset=top zweite Seite usw. Sortierung ist stabil.","schema":{"type":"integer","minimum":0,"maximum":1000000},"example":50},{"name":"format","in":"query","required":false,"description":"Antwortformat: arrays (Standard, rows als Arrays in Spaltenreihenfolge) oder objects (rows als Objekte { spalte: wert }).","schema":{"type":"string","enum":["arrays","objects"],"default":"arrays"}}],"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeldkontenAntwort"}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]},"post":{"operationId":"get_geldkonten_post","summary":"Bank- und Kassenbestände je Monat (JSON-Body)","description":"Alternative Aufrufform von GET /api/v1/geldkonten — gleiche Fähigkeit, Felder im JSON-Body (lange Filterlisten, Clients ohne Query-Strings). Toolgeneratoren: den Tag „Alternative Aufrufform“ bzw. x-datenbruecke-alternative ausblenden, damit je Fähigkeit ein Tool bleibt.","tags":["Alternative Aufrufform"],"x-datenbruecke-alternative":true,"requestBody":{"description":"Dieselben Felder wie die Query-Parameter, als JSON-Objekt — für lange Filterlisten oder Clients ohne Query-Strings.","required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mandant_id":{"type":"string","format":"uuid","description":"Mandanten-ID aus list_mandanten.","example":"bed9e862-2525-44a2-a12c-b40fbecb63b9"},"jahr":{"type":"integer","minimum":2000,"maximum":2100,"description":"Geschäftsjahr, z. B. 2025.","example":2024},"monat":{"type":"integer","minimum":1,"maximum":12,"description":"Monat 1–12. Ohne Angabe: Jahreswert.","example":3},"konto":{"type":"integer","minimum":1,"maximum":99999999,"description":"Einzelne Kontonummer (4–8 Stellen; kürzere werden rechts mit Nullen auf 8 Stellen aufgefüllt: 1460 → 14600000).","example":1460},"top":{"type":"integer","minimum":1,"maximum":500,"description":"Maximale Zeilenzahl (Standard 500, höchstens 500).","example":50},"offset":{"type":"integer","minimum":0,"maximum":1000000,"description":"Zeilen überspringen (Paging): offset=0 erste Seite, offset=top zweite Seite usw. Sortierung ist stabil.","example":50},"format":{"type":"string","enum":["arrays","objects"],"default":"arrays"}},"required":["mandant_id","jahr"],"additionalProperties":false}}}},"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GeldkontenAntwort"}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token); kost (Daten-Sicht auf Kostenstellen eingeschränkt); mandant (nicht in der Daten-Sicht).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]}},"/api/v1/glossar":{"get":{"operationId":"get_glossar","summary":"Glossar & Rechenregeln","description":"Statisches Glossar: Vorzeichenregeln, Kennzahldefinitionen, Label-Beispiele und Grenzen der API. Eine Zeile mit einem JSON-Objekt in der Spalte inhalt.","tags":["Datenbrücke"],"parameters":[{"name":"format","in":"query","required":false,"description":"Antwortformat: arrays (Standard, rows als Arrays in Spaltenreihenfolge) oder objects (rows als Objekte { spalte: wert }).","schema":{"type":"string","enum":["arrays","objects"],"default":"arrays"}}],"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlossarAntwort"}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]},"post":{"operationId":"get_glossar_post","summary":"Glossar & Rechenregeln (JSON-Body)","description":"Alternative Aufrufform von GET /api/v1/glossar — gleiche Fähigkeit, Felder im JSON-Body (lange Filterlisten, Clients ohne Query-Strings). Toolgeneratoren: den Tag „Alternative Aufrufform“ bzw. x-datenbruecke-alternative ausblenden, damit je Fähigkeit ein Tool bleibt.","tags":["Alternative Aufrufform"],"x-datenbruecke-alternative":true,"requestBody":{"description":"Dieselben Felder wie die Query-Parameter, als JSON-Objekt — für lange Filterlisten oder Clients ohne Query-Strings.","required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"format":{"type":"string","enum":["arrays","objects"],"default":"arrays"}},"required":[],"additionalProperties":false}}}},"responses":{"200":{"description":"Ergebnis (rows als Objekte bei format=objects, sonst Arrays).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlossarAntwort"}}}},"400":{"description":"Eingabe ungültig (Pflichtfeld, Typ, Bereich, Fachregel) — message sagt, was.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}}}},"401":{"description":"Kein oder ungültiges Token bzw. Schlüssel.","headers":{"WWW-Authenticate":{"description":"RFC 9728: `Bearer error=\"invalid_token\", resource_metadata=\"<origin>/.well-known/oauth-protected-resource\"` — OAuth-Clients finden darüber den Authorization Server.","schema":{"type":"string"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"403":{"description":"Nicht freigegeben — mögliche codes: ki_deaktiviert (Organisation hat KI-Analytik und API abgeschaltet oder noch nicht freigeschaltet — die Meldung sagt, welcher Fall); org (keine Organisation im Token).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"429":{"description":"Zu viele Anfragen — 60 je Person und Minute, 300 je Organisation.","headers":{"Retry-After":{"description":"Sekunden bis zum nächsten Versuch.","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"502":{"description":"Abfrage fehlgeschlagen (Datenquelle, code abfrage) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}},"503":{"description":"Authorization Server oder Konfiguration nicht erreichbar (code kontext) — später erneut versuchen.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Fehler"}}}}},"security":[{"oauth2":["openid","email","profile","offline_access","user:org:read"]},{"apiSchluessel":[]}]}}},"components":{"schemas":{"Meta":{"type":"object","required":["tool","rowCount","truncated"],"properties":{"tool":{"type":"string","description":"Name des Werkzeugs (MCP-Toolname)."},"mandant_id":{"type":"string","format":"uuid"},"rowCount":{"type":"integer","description":"Zeilen in dieser Antwort."},"truncated":{"type":"boolean","description":"true = es gäbe mehr Zeilen: mit offset weiterblättern oder enger filtern."},"postfilterEntfernt":{"type":"integer","description":"Zeilen, die die Mandanten-Sicht nachträglich verworfen hat (normal 0)."},"datenstand":{"type":["object","null"],"description":"Datenstand der Quelle — die Daten stammen aus dem nächtlichen Abzug.","properties":{"quelle":{"type":"string"},"jahr_bis":{"type":["integer","null"]},"letzter_monat":{"type":["integer","null"]}}},"demo":{"type":"boolean","description":"true = Musterdaten (Organisation ohne angebundene Buchhaltung)."}}},"Fehler":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["auth","unbekanntes_tool","eingabe","org","ki_deaktiviert","kost","mandant","namen","rate","kontext","abfrage"],"description":"auth 401 · unbekanntes_tool 404 (Pfad gibt es nicht) · eingabe 400 · org/ki_deaktiviert/kost/mandant/namen 403 · rate 429 · abfrage 502 (Datenquelle) · kontext 503 (Authorization Server)."},"message":{"type":"string","description":"Klartext (deutsch)."}}}},"example":{"error":{"code":"eingabe","message":"Genau eine Zeilenangabe ist Pflicht: bwa_zeilennummer ODER bwa_zeile (beide aus get_bwa)."}}},"MandantenZeile":{"type":"object","description":"Eine Ergebniszeile von /api/v1/mandanten.","properties":{"mandant_id":{"type":"string","description":"Mandanten-ID (UUID)."},"mandant_name":{"type":"string","description":"Firmenname."},"mandant_nummer":{"type":"string","description":"DATEV-Mandantennummer."},"kontenrahmen":{"type":"string","description":"Kontenrahmen als Text: „3“ = SKR 3, „4“ = SKR 4."},"kontenlaenge":{"type":"string","description":"Länge der Kontonummern (4–8) als Text."}},"required":["mandant_id","mandant_name","mandant_nummer","kontenrahmen","kontenlaenge"],"additionalProperties":false},"MandantenAntwort":{"type":"object","description":"rows als Objekte (format=objects) oder als Arrays in der Reihenfolge von columns (format=arrays, Standard).","required":["ok","columns","rows","meta"],"properties":{"ok":{"type":"boolean","const":true},"columns":{"type":"array","items":{"type":"string","enum":["mandant_id","mandant_name","mandant_nummer","kontenrahmen","kontenlaenge"]},"description":"Spaltennamen dieser Antwort, in Reihenfolge der rows-Arrays."},"rows":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/MandantenZeile"},{"type":"array","items":{},"description":"format=arrays: Werte in der Reihenfolge von columns."}]}},"meta":{"$ref":"#/components/schemas/Meta"}}},"DatenumfangZeile":{"type":"object","description":"Eine Ergebniszeile von /api/v1/datenumfang.","properties":{"mandant_id":{"type":"string","description":"Mandanten-ID (UUID)."},"quelle":{"type":"string","description":"bwa · konten · belege · bilanz."},"jahr_von":{"type":"integer","description":"Erstes Jahr mit Daten."},"jahr_bis":{"type":"integer","description":"Letztes Jahr mit Daten."},"letzter_monat":{"type":["integer","null"],"description":"Letzter gebuchter Monat des jüngsten Jahres."},"datenpunkte":{"type":"integer","description":"Anzahl Datensätze der Quelle."}},"required":["mandant_id","quelle","jahr_von","jahr_bis","letzter_monat","datenpunkte"],"additionalProperties":false},"DatenumfangAntwort":{"type":"object","description":"rows als Objekte (format=objects) oder als Arrays in der Reihenfolge von columns (format=arrays, Standard).","required":["ok","columns","rows","meta"],"properties":{"ok":{"type":"boolean","const":true},"columns":{"type":"array","items":{"type":"string","enum":["mandant_id","quelle","jahr_von","jahr_bis","letzter_monat","datenpunkte"]},"description":"Spaltennamen dieser Antwort, in Reihenfolge der rows-Arrays."},"rows":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/DatenumfangZeile"},{"type":"array","items":{},"description":"format=arrays: Werte in der Reihenfolge von columns."}]}},"meta":{"$ref":"#/components/schemas/Meta"}}},"BwaZeile":{"type":"object","description":"Eine Ergebniszeile von /api/v1/bwa.","properties":{"mandant_id":{"type":"string","description":"Mandanten-ID (UUID)."},"jahr":{"type":"integer","description":"Geschäftsjahr."},"monat":{"type":"integer","description":"Monat 1–12. Nur wenn: monat gesetzt."},"bwa_zeilennummer":{"type":"integer","description":"Kundenindividuelle Zeilennummer."},"bwa_zeile":{"type":"string","description":"Zeilenname."},"bereich":{"type":"string","description":"Erfolgsrechnung · Bewegungsbilanz · Liquidität."},"betrag":{"type":"number","description":"EUR; Erträge positiv, Aufwendungen negativ. Summenzeilen enthalten."}},"required":["mandant_id","jahr","bwa_zeilennummer","bwa_zeile","bereich","betrag"],"additionalProperties":false},"BwaAntwort":{"type":"object","description":"rows als Objekte (format=objects) oder als Arrays in der Reihenfolge von columns (format=arrays, Standard).","required":["ok","columns","rows","meta"],"properties":{"ok":{"type":"boolean","const":true},"columns":{"type":"array","items":{"type":"string","enum":["mandant_id","jahr","monat","bwa_zeilennummer","bwa_zeile","bereich","betrag"]},"description":"Spaltennamen dieser Antwort, in Reihenfolge der rows-Arrays."},"rows":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/BwaZeile"},{"type":"array","items":{},"description":"format=arrays: Werte in der Reihenfolge von columns."}]}},"meta":{"$ref":"#/components/schemas/Meta"}}},"BilanzJahrZeile":{"type":"object","description":"Zeile von /api/v1/bilanz — Variante Jahr: ohne monat und label: Jahresbestand.","properties":{"mandant_id":{"type":"string","description":"Mandanten-ID (UUID)."},"jahr":{"type":"integer","description":"Geschäftsjahr."},"bwa_zeilennummer":{"type":"integer","description":"Zeilennummer."},"bwa_zeile":{"type":"string","description":"Zeilenname."},"bereich":{"type":"string","description":"Bilanzbereich."},"bestand":{"type":"number","description":"EUR; Aktiva positiv, Passiva negativ."}},"required":["mandant_id","jahr","bwa_zeilennummer","bwa_zeile","bereich","bestand"],"additionalProperties":false},"BilanzMonatZeile":{"type":"object","description":"Zeile von /api/v1/bilanz — Variante Monat: monat oder label gesetzt: Monatsende-Stand mit Kennzahl-Label.","properties":{"mandant_id":{"type":"string","description":"Mandanten-ID (UUID)."},"jahr":{"type":"integer","description":"Geschäftsjahr."},"monat":{"type":"integer","description":"Monatsende-Stand."},"label":{"type":["string","null"],"description":"Kennzahl-Label (GROSS_MIT_UNTERSTRICH)."},"bwa_zeilennummer":{"type":"integer","description":"Zeilennummer."},"bwa_zeile":{"type":"string","description":"Zeilenname."},"bereich":{"type":"string","description":"Bilanzbereich."},"bestand":{"type":"number","description":"EUR; Aktiva positiv, Passiva negativ."}},"required":["mandant_id","jahr","monat","label","bwa_zeilennummer","bwa_zeile","bereich","bestand"],"additionalProperties":false},"BilanzZeile":{"oneOf":[{"$ref":"#/components/schemas/BilanzJahrZeile"},{"$ref":"#/components/schemas/BilanzMonatZeile"}],"description":"Eine Ergebniszeile von /api/v1/bilanz; welche Variante, entscheidet der Aufruf (Jahr | Monat)."},"BilanzAntwort":{"type":"object","description":"rows als Objekte (format=objects) oder als Arrays in der Reihenfolge von columns (format=arrays, Standard).","required":["ok","columns","rows","meta"],"properties":{"ok":{"type":"boolean","const":true},"columns":{"type":"array","items":{"type":"string","enum":["mandant_id","jahr","monat","label","bwa_zeilennummer","bwa_zeile","bereich","bestand"]},"description":"Spaltennamen dieser Antwort, in Reihenfolge der rows-Arrays."},"rows":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/BilanzZeile"},{"type":"array","items":{},"description":"format=arrays: Werte in der Reihenfolge von columns."}]}},"meta":{"$ref":"#/components/schemas/Meta"}}},"KontenZeile":{"type":"object","description":"Eine Ergebniszeile von /api/v1/konten.","properties":{"mandant_id":{"type":"string","description":"Mandanten-ID (UUID)."},"jahr":{"type":"integer","description":"Geschäftsjahr."},"monat":{"type":"integer","description":"Monat. Nur wenn: monat gesetzt."},"konto":{"type":"integer","description":"DATEV-Kontonummer, wie im Kontenrahmen des Mandanten (4–8 Stellen, z. B. 4110)."},"konto_intern":{"type":"integer","description":"Dieselbe Kontonummer 8-stellig normalisiert (41100000) — Schlüssel für Filter und für /geldkonten."},"kontobezeichnung":{"type":"string","description":"Kontobezeichnung."},"bwa_zeilennummer":{"type":"integer","description":"Zeilennummer."},"bwa_zeile":{"type":"string","description":"Zeilenname."},"betrag":{"type":"number","description":"EUR, Vorzeichen wie BWA."},"buchungen_anzahl":{"type":"integer","description":"Anzahl Buchungen."}},"required":["mandant_id","jahr","konto","konto_intern","kontobezeichnung","bwa_zeilennummer","bwa_zeile","betrag","buchungen_anzahl"],"additionalProperties":false},"KontenAntwort":{"type":"object","description":"rows als Objekte (format=objects) oder als Arrays in der Reihenfolge von columns (format=arrays, Standard).","required":["ok","columns","rows","meta"],"properties":{"ok":{"type":"boolean","const":true},"columns":{"type":"array","items":{"type":"string","enum":["mandant_id","jahr","monat","konto","konto_intern","kontobezeichnung","bwa_zeilennummer","bwa_zeile","betrag","buchungen_anzahl"]},"description":"Spaltennamen dieser Antwort, in Reihenfolge der rows-Arrays."},"rows":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/KontenZeile"},{"type":"array","items":{},"description":"format=arrays: Werte in der Reihenfolge von columns."}]}},"meta":{"$ref":"#/components/schemas/Meta"}}},"ForderungenPostenZeile":{"type":"object","description":"Zeile von /api/v1/forderungen — Variante Posten: aging nicht gesetzt (Standard): Einzelposten.","properties":{"mandant_id":{"type":"string","description":"Mandanten-ID (UUID)."},"kundennummer":{"type":"string","description":"Debitorennummer."},"kunde":{"type":"string","description":"Kundenname. Nur wenn: Namen von der Organisation freigegeben (Standard)."},"betrag":{"type":"number","description":"EUR, offene Forderung negativ."},"faelligkeit":{"type":["string","null"],"format":"date","description":"Fälligkeitsdatum."},"belegdatum":{"type":["string","null"],"format":"date","description":"Belegdatum."},"mahnstufe":{"type":["integer","null"],"description":"Mahnstufe."},"ueberfaellig":{"type":"integer","description":"1 = überfällig."},"tage_ueberfaellig":{"type":"integer","description":"Verzugstage, gerechnet gegen das Datum zum Abfragezeitpunkt (Serverzeit UTC), nicht gegen den Datenstand."}},"required":["mandant_id","kundennummer","betrag","faelligkeit","belegdatum","mahnstufe","ueberfaellig","tage_ueberfaellig"],"additionalProperties":false},"ForderungenAgingZeile":{"type":"object","description":"Zeile von /api/v1/forderungen — Variante Aging: aging=true: Altersstruktur je Kunde und Fälligkeitsband.","properties":{"mandant_id":{"type":"string","description":"Mandanten-ID (UUID)."},"kundennummer":{"type":"string","description":"Debitorennummer."},"kunde":{"type":"string","description":"Kundenname. Nur wenn: Namen von der Organisation freigegeben (Standard)."},"betrag":{"type":"number","description":"EUR, offene Forderung negativ."},"bucket":{"type":"string","description":"nicht_faellig · 1_30 · 31_60 · 61_90 · ueber_90."},"bucket_sort":{"type":"integer","description":"Sortierung der Bänder 0–4."},"anzahl":{"type":"integer","description":"Posten im Band."}},"required":["mandant_id","kundennummer","betrag","bucket","bucket_sort","anzahl"],"additionalProperties":false},"ForderungenZeile":{"oneOf":[{"$ref":"#/components/schemas/ForderungenPostenZeile"},{"$ref":"#/components/schemas/ForderungenAgingZeile"}],"description":"Eine Ergebniszeile von /api/v1/forderungen; welche Variante, entscheidet der Aufruf (Posten | Aging)."},"ForderungenAntwort":{"type":"object","description":"rows als Objekte (format=objects) oder als Arrays in der Reihenfolge von columns (format=arrays, Standard).","required":["ok","columns","rows","meta"],"properties":{"ok":{"type":"boolean","const":true},"columns":{"type":"array","items":{"type":"string","enum":["mandant_id","kundennummer","kunde","betrag","faelligkeit","belegdatum","mahnstufe","ueberfaellig","tage_ueberfaellig","bucket","bucket_sort","anzahl"]},"description":"Spaltennamen dieser Antwort, in Reihenfolge der rows-Arrays."},"rows":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/ForderungenZeile"},{"type":"array","items":{},"description":"format=arrays: Werte in der Reihenfolge von columns."}]}},"meta":{"$ref":"#/components/schemas/Meta"}}},"VerbindlichkeitenPostenZeile":{"type":"object","description":"Zeile von /api/v1/verbindlichkeiten — Variante Posten: aging nicht gesetzt (Standard): Einzelposten.","properties":{"mandant_id":{"type":"string","description":"Mandanten-ID (UUID)."},"lieferantennummer":{"type":"string","description":"Kreditorennummer."},"lieferant":{"type":"string","description":"Lieferantenname. Nur wenn: Namen von der Organisation freigegeben (Standard)."},"betrag":{"type":"number","description":"EUR, Vorzeichen wie in der Buchhaltung."},"faelligkeit":{"type":["string","null"],"format":"date","description":"Fälligkeitsdatum."},"belegdatum":{"type":["string","null"],"format":"date","description":"Belegdatum."},"zahlweg":{"type":["string","null"],"description":"Zahlweg."},"ueberfaellig":{"type":"integer","description":"1 = überfällig."},"tage_ueberfaellig":{"type":"integer","description":"Verzugstage, gerechnet gegen das Datum zum Abfragezeitpunkt (Serverzeit UTC), nicht gegen den Datenstand."}},"required":["mandant_id","lieferantennummer","betrag","faelligkeit","belegdatum","zahlweg","ueberfaellig","tage_ueberfaellig"],"additionalProperties":false},"VerbindlichkeitenAgingZeile":{"type":"object","description":"Zeile von /api/v1/verbindlichkeiten — Variante Aging: aging=true: Altersstruktur je Lieferant und Fälligkeitsband.","properties":{"mandant_id":{"type":"string","description":"Mandanten-ID (UUID)."},"lieferantennummer":{"type":"string","description":"Kreditorennummer."},"lieferant":{"type":"string","description":"Lieferantenname. Nur wenn: Namen von der Organisation freigegeben (Standard)."},"betrag":{"type":"number","description":"EUR, Vorzeichen wie in der Buchhaltung."},"bucket":{"type":"string","description":"nicht_faellig · 1_30 · 31_60 · 61_90 · ueber_90."},"bucket_sort":{"type":"integer","description":"Sortierung der Bänder 0–4."},"anzahl":{"type":"integer","description":"Posten im Band."}},"required":["mandant_id","lieferantennummer","betrag","bucket","bucket_sort","anzahl"],"additionalProperties":false},"VerbindlichkeitenZeile":{"oneOf":[{"$ref":"#/components/schemas/VerbindlichkeitenPostenZeile"},{"$ref":"#/components/schemas/VerbindlichkeitenAgingZeile"}],"description":"Eine Ergebniszeile von /api/v1/verbindlichkeiten; welche Variante, entscheidet der Aufruf (Posten | Aging)."},"VerbindlichkeitenAntwort":{"type":"object","description":"rows als Objekte (format=objects) oder als Arrays in der Reihenfolge von columns (format=arrays, Standard).","required":["ok","columns","rows","meta"],"properties":{"ok":{"type":"boolean","const":true},"columns":{"type":"array","items":{"type":"string","enum":["mandant_id","lieferantennummer","lieferant","betrag","faelligkeit","belegdatum","zahlweg","ueberfaellig","tage_ueberfaellig","bucket","bucket_sort","anzahl"]},"description":"Spaltennamen dieser Antwort, in Reihenfolge der rows-Arrays."},"rows":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/VerbindlichkeitenZeile"},{"type":"array","items":{},"description":"format=arrays: Werte in der Reihenfolge von columns."}]}},"meta":{"$ref":"#/components/schemas/Meta"}}},"DsoDpoZeile":{"type":"object","description":"Eine Ergebniszeile von /api/v1/dso_dpo.","properties":{"mandant_id":{"type":"string","description":"Mandanten-ID (UUID)."},"seite":{"type":"string","description":"debitoren · kreditoren."},"offener_bestand":{"type":"number","description":"EUR."},"davon_ueberfaellig":{"type":"number","description":"EUR."},"ueberfaellig_quote_prozent":{"type":"number","description":"Prozent."},"verzugstage_gewichtet":{"type":"number","description":"Betragsgewichtete Verzugstage."},"volumen_12m":{"type":"number","description":"Volumen der letzten 12 Monate, EUR."},"laufzeit_tage":{"type":["number","null"],"description":"DSO bzw. DPO in Tagen."}},"required":["mandant_id","seite","offener_bestand","davon_ueberfaellig","ueberfaellig_quote_prozent","verzugstage_gewichtet","volumen_12m","laufzeit_tage"],"additionalProperties":false},"DsoDpoAntwort":{"type":"object","description":"rows als Objekte (format=objects) oder als Arrays in der Reihenfolge von columns (format=arrays, Standard).","required":["ok","columns","rows","meta"],"properties":{"ok":{"type":"boolean","const":true},"columns":{"type":"array","items":{"type":"string","enum":["mandant_id","seite","offener_bestand","davon_ueberfaellig","ueberfaellig_quote_prozent","verzugstage_gewichtet","volumen_12m","laufzeit_tage"]},"description":"Spaltennamen dieser Antwort, in Reihenfolge der rows-Arrays."},"rows":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/DsoDpoZeile"},{"type":"array","items":{},"description":"format=arrays: Werte in der Reihenfolge von columns."}]}},"meta":{"$ref":"#/components/schemas/Meta"}}},"LiquiditaetAggregiertZeile":{"type":"object","description":"Zeile von /api/v1/liquiditaet — Variante Aggregiert: aggregiert nicht false (Standard): Summe je Fälligkeitstag und Quelle.","properties":{"mandant_id":{"type":"string","description":"Mandanten-ID (UUID)."},"faelligkeit":{"type":["string","null"],"format":"date","description":"Fälligkeitstag."},"quelle":{"type":"string","description":"AR · AP · BANK."},"betrag":{"type":"number","description":"EUR; Einzahlung positiv, Auszahlung negativ."},"anzahl":{"type":"integer","description":"Posten am Tag."},"ueberfaellig":{"type":"integer","description":"1 = mindestens ein Posten überfällig."}},"required":["mandant_id","faelligkeit","quelle","betrag","anzahl","ueberfaellig"],"additionalProperties":false},"LiquiditaetPostenZeile":{"type":"object","description":"Zeile von /api/v1/liquiditaet — Variante Posten: aggregiert=false: Einzelposten mit Konto.","properties":{"mandant_id":{"type":"string","description":"Mandanten-ID (UUID)."},"faelligkeit":{"type":["string","null"],"format":"date","description":"Fälligkeitstag."},"quelle":{"type":"string","description":"AR · AP · BANK."},"betrag":{"type":"number","description":"EUR; Einzahlung positiv, Auszahlung negativ."},"ueberfaellig":{"type":"integer","description":"1 = mindestens ein Posten überfällig."},"konto":{"type":["integer","null"],"description":"Konto des Einzelpostens."}},"required":["mandant_id","faelligkeit","quelle","betrag","ueberfaellig","konto"],"additionalProperties":false},"LiquiditaetZeile":{"oneOf":[{"$ref":"#/components/schemas/LiquiditaetAggregiertZeile"},{"$ref":"#/components/schemas/LiquiditaetPostenZeile"}],"description":"Eine Ergebniszeile von /api/v1/liquiditaet; welche Variante, entscheidet der Aufruf (Aggregiert | Posten)."},"LiquiditaetAntwort":{"type":"object","description":"rows als Objekte (format=objects) oder als Arrays in der Reihenfolge von columns (format=arrays, Standard).","required":["ok","columns","rows","meta"],"properties":{"ok":{"type":"boolean","const":true},"columns":{"type":"array","items":{"type":"string","enum":["mandant_id","faelligkeit","quelle","betrag","anzahl","ueberfaellig","konto"]},"description":"Spaltennamen dieser Antwort, in Reihenfolge der rows-Arrays."},"rows":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/LiquiditaetZeile"},{"type":"array","items":{},"description":"format=arrays: Werte in der Reihenfolge von columns."}]}},"meta":{"$ref":"#/components/schemas/Meta"}}},"KostenstellenStrukturZeile":{"type":"object","description":"Eine Ergebniszeile von /api/v1/kostenstellen_struktur.","properties":{"mandant_id":{"type":"string","description":"Mandanten-ID (UUID)."},"group_id":{"type":["integer","null"],"description":"Gruppen-ID."},"parent_group_id":{"type":["integer","null"],"description":"Übergeordnete Gruppe."},"group_name":{"type":"string","description":"Gruppenname."},"kost_type":{"type":"string","description":"Kostenstellen-Art als Ziffer: „1“ = KOST1, „2“ = KOST2 — Eingabe kost_type=KOST1 liefert Zeilen mit „1“."},"ebene":{"type":"integer","description":"Hierarchieebene (0 = Wurzel)."},"pfad":{"type":"string","description":"Pfad der Gruppe."},"kostenstelle":{"type":"string","description":"Kostenstellennummer."},"kostenstelle_name":{"type":"string","description":"Kostenstellenname."},"ist_direkt":{"type":"integer","description":"1 = direkt zugeordnet."}},"required":["mandant_id","group_id","parent_group_id","group_name","kost_type","ebene","pfad","kostenstelle","kostenstelle_name","ist_direkt"],"additionalProperties":false},"KostenstellenStrukturAntwort":{"type":"object","description":"rows als Objekte (format=objects) oder als Arrays in der Reihenfolge von columns (format=arrays, Standard).","required":["ok","columns","rows","meta"],"properties":{"ok":{"type":"boolean","const":true},"columns":{"type":"array","items":{"type":"string","enum":["mandant_id","group_id","parent_group_id","group_name","kost_type","ebene","pfad","kostenstelle","kostenstelle_name","ist_direkt"]},"description":"Spaltennamen dieser Antwort, in Reihenfolge der rows-Arrays."},"rows":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/KostenstellenStrukturZeile"},{"type":"array","items":{},"description":"format=arrays: Werte in der Reihenfolge von columns."}]}},"meta":{"$ref":"#/components/schemas/Meta"}}},"KundenUmsatzZeile":{"type":"object","description":"Eine Ergebniszeile von /api/v1/kunden_umsatz.","properties":{"mandant_id":{"type":"string","description":"Mandanten-ID (UUID)."},"kundennummer":{"type":"string","description":"Debitorennummer."},"kunde":{"type":"string","description":"Kundenname. Nur wenn: Namen von der Organisation freigegeben (Standard)."},"jahr":{"type":"integer","description":"Jahr."},"monat":{"type":"integer","description":"Monat. Nur wenn: monat gesetzt."},"umsatz":{"type":"number","description":"Brutto-Volumen, EUR, positiv."},"zahlungseingang":{"type":"number","description":"EUR."},"anzahl_belege":{"type":"integer","description":"Belege."}},"required":["mandant_id","kundennummer","jahr","umsatz","zahlungseingang","anzahl_belege"],"additionalProperties":false},"KundenUmsatzAntwort":{"type":"object","description":"rows als Objekte (format=objects) oder als Arrays in der Reihenfolge von columns (format=arrays, Standard).","required":["ok","columns","rows","meta"],"properties":{"ok":{"type":"boolean","const":true},"columns":{"type":"array","items":{"type":"string","enum":["mandant_id","kundennummer","kunde","jahr","monat","umsatz","zahlungseingang","anzahl_belege"]},"description":"Spaltennamen dieser Antwort, in Reihenfolge der rows-Arrays."},"rows":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/KundenUmsatzZeile"},{"type":"array","items":{},"description":"format=arrays: Werte in der Reihenfolge von columns."}]}},"meta":{"$ref":"#/components/schemas/Meta"}}},"LieferantenVolumenZeile":{"type":"object","description":"Eine Ergebniszeile von /api/v1/lieferanten_volumen.","properties":{"mandant_id":{"type":"string","description":"Mandanten-ID (UUID)."},"lieferantennummer":{"type":"string","description":"Kreditorennummer."},"lieferant":{"type":"string","description":"Lieferantenname. Nur wenn: Namen von der Organisation freigegeben (Standard)."},"jahr":{"type":"integer","description":"Jahr."},"einkaufsvolumen":{"type":"number","description":"EUR, positiv."},"zahlungsausgang":{"type":"number","description":"EUR."},"anzahl_belege":{"type":"integer","description":"Belege."}},"required":["mandant_id","lieferantennummer","jahr","einkaufsvolumen","zahlungsausgang","anzahl_belege"],"additionalProperties":false},"LieferantenVolumenAntwort":{"type":"object","description":"rows als Objekte (format=objects) oder als Arrays in der Reihenfolge von columns (format=arrays, Standard).","required":["ok","columns","rows","meta"],"properties":{"ok":{"type":"boolean","const":true},"columns":{"type":"array","items":{"type":"string","enum":["mandant_id","lieferantennummer","lieferant","jahr","einkaufsvolumen","zahlungsausgang","anzahl_belege"]},"description":"Spaltennamen dieser Antwort, in Reihenfolge der rows-Arrays."},"rows":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/LieferantenVolumenZeile"},{"type":"array","items":{},"description":"format=arrays: Werte in der Reihenfolge von columns."}]}},"meta":{"$ref":"#/components/schemas/Meta"}}},"KundenZeile":{"type":"object","description":"Eine Ergebniszeile von /api/v1/kunden.","properties":{"mandant_id":{"type":"string","description":"Mandanten-ID (UUID)."},"kundennummer":{"type":"string","description":"Debitorennummer."},"kunde":{"type":"string","description":"Kundenname."}},"required":["mandant_id","kundennummer","kunde"],"additionalProperties":false},"KundenAntwort":{"type":"object","description":"rows als Objekte (format=objects) oder als Arrays in der Reihenfolge von columns (format=arrays, Standard).","required":["ok","columns","rows","meta"],"properties":{"ok":{"type":"boolean","const":true},"columns":{"type":"array","items":{"type":"string","enum":["mandant_id","kundennummer","kunde"]},"description":"Spaltennamen dieser Antwort, in Reihenfolge der rows-Arrays."},"rows":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/KundenZeile"},{"type":"array","items":{},"description":"format=arrays: Werte in der Reihenfolge von columns."}]}},"meta":{"$ref":"#/components/schemas/Meta"}}},"LieferantenZeile":{"type":"object","description":"Eine Ergebniszeile von /api/v1/lieferanten.","properties":{"mandant_id":{"type":"string","description":"Mandanten-ID (UUID)."},"lieferantennummer":{"type":"string","description":"Kreditorennummer."},"lieferant":{"type":"string","description":"Lieferantenname."}},"required":["mandant_id","lieferantennummer","lieferant"],"additionalProperties":false},"LieferantenAntwort":{"type":"object","description":"rows als Objekte (format=objects) oder als Arrays in der Reihenfolge von columns (format=arrays, Standard).","required":["ok","columns","rows","meta"],"properties":{"ok":{"type":"boolean","const":true},"columns":{"type":"array","items":{"type":"string","enum":["mandant_id","lieferantennummer","lieferant"]},"description":"Spaltennamen dieser Antwort, in Reihenfolge der rows-Arrays."},"rows":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/LieferantenZeile"},{"type":"array","items":{},"description":"format=arrays: Werte in der Reihenfolge von columns."}]}},"meta":{"$ref":"#/components/schemas/Meta"}}},"GeldkontenZeile":{"type":"object","description":"Eine Ergebniszeile von /api/v1/geldkonten.","properties":{"mandant_id":{"type":"string","description":"Mandanten-ID (UUID)."},"jahr":{"type":"integer","description":"Jahr."},"monat":{"type":"integer","description":"Monat."},"konto":{"type":"integer","description":"DATEV-Kontonummer."},"kontobezeichnung":{"type":"string","description":"Kontobezeichnung."},"bestand":{"type":"number","description":"EUR zum Monatsende."}},"required":["mandant_id","jahr","monat","konto","kontobezeichnung","bestand"],"additionalProperties":false},"GeldkontenAntwort":{"type":"object","description":"rows als Objekte (format=objects) oder als Arrays in der Reihenfolge von columns (format=arrays, Standard).","required":["ok","columns","rows","meta"],"properties":{"ok":{"type":"boolean","const":true},"columns":{"type":"array","items":{"type":"string","enum":["mandant_id","jahr","monat","konto","kontobezeichnung","bestand"]},"description":"Spaltennamen dieser Antwort, in Reihenfolge der rows-Arrays."},"rows":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/GeldkontenZeile"},{"type":"array","items":{},"description":"format=arrays: Werte in der Reihenfolge von columns."}]}},"meta":{"$ref":"#/components/schemas/Meta"}}},"GlossarZeile":{"type":"object","description":"Eine Ergebniszeile von /api/v1/glossar.","properties":{"inhalt":{"type":"object","description":"Glossar als JSON-Objekt (vorzeichen, begriffe, labels, grenzen)."}},"required":["inhalt"],"additionalProperties":false},"GlossarAntwort":{"type":"object","description":"rows als Objekte (format=objects) oder als Arrays in der Reihenfolge von columns (format=arrays, Standard).","required":["ok","columns","rows","meta"],"properties":{"ok":{"type":"boolean","const":true},"columns":{"type":"array","items":{"type":"string","enum":["inhalt"]},"description":"Spaltennamen dieser Antwort, in Reihenfolge der rows-Arrays."},"rows":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/GlossarZeile"},{"type":"array","items":{},"description":"format=arrays: Werte in der Reihenfolge von columns."}]}},"meta":{"$ref":"#/components/schemas/Meta"}}}},"securitySchemes":{"oauth2":{"type":"oauth2","description":"Clerk OAuth 2.1 (Authorization Code + PKCE). Für OAuth-fähige Clients (claude.ai, ChatGPT).","flows":{"authorizationCode":{"authorizationUrl":"https://clerk.datenbruecke.com/oauth/authorize","tokenUrl":"https://clerk.datenbruecke.com/oauth/token","scopes":{"openid":"Identität","email":"E-Mail","profile":"Profil","offline_access":"Verbindung behalten","user:org:read":"Organisation wählen"}}}},"apiSchluessel":{"type":"http","scheme":"bearer","bearerFormat":"dbk_…","description":"Persönlicher API-Schlüssel (Bereich „KI-Konnektor & API“) — für Excel/Power Query, Power Automate, Skripte. Sieht genau die Mandanten der Person."}}}}