Flowyer API

Flowyer API-Referenz

API-Version: 25ac141b2e28

Die vollständige Flowyer REST API für Entwickler: Endpunkte, Parameter, Antworten und Codebeispiele.

Mit der Flowyer API kann Ihre eigene Software oder ein KI-Assistent im Namen eines Flowyer-Benutzers Datensätze (Akten, Mandanten, Aufgaben, Arbeitszeiten, Kosten und Dokumente) lesen, anlegen und ändern. Jede Anfrage läuft genau mit den Berechtigungen dieses Benutzers, zusätzlich eingeschränkt durch die Bereiche des Schlüssels oder der Freigabe. Über die API lässt sich nichts löschen.

Die Beschreibungen der Endpunkte und Felder sind auf Englisch, weil KI-Assistenten genau diesen Text lesen.

Basis-URL

Alle Endpunkte liegen unter den folgenden Adressen. Verwenden Sie immer genau den https-Host mit www. am Anfang, denn eine Weiterleitung würde den Authorization-Header verwerfen.

Basis-URL

https://www.flowyer.de/api/agent
https://www.flowyer.hu/api/agent
https://www.flowyer.com/api/agent
https://www.flowyer.ro/api/agent
https://www.flowyer.it/api/agent

Authentifizierung

Jede Anfrage braucht ein Bearer-Token im Authorization-Header. Es gibt zwei Arten von Token; die Endpunkte behandeln beide gleich.

Persönlicher API-Schlüssel

Der Benutzer legt ihn in Flowyer unter Einstellungen > API-Schlüssel an, nachdem ein Kanzlei-Administrator die API freigeschaltet hat. Ein Schlüssel beginnt mit flw_, wird nur einmal angezeigt und kann jederzeit mit sofortiger Wirkung widerrufen werden.

OAuth 2.1 für verbundene Anwendungen

Eine Integration für andere Benutzer fordert den Zugriff statt mit einem Schlüssel über den OAuth 2.1 Authorization Code + PKCE (S256) Ablauf an; Clients können sich dynamisch registrieren. Ein Zugriffstoken gilt 60 Minuten, ein Aktualisierungstoken 60 Tage, und das Paar wird bei jeder Verwendung ersetzt. Der PKCE code_verifier besteht aus 43 bis 128 Zeichen aus A-Z, a-z, 0-9 sowie - . _ ~ (RFC 7636 4.1), also base64url ohne Auffüllzeichen: ein abschließendes "=" wird abgelehnt.

Server-Metadaten
https://www.flowyer.com/.well-known/oauth-authorization-server
Autorisierung
https://www.flowyer.com/authorize
Token
https://www.flowyer.com/api/agent/oauth/token
Client-Registrierung
https://www.flowyer.com/api/agent/oauth/register
Widerruf
https://www.flowyer.com/api/agent/oauth/revoke

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/me' \
  -H 'Authorization: Bearer flw_...'

Bereiche

Jeder Endpunkt außer GET /me erfordert einen Bereich (Scope). Fehlt er dem Schlüssel oder der Freigabe, lautet die Antwort 403 scope_missing. GET /me braucht keinen Bereich: damit sehen Sie, was der Schlüssel oder die Freigabe darf.

BereichBedeutungEndpunkte
matters:read Akten lesen GETAngelegenheiten auflisten GETAngelegenheit anhand des Namens auflösen GETAngelegenheit abrufen GETVerantwortliche einer Akte auflisten
matters:create Akten anlegen POSTAngelegenheit erstellen
matters:update Akten ändern PATCHAngelegenheit aktualisieren POSTVerantwortlichen zu einer Akte hinzufügen
clients:read Mandanten lesen GETMandanten auflisten GETMandanten anhand des Namens auflösen GETMandanten abrufen
clients:create Mandanten anlegen POSTMandanten anlegen
clients:update Mandanten ändern PATCHMandanten aktualisieren
tasks:read Aufgaben lesen GETAufgaben auflisten GETAufgabe abrufen
tasks:create Aufgaben anlegen POSTAufgabe anlegen
tasks:update Aufgaben ändern PATCHAufgabe aktualisieren POSTAufgabe schließen
workhours:read Zeiteinträge lesen GETZeiteinträge auflisten GETZeiteintrag abrufen
workhours:create Zeiteintrag erfassen POSTZeiteintrag erfassen
workhours:update Zeiteintrag ändern PATCHZeiteintrag aktualisieren
costs:read Kosten lesen GETKosten auflisten GETKosten abrufen
costs:create Kosten erfassen POSTKosten erfassen
costs:update Kosten ändern PATCHKosten aktualisieren
invoices:read Rechnungen lesen GETRechnungen auflisten GETRechnung abrufen
documents:read Dokumente auflisten (nur Metadaten, kein Download) GETDokumente einer Angelegenheit auflisten GETOrdner einer Angelegenheit auflisten
documents:download Dokumente herunterladen (vollständiger Inhalt) GETDokument herunterladen
documents:create Dokument hochladen POSTAktenordner anlegen POSTDokument-Upload starten POSTDokument-Upload abschließen
documents:update Dokument umbenennen PATCHDokument umbenennen PATCHAktenordner umbenennen
colleagues:read Kollegen auflisten (nur Namen) GETKollegen auflisten
knowledge:read Wissensdatenbank lesen GETWissensdatenbank-Artikel auflisten GETWissensdatenbank-Artikel abrufen GETWissensdatenbank-Kategorien auflisten GETWissensdatenbank-Kategorie abrufen
knowledge:create Wissensdatenbank-Einträge erstellen POSTWissensdatenbank-Artikel anlegen POSTWissensdatenbank-Kategorie anlegen
knowledge:update Wissensdatenbank-Einträge bearbeiten PATCHWissensdatenbank-Artikel aktualisieren PATCHWissensdatenbank-Kategorie aktualisieren
emails:read E-Mails von Akten lesen GETE-Mails einer Akte auflisten GETE-Mail abrufen
litigation:read Prozessverlauf auflisten GETProzessverlauf einer Akte auflisten
litigation:create Prozessverlaufseintrag anlegen POSTEintrag im Prozessverlauf anlegen
litigation:update Prozessverlaufseintrag ändern PATCHEintrag im Prozessverlauf aktualisieren
mail_register:read Postbuch lesen GETPostbuch auflisten GETPostbuch-Eintrag abrufen
mail_register:create Postbuch-Eintrag anlegen POSTPostbuch-Eintrag anlegen
mail_register:update Postbuch-Eintrag ändern PATCHPostbuch-Eintrag aktualisieren
comments:read Fallkommentare lesen GETFallkommentare auflisten
comments:create Fallkommentare schreiben POSTFallkommentar posten
comments:update Eigene Fallkommentare bearbeiten PATCHEigenen Fallkommentar bearbeiten
trials:read Verhandlungen lesen GETVerhandlungen einer Akte auflisten GETVerhandlung abrufen
trials:create Verhandlung anlegen POSTVerhandlung erfassen
trials:update Verhandlung ändern PATCHVerhandlung aktualisieren
courts:read Gerichte auflisten GETGerichte auflisten
hr:read Abwesenheiten lesen (nur Daten) GETMitarbeiterabwesenheiten auflisten
calendar:read Kalendereinträge lesen GETKalendereinträge auflisten GETKalendereintrag abrufen
calendar:create Kalendereinträge erstellen POSTKalendereintrag anlegen
calendar:update Kalendereinträge ändern PATCHKalendereintrag aktualisieren
bookings:read Terminbuchungen ansehen GETTerminbuchungen auflisten GETTerminbuchung abrufen
bookings:create Terminbuchung erstellen (sendet dem Mandanten eine E-Mail) POSTTerminbuchung anlegen
bookings:update Buchungen verschieben und bearbeiten PATCHTerminbuchung aktualisieren
bookings:send Buchungen bestätigen oder stornieren (sendet dem Mandanten eine E-Mail) POSTTerminbuchung bestätigen POSTTerminbuchung stornieren
tickets:read Support-Tickets lesen GETSupport-Tickets auflisten GETSupport-Ticket abrufen
tickets:reply Auf Tickets antworten (sendet eine E-Mail an den Mandanten) POSTAuf Ticket antworten
tickets:update Ticketstatus ändern PATCHTicketstatus ändern
portal:read Mandantenportal: Threads und Nachrichten lesen GETMandantenportale auflisten GETPortalnachrichten auflisten
portal:reply Mandantenportal: dem Mandanten antworten (sendet eine Nachricht und eine Benachrichtigungs-E-Mail) POSTIm Mandantenportal antworten

Fehler

Jeder Fehler hat dieselbe Form: ein Maschinencode (error), eine englische Meldung (message), die Meldung in der Kanzleisprache (message_localized) und optionale Details (details). Bei 401, 403, 404 und 422 ist es sinnlos, die unveränderte Anfrage zu wiederholen, mit zwei Ausnahmen: bei 404 upload_not_finished schließen Sie zuerst den Upload zur upload_url ab und rufen dann complete erneut auf; bei einem abgelaufenen OAuth-Zugriffstoken (401 expired_key) erneuern Sie zuerst das Token.

HTTPerrorBedeutung
400 invalid_json use_www_host bad_request Fehlerhafte Anfrage: ungültiger JSON-Text, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.
401 missing_key invalid_key revoked_key expired_key user_inactive office_not_found Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, sein Inhaber ist nicht mehr aktiv, oder die Kanzlei des Schlüssels wurde nicht gefunden.
403 scope_missing module_forbidden forbidden office_api_disabled licence_expired office_archived Eine Berechtigung fehlt beim Schlüssel oder beim Benutzer, oder die Kanzlei hat die API nicht freigeschaltet.
404 not_found matter_not_visible unknown_endpoint upload_not_finished replay_not_visible Der Datensatz existiert nicht oder der Benutzer darf ihn nicht sehen; unbekannter Endpunkt; die hochgeladene Datei ist noch nicht im Speicher angekommen (upload_not_finished: laden Sie sie zur upload_url hoch und rufen Sie dann complete erneut auf); oder eine wiederholte Anlage, deren Datensatz bereits angelegt, inzwischen aber gelöscht oder verborgen wurde (replay_not_visible: es wurde nichts Neues angelegt, legen Sie ihn nicht erneut an).
405 delete_not_allowed update_not_allowed method_not_allowed Löschen ist über die API nicht möglich; Ändern nur dort, wo die Beschreibung eine PATCH-Operation anbietet.
409 client_exists client_exists_generic idempotency_key_reused duplicate_in_progress record_conflict record_locked duplicate_name Ein Mandant mit diesem Namen existiert bereits; im Ordner existiert bereits ein Dokument mit diesem Namen (duplicate_name); der Datensatz wurde seit dem Lesen geändert (record_conflict: lesen Sie ihn erneut und senden Sie die Änderung mit dem neuen updated_at erneut); der Datensatz ist abgerechnet oder gesperrt (record_locked: nehmen Sie die Änderung in Flowyer vor); der Idempotency-Key wurde für eine andere Ressource verwendet; oder eine identische Anfrage wird gerade verarbeitet.
413 request_too_large file_too_large Der Anfragetext ist zu groß (request_too_large), oder die hochzuladende Datei überschreitet die Grenze (file_too_large; details.max nennt die Grenze in Byte).
422 validation_failed unknown_client unknown_colleague blocked_file_type upload_token_invalid folder_not_in_matter document_name_too_long Ein ungültiges oder fehlendes Feld (details.fields zeigt welches); ein ungültiges, bereits verwendetes oder abgelaufenes Upload-Token (upload_token_invalid: starten Sie den Upload erneut); oder ein Ordner, der nicht zur Akte gehört (folder_not_in_matter).
429 rate_limited auth_rate_limited Zu viele Anfragen (300 pro Minute und Schlüssel); der Retry-After-Header sagt, wann Sie es erneut versuchen können.
500 server_error Unerwarteter Fehler. Die Anfrage wurde unter ihrer request_id protokolliert; versuchen Sie es später erneut und nennen Sie bei Wiederholung diese ID dem Flowyer-Support.
503 office_maintenance office_setup_incomplete temporarily_unavailable Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder laufende Einrichtung); der Retry-After-Header sagt, wann Sie es erneut versuchen können.

Antwortbeispiele · 403

{
  "error": "scope_missing",
  "message": "This API key does not have the \"clients:create\" permission. The permissions of an existing key cannot be changed, so the key owner needs to create a new key with this permission in Flowyer under Settings > API keys and use it in place of the old one.",
  "message_localized": "Dieser API-Schlüssel hat die Berechtigung \"clients:create\" nicht. Die Berechtigungen eines bestehenden Schlüssels lassen sich nicht ändern, daher muss der Inhaber des Schlüssels in Flowyer unter Einstellungen > API-Schlüssel einen neuen Schlüssel mit dieser Berechtigung anlegen und ihn anstelle des alten verwenden.",
  "locale": "de",
  "details": {
    "required_scope": "clients:create"
  },
  "request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}

Seitenweise Abfrage

Datensatzlisten werden mit den Parametern limit und offset seitenweise abgefragt (Standard 25, höchstens 100 Einträge pro Seite). pagination.total ist die Gesamtzahl der Treffer; der offset der nächsten Seite ist der vorherige offset plus limit. GET /colleagues, GET /clients/resolve und GET /matters/resolve sind nicht seitenweise abfragbar: Sie akzeptieren nur limit (mit eigenem Standardwert und eigenem Höchstwert, siehe den jeweiligen Endpunkt) und liefern statt eines pagination-Objekts total und truncated innerhalb von data; senden Sie ihnen daher keinen offset.

Antwortbeispiele · 200

{
  "data": [
    {
      "id": 1234,
      "...": "..."
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 134
  }
}

Sichere Wiederholungen

Jedes Anlegen akzeptiert einen Idempotency-Key-Header (oder ein Feld idempotency_key). Eine mit demselben Wert wiederholte Anfrage liefert den beim ersten Mal angelegten Datensatz (200, idempotent_replay), statt einen weiteren anzulegen. Unterschiedliche Schlüssel legen immer getrennte Datensätze an. Ohne Schlüssel liefert ein identisches Anlegen innerhalb von 120 Sekunden den ersten Datensatz.

Anfragebeispiele

curl -X POST 'https://www.flowyer.de/api/agent/clients' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 7f3a9c21-1b2c-4d5e-8f90-0a1b2c3d4e5f' \
  -d '{"name": "Kovács Kft."}'

Änderungen und Konflikte

Eine Änderung ist ein PATCH auf den eigenen Pfad des Datensatzes: Nur die gesendeten Felder ändern sich, und ein ausdrückliches null leert ein Feld nur dann, wenn die Feldbeschreibung dies zulässt; bei einigen Feldern behält null den gespeicherten Wert, lesen Sie daher die Feldbeschreibung. Senden Sie in expected_updated_at den updated_at-Wert Ihres letzten Lesens. Hat inzwischen jemand anderes den Datensatz geändert, lautet die Antwort 409 record_conflict; lesen Sie den Datensatz dann erneut.

Anfragebeispiele

curl -X PATCH 'https://www.flowyer.de/api/agent/matters/1234' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -d '{"expected_updated_at": "2026-10-30T09:15:00+01:00", "description": null}'

Datum und Zeitzone

Datumsangaben haben das Format JJJJ-MM-TT, Zeitpunkte folgen ISO 8601 mit dem Versatz der Kanzlei-Zeitzone. Die Zeitzone der Kanzlei steht im Feld office.timezone der Antwort von GET /me.

Grenzen

Höchstens 300 Anfragen pro Minute und Schlüssel oder Token; darüber lautet die Antwort 429, und der Retry-After-Header sagt, wann Sie es erneut versuchen können. Ein JSON-Anfragetext darf höchstens 64 KB groß sein, ein hochgeladenes Dokument höchstens 100 MB.

Versionen

Die Version der OpenAPI-Beschreibung ändert sich mit jeder Änderung und wird auch als ETag-Header gesendet, sodass Clients mit If-None-Match prüfen können, ob sie sich geändert hat.

Identität

Wer bin ich

GET /api/agent/me

Gibt den Benutzer und die Kanzlei zurück, für die dieser API-Schlüssel handelt, die Scopes des Schlüssels (was er darf) und die Rate-Limits. Rufen Sie es zuerst auf, um zu erfahren, welche Operationen verfügbar sind; erfordert keinen Scope.

Dieser Endpunkt hat keine Eingaben.

Antworten

200

OK.

dataerforderlich
object
Felder von data
user
object
Felder von user
id
integer
name
string | null
language
string | null
office
object
Felder von office
id
integer
name
string | null
timezone
string

IANA-Zone, in der die API Zeitstempel liest und schreibt, z. B. Europe/Budapest.

currency_id
integer

Die Währung der Kanzlei (Flowyer-Währungs-ID): costs.create bucht darin, wenn currency_id weggelassen wird.

currency
string | null

ISO-Code der Währung der Kanzlei, z. B. HUF, EUR, RON.

key
object
Felder von key
id
integer
name
string

Name, den der Benutzer diesem Schlüssel gegeben hat, oder die verbundene App bei einem OAuth-Token.

kind
string

"key" = ein statischer API-Schlüssel, "oauth" = ein OAuth 2.1 Access-Token.

Zulässige Werte: "key" "oauth"
prefix
string | null

Erste Zeichen eines statischen Schlüssels, nur zur Identifikation; null bei OAuth.

expires_at
string <date-time> | null
last_used_at
string <date-time> | null
scopes
string[]

Scopes dieses Credentials, z. B. "matters:read". Eine Operation, deren Scope fehlt, antwortet mit 403.

available_scopes
string[]

Alle Scopes, die der Schlüsselinhaber in Flowyer aktivieren könnte.

limits
object
Felder von limits
requests_per_minute
integer
list_max_limit
integer
channel
string

Wie die Anfrage Flowyer erreicht hat.

Zulässige Werte: "rest" "mcp"
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Unbekannter Query-Parameter (diese Operation nimmt keine an); details.fields benennt ihn.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/me' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": {
    "user": {
      "id": 1234,
      "name": "string",
      "language": "string"
    },
    "office": {
      "id": 1234,
      "name": "string",
      "timezone": "string",
      "currency_id": 1234,
      "currency": "string"
    },
    "key": {
      "id": 1234,
      "name": "string",
      "kind": "key",
      "prefix": "string",
      "expires_at": "2026-10-30T09:15:00+01:00",
      "last_used_at": "2026-10-30T09:15:00+01:00"
    },
    "scopes": [
      "string"
    ],
    "available_scopes": [
      "string"
    ],
    "limits": {
      "requests_per_minute": 0,
      "list_max_limit": 0
    },
    "channel": "rest"
  }
}

Kollegen

Kollegen auflisten

GET /api/agent/colleagues

Listet die aktiven Kollegen der Kanzlei (id, name) für assigned_to_user_id / responsible_user_id auf. Mit q (ein Name wie gehört; Akzente, Groß-/Kleinschreibung und kleine Tippfehler werden toleriert) antwortet die Funktion mit dem Status exact/similar/none wie die resolve-Funktionen: Nur "exact" kann direkt gefahrlos verwendet werden.

Bereich
colleagues:read

Abfrageparameter

q
stringhöchstens 255 Zeichen

Nachzuschlagender Name eines Kollegen, wie gehört oder diktiert, in beliebiger Wortreihenfolge. Lassen Sie ihn weg, um alle aktiven Kollegen aufzulisten.

Beispiel: "Nagy Péter"
limit
integer>= 1<= 500

Maximale Anzahl zurückzugebender Kollegen (Standard 200).

Standard: 200

Antworten

200

OK.

dataerforderlich
object
Felder von data
status
string | null

Nur mit q: exact = ein sicherer Treffer (seine id kann gefahrlos verwendet werden), similar = ungefähre oder mehrere Treffer (bestätigen Sie zuerst beim Benutzer), none = kein Treffer (fragen Sie den Benutzer). null ohne q.

Zulässige Werte: "exact" "similar" "none"
colleagues
object[]

Aktive Kollegen, mit q bester Treffer zuerst, andernfalls nach Namen.

Felder von colleagues
id
integer

Benutzer-ID: übergeben Sie sie als assigned_to_user_id / responsible_user_id.

name
string

Anzeigename, wie ihn Flowyer darstellt (ggf. mit dem Titel).

title
string | null

Namenszusatz wie "Dr." oder null.

total
integer

Wie viele Kollegen übereinstimmten (ohne q alle aktiven Kollegen), bevor die Liste auf limit gekürzt wurde.

truncated
boolean

true, wenn mehr Kollegen übereinstimmten als zurückgegeben wurden: grenzen Sie q ein oder erhöhen Sie limit.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/colleagues?q=Nagy%20P%C3%A9ter' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": {
    "status": "exact",
    "colleagues": [
      {
        "id": 1234,
        "name": "string",
        "title": "string"
      }
    ],
    "total": 1,
    "truncated": true
  }
}

Akten

Angelegenheiten auflisten

GET /api/agent/matters

Listet die Angelegenheiten (Fälle) auf, die der Benutzer sehen darf, neueste zuerst. Verwenden Sie dies, um eine Angelegenheit anhand des Aktenzeichens, des Betreffs oder des Mandanten zu finden, bevor Sie an anderer Stelle darauf verweisen. Archivierte Angelegenheiten werden ausgeblendet, sofern include_archived nicht true ist.

Bereich
matters:read
Flowyer-Berechtigung
cases:read

Abfrageparameter

q
stringhöchstens 100 Zeichen

Volltextsuche im Betreff und in den Mandantennamen (Akzente und Groß-/Kleinschreibung werden ignoriert) sowie in den übrigen Aktenzeichen der Kanzlei; oder ein Aktenzeichen, entweder genau wie in case_number zurückgegeben (das Nummerierungsschema der Kanzlei) oder als Jahr/Sequenz wie "2026/0025".

Beispiel: "2026/0025"
client_id
integer>= 1

Nur Angelegenheiten dieses Mandanten.

Beispiel: 512
responsible_user_id
integer>= 1

Nur Angelegenheiten, für die dieser Benutzer (IDs aus colleagues.list) verantwortlich ist: als Hauptverantwortlicher, als zusätzlicher Verantwortlicher oder als Mitglied einer verantwortlichen Arbeitsgruppe (wie der Kollegenfilter im Web).

updated_since
string <date-time>

Nur Angelegenheiten, die zu diesem Zeitpunkt oder danach geändert wurden (ISO 8601).

Beispiel: "2026-10-01T00:00:00+02:00"
include_archived
boolean

Archivierte Angelegenheiten einbeziehen.

Standard: false
limit
integer>= 1<= 100

Seitengröße, 1-100. Standard 25.

Standard: 25
Beispiel: 25
offset
integer>= 0

Anzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.

Standard: 0
Beispiel: 0

Antworten

200

OK.

dataerforderlich
object[]
Felder von data
id
integer

Angelegenheits-ID. Verwenden Sie sie an anderer Stelle als matter_id.

Beispiel: 1234
case_number
string

Aktenzeichen, wie es in Flowyer angezeigt wird, im Nummerierungsschema der Kanzlei.

Beispiel: "2026/0025"
subject
string
Beispiel: "Kovács Kft. v. Nagy Bt. - contract dispute"
status
string
Zulässige Werte: "active" "archived"
case_type_id
integer | null
case_type
string | null

Lokalisierter Name des Falltyps.

responsible_user_id
integer | null
responsible
string | null

Anzeigename des verantwortlichen Anwalts.

clients
object[]

Mandanten (Auftraggeber) der Angelegenheit.

Felder von clients
id
integer
name
string
started_on
string <date> | null
restricted
boolean

True, wenn nur die verantwortlichen Anwälte die Angelegenheit sehen dürfen (Chinese Wall).

created_at
string <date-time> | null
updated_at
string <date-time> | null
created_via_api
object | null

Vorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
paginationerforderlich
object
Felder von pagination
limiterforderlich
integer
offseterforderlich
integer
totalerforderlich
integer

Gesamtanzahl der übereinstimmenden Datensätze.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/matters?q=2026%2F0025&client_id=512&updated_since=2026-10-01T00%3A00%3A00%2B02%3A00' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": [
    {
      "id": 1234,
      "case_number": "2026/0025",
      "subject": "Kovács Kft. v. Nagy Bt. - contract dispute",
      "status": "active",
      "case_type_id": 1234,
      "case_type": "string",
      "responsible_user_id": 1234,
      "responsible": "string",
      "clients": [
        {
          "id": 1234,
          "name": "string"
        }
      ],
      "started_on": "2026-10-30",
      "restricted": true,
      "created_at": "2026-10-30T09:15:00+01:00",
      "updated_at": "2026-10-30T09:15:00+01:00",
      "created_via_api": {
        "kind": "key",
        "key_id": 1234,
        "key_name": "string",
        "user_id": 1234,
        "user": "string",
        "at": "2026-10-30T09:15:00+01:00"
      }
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 1
  }
}

Angelegenheit anhand des Namens auflösen

GET /api/agent/matters/resolve

Findet eine Angelegenheit anhand eines gesprochenen oder falsch geschriebenen Betreffs oder Mandantennamens (Akzente, Groß-/Kleinschreibung und kleine Tippfehler werden toleriert). Gibt den Status exact/similar/none und Kandidaten zurück. Nur "exact" kann direkt gefahrlos verwendet werden; andernfalls bestätigen Sie mit dem Benutzer. Viele Namensdoppelgänger sind nie "exact": Grenzen Sie mit client_id oder einem vollständigeren Namen ein.

Bereich
matters:read
Flowyer-Berechtigung
cases:read

Abfrageparameter

nameerforderlich
stringmindestens 1 Zeichenhöchstens 255 Zeichen

Betreff der Angelegenheit oder Mandantenname zum Nachschlagen, wie gehört oder diktiert.

Beispiel: "ingatlan adásvétel"
client_id
integer | null>= 1

Nur Angelegenheiten dieses Mandanten (verwenden Sie dies, nachdem clients.resolve einen exakten Mandanten zurückgegeben hat).

limit
integer>= 1<= 10

Maximale Anzahl zurückzugebender Kandidaten (Standard 5).

Standard: 5

Antworten

200

OK.

dataerforderlich
object
Felder von data
status
string

exact = ein sicherer Treffer (seine id kann gefahrlos verwendet werden). similar = ein oder mehrere ungefähre Treffer, bestätigen Sie zuerst mit dem Benutzer. none = kein Treffer, fragen Sie den Benutzer.

Zulässige Werte: "exact" "similar" "none"
matters
object[]

Kandidaten-Angelegenheiten, bester Treffer zuerst.

Felder von matters
id
integer

Angelegenheits-ID. Verwenden Sie sie an anderer Stelle als matter_id.

Beispiel: 1234
case_number
string

Aktenzeichen, wie es in Flowyer angezeigt wird, im Nummerierungsschema der Kanzlei.

Beispiel: "2026/0025"
subject
string
Beispiel: "Kovács Kft. v. Nagy Bt. - contract dispute"
status
string
Zulässige Werte: "active" "archived"
case_type_id
integer | null
case_type
string | null

Lokalisierter Name des Falltyps.

responsible_user_id
integer | null
responsible
string | null

Anzeigename des verantwortlichen Anwalts.

clients
object[]

Mandanten (Auftraggeber) der Angelegenheit.

Felder von clients
id
integer
name
string
started_on
string <date> | null
restricted
boolean

True, wenn nur die verantwortlichen Anwälte die Angelegenheit sehen dürfen (Chinese Wall).

created_at
string <date-time> | null
updated_at
string <date-time> | null
created_via_api
object | null

Vorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
total
integer

Wie viele Angelegenheiten übereingestimmt haben, bevor die Liste auf limit gekürzt wurde.

truncated
boolean

True, wenn mehr Angelegenheiten übereingestimmt haben als zurückgegeben wurden, oder wenn zu viele Namensdoppelgänger vorhanden waren, um sie alle zu prüfen; grenzen Sie mit client_id oder einem vollständigeren Namen ein oder erhöhen Sie limit, anstatt aus einer unvollständigen Liste auszuwählen.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/matters/resolve?name=ingatlan%20ad%C3%A1sv%C3%A9tel' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": {
    "status": "exact",
    "matters": [
      {
        "id": 1234,
        "case_number": "2026/0025",
        "subject": "Kovács Kft. v. Nagy Bt. - contract dispute",
        "status": "active",
        "case_type_id": 1234,
        "case_type": "string",
        "responsible_user_id": 1234,
        "responsible": "string",
        "clients": [
          {
            "id": 1234,
            "name": "string"
          }
        ],
        "started_on": "2026-10-30",
        "restricted": true,
        "created_at": "2026-10-30T09:15:00+01:00",
        "updated_at": "2026-10-30T09:15:00+01:00",
        "created_via_api": {
          "kind": "key",
          "key_id": 1234,
          "key_name": "string",
          "user_id": 1234,
          "user": "string",
          "at": "2026-10-30T09:15:00+01:00"
        }
      }
    ],
    "total": 1,
    "truncated": true
  }
}

Angelegenheit abrufen

GET /api/agent/matters/{id}

Gibt eine Angelegenheit (Fall) mit ihren Mandanten und Details zurück. Antwortet mit 404, wenn die Angelegenheit nicht existiert oder der Benutzer sie nicht sehen darf.

Bereich
matters:read
Flowyer-Berechtigung
cases:read

Pfadparameter

iderforderlich
integer>= 1

Angelegenheits-ID.

Beispiel: 1234

Antworten

200

OK.

dataerforderlich
object
Felder von data
id
integer

Angelegenheits-ID. Verwenden Sie sie an anderer Stelle als matter_id.

Beispiel: 1234
case_number
string

Aktenzeichen, wie es in Flowyer angezeigt wird, im Nummerierungsschema der Kanzlei.

Beispiel: "2026/0025"
subject
string
Beispiel: "Kovács Kft. v. Nagy Bt. - contract dispute"
status
string
Zulässige Werte: "active" "archived"
case_type_id
integer | null
case_type
string | null

Lokalisierter Name des Falltyps.

responsible_user_id
integer | null
responsible
string | null

Anzeigename des verantwortlichen Anwalts.

clients
object[]

Mandanten (Auftraggeber) der Angelegenheit.

Felder von clients
id
integer
name
string
started_on
string <date> | null
restricted
boolean

True, wenn nur die verantwortlichen Anwälte die Angelegenheit sehen dürfen (Chinese Wall).

created_at
string <date-time> | null
updated_at
string <date-time> | null
created_via_api
object | null

Vorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
description
string | null
litigious
boolean
archived_at
string <date> | null

Tag, an dem die Angelegenheit archiviert wurde, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/matters/1234' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": {
    "id": 1234,
    "case_number": "2026/0025",
    "subject": "Kovács Kft. v. Nagy Bt. - contract dispute",
    "status": "active",
    "case_type_id": 1234,
    "case_type": "string",
    "responsible_user_id": 1234,
    "responsible": "string",
    "clients": [
      {
        "id": 1234,
        "name": "string"
      }
    ],
    "started_on": "2026-10-30",
    "restricted": true,
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    },
    "description": "string",
    "litigious": true,
    "archived_at": "2026-10-30"
  }
}

Angelegenheit erstellen

POST /api/agent/matters

Eröffnet eine Angelegenheit (Fall) mit dem nächsten Aktenzeichen des Jahres. Erfordert mindestens einen vorhandenen Mandanten (suchen oder erstellen Sie ihn zuerst). Der verantwortliche Anwalt ist standardmäßig der Benutzer des Schlüssels und wird andernfalls benachrichtigt. Parteien, Kontakte und Honorare werden in Flowyer festgelegt.

Bereich
matters:create
Flowyer-Berechtigung
cases:create

Header-Parameter

Idempotency-Key
stringhöchstens 128 Zeichen

Bei jeder Erstellung empfohlen. Ein eindeutiger Wert pro logischer Operation (z. B. eine UUID). Derselbe Wert gibt denselben Datensatz zurück: Ein erneuter Versuch damit gibt den beim ersten Mal erstellten Datensatz zurück, anstatt einen zweiten zu erstellen. Unterschiedliche Werte erstellen immer unterschiedliche Datensätze. Clients, die keine Header senden können, können denselben Wert im Body-Feld idempotency_key übergeben. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$

Anfragetext application/json

subjecterforderlich
stringmindestens 2 Zeichenhöchstens 255 Zeichen

Kurztitel der Angelegenheit, wie er in Listen erscheint. Klartext; "<" und ">" sind nicht erlaubt.

Muster: ^[^<>]*$
Beispiel: "Kovács Kft. v. Nagy Bt. - contract dispute"
case_type_iderforderlich
integer>= 1

Falltyp-ID (Rechtsgebiet) aus der globalen Flowyer-Falltypliste: Wählen Sie denjenigen, dessen Name den Worten des Benutzers entspricht, oder bitten Sie den Benutzer, anhand des Namens auszuwählen. Eine unbekannte ID antwortet mit 422 und details.known_case_types (id + lokalisierter Name); eine vorhandene Angelegenheit zeigt ihren Typ in matters.get case_type_id / case_type.

client_idserforderlich
integer[]mindestens 1 Einträgehöchstens 20 Einträge

IDs der Mandanten (Auftraggeber). Mindestens einer, höchstens 20.

Beispiel: [ 512 ]
responsible_user_id
integer | null>= 1

Verantwortlicher Anwalt: eine Benutzer-ID aus colleagues.list (schlagen Sie einen diktierten Namen dort nach). Standard: der Benutzer hinter dem Schlüssel.

started_on
string <date> | null

Startdatum, YYYY-MM-DD. Standard: heute.

Beispiel: "2026-10-29"
description
string | nullhöchstens 10000 Zeichen

Längere Beschreibung, Klartext.

main_case_number
string | nullhöchstens 100 Zeichen

Das eigene Hauptaktenzeichen der Kanzlei für die Angelegenheit. Erforderlich, wenn das Nummerierungsschema der Kanzlei es verwendet (andernfalls antwortet die API mit 422).

restricted
boolean

true = nur die verantwortlichen Anwälte dürfen die Angelegenheit sehen (Chinese Wall).

Standard: false
idempotency_key
stringhöchstens 128 Zeichen

Dieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$
Beispiel: "b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"

Antworten

201

Erstellt.

dataerforderlich
object
Felder von data
id
integer

Angelegenheits-ID. Verwenden Sie sie an anderer Stelle als matter_id.

Beispiel: 1234
case_number
string

Aktenzeichen, wie es in Flowyer angezeigt wird, im Nummerierungsschema der Kanzlei.

Beispiel: "2026/0025"
subject
string
Beispiel: "Kovács Kft. v. Nagy Bt. - contract dispute"
status
string
Zulässige Werte: "active" "archived"
case_type_id
integer | null
case_type
string | null

Lokalisierter Name des Falltyps.

responsible_user_id
integer | null
responsible
string | null

Anzeigename des verantwortlichen Anwalts.

clients
object[]

Mandanten (Auftraggeber) der Angelegenheit.

Felder von clients
id
integer
name
string
started_on
string <date> | null
restricted
boolean

True, wenn nur die verantwortlichen Anwälte die Angelegenheit sehen dürfen (Chinese Wall).

created_at
string <date-time> | null
updated_at
string <date-time> | null
created_via_api
object | null

Vorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
description
string | null
litigious
boolean
archived_at
string <date> | null

Tag, an dem die Angelegenheit archiviert wurde, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.

created
boolean
Wert: true
200

Idempotentes Replay: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage innerhalb von 120 Sekunden) hat den Datensatz bereits erstellt; er wird erneut zurückgegeben, es wurde nichts Neues erstellt.

dataerforderlich
object
Felder von data
id
integer

Angelegenheits-ID. Verwenden Sie sie an anderer Stelle als matter_id.

Beispiel: 1234
case_number
string

Aktenzeichen, wie es in Flowyer angezeigt wird, im Nummerierungsschema der Kanzlei.

Beispiel: "2026/0025"
subject
string
Beispiel: "Kovács Kft. v. Nagy Bt. - contract dispute"
status
string
Zulässige Werte: "active" "archived"
case_type_id
integer | null
case_type
string | null

Lokalisierter Name des Falltyps.

responsible_user_id
integer | null
responsible
string | null

Anzeigename des verantwortlichen Anwalts.

clients
object[]

Mandanten (Auftraggeber) der Angelegenheit.

Felder von clients
id
integer
name
string
started_on
string <date> | null
restricted
boolean

True, wenn nur die verantwortlichen Anwälte die Angelegenheit sehen dürfen (Chinese Wall).

created_at
string <date-time> | null
updated_at
string <date-time> | null
created_via_api
object | null

Vorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
description
string | null
litigious
boolean
archived_at
string <date> | null

Tag, an dem die Angelegenheit archiviert wurde, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.

created
boolean
Wert: false
idempotent_replay
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar. replay_not_visible: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage) hat den Datensatz bereits erstellt (details.record_id), aber dieser wurde inzwischen gelöscht oder ist für den Benutzer nicht sichtbar; es wurde nichts Neues erstellt, erstellen Sie ihn nicht erneut.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Idempotency-Key wurde für einen anderen Ressourcentyp verwendet (idempotency_key_reused), oder, ohne Schlüssel, eine identische Anfrage wird gerade verarbeitet (duplicate_in_progress; versuchen Sie es in Kürze erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X POST 'https://www.flowyer.de/api/agent/matters' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 7f3a9c21-1b2c-4d5e-8f90-0a1b2c3d4e5f' \
  -d '{
  "subject": "Kovács Kft. v. Nagy Bt. - contract dispute",
  "case_type_id": 1234,
  "client_ids": [
    512
  ],
  "started_on": "2026-10-29"
}'

Antwortbeispiele

{
  "data": {
    "id": 1234,
    "case_number": "2026/0025",
    "subject": "Kovács Kft. v. Nagy Bt. - contract dispute",
    "status": "active",
    "case_type_id": 1234,
    "case_type": "string",
    "responsible_user_id": 1234,
    "responsible": "string",
    "clients": [
      {
        "id": 1234,
        "name": "string"
      }
    ],
    "started_on": "2026-10-30",
    "restricted": true,
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    },
    "description": "string",
    "litigious": true,
    "archived_at": "2026-10-30"
  },
  "created": true
}

Angelegenheit aktualisieren

PATCH /api/agent/matters/{id}

Ändert den Betreff, die Beschreibung, das Startdatum, das Streitigkeits-Flag oder den verantwortlichen Anwalt einer Angelegenheit. Aktenzeichen, Chinese Wall, Archivstatus, Honorare und Mandantenverknüpfungen sind hier nicht bearbeitbar. Übergeben Sie expected_updated_at aus Ihrem letzten Lesevorgang; eine widersprüchliche Änderung antwortet mit 409.

Bereich
matters:update
Flowyer-Berechtigung
cases:modify

Pfadparameter

iderforderlich
integer>= 1

ID des zu ändernden Datensatzes.

Anfragetext application/json

expected_updated_at
string <date-time> | null

Der Wert updated_at aus Ihrem letzten Lesevorgang dieses Datensatzes (erforderlich, sofern der Datensatz einen hat). Wenn sich der Datensatz seitdem geändert hat (ein Kollege hat ihn bearbeitet), antwortet die API mit 409, und Sie müssen vor einem erneuten Versuch erneut lesen. Ein Altdatensatz, dessen updated_at null ist, nimmt null an.

subject
string | nullmindestens 1 Zeichen

Kurztitel der Angelegenheit. Klartext, höchstens 255 Zeichen als NEUER Wert; "<" und ">" können ebenfalls nicht eingeführt werden, aber ein gespeicherter Betreff, der länger ist oder sie enthält, kann unverändert zurückgegeben werden. null behält den aktuellen Betreff bei.

description
string | null

Längere Beschreibung, Klartext, höchstens 10000 Zeichen als NEUER Wert; eine längere gespeicherte Beschreibung kann unverändert zurückgegeben werden.

started_on
string <date> | null

Startdatum, YYYY-MM-DD. null behält den aktuellen Wert bei (ein Startdatum kann nicht gelöscht werden).

litigious
boolean

Ob die Angelegenheit streitig ist.

responsible_user_id
integer | null>= 0

Neuer verantwortlicher Anwalt: die Benutzer-ID eines aktiven Kollegen aus colleagues.list. Er wird benachrichtigt, wenn er nicht Sie selbst sind. Das Senden des aktuellen Werts - oder null / 0, als was eine Angelegenheit ohne Verantwortlichen zurückgelesen wird - ändert nichts.

Antworten

200

Aktualisiert.

dataerforderlich
object
Felder von data
id
integer

Angelegenheits-ID. Verwenden Sie sie an anderer Stelle als matter_id.

Beispiel: 1234
case_number
string

Aktenzeichen, wie es in Flowyer angezeigt wird, im Nummerierungsschema der Kanzlei.

Beispiel: "2026/0025"
subject
string
Beispiel: "Kovács Kft. v. Nagy Bt. - contract dispute"
status
string
Zulässige Werte: "active" "archived"
case_type_id
integer | null
case_type
string | null

Lokalisierter Name des Falltyps.

responsible_user_id
integer | null
responsible
string | null

Anzeigename des verantwortlichen Anwalts.

clients
object[]

Mandanten (Auftraggeber) der Angelegenheit.

Felder von clients
id
integer
name
string
started_on
string <date> | null
restricted
boolean

True, wenn nur die verantwortlichen Anwälte die Angelegenheit sehen dürfen (Chinese Wall).

created_at
string <date-time> | null
updated_at
string <date-time> | null
created_via_api
object | null

Vorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
description
string | null
litigious
boolean
archived_at
string <date> | null

Tag, an dem die Angelegenheit archiviert wurde, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.

updated
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Datensatz hat sich geändert, seit Sie ihn gelesen haben (record_conflict: expected_updated_at stimmt nicht mehr überein; lesen Sie ihn erneut und versuchen Sie es mit dem neuen updated_at erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X PATCH 'https://www.flowyer.de/api/agent/matters/1234' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "expected_updated_at": "2026-10-30T09:15:00+01:00",
  "subject": "string"
}'

Antwortbeispiele

{
  "data": {
    "id": 1234,
    "case_number": "2026/0025",
    "subject": "Kovács Kft. v. Nagy Bt. - contract dispute",
    "status": "active",
    "case_type_id": 1234,
    "case_type": "string",
    "responsible_user_id": 1234,
    "responsible": "string",
    "clients": [
      {
        "id": 1234,
        "name": "string"
      }
    ],
    "started_on": "2026-10-30",
    "restricted": true,
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    },
    "description": "string",
    "litigious": true,
    "archived_at": "2026-10-30"
  },
  "updated": true
}

Verantwortliche einer Akte auflisten

GET /api/agent/matters/{id}/responsibles

Listet die ZUSÄTZLICHEN Verantwortlichen einer Akte auf (der Hauptverantwortliche steht in matters.get): jeder ist ein Kollege (type "user", user_id gesetzt) oder eine Arbeitsgruppe (type "workgroup", workgroup_id gesetzt), die alle die Akte sehen können. Antwortet mit 404, wenn die Akte nicht sichtbar ist.

Bereich
matters:read
Flowyer-Berechtigung
cases:read

Pfadparameter

iderforderlich
integer>= 1

Angelegenheits-ID.

Beispiel: 1234

Abfrageparameter

limit
integer>= 1<= 100

Seitengröße, 1-100. Standard 25.

Standard: 25
Beispiel: 25
offset
integer>= 0

Anzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.

Standard: 0
Beispiel: 0

Antworten

200

OK.

dataerforderlich
object[]
Felder von data
type
string

"user" = ein einzelner Kollege; "workgroup" = jedes Mitglied einer Arbeitsgruppe.

Zulässige Werte: "user" "workgroup"
user_id
integer | null

Benutzer-id des Kollegen bei einem "user"-Eintrag (übergeben Sie sie als user_id an matters.responsibles.add); null bei einer Arbeitsgruppe.

workgroup_id
integer | null

Arbeitsgruppen-id bei einem "workgroup"-Eintrag; null bei einem einzelnen Kollegen. Verantwortliche Arbeitsgruppen werden in Flowyer verwaltet.

name
string | null

Anzeigename des Kollegen oder der Arbeitsgruppe.

paginationerforderlich
object
Felder von pagination
limiterforderlich
integer
offseterforderlich
integer
totalerforderlich
integer

Gesamtanzahl der übereinstimmenden Datensätze.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/matters/1234/responsibles?limit=25' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": [
    {
      "type": "user",
      "user_id": 1234,
      "workgroup_id": 1234,
      "name": "string"
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 1
  }
}

Verantwortlichen zu einer Akte hinzufügen

POST /api/agent/matters/{id}/responsibles

Fügt einen Kollegen (user_id aus colleagues.list) als zusätzlichen Verantwortlichen einer Akte hinzu. Dies GIBT diesem Kollegen Zugriff auf die Akte, fügen Sie also nur jemanden hinzu, der sie sehen soll; er wird benachrichtigt. Idempotent: Das erneute Hinzufügen eines bestehenden Verantwortlichen bewirkt keine Änderung.

Bereich
matters:update
Flowyer-Berechtigung
cases:modify

Pfadparameter

iderforderlich
integer>= 1

Akte, für die der Kollege verantwortlich wird (muss sichtbar sein).

Beispiel: 1234

Anfragetext application/json

user_iderforderlich
integer>= 1

Hinzuzufügender Kollege: eine Benutzer-id aus colleagues.list. Das Hinzufügen gibt ihm Zugriff auf die Akte.

Beispiel: 42

Antworten

200

OK.

dataerforderlich
object
Felder von data
user_id
integer

Der Kollege, der nun für die Akte verantwortlich ist.

name
string | null

Anzeigename des Kollegen.

already_responsible
boolean

True, wenn der Kollege bereits ein Verantwortlicher der Akte war (nichts hat sich geändert).

notified
boolean

True, wenn der Kollege benachrichtigt wurde, dass er hinzugefügt wurde. Nie true, wenn der Kollege Sie selbst sind oder wenn er bereits verantwortlich war.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X POST 'https://www.flowyer.de/api/agent/matters/1234/responsibles' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "user_id": 42
}'

Antwortbeispiele

{
  "data": {
    "user_id": 1234,
    "name": "string",
    "already_responsible": true,
    "notified": true
  }
}

Mandanten

Mandanten auflisten

GET /api/agent/clients

Listet die Mandanten der Kanzlei (Personen und Unternehmen) alphabetisch auf; q durchsucht den Namen (Akzente und Groß-/Kleinschreibung werden ignoriert), die E-Mail-Adresse und die Steuernummer. Prüfen Sie den Namen vor dem Anlegen eines Mandanten mit clients.resolve (toleriert auch Tippfehler). Archivierte Mandanten werden ausgeblendet, sofern include_archived nicht true ist.

Bereich
clients:read
Flowyer-Berechtigung
contacts:read

Abfrageparameter

q
stringhöchstens 100 Zeichen

Sucht im Namen (Akzente und Groß-/Kleinschreibung werden ignoriert), in der E-Mail-Adresse und der Steuernummer.

Beispiel: "Kovács"
is_person
boolean

true = nur natürliche Personen, false = nur Unternehmen.

include_archived
boolean
Standard: false
limit
integer>= 1<= 100

Seitengröße, 1-100. Standard 25.

Standard: 25
Beispiel: 25
offset
integer>= 0

Anzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.

Standard: 0
Beispiel: 0

Antworten

200

OK.

dataerforderlich
object[]
Felder von data
id
integer

Mandanten-ID. Verwenden Sie sie anderenorts als client_id.

Beispiel: 512
name
string
Beispiel: "Kovács Kft."
is_person
boolean

true bei einer natürlichen Person, false bei einem Unternehmen.

email
string | null
phone
string | null
archived
boolean
recorded_by_user_id
integer | null
recorded_by
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null
created_via_api
object | null
Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
paginationerforderlich
object
Felder von pagination
limiterforderlich
integer
offseterforderlich
integer
totalerforderlich
integer

Gesamtanzahl der übereinstimmenden Datensätze.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/clients?q=Kov%C3%A1cs&limit=25' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": [
    {
      "id": 512,
      "name": "Kovács Kft.",
      "is_person": true,
      "email": "info@example.hu",
      "phone": "string",
      "archived": true,
      "recorded_by_user_id": 1234,
      "recorded_by": "string",
      "created_at": "2026-10-30T09:15:00+01:00",
      "updated_at": "2026-10-30T09:15:00+01:00",
      "created_via_api": {
        "kind": "key",
        "key_id": 1234,
        "key_name": "string",
        "user_id": 1234,
        "user": "string",
        "at": "2026-10-30T09:15:00+01:00"
      }
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 1
  }
}

Mandanten anhand des Namens auflösen

GET /api/agent/clients/resolve

Findet einen Mandanten anhand eines gesprochenen oder falsch geschriebenen Namens (Akzente, Groß-/Kleinschreibung und kleine Tippfehler werden toleriert). Gibt den Status exact/similar/none und mögliche Mandanten zurück. Nur "exact" kann direkt gefahrlos verwendet werden; bei "similar" oder "none" fragen Sie den Benutzer. Ein Name mit vielen ähnlichen Treffern ist nie "exact": fragen Sie nach einem vollständigeren Namen.

Bereich
clients:read
Flowyer-Berechtigung
contacts:read

Abfrageparameter

nameerforderlich
stringmindestens 1 Zeichenhöchstens 255 Zeichen

Nachzuschlagender Mandantenname, wie gehört oder diktiert.

Beispiel: "Józsi ingatlan"
limit
integer>= 1<= 10

Maximale Anzahl zurückzugebender Kandidaten (Standard 5).

Standard: 5

Antworten

200

OK.

dataerforderlich
object
Felder von data
status
string

exact = ein sicherer Treffer (seine id kann gefahrlos verwendet werden). similar = ein oder mehrere ungefähre Treffer, bestätigen Sie zuerst mit dem Benutzer. none = kein Treffer, fragen Sie den Benutzer.

Zulässige Werte: "exact" "similar" "none"
matches
object[]

Mögliche Mandanten, bester Treffer zuerst.

Felder von matches
id
integer

Mandanten-ID. Verwenden Sie sie anderenorts als client_id.

Beispiel: 512
name
string
Beispiel: "Kovács Kft."
is_person
boolean

true bei einer natürlichen Person, false bei einem Unternehmen.

email
string | null
phone
string | null
archived
boolean
recorded_by_user_id
integer | null
recorded_by
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null
created_via_api
object | null
Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
total
integer

Wie viele Mandanten übereinstimmten, bevor die Liste auf limit gekürzt wurde.

truncated
boolean

true, wenn mehr Mandanten übereinstimmten als zurückgegeben wurden oder zu viele ähnliche Treffer existierten, um alle zu prüfen; fragen Sie den Benutzer nach einem vollständigeren Namen oder erhöhen Sie limit, anstatt aus einer unvollständigen Liste zu wählen.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/clients/resolve?name=J%C3%B3zsi%20ingatlan' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": {
    "status": "exact",
    "matches": [
      {
        "id": 512,
        "name": "Kovács Kft.",
        "is_person": true,
        "email": "info@example.hu",
        "phone": "string",
        "archived": true,
        "recorded_by_user_id": 1234,
        "recorded_by": "string",
        "created_at": "2026-10-30T09:15:00+01:00",
        "updated_at": "2026-10-30T09:15:00+01:00",
        "created_via_api": {
          "kind": "key",
          "key_id": 1234,
          "key_name": "string",
          "user_id": 1234,
          "user": "string",
          "at": "2026-10-30T09:15:00+01:00"
        }
      }
    ],
    "total": 1,
    "truncated": true
  }
}

Mandanten abrufen

GET /api/agent/clients/{id}

Gibt einen Mandanten mit Anschrift und Registrierungsdaten zurück. Ausweisnummern und Gebühreneinstellungen werden nie zurückgegeben.

Bereich
clients:read
Flowyer-Berechtigung
contacts:read

Pfadparameter

iderforderlich
integer>= 1

Mandanten-ID.

Beispiel: 512

Antworten

200

OK.

dataerforderlich
object
Felder von data
id
integer

Mandanten-ID. Verwenden Sie sie anderenorts als client_id.

Beispiel: 512
name
string
Beispiel: "Kovács Kft."
is_person
boolean

true bei einer natürlichen Person, false bei einem Unternehmen.

email
string | null
phone
string | null
archived
boolean
recorded_by_user_id
integer | null
recorded_by
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null
created_via_api
object | null
Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
address
object
Felder von address
zip
string | nullhöchstens 20 Zeichen
city
string | nullhöchstens 100 Zeichen
street
string | nullhöchstens 255 Zeichen
mailing_address
object
Felder von mailing_address
zip
string | nullhöchstens 20 Zeichen
city
string | nullhöchstens 100 Zeichen
street
string | nullhöchstens 255 Zeichen
tax_number
string | null

Nur bei Unternehmen; null bei einer natürlichen Person.

company_registration_number
string | null

Nur bei Unternehmen; null bei einer natürlichen Person.

representative_name
string | null

Nur bei Unternehmen; null bei einer natürlichen Person.

representative_position
string | null

Nur bei Unternehmen; null bei einer natürlichen Person.

main_activity
string | null

Haupttätigkeitsbereich. Nur bei Unternehmen; null bei einer natürlichen Person.

nationality_country
string | null
note
string | null
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/clients/512' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": {
    "id": 512,
    "name": "Kovács Kft.",
    "is_person": true,
    "email": "info@example.hu",
    "phone": "string",
    "archived": true,
    "recorded_by_user_id": 1234,
    "recorded_by": "string",
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    },
    "address": {
      "zip": "string",
      "city": "string",
      "street": "string"
    },
    "mailing_address": {
      "zip": "string",
      "city": "string",
      "street": "string"
    },
    "tax_number": "string",
    "company_registration_number": "string",
    "representative_name": "string",
    "representative_position": "string",
    "main_activity": "string",
    "nationality_country": "string",
    "note": "string"
  }
}

Mandanten anlegen

POST /api/agent/clients

Legt einen Mandanten (Person oder Unternehmen) an, erfasst als angelegt vom Benutzer des Schlüssels. Prüfen Sie den Namen zuerst mit clients.resolve (toleriert fehlende Akzente und Tippfehler): Ein 409 erfasst nur einen aktiven Mandanten mit exakt demselben Namen, sofern allow_duplicate_name nicht true ist. Ausweisnummern und Gebühren können nicht gesetzt werden.

Bereich
clients:create
Flowyer-Berechtigung
contacts:create

Header-Parameter

Idempotency-Key
stringhöchstens 128 Zeichen

Bei jeder Erstellung empfohlen. Ein eindeutiger Wert pro logischer Operation (z. B. eine UUID). Derselbe Wert gibt denselben Datensatz zurück: Ein erneuter Versuch damit gibt den beim ersten Mal erstellten Datensatz zurück, anstatt einen zweiten zu erstellen. Unterschiedliche Werte erstellen immer unterschiedliche Datensätze. Clients, die keine Header senden können, können denselben Wert im Body-Feld idempotency_key übergeben. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$

Anfragetext application/json

nameerforderlich
stringmindestens 2 Zeichenhöchstens 255 Zeichen

Vollständiger Name der Person oder Name des Unternehmens. Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
Beispiel: "Kovács Kft."
is_person
boolean

true bei einer natürlichen Person, false (Standard) bei einem Unternehmen.

Standard: false
email
string | nullhöchstens 190 Zeichen
Beispiel: "info@kovacskft.hu"
phone
string | nullhöchstens 64 Zeichen
Beispiel: "+36 1 234 5678"
address
object | null

Gemeldete Anschrift / Wohnanschrift.

Felder von address
zip
string | nullhöchstens 20 Zeichen
city
string | nullhöchstens 100 Zeichen
street
string | nullhöchstens 255 Zeichen
mailing_address
object | null
Felder von mailing_address
zip
string | nullhöchstens 20 Zeichen
city
string | nullhöchstens 100 Zeichen
street
string | nullhöchstens 255 Zeichen
tax_number
string | nullhöchstens 64 Zeichen

Steuernummer des Unternehmens (nur bei Unternehmen).

Beispiel: "12345678-2-41"
company_registration_number
string | nullhöchstens 64 Zeichen

Handelsregisternummer des Unternehmens (nur bei Unternehmen).

Beispiel: "01-09-123456"
representative_name
string | nullhöchstens 255 Zeichen

Nur bei Unternehmen.

representative_position
string | nullhöchstens 255 Zeichen

Nur bei Unternehmen.

main_activity
string | nullhöchstens 255 Zeichen

Haupttätigkeitsbereich (nur bei Unternehmen).

nationality_country
string | nullhöchstens 100 Zeichen
note
string | nullhöchstens 4000 Zeichen
allow_duplicate_name
boolean

Auch dann anlegen, wenn bereits ein aktiver Mandant mit demselben Namen existiert.

Standard: false
idempotency_key
stringhöchstens 128 Zeichen

Dieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$
Beispiel: "b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"

Antworten

201

Erstellt.

dataerforderlich
object
Felder von data
id
integer

Mandanten-ID. Verwenden Sie sie anderenorts als client_id.

Beispiel: 512
name
string
Beispiel: "Kovács Kft."
is_person
boolean

true bei einer natürlichen Person, false bei einem Unternehmen.

email
string | null
phone
string | null
archived
boolean
recorded_by_user_id
integer | null
recorded_by
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null
created_via_api
object | null
Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
address
object
Felder von address
zip
string | nullhöchstens 20 Zeichen
city
string | nullhöchstens 100 Zeichen
street
string | nullhöchstens 255 Zeichen
mailing_address
object
Felder von mailing_address
zip
string | nullhöchstens 20 Zeichen
city
string | nullhöchstens 100 Zeichen
street
string | nullhöchstens 255 Zeichen
tax_number
string | null

Nur bei Unternehmen; null bei einer natürlichen Person.

company_registration_number
string | null

Nur bei Unternehmen; null bei einer natürlichen Person.

representative_name
string | null

Nur bei Unternehmen; null bei einer natürlichen Person.

representative_position
string | null

Nur bei Unternehmen; null bei einer natürlichen Person.

main_activity
string | null

Haupttätigkeitsbereich. Nur bei Unternehmen; null bei einer natürlichen Person.

nationality_country
string | null
note
string | null
created
boolean
Wert: true
200

Idempotentes Replay: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage innerhalb von 120 Sekunden) hat den Datensatz bereits erstellt; er wird erneut zurückgegeben, es wurde nichts Neues erstellt.

dataerforderlich
object
Felder von data
id
integer

Mandanten-ID. Verwenden Sie sie anderenorts als client_id.

Beispiel: 512
name
string
Beispiel: "Kovács Kft."
is_person
boolean

true bei einer natürlichen Person, false bei einem Unternehmen.

email
string | null
phone
string | null
archived
boolean
recorded_by_user_id
integer | null
recorded_by
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null
created_via_api
object | null
Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
address
object
Felder von address
zip
string | nullhöchstens 20 Zeichen
city
string | nullhöchstens 100 Zeichen
street
string | nullhöchstens 255 Zeichen
mailing_address
object
Felder von mailing_address
zip
string | nullhöchstens 20 Zeichen
city
string | nullhöchstens 100 Zeichen
street
string | nullhöchstens 255 Zeichen
tax_number
string | null

Nur bei Unternehmen; null bei einer natürlichen Person.

company_registration_number
string | null

Nur bei Unternehmen; null bei einer natürlichen Person.

representative_name
string | null

Nur bei Unternehmen; null bei einer natürlichen Person.

representative_position
string | null

Nur bei Unternehmen; null bei einer natürlichen Person.

main_activity
string | null

Haupttätigkeitsbereich. Nur bei Unternehmen; null bei einer natürlichen Person.

nationality_country
string | null
note
string | null
created
boolean
Wert: false
idempotent_replay
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar. replay_not_visible: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage) hat den Datensatz bereits erstellt (details.record_id), aber dieser wurde inzwischen gelöscht oder ist für den Benutzer nicht sichtbar; es wurde nichts Neues erstellt, erstellen Sie ihn nicht erneut.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Es existiert bereits ein aktiver Mandant mit demselben Namen (client_exists, oder client_exists_generic ohne den Scope clients:read, wenn der vorhandene Mandant nicht benannt werden darf; übergeben Sie allow_duplicate_name, um dies zu übersteuern), der Idempotency-Key wurde für einen anderen Ressourcentyp verwendet (idempotency_key_reused), oder es wird ohne Schlüssel bereits eine identische Anfrage verarbeitet (duplicate_in_progress).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X POST 'https://www.flowyer.de/api/agent/clients' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 7f3a9c21-1b2c-4d5e-8f90-0a1b2c3d4e5f' \
  -d '{
  "name": "Kovács Kft.",
  "email": "info@kovacskft.hu",
  "phone": "+36 1 234 5678",
  "tax_number": "12345678-2-41",
  "company_registration_number": "01-09-123456"
}'

Antwortbeispiele

{
  "data": {
    "id": 512,
    "name": "Kovács Kft.",
    "is_person": true,
    "email": "info@example.hu",
    "phone": "string",
    "archived": true,
    "recorded_by_user_id": 1234,
    "recorded_by": "string",
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    },
    "address": {
      "zip": "string",
      "city": "string",
      "street": "string"
    },
    "mailing_address": {
      "zip": "string",
      "city": "string",
      "street": "string"
    },
    "tax_number": "string",
    "company_registration_number": "string",
    "representative_name": "string",
    "representative_position": "string",
    "main_activity": "string",
    "nationality_country": "string",
    "note": "string"
  },
  "created": true
}

Mandanten aktualisieren

PATCH /api/agent/clients/{id}

Ändert die Kontaktfelder eines Mandanten (Name, E-Mail, Telefon, Anschrift, Notiz, Staatsangehörigkeit sowie Vertreter/Tätigkeit des Unternehmens). Ausweisnummern, Steuernummern, Gebühren und der Typ Person/Unternehmen sind hier nicht bearbeitbar. Übergeben Sie expected_updated_at; eine kollidierende Änderung antwortet mit 409.

Bereich
clients:update
Flowyer-Berechtigung
contacts:modify

Pfadparameter

iderforderlich
integer>= 1

ID des zu ändernden Datensatzes.

Anfragetext application/json

expected_updated_at
string <date-time> | null

Der Wert updated_at aus Ihrem letzten Lesevorgang dieses Datensatzes (erforderlich, sofern der Datensatz einen hat). Wenn sich der Datensatz seitdem geändert hat (ein Kollege hat ihn bearbeitet), antwortet die API mit 409, und Sie müssen vor einem erneuten Versuch erneut lesen. Ein Altdatensatz, dessen updated_at null ist, nimmt null an.

name
string | nullmindestens 1 Zeichen

Vollständiger Name oder Unternehmensname. Klartext, als NEUER Wert höchstens 255 Zeichen; "<" und ">" können ebenfalls nicht eingeführt werden, ein gespeicherter Name, der länger ist oder diese enthält, kann jedoch unverändert zurückgesendet werden. null behält den aktuellen Namen bei.

email
string | nullhöchstens 190 Zeichen
phone
string | nullhöchstens 64 Zeichen
address
object | null

Gemeldete Anschrift / Wohnanschrift.

Felder von address
zip
string | nullhöchstens 20 Zeichen
city
string | nullhöchstens 100 Zeichen
street
string | nullhöchstens 255 Zeichen
mailing_address
object | null
Felder von mailing_address
zip
string | nullhöchstens 20 Zeichen
city
string | nullhöchstens 100 Zeichen
street
string | nullhöchstens 255 Zeichen
representative_name
string | nullhöchstens 255 Zeichen

Nur bei Unternehmen.

representative_position
string | nullhöchstens 255 Zeichen

Nur bei Unternehmen.

main_activity
string | nullhöchstens 255 Zeichen

Haupttätigkeitsbereich (nur bei Unternehmen).

nationality_country
string | nullhöchstens 100 Zeichen
note
string | null

Freitextnotiz, als NEUER Wert höchstens 4000 Zeichen; eine längere gespeicherte Notiz kann unverändert zurückgesendet werden. null löscht die Notiz.

Antworten

200

Aktualisiert.

dataerforderlich
object
Felder von data
id
integer

Mandanten-ID. Verwenden Sie sie anderenorts als client_id.

Beispiel: 512
name
string
Beispiel: "Kovács Kft."
is_person
boolean

true bei einer natürlichen Person, false bei einem Unternehmen.

email
string | null
phone
string | null
archived
boolean
recorded_by_user_id
integer | null
recorded_by
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null
created_via_api
object | null
Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
address
object
Felder von address
zip
string | nullhöchstens 20 Zeichen
city
string | nullhöchstens 100 Zeichen
street
string | nullhöchstens 255 Zeichen
mailing_address
object
Felder von mailing_address
zip
string | nullhöchstens 20 Zeichen
city
string | nullhöchstens 100 Zeichen
street
string | nullhöchstens 255 Zeichen
tax_number
string | null

Nur bei Unternehmen; null bei einer natürlichen Person.

company_registration_number
string | null

Nur bei Unternehmen; null bei einer natürlichen Person.

representative_name
string | null

Nur bei Unternehmen; null bei einer natürlichen Person.

representative_position
string | null

Nur bei Unternehmen; null bei einer natürlichen Person.

main_activity
string | null

Haupttätigkeitsbereich. Nur bei Unternehmen; null bei einer natürlichen Person.

nationality_country
string | null
note
string | null
updated
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Datensatz hat sich geändert, seit Sie ihn gelesen haben (record_conflict: expected_updated_at stimmt nicht mehr überein; lesen Sie ihn erneut und versuchen Sie es mit dem neuen updated_at erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X PATCH 'https://www.flowyer.de/api/agent/clients/1234' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "expected_updated_at": "2026-10-30T09:15:00+01:00",
  "name": "string"
}'

Antwortbeispiele

{
  "data": {
    "id": 512,
    "name": "Kovács Kft.",
    "is_person": true,
    "email": "info@example.hu",
    "phone": "string",
    "archived": true,
    "recorded_by_user_id": 1234,
    "recorded_by": "string",
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    },
    "address": {
      "zip": "string",
      "city": "string",
      "street": "string"
    },
    "mailing_address": {
      "zip": "string",
      "city": "string",
      "street": "string"
    },
    "tax_number": "string",
    "company_registration_number": "string",
    "representative_name": "string",
    "representative_position": "string",
    "main_activity": "string",
    "nationality_country": "string",
    "note": "string"
  },
  "updated": true
}

Aufgaben

Aufgaben auflisten

GET /api/agent/tasks

Listet die für den Benutzer sichtbaren Aufgaben (To-dos mit Frist) auf, früheste Frist zuerst. Standardmäßig offene Aufgaben; filtern Sie nach Bearbeiter, Akte, Mandant oder Fristzeitraum.

Bereich
tasks:read
Flowyer-Berechtigung
tasks:read

Abfrageparameter

status
string

open (Standard), closed oder all.

Zulässige Werte: "open" "closed" "all"
Standard: "open"
assigned_to_user_id
integer>= 1

Nur diesem Benutzer zugewiesene Aufgaben (eine Benutzer-ID aus colleagues.list).

matter_id
integer>= 1

Nur Aufgaben dieser Akte.

client_id
integer>= 1

Nur aktenlose Aufgaben dieses Mandanten.

deadline_from
string <date>

Frist an oder nach diesem Datum.

Beispiel: "2026-11-01"
deadline_to
string <date>

Frist an oder vor diesem Datum.

Beispiel: "2026-11-30"
limit
integer>= 1<= 100

Seitengröße, 1-100. Standard 25.

Standard: 25
Beispiel: 25
offset
integer>= 0

Anzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.

Standard: 0
Beispiel: 0

Antworten

200

OK.

dataerforderlich
object[]
Felder von data
id
integer
Beispiel: 9876
subject
string
Beispiel: "Submit the statement of defence"
description
string | null
deadline
string <date> | null

Fälligkeitsdatum, YYYY-MM-DD.

Beispiel: "2026-11-15"
priority
integer | null

1 = niedrig, 2 = mittel, 3 = hoch; null = nicht gesetzt (eine ältere Aufgabe ohne Priorität).

Beispiel: 2
status
string
Zulässige Werte: "open" "closed"
closed_at
string <date> | null

Tag, an dem die Aufgabe geschlossen wurde, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.

matter
object | null

Die Akte, zu der die Aufgabe gehört, falls vorhanden.

Felder von matter
id
integer
case_number
string
client
object | null

Der Mandant: der erste Mandant der Akte oder der eigene Mandant der Aufgabe, wenn sie keine Akte hat.

Felder von client
id
integer
name
string
assigned_to_user_id
integer | null
assigned_to
string | null
created_by_user_id
integer | null
created_by
string | null
flag_id
integer | null
created_at
string <date-time> | null
updated_at
string <date-time> | null
created_via_api
object | null
Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
paginationerforderlich
object
Felder von pagination
limiterforderlich
integer
offseterforderlich
integer
totalerforderlich
integer

Gesamtanzahl der übereinstimmenden Datensätze.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/tasks?deadline_from=2026-11-01&deadline_to=2026-11-30&limit=25' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": [
    {
      "id": 9876,
      "subject": "Submit the statement of defence",
      "description": "string",
      "deadline": "2026-11-15",
      "priority": 2,
      "status": "open",
      "closed_at": "2026-10-30",
      "matter": {
        "id": 1234,
        "case_number": "string"
      },
      "client": {
        "id": 1234,
        "name": "string"
      },
      "assigned_to_user_id": 1234,
      "assigned_to": "string",
      "created_by_user_id": 1234,
      "created_by": "string",
      "flag_id": 1234,
      "created_at": "2026-10-30T09:15:00+01:00",
      "updated_at": "2026-10-30T09:15:00+01:00",
      "created_via_api": {
        "kind": "key",
        "key_id": 1234,
        "key_name": "string",
        "user_id": 1234,
        "user": "string",
        "at": "2026-10-30T09:15:00+01:00"
      }
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 1
  }
}

Aufgabe abrufen

GET /api/agent/tasks/{id}

Gibt eine Aufgabe zurück. Antwortet mit 404, wenn die Aufgabe nicht existiert oder der Benutzer sie nicht sehen darf.

Bereich
tasks:read
Flowyer-Berechtigung
tasks:read

Pfadparameter

iderforderlich
integer>= 1

Aufgaben-ID.

Beispiel: 9876

Antworten

200

OK.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 9876
subject
string
Beispiel: "Submit the statement of defence"
description
string | null
deadline
string <date> | null

Fälligkeitsdatum, YYYY-MM-DD.

Beispiel: "2026-11-15"
priority
integer | null

1 = niedrig, 2 = mittel, 3 = hoch; null = nicht gesetzt (eine ältere Aufgabe ohne Priorität).

Beispiel: 2
status
string
Zulässige Werte: "open" "closed"
closed_at
string <date> | null

Tag, an dem die Aufgabe geschlossen wurde, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.

matter
object | null

Die Akte, zu der die Aufgabe gehört, falls vorhanden.

Felder von matter
id
integer
case_number
string
client
object | null

Der Mandant: der erste Mandant der Akte oder der eigene Mandant der Aufgabe, wenn sie keine Akte hat.

Felder von client
id
integer
name
string
assigned_to_user_id
integer | null
assigned_to
string | null
created_by_user_id
integer | null
created_by
string | null
flag_id
integer | null
created_at
string <date-time> | null
updated_at
string <date-time> | null
created_via_api
object | null
Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/tasks/9876' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": {
    "id": 9876,
    "subject": "Submit the statement of defence",
    "description": "string",
    "deadline": "2026-11-15",
    "priority": 2,
    "status": "open",
    "closed_at": "2026-10-30",
    "matter": {
      "id": 1234,
      "case_number": "string"
    },
    "client": {
      "id": 1234,
      "name": "string"
    },
    "assigned_to_user_id": 1234,
    "assigned_to": "string",
    "created_by_user_id": 1234,
    "created_by": "string",
    "flag_id": 1234,
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    }
  }
}

Aufgabe anlegen

POST /api/agent/tasks

Legt eine Aufgabe (To-do mit Frist) an, entweder auf einer Akte (matter_id, sichtbar und nicht archiviert) oder aktenlos, optional für einen Mandanten (client_id). Der Bearbeiter ist standardmäßig der Benutzer des Schlüssels und wird benachrichtigt, wenn es jemand anderes ist.

Bereich
tasks:create
Flowyer-Berechtigung
tasks:create

Header-Parameter

Idempotency-Key
stringhöchstens 128 Zeichen

Bei jeder Erstellung empfohlen. Ein eindeutiger Wert pro logischer Operation (z. B. eine UUID). Derselbe Wert gibt denselben Datensatz zurück: Ein erneuter Versuch damit gibt den beim ersten Mal erstellten Datensatz zurück, anstatt einen zweiten zu erstellen. Unterschiedliche Werte erstellen immer unterschiedliche Datensätze. Clients, die keine Header senden können, können denselben Wert im Body-Feld idempotency_key übergeben. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$

Anfragetext application/json

subjecterforderlich
stringmindestens 2 Zeichenhöchstens 1000 Zeichen

Was zu erledigen ist. Klartext.

Beispiel: "Submit the statement of defence"
deadlineerforderlich
string <date>

Fälligkeitsdatum, YYYY-MM-DD.

Beispiel: "2026-11-15"
matter_id
integer | null>= 1

Akte, zu der die Aufgabe gehört. Weglassen bei einer aktenlosen Aufgabe.

Beispiel: 1234
client_id
integer | null>= 1

Mandant einer aktenlosen Aufgabe. Nicht zusammen mit matter_id zulässig (eine Aufgabe einer Akte übernimmt den Mandanten der Akte).

assigned_to_user_id
integer | null>= 1

Für die Aufgabe verantwortlicher Kollege: eine Benutzer-ID aus colleagues.list (schlagen Sie einen diktierten Namen dort nach). Standard: der Benutzer hinter dem Schlüssel.

priority
integer>= 1<= 3

1 = niedrig, 2 = mittel (Standard), 3 = hoch.

Standard: 2
description
string | nullhöchstens 10000 Zeichen

Ausführlichere Details, Klartext.

flag_id
integer | null>= 1

Id eines Aufgaben-Flags (Label) der Kanzlei.

idempotency_key
stringhöchstens 128 Zeichen

Dieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$
Beispiel: "b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"

Antworten

201

Erstellt.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 9876
subject
string
Beispiel: "Submit the statement of defence"
description
string | null
deadline
string <date> | null

Fälligkeitsdatum, YYYY-MM-DD.

Beispiel: "2026-11-15"
priority
integer | null

1 = niedrig, 2 = mittel, 3 = hoch; null = nicht gesetzt (eine ältere Aufgabe ohne Priorität).

Beispiel: 2
status
string
Zulässige Werte: "open" "closed"
closed_at
string <date> | null

Tag, an dem die Aufgabe geschlossen wurde, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.

matter
object | null

Die Akte, zu der die Aufgabe gehört, falls vorhanden.

Felder von matter
id
integer
case_number
string
client
object | null

Der Mandant: der erste Mandant der Akte oder der eigene Mandant der Aufgabe, wenn sie keine Akte hat.

Felder von client
id
integer
name
string
assigned_to_user_id
integer | null
assigned_to
string | null
created_by_user_id
integer | null
created_by
string | null
flag_id
integer | null
created_at
string <date-time> | null
updated_at
string <date-time> | null
created_via_api
object | null
Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
created
boolean
Wert: true
200

Idempotentes Replay: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage innerhalb von 120 Sekunden) hat den Datensatz bereits erstellt; er wird erneut zurückgegeben, es wurde nichts Neues erstellt.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 9876
subject
string
Beispiel: "Submit the statement of defence"
description
string | null
deadline
string <date> | null

Fälligkeitsdatum, YYYY-MM-DD.

Beispiel: "2026-11-15"
priority
integer | null

1 = niedrig, 2 = mittel, 3 = hoch; null = nicht gesetzt (eine ältere Aufgabe ohne Priorität).

Beispiel: 2
status
string
Zulässige Werte: "open" "closed"
closed_at
string <date> | null

Tag, an dem die Aufgabe geschlossen wurde, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.

matter
object | null

Die Akte, zu der die Aufgabe gehört, falls vorhanden.

Felder von matter
id
integer
case_number
string
client
object | null

Der Mandant: der erste Mandant der Akte oder der eigene Mandant der Aufgabe, wenn sie keine Akte hat.

Felder von client
id
integer
name
string
assigned_to_user_id
integer | null
assigned_to
string | null
created_by_user_id
integer | null
created_by
string | null
flag_id
integer | null
created_at
string <date-time> | null
updated_at
string <date-time> | null
created_via_api
object | null
Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
created
boolean
Wert: false
idempotent_replay
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar. replay_not_visible: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage) hat den Datensatz bereits erstellt (details.record_id), aber dieser wurde inzwischen gelöscht oder ist für den Benutzer nicht sichtbar; es wurde nichts Neues erstellt, erstellen Sie ihn nicht erneut.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Idempotency-Key wurde für einen anderen Ressourcentyp verwendet (idempotency_key_reused), oder, ohne Schlüssel, eine identische Anfrage wird gerade verarbeitet (duplicate_in_progress; versuchen Sie es in Kürze erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X POST 'https://www.flowyer.de/api/agent/tasks' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 7f3a9c21-1b2c-4d5e-8f90-0a1b2c3d4e5f' \
  -d '{
  "subject": "Submit the statement of defence",
  "deadline": "2026-11-15",
  "matter_id": 1234
}'

Antwortbeispiele

{
  "data": {
    "id": 9876,
    "subject": "Submit the statement of defence",
    "description": "string",
    "deadline": "2026-11-15",
    "priority": 2,
    "status": "open",
    "closed_at": "2026-10-30",
    "matter": {
      "id": 1234,
      "case_number": "string"
    },
    "client": {
      "id": 1234,
      "name": "string"
    },
    "assigned_to_user_id": 1234,
    "assigned_to": "string",
    "created_by_user_id": 1234,
    "created_by": "string",
    "flag_id": 1234,
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    }
  },
  "created": true
}

Aufgabe aktualisieren

PATCH /api/agent/tasks/{id}

Ändert eine Aufgabe: Betreff, Frist, Beschreibung, Priorität, Flag, Bearbeiter oder die Akte, zu der sie gehört. Das Verschieben auf eine Akte leitet die Gerichtsverknüpfung neu ab und entfernt einen direkten Mandanten; client_id gilt nur für eine aktenlose Aufgabe. Übergeben Sie expected_updated_at; eine kollidierende Änderung antwortet mit 409.

Bereich
tasks:update
Flowyer-Berechtigung
tasks:modify

Pfadparameter

iderforderlich
integer>= 1

ID des zu ändernden Datensatzes.

Anfragetext application/json

expected_updated_at
string <date-time> | null

Der Wert updated_at aus Ihrem letzten Lesevorgang dieses Datensatzes (erforderlich, sofern der Datensatz einen hat). Wenn sich der Datensatz seitdem geändert hat (ein Kollege hat ihn bearbeitet), antwortet die API mit 409, und Sie müssen vor einem erneuten Versuch erneut lesen. Ein Altdatensatz, dessen updated_at null ist, nimmt null an.

subject
string | nullmindestens 1 Zeichen

Was zu erledigen ist. Klartext, als NEUER Wert höchstens 1000 Zeichen; ein längerer gespeicherter Betreff kann unverändert zurückgesendet werden. null behält den aktuellen Betreff bei.

deadline
string <date> | null

Fälligkeitsdatum, YYYY-MM-DD. null behält die aktuelle Frist bei (eine Frist kann nicht gelöscht werden).

matter_id
integer | null>= 1

Verschiebt die Aufgabe auf diese Akte (muss sichtbar und nicht archiviert sein) oder null, um sie zu lösen. Das Senden der aktuellen Akte der Aufgabe ändert nichts.

client_id
integer | null>= 1

Mandant einer aktenlosen Aufgabe. Nur zulässig, wenn die Aufgabe keine Akte hat.

assigned_to_user_id
integer | null>= 0

Neuer Bearbeiter: die Benutzer-ID eines aktiven Kollegen aus colleagues.list. Wird benachrichtigt, wenn Sie es nicht sind. Das Senden des aktuellen Wertes, oder null / 0, als das eine Aufgabe ohne Bearbeiter zurückgelesen wird, ändert nichts.

priority
integer>= 1<= 3

1 = niedrig, 2 = mittel, 3 = hoch. Weglassen, um die aktuelle Priorität beizubehalten (auch wenn die Aufgabe mit priority null zurückgelesen wird); null wird abgelehnt.

description
string | null

Ausführlichere Details, Klartext, als NEUER Wert höchstens 10000 Zeichen; eine längere gespeicherte Beschreibung kann unverändert zurückgesendet werden.

flag_id
integer | null>= 1

Id eines Aufgaben-Flags (Label) der Kanzlei oder null, um es zu löschen.

Antworten

200

Aktualisiert.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 9876
subject
string
Beispiel: "Submit the statement of defence"
description
string | null
deadline
string <date> | null

Fälligkeitsdatum, YYYY-MM-DD.

Beispiel: "2026-11-15"
priority
integer | null

1 = niedrig, 2 = mittel, 3 = hoch; null = nicht gesetzt (eine ältere Aufgabe ohne Priorität).

Beispiel: 2
status
string
Zulässige Werte: "open" "closed"
closed_at
string <date> | null

Tag, an dem die Aufgabe geschlossen wurde, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.

matter
object | null

Die Akte, zu der die Aufgabe gehört, falls vorhanden.

Felder von matter
id
integer
case_number
string
client
object | null

Der Mandant: der erste Mandant der Akte oder der eigene Mandant der Aufgabe, wenn sie keine Akte hat.

Felder von client
id
integer
name
string
assigned_to_user_id
integer | null
assigned_to
string | null
created_by_user_id
integer | null
created_by
string | null
flag_id
integer | null
created_at
string <date-time> | null
updated_at
string <date-time> | null
created_via_api
object | null
Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
updated
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Datensatz hat sich geändert, seit Sie ihn gelesen haben (record_conflict: expected_updated_at stimmt nicht mehr überein; lesen Sie ihn erneut und versuchen Sie es mit dem neuen updated_at erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X PATCH 'https://www.flowyer.de/api/agent/tasks/1234' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "expected_updated_at": "2026-10-30T09:15:00+01:00",
  "subject": "string"
}'

Antwortbeispiele

{
  "data": {
    "id": 9876,
    "subject": "Submit the statement of defence",
    "description": "string",
    "deadline": "2026-11-15",
    "priority": 2,
    "status": "open",
    "closed_at": "2026-10-30",
    "matter": {
      "id": 1234,
      "case_number": "string"
    },
    "client": {
      "id": 1234,
      "name": "string"
    },
    "assigned_to_user_id": 1234,
    "assigned_to": "string",
    "created_by_user_id": 1234,
    "created_by": "string",
    "flag_id": 1234,
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    }
  },
  "updated": true
}

Aufgabe schließen

POST /api/agent/tasks/{id}/close

Schließt eine Aufgabe. Wenn Minuten angegeben werden, bucht sie außerdem einen Zeiteintrag (benötigt workhours:create und eine Akte: die eigene der Aufgabe oder matter_id bei einer aktenlosen Aufgabe); abrechenbare Minuten werden auf die Stundenobergrenze der Kanzlei gekürzt. Ein zweites Schließen antwortet mit 409, sodass ein erneuter Versuch nie einen zweiten Eintrag bucht.

Bereich
tasks:update
Flowyer-Berechtigung
tasks:modify

Pfadparameter

iderforderlich
integer>= 1

Aufgaben-ID.

Beispiel: 9876

Anfragetext application/json

minutes_spent
integer | null>= 0<= 100000

Aufgewendete Zeit in Minuten. Das Buchen von Zeit benötigt den Scope workhours:create und eine Akte.

minutes_invoiceable
integer | null>= 0<= 100000

Abrechenbare Minuten; auf die Stundenobergrenze der Kanzlei gekürzt.

minutes_normative
integer | null>= 0<= 100000

Normative Minuten; roh gespeichert, nie gekürzt.

matter_id
integer | null>= 1

Weist einer AKTENLOSEN Aufgabe beim Schließen diese Akte zu (und ermöglicht so das Buchen von Zeit). Nicht zulässig, wenn die Aufgabe bereits eine Akte hat.

client_id
integer | null>= 1

Direkter Mandant (Megbízó) für eine ohne Akte geschlossene aktenlose Aufgabe.

Antworten

200

OK.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 9876
subject
string
Beispiel: "Submit the statement of defence"
description
string | null
deadline
string <date> | null

Fälligkeitsdatum, YYYY-MM-DD.

Beispiel: "2026-11-15"
priority
integer | null

1 = niedrig, 2 = mittel, 3 = hoch; null = nicht gesetzt (eine ältere Aufgabe ohne Priorität).

Beispiel: 2
status
string
Zulässige Werte: "open" "closed"
closed_at
string <date> | null

Tag, an dem die Aufgabe geschlossen wurde, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.

matter
object | null

Die Akte, zu der die Aufgabe gehört, falls vorhanden.

Felder von matter
id
integer
case_number
string
client
object | null

Der Mandant: der erste Mandant der Akte oder der eigene Mandant der Aufgabe, wenn sie keine Akte hat.

Felder von client
id
integer
name
string
assigned_to_user_id
integer | null
assigned_to
string | null
created_by_user_id
integer | null
created_by
string | null
flag_id
integer | null
created_at
string <date-time> | null
updated_at
string <date-time> | null
created_via_api
object | null
Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
booked_workhour
object | null

Der beim Schließen gebuchte Zeiteintrag oder null, wenn keine Zeit eingegeben wurde.

Felder von booked_workhour
id
integer>= 1
minutes
integer
minutes_invoiceable
integer
minutes_normative
integer
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X POST 'https://www.flowyer.de/api/agent/tasks/9876/close' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -d '{}'

Antwortbeispiele

{
  "data": {
    "id": 9876,
    "subject": "Submit the statement of defence",
    "description": "string",
    "deadline": "2026-11-15",
    "priority": 2,
    "status": "open",
    "closed_at": "2026-10-30",
    "matter": {
      "id": 1234,
      "case_number": "string"
    },
    "client": {
      "id": 1234,
      "name": "string"
    },
    "assigned_to_user_id": 1234,
    "assigned_to": "string",
    "created_by_user_id": 1234,
    "created_by": "string",
    "flag_id": 1234,
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    },
    "booked_workhour": {
      "id": 1234,
      "minutes": 0,
      "minutes_invoiceable": 0,
      "minutes_normative": 0
    }
  }
}

Arbeitszeit

Zeiteinträge auflisten

GET /api/agent/workhours

Listet laufende (noch nicht abgerechnete) Zeiteinträge auf den für den Benutzer sichtbaren Akten auf, neueste zuerst. Filtern Sie nach Akte, verantwortlichem Kollegen oder Zeitraum. Aus der Zusammenfassung ausgeschlossene Einträge werden ebenfalls aufgelistet, gekennzeichnet mit excluded: true; lassen Sie sie in den abrechenbaren Summen unberücksichtigt.

Bereich
workhours:read
Flowyer-Berechtigung
workhours:read

Abfrageparameter

matter_id
integer>= 1

Nur Einträge dieser Akte.

Beispiel: 1234
responsible_user_id
integer>= 1

Nur für diesen Kollegen gebuchte Einträge (eine Benutzer-ID aus colleagues.list).

date_from
string <date>

Nur Einträge an oder nach diesem Datum (YYYY-MM-DD).

date_to
string <date>

Nur Einträge an oder vor diesem Datum (YYYY-MM-DD).

limit
integer>= 1<= 100

Seitengröße, 1-100. Standard 25.

Standard: 25
Beispiel: 25
offset
integer>= 0

Anzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.

Standard: 0
Beispiel: 0

Antworten

200

OK.

dataerforderlich
object[]
Felder von data
id
integer

Zeiteintrags-ID.

matter_id
integer | null

Akte, auf die der Eintrag gebucht ist.

date
string <date> | null
activity
string | null

Was erledigt wurde (Klartext).

minutes
integer | null

Aufgewendete Minuten.

minutes_invoiceable
integer | null

Abrechenbare Minuten nach Anwendung der Stundenobergrenze der Kanzlei (können niedriger als angefordert sein). Sie zählen nur zur Abrechnung, solange excluded false ist.

minutes_normative
integer | null

Normative Minuten (informativ; nie gekürzt).

responsible_user_id
integer | null

Kollege, auf den die Zeit gebucht ist.

responsible
string | null
recorded_by_user_id
integer | null

Wer den Eintrag erfasst hat.

locked
boolean

true, wenn der Eintrag gesperrt ist (über die API schreibgeschützt).

excluded
boolean

true, wenn ein Kollege den Eintrag aus der Aktenzusammenfassung ausgeschlossen hat: Er wird nicht abgerechnet und seine Minuten bleiben in den abrechenbaren Summen unberücksichtigt.

created_at
string <date-time> | null
updated_at
string <date-time> | null

Senden Sie dies bei einer Aktualisierung als expected_updated_at zurück.

paginationerforderlich
object
Felder von pagination
limiterforderlich
integer
offseterforderlich
integer
totalerforderlich
integer

Gesamtanzahl der übereinstimmenden Datensätze.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/workhours?matter_id=1234&limit=25' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": [
    {
      "id": 1234,
      "matter_id": 1234,
      "date": "2026-10-30",
      "activity": "string",
      "minutes": 0,
      "minutes_invoiceable": 0,
      "minutes_normative": 0,
      "responsible_user_id": 1234,
      "responsible": "string",
      "recorded_by_user_id": 1234,
      "locked": true,
      "excluded": true,
      "created_at": "2026-10-30T09:15:00+01:00",
      "updated_at": "2026-10-30T09:15:00+01:00"
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 1
  }
}

Zeiteintrag abrufen

GET /api/agent/workhours/{id}

Gibt einen laufenden Zeiteintrag anhand der id zurück, sofern seine Akte für den Benutzer sichtbar ist.

Bereich
workhours:read
Flowyer-Berechtigung
workhours:read

Pfadparameter

iderforderlich
integer>= 1

Zeiteintrags-ID.

Antworten

200

OK.

dataerforderlich
object
Felder von data
id
integer

Zeiteintrags-ID.

matter_id
integer | null

Akte, auf die der Eintrag gebucht ist.

date
string <date> | null
activity
string | null

Was erledigt wurde (Klartext).

minutes
integer | null

Aufgewendete Minuten.

minutes_invoiceable
integer | null

Abrechenbare Minuten nach Anwendung der Stundenobergrenze der Kanzlei (können niedriger als angefordert sein). Sie zählen nur zur Abrechnung, solange excluded false ist.

minutes_normative
integer | null

Normative Minuten (informativ; nie gekürzt).

responsible_user_id
integer | null

Kollege, auf den die Zeit gebucht ist.

responsible
string | null
recorded_by_user_id
integer | null

Wer den Eintrag erfasst hat.

locked
boolean

true, wenn der Eintrag gesperrt ist (über die API schreibgeschützt).

excluded
boolean

true, wenn ein Kollege den Eintrag aus der Aktenzusammenfassung ausgeschlossen hat: Er wird nicht abgerechnet und seine Minuten bleiben in den abrechenbaren Summen unberücksichtigt.

created_at
string <date-time> | null
updated_at
string <date-time> | null

Senden Sie dies bei einer Aktualisierung als expected_updated_at zurück.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/workhours/1234' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": {
    "id": 1234,
    "matter_id": 1234,
    "date": "2026-10-30",
    "activity": "string",
    "minutes": 0,
    "minutes_invoiceable": 0,
    "minutes_normative": 0,
    "responsible_user_id": 1234,
    "responsible": "string",
    "recorded_by_user_id": 1234,
    "locked": true,
    "excluded": true,
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00"
  }
}

Zeiteintrag erfassen

POST /api/agent/workhours

Erfasst einen Zeiteintrag auf einer Akte: Datum, Tätigkeit, aufgewendete Minuten und abrechenbare Minuten. Weggelassene abrechenbare Minuten bedeuten nicht abrechenbar: senden Sie minutes_invoiceable für abrechenbare Arbeit. Sie werden auf die Stundenobergrenze der Kanzlei gekürzt. Der verantwortliche Kollege ist standardmäßig der Benutzer des Schlüssels und wird andernfalls benachrichtigt.

Bereich
workhours:create
Flowyer-Berechtigung
workhours:create

Header-Parameter

Idempotency-Key
stringhöchstens 128 Zeichen

Bei jeder Erstellung empfohlen. Ein eindeutiger Wert pro logischer Operation (z. B. eine UUID). Derselbe Wert gibt denselben Datensatz zurück: Ein erneuter Versuch damit gibt den beim ersten Mal erstellten Datensatz zurück, anstatt einen zweiten zu erstellen. Unterschiedliche Werte erstellen immer unterschiedliche Datensätze. Clients, die keine Header senden können, können denselben Wert im Body-Feld idempotency_key übergeben. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$

Anfragetext application/json

matter_iderforderlich
integer>= 1

Akte, auf die die Zeit gebucht wird (muss sichtbar sein).

Beispiel: 1234
dateerforderlich
string <date>

Datum der Arbeit, YYYY-MM-DD.

Beispiel: "2026-10-30"
subject
stringmindestens 2 Zeichenhöchstens 1000 Zeichen

Was erledigt wurde; die Leseseite gibt es als activity zurück, und hier wird jeder der beiden Namen akzeptiert (einer der beiden ist erforderlich). Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
Beispiel: "Drafting the statement of claim"
activity
stringmindestens 2 Zeichenhöchstens 1000 Zeichen

Dasselbe Feld wie subject, unter dem von der Leseseite verwendeten Namen. Senden Sie einen der beiden.

Muster: ^[^<>]*$
minutes
integer | null>= 0<= 100000

Tatsächlich aufgewendete Minuten.

Beispiel: 90
minutes_invoiceable
integer | null>= 0<= 100000

Angeforderte abrechenbare Minuten. Weggelassen oder null = nicht abrechenbar (der Eintrag berechnet nichts; sie werden nicht aus minutes abgeleitet): senden Sie sie für abrechenbare Arbeit ausdrücklich, in der Regel gleich minutes. Die Stundenobergrenze der Kanzlei kann den gespeicherten Wert verringern. Sie zählen nur zur Abrechnung, solange der Eintrag nicht aus der Zusammenfassung ausgeschlossen ist.

Beispiel: 60
minutes_normative
integer | null>= 0<= 100000

Normative Minuten (informativ; nie gekürzt).

responsible_user_id
integer | null>= 1

Kollege, auf den die Zeit gebucht wird: eine Benutzer-ID aus colleagues.list (schlagen Sie einen diktierten Namen dort nach). Standard: der Benutzer hinter dem Schlüssel.

idempotency_key
stringhöchstens 128 Zeichen

Dieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$
Beispiel: "b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"

Antworten

201

Erstellt.

dataerforderlich
object
Felder von data
id
integer

Zeiteintrags-ID.

matter_id
integer | null

Akte, auf die der Eintrag gebucht ist.

date
string <date> | null
activity
string | null

Was erledigt wurde (Klartext).

minutes
integer | null

Aufgewendete Minuten.

minutes_invoiceable
integer | null

Abrechenbare Minuten nach Anwendung der Stundenobergrenze der Kanzlei (können niedriger als angefordert sein). Sie zählen nur zur Abrechnung, solange excluded false ist.

minutes_normative
integer | null

Normative Minuten (informativ; nie gekürzt).

responsible_user_id
integer | null

Kollege, auf den die Zeit gebucht ist.

responsible
string | null
recorded_by_user_id
integer | null

Wer den Eintrag erfasst hat.

locked
boolean

true, wenn der Eintrag gesperrt ist (über die API schreibgeschützt).

excluded
boolean

true, wenn ein Kollege den Eintrag aus der Aktenzusammenfassung ausgeschlossen hat: Er wird nicht abgerechnet und seine Minuten bleiben in den abrechenbaren Summen unberücksichtigt.

created_at
string <date-time> | null
updated_at
string <date-time> | null

Senden Sie dies bei einer Aktualisierung als expected_updated_at zurück.

created
boolean
Wert: true
200

Idempotentes Replay: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage innerhalb von 120 Sekunden) hat den Datensatz bereits erstellt; er wird erneut zurückgegeben, es wurde nichts Neues erstellt.

dataerforderlich
object
Felder von data
id
integer

Zeiteintrags-ID.

matter_id
integer | null

Akte, auf die der Eintrag gebucht ist.

date
string <date> | null
activity
string | null

Was erledigt wurde (Klartext).

minutes
integer | null

Aufgewendete Minuten.

minutes_invoiceable
integer | null

Abrechenbare Minuten nach Anwendung der Stundenobergrenze der Kanzlei (können niedriger als angefordert sein). Sie zählen nur zur Abrechnung, solange excluded false ist.

minutes_normative
integer | null

Normative Minuten (informativ; nie gekürzt).

responsible_user_id
integer | null

Kollege, auf den die Zeit gebucht ist.

responsible
string | null
recorded_by_user_id
integer | null

Wer den Eintrag erfasst hat.

locked
boolean

true, wenn der Eintrag gesperrt ist (über die API schreibgeschützt).

excluded
boolean

true, wenn ein Kollege den Eintrag aus der Aktenzusammenfassung ausgeschlossen hat: Er wird nicht abgerechnet und seine Minuten bleiben in den abrechenbaren Summen unberücksichtigt.

created_at
string <date-time> | null
updated_at
string <date-time> | null

Senden Sie dies bei einer Aktualisierung als expected_updated_at zurück.

created
boolean
Wert: false
idempotent_replay
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar. replay_not_visible: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage) hat den Datensatz bereits erstellt (details.record_id), aber dieser wurde inzwischen gelöscht oder ist für den Benutzer nicht sichtbar; es wurde nichts Neues erstellt, erstellen Sie ihn nicht erneut.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Idempotency-Key wurde für einen anderen Ressourcentyp verwendet (idempotency_key_reused), oder, ohne Schlüssel, eine identische Anfrage wird gerade verarbeitet (duplicate_in_progress; versuchen Sie es in Kürze erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X POST 'https://www.flowyer.de/api/agent/workhours' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 7f3a9c21-1b2c-4d5e-8f90-0a1b2c3d4e5f' \
  -d '{
  "matter_id": 1234,
  "date": "2026-10-30",
  "subject": "Drafting the statement of claim",
  "minutes": 90,
  "minutes_invoiceable": 60
}'

Antwortbeispiele

{
  "data": {
    "id": 1234,
    "matter_id": 1234,
    "date": "2026-10-30",
    "activity": "string",
    "minutes": 0,
    "minutes_invoiceable": 0,
    "minutes_normative": 0,
    "responsible_user_id": 1234,
    "responsible": "string",
    "recorded_by_user_id": 1234,
    "locked": true,
    "excluded": true,
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00"
  },
  "created": true
}

Zeiteintrag aktualisieren

PATCH /api/agent/workhours/{id}

Ändert einen laufenden Zeiteintrag: Datum, Tätigkeit (subject oder activity), Minuten, abrechenbare Minuten (eine geänderte Zahl wird auf die Stundenobergrenze gekürzt, eine zurückgespiegelte beibehalten) und den verantwortlichen Kollegen. Ein gesperrter oder abgerechneter Eintrag kann nicht geändert werden (409). Übergeben Sie expected_updated_at; eine Kollision antwortet mit 409.

Bereich
workhours:update
Flowyer-Berechtigung
workhours:modify

Pfadparameter

iderforderlich
integer>= 1

ID des zu ändernden Datensatzes.

Anfragetext application/json

expected_updated_at
string <date-time> | null

Der Wert updated_at aus Ihrem letzten Lesevorgang dieses Datensatzes (erforderlich, sofern der Datensatz einen hat). Wenn sich der Datensatz seitdem geändert hat (ein Kollege hat ihn bearbeitet), antwortet die API mit 409, und Sie müssen vor einem erneuten Versuch erneut lesen. Ein Altdatensatz, dessen updated_at null ist, nimmt null an.

date
string <date> | null

Datum der Arbeit, YYYY-MM-DD. null behält das aktuelle Datum bei.

subject
string | nullmindestens 1 Zeichen

Was erledigt wurde, der Wert, den die Leseseite als activity zurückgibt (jeder der beiden Namen wird akzeptiert; null unter einem von ihnen bedeutet "nicht angegeben", nur zwei unterschiedliche Texte werden abgelehnt). Klartext, als NEUER Wert höchstens 1000 Zeichen; "<" und ">" können ebenfalls nicht eingeführt werden, ein gespeicherter Text, der länger ist oder diese enthält, kann jedoch unverändert zurückgesendet werden. null behält den aktuellen Text bei.

activity
string | nullmindestens 1 Zeichen

Dasselbe Feld wie subject, unter dem von der Leseseite verwendeten Namen. Senden Sie einen der beiden (null unter dem anderen ist zulässig).

minutes
integer | null>= 0<= 100000

Tatsächlich aufgewendete Minuten; null löscht sie.

minutes_invoiceable
integer | null>= 0<= 100000

Angeforderte abrechenbare Minuten. Eine Zahl, die von der gespeicherten abweicht, wird auf den Rest der Stundenobergrenze gekürzt; das erneute Senden des vom Lesevorgang zurückgegebenen Wertes behält ihn wie erfasst bei (er wird nicht erneut gekürzt). null löscht sie. Sie zählen nur zur Abrechnung, solange der Eintrag nicht aus der Zusammenfassung ausgeschlossen ist (excluded ist false).

minutes_normative
integer | null>= 0<= 100000

Normative Minuten (nie gekürzt); null löscht sie.

responsible_user_id
integer | null>= 0

Neuer verantwortlicher Kollege: die Benutzer-ID eines aktiven Kollegen aus colleagues.list; wird benachrichtigt, wenn Sie es nicht sind. Das Senden des aktuellen Wertes, oder null / 0, als das ein Eintrag ohne Verantwortlichen zurückgelesen wird, ändert nichts.

Antworten

200

Aktualisiert.

dataerforderlich
object
Felder von data
id
integer

Zeiteintrags-ID.

matter_id
integer | null

Akte, auf die der Eintrag gebucht ist.

date
string <date> | null
activity
string | null

Was erledigt wurde (Klartext).

minutes
integer | null

Aufgewendete Minuten.

minutes_invoiceable
integer | null

Abrechenbare Minuten nach Anwendung der Stundenobergrenze der Kanzlei (können niedriger als angefordert sein). Sie zählen nur zur Abrechnung, solange excluded false ist.

minutes_normative
integer | null

Normative Minuten (informativ; nie gekürzt).

responsible_user_id
integer | null

Kollege, auf den die Zeit gebucht ist.

responsible
string | null
recorded_by_user_id
integer | null

Wer den Eintrag erfasst hat.

locked
boolean

true, wenn der Eintrag gesperrt ist (über die API schreibgeschützt).

excluded
boolean

true, wenn ein Kollege den Eintrag aus der Aktenzusammenfassung ausgeschlossen hat: Er wird nicht abgerechnet und seine Minuten bleiben in den abrechenbaren Summen unberücksichtigt.

created_at
string <date-time> | null
updated_at
string <date-time> | null

Senden Sie dies bei einer Aktualisierung als expected_updated_at zurück.

updated
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Datensatz hat sich seit dem Lesen geändert (record_conflict: expected_updated_at stimmt nicht mehr überein; lesen Sie ihn erneut und versuchen Sie es mit dem neuen updated_at noch einmal), oder er wurde abgerechnet / gesperrt und kann nicht mehr über die API geändert werden (record_locked; nehmen Sie die Änderung in Flowyer vor).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X PATCH 'https://www.flowyer.de/api/agent/workhours/1234' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "expected_updated_at": "2026-10-30T09:15:00+01:00",
  "date": "2026-10-30"
}'

Antwortbeispiele

{
  "data": {
    "id": 1234,
    "matter_id": 1234,
    "date": "2026-10-30",
    "activity": "string",
    "minutes": 0,
    "minutes_invoiceable": 0,
    "minutes_normative": 0,
    "responsible_user_id": 1234,
    "responsible": "string",
    "recorded_by_user_id": 1234,
    "locked": true,
    "excluded": true,
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00"
  },
  "updated": true
}

Kosten

Kosten auflisten

GET /api/agent/costs

Listet die laufenden Kosten der für den Benutzer sichtbaren Akten auf, neueste zuerst (eine abgerechnete Kostenposition erscheint hier nicht mehr). Filtern Sie nach Akte, verantwortlichem Kollegen oder Zeitraum. Die Beträge sind Nettobeträge. Zeilen mit excluded: true stehen außerhalb der Zusammenfassung und Zeilen mit locked: true werden von Flowyer verwaltet.

Bereich
costs:read
Flowyer-Berechtigung
cases:read, summary:read

Abfrageparameter

matter_id
integer>= 1

Nur Kosten dieser Akte.

Beispiel: 1234
responsible_user_id
integer>= 1

Nur für diesen Kollegen erfasste Kosten (eine Benutzer-ID aus colleagues.list).

date_from
string <date>

Nur Kosten an oder nach diesem Datum (YYYY-MM-DD).

date_to
string <date>

Nur Kosten an oder vor diesem Datum (YYYY-MM-DD).

limit
integer>= 1<= 100

Seitengröße, 1-100. Standard 25.

Standard: 25
Beispiel: 25
offset
integer>= 0

Anzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.

Standard: 0
Beispiel: 0

Antworten

200

OK.

dataerforderlich
object[]
Felder von data
id
integer

Kosten-ID.

matter_id
integer | null

Akte, zu der die Kostenposition gehört.

date
string <date> | null
activity
string | null

Beschreibung der Kostenposition (Klartext).

cost
number | null

Netto-Kostenbetrag (ohne USt.).

cost_invoiceable
number | null

Netto-Betrag, der an den Mandanten weiterberechnet wird. Er zählt nur zur Abrechnung, solange excluded false ist.

currency_id
integer | null

Währungs-ID (Flowyer-Währungsliste).

currency
string | null

ISO-Währungscode, z. B. HUF, EUR.

responsible_user_id
integer | null
responsible
string | null
excluded
boolean

true, wenn ein Kollege die Kostenposition aus der Aktenzusammenfassung ausgeschlossen hat: Sie wird nicht abgerechnet und bleibt in den abrechenbaren Summen unberücksichtigt.

locked
boolean

true, wenn die Kostenposition von Flowyer verwaltet wird, gespiegelt aus einer Eingangsrechnung oder als Auslagenzuschlag, und nicht über die API geändert werden kann (costs.update antwortet mit 409 record_locked, details.reason gibt den Grund an).

approved_for_billing
boolean

true, wenn ein Kollege die Kostenposition in der Aktenzusammenfassung zur Abrechnung freigegeben hat. Sie bleibt über die API bearbeitbar (wie im Web), und die Freigabe wird danach NICHT erneut angefordert: weisen Sie darauf hin, bevor Sie den Betrag einer freigegebenen Kostenposition ändern.

created_at
string <date-time> | null
updated_at
string <date-time> | null

Senden Sie dies bei einer Aktualisierung als expected_updated_at zurück.

paginationerforderlich
object
Felder von pagination
limiterforderlich
integer
offseterforderlich
integer
totalerforderlich
integer

Gesamtanzahl der übereinstimmenden Datensätze.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/costs?matter_id=1234&limit=25' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": [
    {
      "id": 1234,
      "matter_id": 1234,
      "date": "2026-10-30",
      "activity": "string",
      "cost": 0,
      "cost_invoiceable": 0,
      "currency_id": 1234,
      "currency": "string",
      "responsible_user_id": 1234,
      "responsible": "string",
      "excluded": true,
      "locked": true,
      "approved_for_billing": true,
      "created_at": "2026-10-30T09:15:00+01:00",
      "updated_at": "2026-10-30T09:15:00+01:00"
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 1
  }
}

Kosten abrufen

GET /api/agent/costs/{id}

Gibt eine laufende Kostenposition anhand der id zurück, sofern ihre Akte für den Benutzer sichtbar ist. Die Beträge sind Nettobeträge.

Bereich
costs:read
Flowyer-Berechtigung
cases:read, summary:read

Pfadparameter

iderforderlich
integer>= 1

Kosten-ID.

Antworten

200

OK.

dataerforderlich
object
Felder von data
id
integer

Kosten-ID.

matter_id
integer | null

Akte, zu der die Kostenposition gehört.

date
string <date> | null
activity
string | null

Beschreibung der Kostenposition (Klartext).

cost
number | null

Netto-Kostenbetrag (ohne USt.).

cost_invoiceable
number | null

Netto-Betrag, der an den Mandanten weiterberechnet wird. Er zählt nur zur Abrechnung, solange excluded false ist.

currency_id
integer | null

Währungs-ID (Flowyer-Währungsliste).

currency
string | null

ISO-Währungscode, z. B. HUF, EUR.

responsible_user_id
integer | null
responsible
string | null
excluded
boolean

true, wenn ein Kollege die Kostenposition aus der Aktenzusammenfassung ausgeschlossen hat: Sie wird nicht abgerechnet und bleibt in den abrechenbaren Summen unberücksichtigt.

locked
boolean

true, wenn die Kostenposition von Flowyer verwaltet wird, gespiegelt aus einer Eingangsrechnung oder als Auslagenzuschlag, und nicht über die API geändert werden kann (costs.update antwortet mit 409 record_locked, details.reason gibt den Grund an).

approved_for_billing
boolean

true, wenn ein Kollege die Kostenposition in der Aktenzusammenfassung zur Abrechnung freigegeben hat. Sie bleibt über die API bearbeitbar (wie im Web), und die Freigabe wird danach NICHT erneut angefordert: weisen Sie darauf hin, bevor Sie den Betrag einer freigegebenen Kostenposition ändern.

created_at
string <date-time> | null
updated_at
string <date-time> | null

Senden Sie dies bei einer Aktualisierung als expected_updated_at zurück.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/costs/1234' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": {
    "id": 1234,
    "matter_id": 1234,
    "date": "2026-10-30",
    "activity": "string",
    "cost": 0,
    "cost_invoiceable": 0,
    "currency_id": 1234,
    "currency": "string",
    "responsible_user_id": 1234,
    "responsible": "string",
    "excluded": true,
    "locked": true,
    "approved_for_billing": true,
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00"
  }
}

Kosten erfassen

POST /api/agent/costs

Erfasst eine Kostenposition (Auslage) auf einer Akte: Datum, Text (subject, zurückgelesen als activity), Nettobetrag, an den Mandanten berechneter Nettobetrag und Währung (Standard: die Kanzleiwährung). Die Beträge sind Nettobeträge (ohne USt.). Der verantwortliche Kollege ist standardmäßig der Benutzer des Schlüssels und wird andernfalls benachrichtigt.

Bereich
costs:create
Flowyer-Berechtigung
cases:create, summary:read

Header-Parameter

Idempotency-Key
stringhöchstens 128 Zeichen

Bei jeder Erstellung empfohlen. Ein eindeutiger Wert pro logischer Operation (z. B. eine UUID). Derselbe Wert gibt denselben Datensatz zurück: Ein erneuter Versuch damit gibt den beim ersten Mal erstellten Datensatz zurück, anstatt einen zweiten zu erstellen. Unterschiedliche Werte erstellen immer unterschiedliche Datensätze. Clients, die keine Header senden können, können denselben Wert im Body-Feld idempotency_key übergeben. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$

Anfragetext application/json

matter_iderforderlich
integer>= 1

Akte, zu der die Kostenposition gehört (muss sichtbar sein).

Beispiel: 1234
dateerforderlich
string <date>

Datum der Kostenposition, YYYY-MM-DD.

Beispiel: "2026-10-30"
subject
stringmindestens 2 Zeichenhöchstens 1000 Zeichen

Beschreibung der Kostenposition; die Leseseite gibt sie als activity zurück, und hier wird jeder der beiden Namen akzeptiert (einer der beiden ist erforderlich). Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
Beispiel: "Court filing fee"
activity
stringmindestens 2 Zeichenhöchstens 1000 Zeichen

Dasselbe Feld wie subject, unter dem von der Leseseite verwendeten Namen. Senden Sie einen der beiden.

Muster: ^[^<>]*$
costerforderlich
integer>= 0<= 2147483647

Netto-Kostenbetrag (ohne USt.), eine ganze Zahl in der Haupteinheit der Währung (Cent werden nicht gespeichert).

Beispiel: 15000
cost_invoiceable
integer | null>= 0<= 2147483647

Netto-Betrag, der an den Mandanten weiterberechnet wird, eine ganze Zahl (weglassen, wenn nicht berechnet). Er zählt nur zur Abrechnung, solange die Kostenposition nicht aus der Zusammenfassung ausgeschlossen ist.

Beispiel: 15000
currency_id
integer | null>= 1

Währungs-ID aus der Flowyer-Währungsliste (kein ISO-Code). Lassen Sie sie weg, um die Kanzleiwährung zu verwenden (GET /me office.currency_id / office.currency); eine unbekannte id antwortet mit 422, wobei die akzeptierten ids und Codes in details.allowed stehen.

responsible_user_id
integer | null>= 1

Verantwortlicher Kollege: eine Benutzer-ID aus colleagues.list (schlagen Sie einen diktierten Namen dort nach). Standard: der Benutzer hinter dem Schlüssel.

idempotency_key
stringhöchstens 128 Zeichen

Dieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$
Beispiel: "b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"

Antworten

201

Erstellt.

dataerforderlich
object
Felder von data
id
integer

Kosten-ID.

matter_id
integer | null

Akte, zu der die Kostenposition gehört.

date
string <date> | null
activity
string | null

Beschreibung der Kostenposition (Klartext).

cost
number | null

Netto-Kostenbetrag (ohne USt.).

cost_invoiceable
number | null

Netto-Betrag, der an den Mandanten weiterberechnet wird. Er zählt nur zur Abrechnung, solange excluded false ist.

currency_id
integer | null

Währungs-ID (Flowyer-Währungsliste).

currency
string | null

ISO-Währungscode, z. B. HUF, EUR.

responsible_user_id
integer | null
responsible
string | null
excluded
boolean

true, wenn ein Kollege die Kostenposition aus der Aktenzusammenfassung ausgeschlossen hat: Sie wird nicht abgerechnet und bleibt in den abrechenbaren Summen unberücksichtigt.

locked
boolean

true, wenn die Kostenposition von Flowyer verwaltet wird, gespiegelt aus einer Eingangsrechnung oder als Auslagenzuschlag, und nicht über die API geändert werden kann (costs.update antwortet mit 409 record_locked, details.reason gibt den Grund an).

approved_for_billing
boolean

true, wenn ein Kollege die Kostenposition in der Aktenzusammenfassung zur Abrechnung freigegeben hat. Sie bleibt über die API bearbeitbar (wie im Web), und die Freigabe wird danach NICHT erneut angefordert: weisen Sie darauf hin, bevor Sie den Betrag einer freigegebenen Kostenposition ändern.

created_at
string <date-time> | null
updated_at
string <date-time> | null

Senden Sie dies bei einer Aktualisierung als expected_updated_at zurück.

created
boolean
Wert: true
200

Idempotentes Replay: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage innerhalb von 120 Sekunden) hat den Datensatz bereits erstellt; er wird erneut zurückgegeben, es wurde nichts Neues erstellt.

dataerforderlich
object
Felder von data
id
integer

Kosten-ID.

matter_id
integer | null

Akte, zu der die Kostenposition gehört.

date
string <date> | null
activity
string | null

Beschreibung der Kostenposition (Klartext).

cost
number | null

Netto-Kostenbetrag (ohne USt.).

cost_invoiceable
number | null

Netto-Betrag, der an den Mandanten weiterberechnet wird. Er zählt nur zur Abrechnung, solange excluded false ist.

currency_id
integer | null

Währungs-ID (Flowyer-Währungsliste).

currency
string | null

ISO-Währungscode, z. B. HUF, EUR.

responsible_user_id
integer | null
responsible
string | null
excluded
boolean

true, wenn ein Kollege die Kostenposition aus der Aktenzusammenfassung ausgeschlossen hat: Sie wird nicht abgerechnet und bleibt in den abrechenbaren Summen unberücksichtigt.

locked
boolean

true, wenn die Kostenposition von Flowyer verwaltet wird, gespiegelt aus einer Eingangsrechnung oder als Auslagenzuschlag, und nicht über die API geändert werden kann (costs.update antwortet mit 409 record_locked, details.reason gibt den Grund an).

approved_for_billing
boolean

true, wenn ein Kollege die Kostenposition in der Aktenzusammenfassung zur Abrechnung freigegeben hat. Sie bleibt über die API bearbeitbar (wie im Web), und die Freigabe wird danach NICHT erneut angefordert: weisen Sie darauf hin, bevor Sie den Betrag einer freigegebenen Kostenposition ändern.

created_at
string <date-time> | null
updated_at
string <date-time> | null

Senden Sie dies bei einer Aktualisierung als expected_updated_at zurück.

created
boolean
Wert: false
idempotent_replay
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar. replay_not_visible: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage) hat den Datensatz bereits erstellt (details.record_id), aber dieser wurde inzwischen gelöscht oder ist für den Benutzer nicht sichtbar; es wurde nichts Neues erstellt, erstellen Sie ihn nicht erneut.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Idempotency-Key wurde für einen anderen Ressourcentyp verwendet (idempotency_key_reused), oder, ohne Schlüssel, eine identische Anfrage wird gerade verarbeitet (duplicate_in_progress; versuchen Sie es in Kürze erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X POST 'https://www.flowyer.de/api/agent/costs' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 7f3a9c21-1b2c-4d5e-8f90-0a1b2c3d4e5f' \
  -d '{
  "matter_id": 1234,
  "date": "2026-10-30",
  "subject": "Court filing fee",
  "cost": 15000,
  "cost_invoiceable": 15000
}'

Antwortbeispiele

{
  "data": {
    "id": 1234,
    "matter_id": 1234,
    "date": "2026-10-30",
    "activity": "string",
    "cost": 0,
    "cost_invoiceable": 0,
    "currency_id": 1234,
    "currency": "string",
    "responsible_user_id": 1234,
    "responsible": "string",
    "excluded": true,
    "locked": true,
    "approved_for_billing": true,
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00"
  },
  "created": true
}

Kosten aktualisieren

PATCH /api/agent/costs/{id}

Ändert eine laufende Kostenposition: Text (subject, zurückgelesen als activity), Datum, Nettobeträge, Währung und den verantwortlichen Kollegen. Eine Kostenposition mit locked: true kann nicht geändert werden (409 record_locked, details.reason). Übergeben Sie expected_updated_at; eine kollidierende Änderung antwortet mit 409.

Bereich
costs:update
Flowyer-Berechtigung
cases:modify, summary:read

Pfadparameter

iderforderlich
integer>= 1

ID des zu ändernden Datensatzes.

Anfragetext application/json

expected_updated_at
string <date-time> | null

Der Wert updated_at aus Ihrem letzten Lesevorgang dieses Datensatzes (erforderlich, sofern der Datensatz einen hat). Wenn sich der Datensatz seitdem geändert hat (ein Kollege hat ihn bearbeitet), antwortet die API mit 409, und Sie müssen vor einem erneuten Versuch erneut lesen. Ein Altdatensatz, dessen updated_at null ist, nimmt null an.

date
string <date> | null

Datum der Kostenposition, YYYY-MM-DD. null behält das aktuelle Datum bei.

subject
string | nullmindestens 1 Zeichen

Beschreibung der Kostenposition, der Wert, den die Leseseite als activity zurückgibt (jeder der beiden Namen wird akzeptiert; null unter einem von ihnen bedeutet "nicht angegeben", nur zwei unterschiedliche Texte werden abgelehnt). Klartext, als NEUER Wert höchstens 1000 Zeichen; "<" und ">" können ebenfalls nicht eingeführt werden, ein gespeicherter Text, der länger ist oder diese enthält, kann jedoch unverändert zurückgesendet werden. null behält den aktuellen Text bei.

activity
string | nullmindestens 1 Zeichen

Dasselbe Feld wie subject, unter dem von der Leseseite verwendeten Namen. Senden Sie einen der beiden (null unter dem anderen ist zulässig).

cost
integer | null>= 0<= 2147483647

Netto-Kostenbetrag (ohne USt.), eine ganze Zahl in der Haupteinheit der Währung (Cent werden nicht gespeichert). null löscht den Betrag.

cost_invoiceable
integer | null>= 0<= 2147483647

Netto-Betrag, der an den Mandanten weiterberechnet wird, eine ganze Zahl; null löscht ihn. Er zählt nur zur Abrechnung, solange die Kostenposition nicht aus der Zusammenfassung ausgeschlossen ist (excluded ist false).

currency_id
integer | null>= 0

Währungs-ID aus der Flowyer-Währungsliste (kein ISO-Code; die Kanzleiwährung ist GET /me office.currency_id). Eine unbekannte id antwortet mit 422, wobei die akzeptierten ids und Codes in details.allowed stehen. null, oder die 0, als die eine nicht gesetzte Alt-Kostenposition zurückgelesen wird, behält die aktuelle Währung bei.

responsible_user_id
integer | null>= 0

Neuer verantwortlicher Kollege: die Benutzer-ID eines aktiven Kollegen aus colleagues.list. Das Senden des aktuellen Wertes, oder null / 0, als das eine Kostenposition ohne Verantwortlichen zurückgelesen wird, ändert nichts.

Antworten

200

Aktualisiert.

dataerforderlich
object
Felder von data
id
integer

Kosten-ID.

matter_id
integer | null

Akte, zu der die Kostenposition gehört.

date
string <date> | null
activity
string | null

Beschreibung der Kostenposition (Klartext).

cost
number | null

Netto-Kostenbetrag (ohne USt.).

cost_invoiceable
number | null

Netto-Betrag, der an den Mandanten weiterberechnet wird. Er zählt nur zur Abrechnung, solange excluded false ist.

currency_id
integer | null

Währungs-ID (Flowyer-Währungsliste).

currency
string | null

ISO-Währungscode, z. B. HUF, EUR.

responsible_user_id
integer | null
responsible
string | null
excluded
boolean

true, wenn ein Kollege die Kostenposition aus der Aktenzusammenfassung ausgeschlossen hat: Sie wird nicht abgerechnet und bleibt in den abrechenbaren Summen unberücksichtigt.

locked
boolean

true, wenn die Kostenposition von Flowyer verwaltet wird, gespiegelt aus einer Eingangsrechnung oder als Auslagenzuschlag, und nicht über die API geändert werden kann (costs.update antwortet mit 409 record_locked, details.reason gibt den Grund an).

approved_for_billing
boolean

true, wenn ein Kollege die Kostenposition in der Aktenzusammenfassung zur Abrechnung freigegeben hat. Sie bleibt über die API bearbeitbar (wie im Web), und die Freigabe wird danach NICHT erneut angefordert: weisen Sie darauf hin, bevor Sie den Betrag einer freigegebenen Kostenposition ändern.

created_at
string <date-time> | null
updated_at
string <date-time> | null

Senden Sie dies bei einer Aktualisierung als expected_updated_at zurück.

updated
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Datensatz hat sich seit dem Lesen geändert (record_conflict: expected_updated_at stimmt nicht mehr überein; lesen Sie ihn erneut und versuchen Sie es mit dem neuen updated_at noch einmal), oder er wurde abgerechnet / gesperrt und kann nicht mehr über die API geändert werden (record_locked; nehmen Sie die Änderung in Flowyer vor).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X PATCH 'https://www.flowyer.de/api/agent/costs/1234' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "expected_updated_at": "2026-10-30T09:15:00+01:00",
  "date": "2026-10-30"
}'

Antwortbeispiele

{
  "data": {
    "id": 1234,
    "matter_id": 1234,
    "date": "2026-10-30",
    "activity": "string",
    "cost": 0,
    "cost_invoiceable": 0,
    "currency_id": 1234,
    "currency": "string",
    "responsible_user_id": 1234,
    "responsible": "string",
    "excluded": true,
    "locked": true,
    "approved_for_billing": true,
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00"
  },
  "updated": true
}

Rechnungen

Rechnungen auflisten

GET /api/agent/invoices

Listet Rechnungen (ausgestellt und erhalten) auf, nach neuestem Ausstellungsdatum zuerst. direction=outgoing ist die Liste der von der Kanzlei ausgestellten Rechnungen und lässt Proformarechnungen weg (direction=proforma listet diese auf). Schreibgeschützt: Rechnungen können nicht über die API erstellt oder geändert werden. Rechnungen von Akten, die der Benutzer nicht sehen darf, werden ausgeblendet.

Bereich
invoices:read
Flowyer-Berechtigung
invoices:read, summary:read

Abfrageparameter

direction
string

Die drei eigenen Listen der Kanzlei: outgoing = von der Kanzlei ausgestellte Rechnungen, Proformarechnungen ausgenommen (eine Alt-Zeile ohne Dokumenttyp zählt als Rechnung, wie im Kanzlei-Dashboard); proforma = von der Kanzlei ausgestellte Zahlungsaufforderungen (díjbekérő); incoming = erhalten.

Zulässige Werte: "incoming" "outgoing" "proforma"
paid_status
string
Zulässige Werte: "unpaid" "paid" "partially_paid" "cancelled"
client_id
integer>= 1
matter_id
integer>= 1
issued_from
string <date>

Ausstellungsdatum an oder nach.

Beispiel: "2026-01-01"
issued_to
string <date>

Ausstellungsdatum an oder vor.

Beispiel: "2026-12-31"
limit
integer>= 1<= 100

Seitengröße, 1-100. Standard 25.

Standard: 25
Beispiel: 25
offset
integer>= 0

Anzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.

Standard: 0
Beispiel: 0

Antworten

200

OK.

dataerforderlich
object[]
Felder von data
id
integer
Beispiel: 301
invoice_number
string | null
Beispiel: "FLW-2026-0042"
direction
string | null

outgoing = von der Kanzlei ausgestellt, incoming = von der Kanzlei erhalten.

Zulässige Werte: "incoming" "outgoing"
document_type
string | null

"proforma" ist eine Zahlungsaufforderung, keine ausgestellte Rechnung: Sie ist kein Umsatz und darf nicht zu den ausgestellten gezählt werden. invoices.list direction=outgoing lässt Proformarechnungen weg, direction=proforma listet sie auf. null bei einer Alt-Zeile, die als Rechnung zählt.

Zulässige Werte: "invoice" "proforma" "receipt"
source
string | null
Zulässige Werte: "manual" "szamlazz_outgoing" "szamlazz_imported"
paid_status
string | null
Zulässige Werte: "unpaid" "paid" "partially_paid" "cancelled"
issued_date
string <date> | null
due_date
string <date> | null
paid_date
string <date> | null
completion_date
string <date> | null
net_amount
number | null
gross_amount
number | null
currency
string | null
Beispiel: "HUF"
payment_method_id
integer | null
payment_method
string | null

Lokalisierter Name der Zahlungsart (z. B. Banküberweisung); Englisch, wenn die Kanzleisprache keine Übersetzung dafür hat, null, wenn die Methode überhaupt keinen Namen hat. Identifizieren Sie die Methode anhand von payment_method_id.

supplier
string | null

Aussteller einer Eingangsrechnung.

client
object | null
Felder von client
id
integer
name
string
matter_id
integer | null
created_at
string <date-time> | null
updated_at
string <date-time> | null
paginationerforderlich
object
Felder von pagination
limiterforderlich
integer
offseterforderlich
integer
totalerforderlich
integer

Gesamtanzahl der übereinstimmenden Datensätze.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/invoices?issued_from=2026-01-01&issued_to=2026-12-31&limit=25' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": [
    {
      "id": 301,
      "invoice_number": "FLW-2026-0042",
      "direction": "incoming",
      "document_type": "invoice",
      "source": "manual",
      "paid_status": "unpaid",
      "issued_date": "2026-10-30",
      "due_date": "2026-10-30",
      "paid_date": "2026-10-30",
      "completion_date": "2026-10-30",
      "net_amount": 0,
      "gross_amount": 0,
      "currency": "HUF",
      "payment_method_id": 1234,
      "payment_method": "string",
      "supplier": "string",
      "client": {
        "id": 1234,
        "name": "string"
      },
      "matter_id": 1234,
      "created_at": "2026-10-30T09:15:00+01:00",
      "updated_at": "2026-10-30T09:15:00+01:00"
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 1
  }
}

Rechnung abrufen

GET /api/agent/invoices/{id}

Gibt eine Rechnung zurück. Schreibgeschützt. Antwortet mit 404, wenn sie nicht existiert oder zu einer Akte gehört, die der Benutzer nicht sehen darf.

Bereich
invoices:read
Flowyer-Berechtigung
invoices:read, summary:read

Pfadparameter

iderforderlich
integer>= 1

Rechnungs-ID.

Beispiel: 301

Antworten

200

OK.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 301
invoice_number
string | null
Beispiel: "FLW-2026-0042"
direction
string | null

outgoing = von der Kanzlei ausgestellt, incoming = von der Kanzlei erhalten.

Zulässige Werte: "incoming" "outgoing"
document_type
string | null

"proforma" ist eine Zahlungsaufforderung, keine ausgestellte Rechnung: Sie ist kein Umsatz und darf nicht zu den ausgestellten gezählt werden. invoices.list direction=outgoing lässt Proformarechnungen weg, direction=proforma listet sie auf. null bei einer Alt-Zeile, die als Rechnung zählt.

Zulässige Werte: "invoice" "proforma" "receipt"
source
string | null
Zulässige Werte: "manual" "szamlazz_outgoing" "szamlazz_imported"
paid_status
string | null
Zulässige Werte: "unpaid" "paid" "partially_paid" "cancelled"
issued_date
string <date> | null
due_date
string <date> | null
paid_date
string <date> | null
completion_date
string <date> | null
net_amount
number | null
gross_amount
number | null
currency
string | null
Beispiel: "HUF"
payment_method_id
integer | null
payment_method
string | null

Lokalisierter Name der Zahlungsart (z. B. Banküberweisung); Englisch, wenn die Kanzleisprache keine Übersetzung dafür hat, null, wenn die Methode überhaupt keinen Namen hat. Identifizieren Sie die Methode anhand von payment_method_id.

supplier
string | null

Aussteller einer Eingangsrechnung.

client
object | null
Felder von client
id
integer
name
string
matter_id
integer | null
created_at
string <date-time> | null
updated_at
string <date-time> | null
notes
string | null
received_date
string <date> | null
sent_date
string <date> | null
proforma_invoice_id
integer | null
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/invoices/301' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": {
    "id": 301,
    "invoice_number": "FLW-2026-0042",
    "direction": "incoming",
    "document_type": "invoice",
    "source": "manual",
    "paid_status": "unpaid",
    "issued_date": "2026-10-30",
    "due_date": "2026-10-30",
    "paid_date": "2026-10-30",
    "completion_date": "2026-10-30",
    "net_amount": 0,
    "gross_amount": 0,
    "currency": "HUF",
    "payment_method_id": 1234,
    "payment_method": "string",
    "supplier": "string",
    "client": {
      "id": 1234,
      "name": "string"
    },
    "matter_id": 1234,
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "notes": "string",
    "received_date": "2026-10-30",
    "sent_date": "2026-10-30",
    "proforma_invoice_id": 1234
  }
}

Dokumente

Dokumente einer Angelegenheit auflisten

GET /api/agent/matters/{id}/documents

Listet die aktuellen Versionen der unter einer Angelegenheit abgelegten Dokumente auf: Namen, Größen, Ordner und wer sie hochgeladen hat. Nur Metadaten; verwenden Sie documents.download (Scope documents:download) für einen signierten Link zu den Inhalten. Benannte Dokumente kommen zuerst, alphabetisch, dann importierte ohne Namen.

Bereich
documents:read
Flowyer-Berechtigung
cases:read

Pfadparameter

iderforderlich
integer>= 1

Angelegenheits-ID.

Beispiel: 1234

Abfrageparameter

q
stringhöchstens 100 Zeichen

Nach Dateiname filtern.

Beispiel: "contract"
limit
integer>= 1<= 100

Seitengröße, 1-100. Standard 25.

Standard: 25
Beispiel: 25
offset
integer>= 0

Anzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.

Standard: 0
Beispiel: 0

Antworten

200

OK.

dataerforderlich
object[]
Felder von data
id
integer
name
string

Dateiname, wie er in Flowyer angezeigt wird: der mit dem Dokument gespeicherte Name oder sein Speichername, wenn es aus einem älteren System ohne Namen importiert wurde. documents.list ist nach dem gespeicherten Namen sortiert: Dokumente, die einen haben, kommen zuerst, alphabetisch, dann die importierten ohne gespeicherten Namen, älteste zuerst (die Reihenfolge, in der sie in Flowyer abgelegt wurden), die daher nicht nach dem hier angezeigten Namen sortiert sind. Die Reihenfolge ist auf jeder Seite gleich, sodass limit und offset die Liste ohne Wiederholungen oder Lücken durchblättern.

Beispiel: "Contract_v2.docx"
size
integer | null

Bytes.

version
integer

Aktuelle Versionsnummer der Datei.

folder
object | null

Der Ordner, in dem das Dokument abgelegt ist, oder null im Stammverzeichnis der Angelegenheit. documents.upload.complete antwortet mit null, wenn der bei documents.upload.init gewählte Ordner gelöscht wurde, während die Bytes hochgeladen wurden: Das Dokument wird dann im Stammverzeichnis der Angelegenheit abgelegt, wo Flowyer es anzeigt. Wenn das Stammverzeichnis bereits ein Dokument dieses Namens enthält, wird der Upload unter einem mit Suffix versehenen Namen ("Contract_2.pdf") abgelegt, anstatt eine neue Version dieses nicht verwandten Dokuments zu werden; die 201 gibt den gespeicherten name zurück.

Felder von folder
id
integer
name
string
path
string

Ordnerpfad innerhalb der Angelegenheit, "/"-getrennt.

folder_deleted
boolean

True, wenn das Dokument in einem Ordner abgelegt ist, der nicht mehr existiert, was die Dateiliste von Flowyer selbst nicht anzeigt (folder ist dafür null, wie auch für ein Dokument im Stammverzeichnis der Angelegenheit). documents.upload.complete antwortet nur dann mit true, wenn der Ordner gelöscht wurde, während die Bytes hochgeladen wurden, UND das Verschieben der gespeicherten Datei in das Stammverzeichnis der Angelegenheit fehlgeschlagen ist: Das Dokument wird dann im gelöschten Ordner behalten, wo seine Inhalte weiterhin erreichbar sind. False für alles andere, einschließlich einer normalen Ablage im Stammverzeichnis.

created_by_user_id
integer | null
created_by
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null
paginationerforderlich
object
Felder von pagination
limiterforderlich
integer
offseterforderlich
integer
totalerforderlich
integer

Gesamtanzahl der übereinstimmenden Datensätze.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/matters/1234/documents?q=contract&limit=25' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": [
    {
      "id": 1234,
      "name": "Contract_v2.docx",
      "size": 0,
      "version": 0,
      "folder": {
        "id": 1234,
        "name": "string",
        "path": "string"
      },
      "folder_deleted": true,
      "created_by_user_id": 1234,
      "created_by": "string",
      "created_at": "2026-10-30T09:15:00+01:00",
      "updated_at": "2026-10-30T09:15:00+01:00"
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 1
  }
}

Ordner einer Angelegenheit auflisten

GET /api/agent/matters/{id}/folders

Listet jeden Ordner einer Angelegenheit auf, einschließlich leerer: id, name, parent_id und den "/"-getrennten Pfad, nach Pfad sortiert. Übergeben Sie eine Ordner-ID als folder_id an documents.upload.init. Antwortet mit 404, wenn die Angelegenheit für den Benutzer nicht sichtbar ist.

Bereich
documents:read
Flowyer-Berechtigung
cases:read

Pfadparameter

iderforderlich
integer>= 1

Angelegenheits-ID.

Beispiel: 1234

Abfrageparameter

q
stringhöchstens 100 Zeichen

Nur Ordner, deren Pfad diesen Text enthält (Groß-/Kleinschreibung und Akzente werden ignoriert), z. B. ein Ordnername.

Beispiel: "Beadványok"
limit
integer>= 1<= 100

Seitengröße, 1-100. Standard 25.

Standard: 25
Beispiel: 25
offset
integer>= 0

Anzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.

Standard: 0
Beispiel: 0

Antworten

200

OK.

dataerforderlich
object[]
Felder von data
id
integer

Ordner-ID: Übergeben Sie sie als folder_id an documents.upload.init.

name
string

Ordnername, wie er in Flowyer angezeigt wird.

parent_id
integer | null

ID des übergeordneten Ordners; null für einen Ordner im Stammverzeichnis der Angelegenheit.

path
string

Ordnerpfad innerhalb der Angelegenheit, "/"-getrennt, z. B. "/Iratok/Beadványok" (derselbe Pfad, den documents.list für den Ordner einer Datei anzeigt).

updated_at
string <date-time> | null

Übergeben Sie dies an documents.folders.rename als expected_updated_at.

paginationerforderlich
object
Felder von pagination
limiterforderlich
integer
offseterforderlich
integer
totalerforderlich
integer

Gesamtanzahl der übereinstimmenden Datensätze.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/matters/1234/folders?q=Beadv%C3%A1nyok&limit=25' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": [
    {
      "id": 1234,
      "name": "string",
      "parent_id": 1234,
      "path": "string",
      "updated_at": "2026-10-30T09:15:00+01:00"
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 1
  }
}

Aktenordner anlegen

POST /api/agent/matters/{id}/folders

Erstellt einen Ordner in einer Akte, im Stammverzeichnis oder unter parent_id (ein Ordner DERSELBEN Akte). Der Name ist Klartext ("<" und ">" sind nicht zulässig). Legen Sie ein Dokument darin ab, indem Sie die zurückgegebene id als folder_id an documents.upload.init übergeben. Antwortet mit 404, wenn die Akte nicht sichtbar ist.

Bereich
documents:create
Flowyer-Berechtigung
cases:create

Pfadparameter

iderforderlich
integer>= 1

Akte, zu der der Ordner gehört (muss sichtbar sein).

Beispiel: 1234

Header-Parameter

Idempotency-Key
stringhöchstens 128 Zeichen

Bei jeder Erstellung empfohlen. Ein eindeutiger Wert pro logischer Operation (z. B. eine UUID). Derselbe Wert gibt denselben Datensatz zurück: Ein erneuter Versuch damit gibt den beim ersten Mal erstellten Datensatz zurück, anstatt einen zweiten zu erstellen. Unterschiedliche Werte erstellen immer unterschiedliche Datensätze. Clients, die keine Header senden können, können denselben Wert im Body-Feld idempotency_key übergeben. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$

Anfragetext application/json

nameerforderlich
stringmindestens 1 Zeichenhöchstens 255 Zeichen

Ordnername, höchstens 255 Zeichen. Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
Beispiel: "Beadványok"
parent_id
integer | null>= 1

Id des übergeordneten Ordners (aus documents.folders) innerhalb DERSELBEN Akte; weglassen für einen Ordner im Stammverzeichnis der Akte.

idempotency_key
stringhöchstens 128 Zeichen

Dieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$
Beispiel: "b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"

Antworten

201

Erstellt.

dataerforderlich
object
Felder von data
id
integer

Ordner-id: Übergeben Sie sie als folder_id an documents.upload.init oder als parent_id an documents.folders.create.

name
string

Ordnername, wie er in Flowyer angezeigt wird.

parent_id
integer | null

ID des übergeordneten Ordners; null für einen Ordner im Stammverzeichnis der Angelegenheit.

path
string

Ordnerpfad innerhalb der Akte, "/"-getrennt, z. B. "/Iratok/Beadványok".

updated_at
string <date-time> | null

Übergeben Sie dies an documents.folders.rename als expected_updated_at.

created
boolean
Wert: true
200

Idempotentes Replay: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage innerhalb von 120 Sekunden) hat den Datensatz bereits erstellt; er wird erneut zurückgegeben, es wurde nichts Neues erstellt.

dataerforderlich
object
Felder von data
id
integer

Ordner-id: Übergeben Sie sie als folder_id an documents.upload.init oder als parent_id an documents.folders.create.

name
string

Ordnername, wie er in Flowyer angezeigt wird.

parent_id
integer | null

ID des übergeordneten Ordners; null für einen Ordner im Stammverzeichnis der Angelegenheit.

path
string

Ordnerpfad innerhalb der Akte, "/"-getrennt, z. B. "/Iratok/Beadványok".

updated_at
string <date-time> | null

Übergeben Sie dies an documents.folders.rename als expected_updated_at.

created
boolean
Wert: false
idempotent_replay
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar. replay_not_visible: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage) hat den Datensatz bereits erstellt (details.record_id), aber dieser wurde inzwischen gelöscht oder ist für den Benutzer nicht sichtbar; es wurde nichts Neues erstellt, erstellen Sie ihn nicht erneut.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Idempotency-Key wurde für einen anderen Ressourcentyp verwendet (idempotency_key_reused), oder, ohne Schlüssel, eine identische Anfrage wird gerade verarbeitet (duplicate_in_progress; versuchen Sie es in Kürze erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X POST 'https://www.flowyer.de/api/agent/matters/1234/folders' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 7f3a9c21-1b2c-4d5e-8f90-0a1b2c3d4e5f' \
  -d '{
  "name": "Beadványok"
}'

Antwortbeispiele

{
  "data": {
    "id": 1234,
    "name": "string",
    "parent_id": 1234,
    "path": "string",
    "updated_at": "2026-10-30T09:15:00+01:00"
  },
  "created": true
}

Dokument-Upload starten

POST /api/agent/matters/{id}/documents/uploads

Startet einen Dokument-Upload: Gibt eine signierte upload_url und ein upload_token zurück. Senden Sie die Bytes per PUT dorthin und rufen Sie dann documents.upload.complete auf. Der PUT ist eine einfache HTTPS-Anfrage außerhalb dieser API und außerhalb der MCP-Tools: Ein Assistent ohne eigenen HTTP-Client sollte den Benutzer bitten, die Datei in Flowyer hochzuladen.

Bereich
documents:create
Flowyer-Berechtigung
cases:create

Pfadparameter

iderforderlich
integer>= 1

Angelegenheit, zu der das Dokument gehört (muss sichtbar sein).

Anfragetext application/json

filenameerforderlich
stringmindestens 1 Zeichenhöchstens 255 Zeichen

Dateiname mit Erweiterung, z. B. "Contract.pdf". Klartext; "<" und ">" sind nicht erlaubt. Ausführbare und Web-Dateitypen werden abgelehnt (422 blocked_file_type).

Muster: ^[^<>]*$
Beispiel: "Contract.pdf"
content_typeerforderlich
stringmindestens 1 Zeichenhöchstens 100 Zeichen

MIME-Typ, der beim PUT gesendet wird, z. B. "application/pdf". Er ist Teil der Signatur und muss genau übereinstimmen.

Beispiel: "application/pdf"
sizeerforderlich
integer>= 1

Dateigröße in Bytes, höchstens 104857600 (das Upload-Limit); eine größere Größe antwortet mit 413 file_too_large.

Beispiel: 248000
folder_id
integer | null>= 1

Ordner innerhalb der Angelegenheit: eine Ordner-ID aus documents.folders (es listet auch leere Ordner auf). Für das Stammverzeichnis der Angelegenheit weglassen.

Antworten

200

OK.

dataerforderlich
object
Felder von data
upload_url
string

Signierte URL. Senden Sie die Datei-Bytes per PUT hierher mit dem angegebenen Content-Type UND dem untenstehenden if_generation_match-Header: eine einfache HTTPS-Anfrage, die Ihr eigener HTTP-Client stellt (kein API- oder MCP-Tool sendet sie).

upload_token
string

Übergeben Sie dies an documents.upload.complete, nachdem der PUT erfolgreich war.

content_type
string

Senden Sie genau diesen Content-Type beim PUT.

if_generation_match
string

Senden Sie diesen Wert als "x-goog-if-generation-match"-Header beim PUT (immer "0"). Er macht den Upload einmalig nutzbar: Der PUT wird nur akzeptiert, solange das Objekt noch nicht existiert, sodass die signierte URL ein bereits abgelegtes Dokument nicht überschreiben kann.

object_key
string

Interner Speichername (zur Referenz).

expires_in
integer

Sekunden, bis die Upload-URL und das Token ablaufen.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

413

Der Request-Body ist zu groß (request_too_large), oder die Datei überschreitet das Upload-Limit (file_too_large; details.max gibt das Limit in Bytes an).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X POST 'https://www.flowyer.de/api/agent/matters/1234/documents/uploads' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "filename": "Contract.pdf",
  "content_type": "application/pdf",
  "size": 248000
}'

Antwortbeispiele

{
  "data": {
    "upload_url": "string",
    "upload_token": "string",
    "content_type": "string",
    "if_generation_match": "string",
    "object_key": "string",
    "expires_in": 0
  }
}

Dokument-Upload abschließen

POST /api/agent/matters/{id}/documents

Schließt einen Dokument-Upload ab: Nachdem die Bytes per PUT an die upload_url gesendet wurden, wird die Datei als neue Version an der Angelegenheit erfasst. Übergeben Sie das upload_token aus documents.upload.init. Die Dateimetadaten werden aus dem Token übernommen, nicht aus dieser Anfrage. Ein zwischenzeitlich gelöschter Ordner legt das Dokument im Stammverzeichnis ab.

Bereich
documents:create
Flowyer-Berechtigung
cases:create

Pfadparameter

iderforderlich
integer>= 1

Angelegenheit, zu der das Dokument gehört (dieselbe wie in init).

Header-Parameter

Idempotency-Key
stringhöchstens 128 Zeichen

Bei jeder Erstellung empfohlen. Ein eindeutiger Wert pro logischer Operation (z. B. eine UUID). Derselbe Wert gibt denselben Datensatz zurück: Ein erneuter Versuch damit gibt den beim ersten Mal erstellten Datensatz zurück, anstatt einen zweiten zu erstellen. Unterschiedliche Werte erstellen immer unterschiedliche Datensätze. Clients, die keine Header senden können, können denselben Wert im Body-Feld idempotency_key übergeben. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$

Anfragetext application/json

upload_tokenerforderlich
stringmindestens 1 Zeichenhöchstens 4096 Zeichen

Das von documents.upload.init zurückgegebene Token.

idempotency_key
stringhöchstens 128 Zeichen

Dieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$
Beispiel: "b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"

Antworten

201

Erstellt.

dataerforderlich
object
Felder von data
id
integer
name
string

Dateiname, wie er in Flowyer angezeigt wird: der mit dem Dokument gespeicherte Name oder sein Speichername, wenn es aus einem älteren System ohne Namen importiert wurde. documents.list ist nach dem gespeicherten Namen sortiert: Dokumente, die einen haben, kommen zuerst, alphabetisch, dann die importierten ohne gespeicherten Namen, älteste zuerst (die Reihenfolge, in der sie in Flowyer abgelegt wurden), die daher nicht nach dem hier angezeigten Namen sortiert sind. Die Reihenfolge ist auf jeder Seite gleich, sodass limit und offset die Liste ohne Wiederholungen oder Lücken durchblättern.

Beispiel: "Contract_v2.docx"
size
integer | null

Bytes.

version
integer

Aktuelle Versionsnummer der Datei.

folder
object | null

Der Ordner, in dem das Dokument abgelegt ist, oder null im Stammverzeichnis der Angelegenheit. documents.upload.complete antwortet mit null, wenn der bei documents.upload.init gewählte Ordner gelöscht wurde, während die Bytes hochgeladen wurden: Das Dokument wird dann im Stammverzeichnis der Angelegenheit abgelegt, wo Flowyer es anzeigt. Wenn das Stammverzeichnis bereits ein Dokument dieses Namens enthält, wird der Upload unter einem mit Suffix versehenen Namen ("Contract_2.pdf") abgelegt, anstatt eine neue Version dieses nicht verwandten Dokuments zu werden; die 201 gibt den gespeicherten name zurück.

Felder von folder
id
integer
name
string
path
string

Ordnerpfad innerhalb der Angelegenheit, "/"-getrennt.

folder_deleted
boolean

True, wenn das Dokument in einem Ordner abgelegt ist, der nicht mehr existiert, was die Dateiliste von Flowyer selbst nicht anzeigt (folder ist dafür null, wie auch für ein Dokument im Stammverzeichnis der Angelegenheit). documents.upload.complete antwortet nur dann mit true, wenn der Ordner gelöscht wurde, während die Bytes hochgeladen wurden, UND das Verschieben der gespeicherten Datei in das Stammverzeichnis der Angelegenheit fehlgeschlagen ist: Das Dokument wird dann im gelöschten Ordner behalten, wo seine Inhalte weiterhin erreichbar sind. False für alles andere, einschließlich einer normalen Ablage im Stammverzeichnis.

created_by_user_id
integer | null
created_by
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null
created
boolean
Wert: true
200

Idempotentes Replay: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage innerhalb von 120 Sekunden) hat den Datensatz bereits erstellt; er wird erneut zurückgegeben, es wurde nichts Neues erstellt. Auch die Antwort, wenn dieses upload_token bereits abgeschlossen wurde.

dataerforderlich
object
Felder von data
id
integer
name
string

Dateiname, wie er in Flowyer angezeigt wird: der mit dem Dokument gespeicherte Name oder sein Speichername, wenn es aus einem älteren System ohne Namen importiert wurde. documents.list ist nach dem gespeicherten Namen sortiert: Dokumente, die einen haben, kommen zuerst, alphabetisch, dann die importierten ohne gespeicherten Namen, älteste zuerst (die Reihenfolge, in der sie in Flowyer abgelegt wurden), die daher nicht nach dem hier angezeigten Namen sortiert sind. Die Reihenfolge ist auf jeder Seite gleich, sodass limit und offset die Liste ohne Wiederholungen oder Lücken durchblättern.

Beispiel: "Contract_v2.docx"
size
integer | null

Bytes.

version
integer

Aktuelle Versionsnummer der Datei.

folder
object | null

Der Ordner, in dem das Dokument abgelegt ist, oder null im Stammverzeichnis der Angelegenheit. documents.upload.complete antwortet mit null, wenn der bei documents.upload.init gewählte Ordner gelöscht wurde, während die Bytes hochgeladen wurden: Das Dokument wird dann im Stammverzeichnis der Angelegenheit abgelegt, wo Flowyer es anzeigt. Wenn das Stammverzeichnis bereits ein Dokument dieses Namens enthält, wird der Upload unter einem mit Suffix versehenen Namen ("Contract_2.pdf") abgelegt, anstatt eine neue Version dieses nicht verwandten Dokuments zu werden; die 201 gibt den gespeicherten name zurück.

Felder von folder
id
integer
name
string
path
string

Ordnerpfad innerhalb der Angelegenheit, "/"-getrennt.

folder_deleted
boolean

True, wenn das Dokument in einem Ordner abgelegt ist, der nicht mehr existiert, was die Dateiliste von Flowyer selbst nicht anzeigt (folder ist dafür null, wie auch für ein Dokument im Stammverzeichnis der Angelegenheit). documents.upload.complete antwortet nur dann mit true, wenn der Ordner gelöscht wurde, während die Bytes hochgeladen wurden, UND das Verschieben der gespeicherten Datei in das Stammverzeichnis der Angelegenheit fehlgeschlagen ist: Das Dokument wird dann im gelöschten Ordner behalten, wo seine Inhalte weiterhin erreichbar sind. False für alles andere, einschließlich einer normalen Ablage im Stammverzeichnis.

created_by_user_id
integer | null
created_by
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null
created
boolean
Wert: false
idempotent_replay
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar. upload_not_finished: Die Datei hat den Speicher noch nicht erreicht; schließen Sie den PUT an upload_url ab und rufen Sie dann erneut complete auf. replay_not_visible: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage) hat den Datensatz bereits erstellt (details.record_id), aber dieser wurde inzwischen gelöscht oder ist für den Benutzer nicht sichtbar; es wurde nichts Neues erstellt, erstellen Sie ihn nicht erneut.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Idempotency-Key wurde für einen anderen Ressourcentyp verwendet (idempotency_key_reused), oder, ohne Schlüssel, eine identische Anfrage wird gerade verarbeitet (duplicate_in_progress; versuchen Sie es in Kürze erneut).

413

Der Request-Body ist zu groß (request_too_large), oder die Datei überschreitet das Upload-Limit (file_too_large; details.max gibt das Limit in Bytes an).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X POST 'https://www.flowyer.de/api/agent/matters/1234/documents' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 7f3a9c21-1b2c-4d5e-8f90-0a1b2c3d4e5f' \
  -d '{
  "upload_token": "string"
}'

Antwortbeispiele

{
  "data": {
    "id": 1234,
    "name": "Contract_v2.docx",
    "size": 0,
    "version": 0,
    "folder": {
      "id": 1234,
      "name": "string",
      "path": "string"
    },
    "folder_deleted": true,
    "created_by_user_id": 1234,
    "created_by": "string",
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00"
  },
  "created": true
}

Dokument herunterladen

GET /api/agent/documents/{id}/download

Gibt eine kurzlebige signierte URL zum Herunterladen eines Dokuments anhand der id zurück, sofern seine Akte sichtbar ist. Rufen Sie die url per GET ab, um die Bytes zu laden; sie läuft in wenigen Minuten ab.

Bereich
documents:download
Flowyer-Berechtigung
cases:read

Pfadparameter

iderforderlich
integer>= 1

Dokument-ID (aus documents.list).

Antworten

200

OK.

dataerforderlich
object
Felder von data
download_url
string

Signierte URL. Rufen Sie sie per GET ab, um die Datei-Bytes herunterzuladen.

filename
string

Dateiname für den Download.

size
integer | null

Bytes.

expires_in
integer

Sekunden bis zum Ablauf der URL.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/documents/1234/download' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": {
    "download_url": "string",
    "filename": "string",
    "size": 0,
    "expires_in": 0
  }
}

Dokument umbenennen

PATCH /api/agent/documents/{id}

Benennt ein Dokument um (nur den Anzeigenamen; der Dateiinhalt bleibt unverändert). Der neue Name muss im selben Ordner der Akte eindeutig sein. Übergeben Sie expected_updated_at aus Ihrem letzten Lesevorgang; eine kollidierende Änderung antwortet mit 409.

Bereich
documents:update
Flowyer-Berechtigung
cases:modify

Pfadparameter

iderforderlich
integer>= 1

ID des zu ändernden Datensatzes.

Anfragetext application/json

expected_updated_at
string <date-time> | null

Der Wert updated_at aus Ihrem letzten Lesevorgang dieses Datensatzes (erforderlich, sofern der Datensatz einen hat). Wenn sich der Datensatz seitdem geändert hat (ein Kollege hat ihn bearbeitet), antwortet die API mit 409, und Sie müssen vor einem erneuten Versuch erneut lesen. Ein Altdatensatz, dessen updated_at null ist, nimmt null an.

nameerforderlich
stringmindestens 1 Zeichenhöchstens 255 Zeichen

Neuer Dateiname, höchstens 255 Zeichen EINSCHLIESSLICH der Erweiterung. Die aktuelle Erweiterung wird beibehalten, wenn Sie keine angeben, und sie zählt zu den 255 (ein Name ohne Erweiterung für "Beadvany.pdf" darf also höchstens 251 Zeichen lang sein). Klartext; "<" und ">" sind nicht zulässig, daher kann ein Dokument, dessen gespeicherter Name eines davon enthält, nur in Flowyer umbenannt werden.

Muster: ^[^<>]*$
Beispiel: "Contract_signed.pdf"

Antworten

200

Aktualisiert.

dataerforderlich
object
Felder von data
id
integer
name
string

Dateiname, wie er in Flowyer angezeigt wird: der mit dem Dokument gespeicherte Name oder sein Speichername, wenn es aus einem älteren System ohne Namen importiert wurde. documents.list ist nach dem gespeicherten Namen sortiert: Dokumente, die einen haben, kommen zuerst, alphabetisch, dann die importierten ohne gespeicherten Namen, älteste zuerst (die Reihenfolge, in der sie in Flowyer abgelegt wurden), die daher nicht nach dem hier angezeigten Namen sortiert sind. Die Reihenfolge ist auf jeder Seite gleich, sodass limit und offset die Liste ohne Wiederholungen oder Lücken durchblättern.

Beispiel: "Contract_v2.docx"
size
integer | null

Bytes.

version
integer

Aktuelle Versionsnummer der Datei.

folder
object | null

Der Ordner, in dem das Dokument abgelegt ist, oder null im Stammverzeichnis der Angelegenheit. documents.upload.complete antwortet mit null, wenn der bei documents.upload.init gewählte Ordner gelöscht wurde, während die Bytes hochgeladen wurden: Das Dokument wird dann im Stammverzeichnis der Angelegenheit abgelegt, wo Flowyer es anzeigt. Wenn das Stammverzeichnis bereits ein Dokument dieses Namens enthält, wird der Upload unter einem mit Suffix versehenen Namen ("Contract_2.pdf") abgelegt, anstatt eine neue Version dieses nicht verwandten Dokuments zu werden; die 201 gibt den gespeicherten name zurück.

Felder von folder
id
integer
name
string
path
string

Ordnerpfad innerhalb der Angelegenheit, "/"-getrennt.

folder_deleted
boolean

True, wenn das Dokument in einem Ordner abgelegt ist, der nicht mehr existiert, was die Dateiliste von Flowyer selbst nicht anzeigt (folder ist dafür null, wie auch für ein Dokument im Stammverzeichnis der Angelegenheit). documents.upload.complete antwortet nur dann mit true, wenn der Ordner gelöscht wurde, während die Bytes hochgeladen wurden, UND das Verschieben der gespeicherten Datei in das Stammverzeichnis der Angelegenheit fehlgeschlagen ist: Das Dokument wird dann im gelöschten Ordner behalten, wo seine Inhalte weiterhin erreichbar sind. False für alles andere, einschließlich einer normalen Ablage im Stammverzeichnis.

created_by_user_id
integer | null
created_by
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null
updated
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Datensatz hat sich seit dem Lesen geändert (record_conflict: expected_updated_at stimmt nicht mehr überein; lesen Sie ihn erneut und versuchen Sie es mit dem neuen updated_at noch einmal), oder ein anderes Dokument im selben Ordner trägt bereits diesen Namen (duplicate_name; wählen Sie einen anderen Namen, versuchen Sie nicht denselben erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X PATCH 'https://www.flowyer.de/api/agent/documents/1234' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "expected_updated_at": "2026-10-30T09:15:00+01:00",
  "name": "Contract_signed.pdf"
}'

Antwortbeispiele

{
  "data": {
    "id": 1234,
    "name": "Contract_v2.docx",
    "size": 0,
    "version": 0,
    "folder": {
      "id": 1234,
      "name": "string",
      "path": "string"
    },
    "folder_deleted": true,
    "created_by_user_id": 1234,
    "created_by": "string",
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00"
  },
  "updated": true
}

Aktenordner umbenennen

PATCH /api/agent/folders/{id}

Benennt einen Ordner um (nur dessen Namen; seine Dateien und Unterordner behalten ihren Platz). Der Name ist Klartext ("<" und ">" sind nicht zulässig). Übergeben Sie expected_updated_at aus Ihrem letzten Lesevorgang (documents.folders listet es auf); eine kollidierende Änderung antwortet mit 409.

Bereich
documents:update
Flowyer-Berechtigung
cases:modify

Pfadparameter

iderforderlich
integer>= 1

ID des zu ändernden Datensatzes.

Anfragetext application/json

expected_updated_at
string <date-time> | null

Der Wert updated_at aus Ihrem letzten Lesevorgang dieses Datensatzes (erforderlich, sofern der Datensatz einen hat). Wenn sich der Datensatz seitdem geändert hat (ein Kollege hat ihn bearbeitet), antwortet die API mit 409, und Sie müssen vor einem erneuten Versuch erneut lesen. Ein Altdatensatz, dessen updated_at null ist, nimmt null an.

nameerforderlich
stringmindestens 1 Zeichenhöchstens 255 Zeichen

Neuer Ordnername, höchstens 255 Zeichen. Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
Beispiel: "Beadványok"

Antworten

200

Aktualisiert.

dataerforderlich
object
Felder von data
id
integer

Ordner-id: Übergeben Sie sie als folder_id an documents.upload.init oder als parent_id an documents.folders.create.

name
string

Ordnername, wie er in Flowyer angezeigt wird.

parent_id
integer | null

ID des übergeordneten Ordners; null für einen Ordner im Stammverzeichnis der Angelegenheit.

path
string

Ordnerpfad innerhalb der Akte, "/"-getrennt, z. B. "/Iratok/Beadványok".

updated_at
string <date-time> | null

Übergeben Sie dies an documents.folders.rename als expected_updated_at.

updated
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Datensatz hat sich geändert, seit Sie ihn gelesen haben (record_conflict: expected_updated_at stimmt nicht mehr überein; lesen Sie ihn erneut und versuchen Sie es mit dem neuen updated_at erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X PATCH 'https://www.flowyer.de/api/agent/folders/1234' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "expected_updated_at": "2026-10-30T09:15:00+01:00",
  "name": "Beadványok"
}'

Antwortbeispiele

{
  "data": {
    "id": 1234,
    "name": "string",
    "parent_id": 1234,
    "path": "string",
    "updated_at": "2026-10-30T09:15:00+01:00"
  },
  "updated": true
}

Wissensdatenbank

Wissensdatenbank-Artikel auflisten

GET /api/agent/knowledge/articles

Listet die für den Benutzer sichtbaren Wissensdatenbank-Artikel auf (die eigenen des Autors, globale Artikel und mit der Rolle des Benutzers geteilte Artikel). Standardmäßig alle Status; filtern Sie nach Status oder übergeben Sie q für eine Volltextsuche in Titeln, Auszügen, Inhalt und Tags.

Bereich
knowledge:read

Abfrageparameter

q
string | nullhöchstens 255 Zeichen

Volltext-Suchbegriff (Titel, Auszüge, Inhalt und Tag-Namen). Boolesche Operatoren werden entfernt.

Beispiel: "felmondási idő"
status
string | null

Nur Artikel mit diesem Status. Weglassen, um alle Status aufzulisten.

Zulässige Werte: "draft" "published" "archived"
limit
integer>= 1<= 100

Seitengröße, 1-100. Standard 25.

Standard: 25
Beispiel: 25
offset
integer>= 0

Anzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.

Standard: 0
Beispiel: 0

Antworten

200

OK.

dataerforderlich
object[]
Felder von data
id
integer
Beispiel: 9876
slug
string

Serverseitig generierter URL-Slug.

Beispiel: "felmondasi-ido"
title
string
Beispiel: "Felmondási idő a munka törvénykönyvében"
excerpt
string | null

Kurze Zusammenfassung (Rich-HTML, wie gespeichert).

content
string

Der Artikeltext wie gespeichert (Rich-HTML).

status
string
Zulässige Werte: "draft" "published" "archived"
is_featured
boolean

Ob der Artikel auf der Startseite der Wissensdatenbank angeheftet ist (nicht über die API setzbar).

category_id
integer | null
category_name
string | null
author_id
integer

Benutzer-ID des Autors; 0 bei einem globalen (Standard-)Artikel.

author_name
string | null
editor_id
integer | null

Benutzer-ID des letzten Bearbeiters oder null, falls nie bearbeitet.

editor_name
string | null
views_count
integer
downloads_count
integer
shared_roles
integer[]

Rollen-IDs, mit denen der Artikel geteilt ist (leer = nur der Autor/global).

tags
string[]

Tag-Namen am Artikel.

published_at
string <date-time> | null

Zeitpunkt der Erstveröffentlichung des Artikels oder null.

created_at
string <date-time> | null
updated_at
string <date-time> | null
paginationerforderlich
object
Felder von pagination
limiterforderlich
integer
offseterforderlich
integer
totalerforderlich
integer

Gesamtanzahl der übereinstimmenden Datensätze.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/knowledge/articles?q=felmond%C3%A1si%20id%C5%91&limit=25' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": [
    {
      "id": 9876,
      "slug": "felmondasi-ido",
      "title": "Felmondási idő a munka törvénykönyvében",
      "excerpt": "string",
      "content": "string",
      "status": "draft",
      "is_featured": true,
      "category_id": 1234,
      "category_name": "string",
      "author_id": 1234,
      "author_name": "string",
      "editor_id": 1234,
      "editor_name": "string",
      "views_count": 0,
      "downloads_count": 0,
      "shared_roles": [
        0
      ],
      "tags": [
        "string"
      ],
      "published_at": "2026-10-30T09:15:00+01:00",
      "created_at": "2026-10-30T09:15:00+01:00",
      "updated_at": "2026-10-30T09:15:00+01:00"
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 1
  }
}

Wissensdatenbank-Artikel abrufen

GET /api/agent/knowledge/articles/{id}

Gibt einen Wissensdatenbank-Artikel zurück, einschließlich des vollständigen Inhalts, der Tags und der geteilten Rollen. Antwortet mit 404, wenn der Artikel nicht existiert oder der Benutzer ihn nicht sehen darf.

Bereich
knowledge:read

Pfadparameter

iderforderlich
integer>= 1

Artikel-ID.

Beispiel: 9876

Antworten

200

OK.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 9876
slug
string

Serverseitig generierter URL-Slug.

Beispiel: "felmondasi-ido"
title
string
Beispiel: "Felmondási idő a munka törvénykönyvében"
excerpt
string | null

Kurze Zusammenfassung (Rich-HTML, wie gespeichert).

content
string

Der Artikeltext wie gespeichert (Rich-HTML).

status
string
Zulässige Werte: "draft" "published" "archived"
is_featured
boolean

Ob der Artikel auf der Startseite der Wissensdatenbank angeheftet ist (nicht über die API setzbar).

category_id
integer | null
category_name
string | null
author_id
integer

Benutzer-ID des Autors; 0 bei einem globalen (Standard-)Artikel.

author_name
string | null
editor_id
integer | null

Benutzer-ID des letzten Bearbeiters oder null, falls nie bearbeitet.

editor_name
string | null
views_count
integer
downloads_count
integer
shared_roles
integer[]

Rollen-IDs, mit denen der Artikel geteilt ist (leer = nur der Autor/global).

tags
string[]

Tag-Namen am Artikel.

published_at
string <date-time> | null

Zeitpunkt der Erstveröffentlichung des Artikels oder null.

created_at
string <date-time> | null
updated_at
string <date-time> | null
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/knowledge/articles/9876' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": {
    "id": 9876,
    "slug": "felmondasi-ido",
    "title": "Felmondási idő a munka törvénykönyvében",
    "excerpt": "string",
    "content": "string",
    "status": "draft",
    "is_featured": true,
    "category_id": 1234,
    "category_name": "string",
    "author_id": 1234,
    "author_name": "string",
    "editor_id": 1234,
    "editor_name": "string",
    "views_count": 0,
    "downloads_count": 0,
    "shared_roles": [
      0
    ],
    "tags": [
      "string"
    ],
    "published_at": "2026-10-30T09:15:00+01:00",
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00"
  }
}

Wissensdatenbank-Artikel anlegen

POST /api/agent/knowledge/articles

Legt einen Wissensdatenbank-Artikel an, verfasst vom Benutzer des Schlüssels. Der Slug wird aus dem Titel generiert. Die Kategorie muss existieren und aktiv sein. Teilen Sie ihn über shared_roles mit Rollen (andernfalls sieht ihn nur der Autor). content und excerpt sind HTML und werden serverseitig bereinigt.

Bereich
knowledge:create

Header-Parameter

Idempotency-Key
stringhöchstens 128 Zeichen

Bei jeder Erstellung empfohlen. Ein eindeutiger Wert pro logischer Operation (z. B. eine UUID). Derselbe Wert gibt denselben Datensatz zurück: Ein erneuter Versuch damit gibt den beim ersten Mal erstellten Datensatz zurück, anstatt einen zweiten zu erstellen. Unterschiedliche Werte erstellen immer unterschiedliche Datensätze. Clients, die keine Header senden können, können denselben Wert im Body-Feld idempotency_key übergeben. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$

Anfragetext application/json

titleerforderlich
stringhöchstens 500 Zeichen

Artikeltitel. Klartext.

Beispiel: "Felmondási idő a munka törvénykönyvében"
excerpt
string | null

Kurze Zusammenfassung (HTML erlaubt, serverseitig bereinigt), höchstens 200 Zeichen.

contenterforderlich
string

Der Artikeltext. Rich-HTML, serverseitig mit dem Wissensdatenbank-Profil bereinigt.

category_iderforderlich
integer>= 1

Id einer vorhandenen, aktiven Wissensdatenbank-Kategorie.

Beispiel: 12
statuserforderlich
string

draft, published oder archived. published setzt published_at.

Zulässige Werte: "draft" "published" "archived"
tags
string[] | null

Tag-Namen; neue Tags werden bei Bedarf erstellt.

shared_roles
integer[] | null

Rollen-IDs, mit denen der Artikel geteilt werden soll. Leer bedeutet, dass nur der Autor ihn sehen kann.

idempotency_key
stringhöchstens 128 Zeichen

Dieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$
Beispiel: "b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"

Antworten

201

Erstellt.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 9876
slug
string

Serverseitig generierter URL-Slug.

Beispiel: "felmondasi-ido"
title
string
Beispiel: "Felmondási idő a munka törvénykönyvében"
excerpt
string | null

Kurze Zusammenfassung (Rich-HTML, wie gespeichert).

content
string

Der Artikeltext wie gespeichert (Rich-HTML).

status
string
Zulässige Werte: "draft" "published" "archived"
is_featured
boolean

Ob der Artikel auf der Startseite der Wissensdatenbank angeheftet ist (nicht über die API setzbar).

category_id
integer | null
category_name
string | null
author_id
integer

Benutzer-ID des Autors; 0 bei einem globalen (Standard-)Artikel.

author_name
string | null
editor_id
integer | null

Benutzer-ID des letzten Bearbeiters oder null, falls nie bearbeitet.

editor_name
string | null
views_count
integer
downloads_count
integer
shared_roles
integer[]

Rollen-IDs, mit denen der Artikel geteilt ist (leer = nur der Autor/global).

tags
string[]

Tag-Namen am Artikel.

published_at
string <date-time> | null

Zeitpunkt der Erstveröffentlichung des Artikels oder null.

created_at
string <date-time> | null
updated_at
string <date-time> | null
created
boolean
Wert: true
200

Idempotentes Replay: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage innerhalb von 120 Sekunden) hat den Datensatz bereits erstellt; er wird erneut zurückgegeben, es wurde nichts Neues erstellt.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 9876
slug
string

Serverseitig generierter URL-Slug.

Beispiel: "felmondasi-ido"
title
string
Beispiel: "Felmondási idő a munka törvénykönyvében"
excerpt
string | null

Kurze Zusammenfassung (Rich-HTML, wie gespeichert).

content
string

Der Artikeltext wie gespeichert (Rich-HTML).

status
string
Zulässige Werte: "draft" "published" "archived"
is_featured
boolean

Ob der Artikel auf der Startseite der Wissensdatenbank angeheftet ist (nicht über die API setzbar).

category_id
integer | null
category_name
string | null
author_id
integer

Benutzer-ID des Autors; 0 bei einem globalen (Standard-)Artikel.

author_name
string | null
editor_id
integer | null

Benutzer-ID des letzten Bearbeiters oder null, falls nie bearbeitet.

editor_name
string | null
views_count
integer
downloads_count
integer
shared_roles
integer[]

Rollen-IDs, mit denen der Artikel geteilt ist (leer = nur der Autor/global).

tags
string[]

Tag-Namen am Artikel.

published_at
string <date-time> | null

Zeitpunkt der Erstveröffentlichung des Artikels oder null.

created_at
string <date-time> | null
updated_at
string <date-time> | null
created
boolean
Wert: false
idempotent_replay
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar. replay_not_visible: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage) hat den Datensatz bereits erstellt (details.record_id), aber dieser wurde inzwischen gelöscht oder ist für den Benutzer nicht sichtbar; es wurde nichts Neues erstellt, erstellen Sie ihn nicht erneut.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Idempotency-Key wurde für einen anderen Ressourcentyp verwendet (idempotency_key_reused), oder, ohne Schlüssel, eine identische Anfrage wird gerade verarbeitet (duplicate_in_progress; versuchen Sie es in Kürze erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X POST 'https://www.flowyer.de/api/agent/knowledge/articles' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 7f3a9c21-1b2c-4d5e-8f90-0a1b2c3d4e5f' \
  -d '{
  "title": "Felmondási idő a munka törvénykönyvében",
  "content": "string",
  "category_id": 12,
  "status": "draft"
}'

Antwortbeispiele

{
  "data": {
    "id": 9876,
    "slug": "felmondasi-ido",
    "title": "Felmondási idő a munka törvénykönyvében",
    "excerpt": "string",
    "content": "string",
    "status": "draft",
    "is_featured": true,
    "category_id": 1234,
    "category_name": "string",
    "author_id": 1234,
    "author_name": "string",
    "editor_id": 1234,
    "editor_name": "string",
    "views_count": 0,
    "downloads_count": 0,
    "shared_roles": [
      0
    ],
    "tags": [
      "string"
    ],
    "published_at": "2026-10-30T09:15:00+01:00",
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00"
  },
  "created": true
}

Wissensdatenbank-Artikel aktualisieren

PATCH /api/agent/knowledge/articles/{id}

Ändert einen Wissensdatenbank-Artikel: Titel (der Slug wird neu abgeleitet), Auszug, Inhalt, Kategorie, Status, Tags oder geteilte Rollen. Nur der Autor (oder bei einem globalen Artikel jeder) darf bearbeiten. Übergeben Sie expected_updated_at; eine kollidierende Änderung antwortet mit 409. content und excerpt werden serverseitig bereinigt.

Bereich
knowledge:update

Pfadparameter

iderforderlich
integer>= 1

ID des zu ändernden Datensatzes.

Anfragetext application/json

expected_updated_at
string <date-time> | null

Der Wert updated_at aus Ihrem letzten Lesevorgang dieses Datensatzes (erforderlich, sofern der Datensatz einen hat). Wenn sich der Datensatz seitdem geändert hat (ein Kollege hat ihn bearbeitet), antwortet die API mit 409, und Sie müssen vor einem erneuten Versuch erneut lesen. Ein Altdatensatz, dessen updated_at null ist, nimmt null an.

title
string | null

Artikeltitel (Klartext). null behält den aktuellen Titel bei; ein neuer Titel leitet den Slug neu ab.

excerpt
string | null

Kurze Zusammenfassung (HTML erlaubt, bereinigt), als NEUER Wert höchstens 200 Zeichen. Leer/null löscht sie; weglassen, um sie beizubehalten.

content
string | null

Der Artikeltext (Rich-HTML, bereinigt). null behält den aktuellen Inhalt bei; er kann nicht gelöscht werden.

category_id
integer | null>= 1

Verschiebt den Artikel in diese vorhandene, aktive Kategorie. null behält die aktuelle bei.

status
string | null

draft, published oder archived. Der erste Wechsel zu published setzt published_at; es wird nie gelöscht. null behält den aktuellen Status bei.

Zulässige Werte: "draft" "published" "archived"
tags
string[] | null

Ersetzt den gesamten Tag-Satz (neue Tags werden erstellt). Ein leeres Array löscht alle Tags; weglassen, um sie beizubehalten.

shared_roles
integer[] | null

Ersetzt den gesamten Satz geteilter Rollen. Ein leeres Array entfernt jede Freigabe (nur der Autor sieht ihn); weglassen, um sie beizubehalten.

Antworten

200

Aktualisiert.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 9876
slug
string

Serverseitig generierter URL-Slug.

Beispiel: "felmondasi-ido"
title
string
Beispiel: "Felmondási idő a munka törvénykönyvében"
excerpt
string | null

Kurze Zusammenfassung (Rich-HTML, wie gespeichert).

content
string

Der Artikeltext wie gespeichert (Rich-HTML).

status
string
Zulässige Werte: "draft" "published" "archived"
is_featured
boolean

Ob der Artikel auf der Startseite der Wissensdatenbank angeheftet ist (nicht über die API setzbar).

category_id
integer | null
category_name
string | null
author_id
integer

Benutzer-ID des Autors; 0 bei einem globalen (Standard-)Artikel.

author_name
string | null
editor_id
integer | null

Benutzer-ID des letzten Bearbeiters oder null, falls nie bearbeitet.

editor_name
string | null
views_count
integer
downloads_count
integer
shared_roles
integer[]

Rollen-IDs, mit denen der Artikel geteilt ist (leer = nur der Autor/global).

tags
string[]

Tag-Namen am Artikel.

published_at
string <date-time> | null

Zeitpunkt der Erstveröffentlichung des Artikels oder null.

created_at
string <date-time> | null
updated_at
string <date-time> | null
updated
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Datensatz hat sich geändert, seit Sie ihn gelesen haben (record_conflict: expected_updated_at stimmt nicht mehr überein; lesen Sie ihn erneut und versuchen Sie es mit dem neuen updated_at erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X PATCH 'https://www.flowyer.de/api/agent/knowledge/articles/1234' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "expected_updated_at": "2026-10-30T09:15:00+01:00",
  "title": "string"
}'

Antwortbeispiele

{
  "data": {
    "id": 9876,
    "slug": "felmondasi-ido",
    "title": "Felmondási idő a munka törvénykönyvében",
    "excerpt": "string",
    "content": "string",
    "status": "draft",
    "is_featured": true,
    "category_id": 1234,
    "category_name": "string",
    "author_id": 1234,
    "author_name": "string",
    "editor_id": 1234,
    "editor_name": "string",
    "views_count": 0,
    "downloads_count": 0,
    "shared_roles": [
      0
    ],
    "tags": [
      "string"
    ],
    "published_at": "2026-10-30T09:15:00+01:00",
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00"
  },
  "updated": true
}

Wissensdatenbank-Kategorien auflisten

GET /api/agent/knowledge/categories

Listet die für den Benutzer sichtbaren Wissensdatenbank-Kategorien auf: integrierte Standardkategorien, die eigenen des Benutzers und die mit der Rolle des Benutzers geteilten. Sortiert wie in Flowyer (Sortierposition, dann Name).

Bereich
knowledge:read

Abfrageparameter

limit
integer>= 1<= 100

Seitengröße, 1-100. Standard 25.

Standard: 25
Beispiel: 25
offset
integer>= 0

Anzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.

Standard: 0
Beispiel: 0

Antworten

200

OK.

dataerforderlich
object[]
Felder von data
id
integer
Beispiel: 42
slug
string

URL-Slug, aus dem Namen generiert.

Beispiel: "munkajog"
name
string
Beispiel: "Munkajog"
description
string | null

Beschreibung als Klartext oder null.

icon
string | null

Icon-Bezeichner, der neben der Kategorie angezeigt wird, oder null.

order_column
integer

Sortierposition unter gleichrangigen Kategorien.

Beispiel: 0
is_active
boolean
parent_id
integer | null

Id der übergeordneten Kategorie oder null bei einer Wurzelkategorie.

author_id
integer

Benutzer-ID des Erstellers; 0 bei einer integrierten Standardkategorie, die für alle sichtbar ist.

author_name
string | null

Anzeigename des Erstellers oder null bei einer Standardkategorie.

articles_count
integer

Anzahl der veröffentlichten Artikel in dieser Kategorie, die der Aufrufer sehen darf.

shared_roles
integer[]

Rollen-IDs, mit denen diese Kategorie geteilt ist. Leer bedeutet, dass nur der Autor sie sieht (eine Standardkategorie mit author_id 0 ist für alle sichtbar).

created_at
string <date-time> | null
updated_at
string <date-time> | null
paginationerforderlich
object
Felder von pagination
limiterforderlich
integer
offseterforderlich
integer
totalerforderlich
integer

Gesamtanzahl der übereinstimmenden Datensätze.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/knowledge/categories?limit=25' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": [
    {
      "id": 42,
      "slug": "munkajog",
      "name": "Munkajog",
      "description": "string",
      "icon": "string",
      "order_column": 0,
      "is_active": true,
      "parent_id": 1234,
      "author_id": 1234,
      "author_name": "string",
      "articles_count": 0,
      "shared_roles": [
        1
      ],
      "created_at": "2026-10-30T09:15:00+01:00",
      "updated_at": "2026-10-30T09:15:00+01:00"
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 1
  }
}

Wissensdatenbank-Kategorie abrufen

GET /api/agent/knowledge/categories/{id}

Gibt eine Wissensdatenbank-Kategorie zurück. Antwortet mit 404, wenn die Kategorie nicht existiert oder für den Benutzer, dem dieser API-Schlüssel gehört, nicht sichtbar ist.

Bereich
knowledge:read

Pfadparameter

iderforderlich
integer>= 1

Kategorie-ID.

Beispiel: 42

Antworten

200

OK.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 42
slug
string

URL-Slug, aus dem Namen generiert.

Beispiel: "munkajog"
name
string
Beispiel: "Munkajog"
description
string | null

Beschreibung als Klartext oder null.

icon
string | null

Icon-Bezeichner, der neben der Kategorie angezeigt wird, oder null.

order_column
integer

Sortierposition unter gleichrangigen Kategorien.

Beispiel: 0
is_active
boolean
parent_id
integer | null

Id der übergeordneten Kategorie oder null bei einer Wurzelkategorie.

author_id
integer

Benutzer-ID des Erstellers; 0 bei einer integrierten Standardkategorie, die für alle sichtbar ist.

author_name
string | null

Anzeigename des Erstellers oder null bei einer Standardkategorie.

articles_count
integer

Anzahl der veröffentlichten Artikel in dieser Kategorie, die der Aufrufer sehen darf.

shared_roles
integer[]

Rollen-IDs, mit denen diese Kategorie geteilt ist. Leer bedeutet, dass nur der Autor sie sieht (eine Standardkategorie mit author_id 0 ist für alle sichtbar).

created_at
string <date-time> | null
updated_at
string <date-time> | null
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/knowledge/categories/42' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": {
    "id": 42,
    "slug": "munkajog",
    "name": "Munkajog",
    "description": "string",
    "icon": "string",
    "order_column": 0,
    "is_active": true,
    "parent_id": 1234,
    "author_id": 1234,
    "author_name": "string",
    "articles_count": 0,
    "shared_roles": [
      1
    ],
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00"
  }
}

Wissensdatenbank-Kategorie anlegen

POST /api/agent/knowledge/categories

Legt eine Wissensdatenbank-Kategorie an. Der URL-Slug wird aus dem Namen generiert. Teilen Sie sie über shared_roles mit Rollen oder lassen Sie diese weg, sodass nur Sie (der Autor) sie sehen können. Eine parent_id muss, falls angegeben, eine vorhandene aktive Kategorie sein.

Bereich
knowledge:create

Header-Parameter

Idempotency-Key
stringhöchstens 128 Zeichen

Bei jeder Erstellung empfohlen. Ein eindeutiger Wert pro logischer Operation (z. B. eine UUID). Derselbe Wert gibt denselben Datensatz zurück: Ein erneuter Versuch damit gibt den beim ersten Mal erstellten Datensatz zurück, anstatt einen zweiten zu erstellen. Unterschiedliche Werte erstellen immer unterschiedliche Datensätze. Clients, die keine Header senden können, können denselben Wert im Body-Feld idempotency_key übergeben. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$

Anfragetext application/json

nameerforderlich
stringhöchstens 255 Zeichen

Kategoriename. Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
Beispiel: "Munkajog"
description
string | null

Optionale Beschreibung, Klartext.

parent_id
integer | null>= 1

Id der übergeordneten Kategorie (muss existieren und aktiv sein). Weglassen bei einer Wurzelkategorie.

icon
string | nullhöchstens 100 Zeichen

Optionaler Icon-Bezeichner. Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
is_active
boolean | null

Ob die Kategorie aktiv ist. Standard true.

Standard: true
order_column
integer | null>= 0

Sortierposition unter gleichrangigen Kategorien. Standard 0.

Beispiel: 0
shared_roles
integer[] | null

Rollen-IDs, mit denen diese Kategorie geteilt werden soll. Weglassen, sodass nur Sie (der Autor) sie sehen können.

idempotency_key
stringhöchstens 128 Zeichen

Dieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$
Beispiel: "b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"

Antworten

201

Erstellt.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 42
slug
string

URL-Slug, aus dem Namen generiert.

Beispiel: "munkajog"
name
string
Beispiel: "Munkajog"
description
string | null

Beschreibung als Klartext oder null.

icon
string | null

Icon-Bezeichner, der neben der Kategorie angezeigt wird, oder null.

order_column
integer

Sortierposition unter gleichrangigen Kategorien.

Beispiel: 0
is_active
boolean
parent_id
integer | null

Id der übergeordneten Kategorie oder null bei einer Wurzelkategorie.

author_id
integer

Benutzer-ID des Erstellers; 0 bei einer integrierten Standardkategorie, die für alle sichtbar ist.

author_name
string | null

Anzeigename des Erstellers oder null bei einer Standardkategorie.

articles_count
integer

Anzahl der veröffentlichten Artikel in dieser Kategorie, die der Aufrufer sehen darf.

shared_roles
integer[]

Rollen-IDs, mit denen diese Kategorie geteilt ist. Leer bedeutet, dass nur der Autor sie sieht (eine Standardkategorie mit author_id 0 ist für alle sichtbar).

created_at
string <date-time> | null
updated_at
string <date-time> | null
created
boolean
Wert: true
200

Idempotentes Replay: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage innerhalb von 120 Sekunden) hat den Datensatz bereits erstellt; er wird erneut zurückgegeben, es wurde nichts Neues erstellt.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 42
slug
string

URL-Slug, aus dem Namen generiert.

Beispiel: "munkajog"
name
string
Beispiel: "Munkajog"
description
string | null

Beschreibung als Klartext oder null.

icon
string | null

Icon-Bezeichner, der neben der Kategorie angezeigt wird, oder null.

order_column
integer

Sortierposition unter gleichrangigen Kategorien.

Beispiel: 0
is_active
boolean
parent_id
integer | null

Id der übergeordneten Kategorie oder null bei einer Wurzelkategorie.

author_id
integer

Benutzer-ID des Erstellers; 0 bei einer integrierten Standardkategorie, die für alle sichtbar ist.

author_name
string | null

Anzeigename des Erstellers oder null bei einer Standardkategorie.

articles_count
integer

Anzahl der veröffentlichten Artikel in dieser Kategorie, die der Aufrufer sehen darf.

shared_roles
integer[]

Rollen-IDs, mit denen diese Kategorie geteilt ist. Leer bedeutet, dass nur der Autor sie sieht (eine Standardkategorie mit author_id 0 ist für alle sichtbar).

created_at
string <date-time> | null
updated_at
string <date-time> | null
created
boolean
Wert: false
idempotent_replay
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar. replay_not_visible: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage) hat den Datensatz bereits erstellt (details.record_id), aber dieser wurde inzwischen gelöscht oder ist für den Benutzer nicht sichtbar; es wurde nichts Neues erstellt, erstellen Sie ihn nicht erneut.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Idempotency-Key wurde für einen anderen Ressourcentyp verwendet (idempotency_key_reused), oder, ohne Schlüssel, eine identische Anfrage wird gerade verarbeitet (duplicate_in_progress; versuchen Sie es in Kürze erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X POST 'https://www.flowyer.de/api/agent/knowledge/categories' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 7f3a9c21-1b2c-4d5e-8f90-0a1b2c3d4e5f' \
  -d '{
  "name": "Munkajog",
  "order_column": 0
}'

Antwortbeispiele

{
  "data": {
    "id": 42,
    "slug": "munkajog",
    "name": "Munkajog",
    "description": "string",
    "icon": "string",
    "order_column": 0,
    "is_active": true,
    "parent_id": 1234,
    "author_id": 1234,
    "author_name": "string",
    "articles_count": 0,
    "shared_roles": [
      1
    ],
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00"
  },
  "created": true
}

Wissensdatenbank-Kategorie aktualisieren

PATCH /api/agent/knowledge/categories/{id}

Ändert eine Wissensdatenbank-Kategorie: Name (der Slug folgt), Beschreibung, Icon, übergeordnete Kategorie, Aktiv-Flag, Sortierposition oder die Rollen, mit denen sie geteilt ist. Nur der Autor darf sie ändern (eine integrierte Standardkategorie ist von jedem bearbeitbar). Übergeben Sie expected_updated_at; eine kollidierende Änderung antwortet mit 409.

Bereich
knowledge:update

Pfadparameter

iderforderlich
integer>= 1

ID des zu ändernden Datensatzes.

Anfragetext application/json

expected_updated_at
string <date-time> | null

Der Wert updated_at aus Ihrem letzten Lesevorgang dieses Datensatzes (erforderlich, sofern der Datensatz einen hat). Wenn sich der Datensatz seitdem geändert hat (ein Kollege hat ihn bearbeitet), antwortet die API mit 409, und Sie müssen vor einem erneuten Versuch erneut lesen. Ein Altdatensatz, dessen updated_at null ist, nimmt null an.

name
string | nullmindestens 1 Zeichen

Kategoriename. Als NEUER Wert höchstens 255 Zeichen; "<" und ">" können nicht eingeführt werden, ein gespeicherter Name, der länger ist oder diese enthält, kann jedoch unverändert zurückgesendet werden. null behält den aktuellen Namen bei.

description
string | null

Beschreibung als Klartext. null löscht sie.

parent_id
integer | null>= 1

Verschiebt die Kategorie unter diese übergeordnete Kategorie (muss existieren, aktiv sein und keinen Zyklus erzeugen) oder null, um sie zu einer Wurzelkategorie zu machen.

icon
string | null

Icon-Bezeichner. Als NEUER Wert höchstens 100 Zeichen; "<" und ">" können nicht eingeführt werden. null löscht ihn.

is_active
boolean | null

Aktiv-Flag. Weglassen oder null, um den aktuellen Wert beizubehalten.

order_column
integer | null>= 0

Sortierposition unter gleichrangigen Kategorien. Weglassen oder null, um den aktuellen Wert beizubehalten.

shared_roles
integer[] | null

Ersetzt den Satz der Rollen-IDs, mit denen diese Kategorie geteilt ist. Ein leeres Array entfernt jede Freigabe (nur der Autor sieht sie). Weglassen, um die Freigabe unverändert zu lassen.

Antworten

200

Aktualisiert.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 42
slug
string

URL-Slug, aus dem Namen generiert.

Beispiel: "munkajog"
name
string
Beispiel: "Munkajog"
description
string | null

Beschreibung als Klartext oder null.

icon
string | null

Icon-Bezeichner, der neben der Kategorie angezeigt wird, oder null.

order_column
integer

Sortierposition unter gleichrangigen Kategorien.

Beispiel: 0
is_active
boolean
parent_id
integer | null

Id der übergeordneten Kategorie oder null bei einer Wurzelkategorie.

author_id
integer

Benutzer-ID des Erstellers; 0 bei einer integrierten Standardkategorie, die für alle sichtbar ist.

author_name
string | null

Anzeigename des Erstellers oder null bei einer Standardkategorie.

articles_count
integer

Anzahl der veröffentlichten Artikel in dieser Kategorie, die der Aufrufer sehen darf.

shared_roles
integer[]

Rollen-IDs, mit denen diese Kategorie geteilt ist. Leer bedeutet, dass nur der Autor sie sieht (eine Standardkategorie mit author_id 0 ist für alle sichtbar).

created_at
string <date-time> | null
updated_at
string <date-time> | null
updated
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Datensatz hat sich geändert, seit Sie ihn gelesen haben (record_conflict: expected_updated_at stimmt nicht mehr überein; lesen Sie ihn erneut und versuchen Sie es mit dem neuen updated_at erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X PATCH 'https://www.flowyer.de/api/agent/knowledge/categories/1234' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "expected_updated_at": "2026-10-30T09:15:00+01:00",
  "name": "string"
}'

Antwortbeispiele

{
  "data": {
    "id": 42,
    "slug": "munkajog",
    "name": "Munkajog",
    "description": "string",
    "icon": "string",
    "order_column": 0,
    "is_active": true,
    "parent_id": 1234,
    "author_id": 1234,
    "author_name": "string",
    "articles_count": 0,
    "shared_roles": [
      1
    ],
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00"
  },
  "updated": true
}

E-Mails

E-Mails einer Akte auflisten

GET /api/agent/matters/{id}/emails

Listet die auf einer Akte gespeicherten E-Mails auf: Absendername und -adresse, Betreff, Größe und den Kollegen, der jede gespeichert hat, zuletzt gesendete zuerst. Nur Kopf und Metadaten, nie der Inhalt oder das rohe HTML. Verwenden Sie emails.get für den Klartext-Inhalt einer einzelnen Nachricht.

Bereich
emails:read
Flowyer-Berechtigung
emails:read

Pfadparameter

iderforderlich
integer>= 1

Angelegenheits-ID.

Beispiel: 1234

Abfrageparameter

q
stringhöchstens 100 Zeichen

Nach Betreff, Absendername oder Absenderadresse filtern (akzent- und Groß-/Kleinschreibungsunabhängig). Nicht der Inhalt.

Beispiel: "invoice"
limit
integer>= 1<= 100

Seitengröße, 1-100. Standard 25.

Standard: 25
Beispiel: 25
offset
integer>= 0

Anzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.

Standard: 0
Beispiel: 0

Antworten

200

OK.

dataerforderlich
object[]
Felder von data
id
integer

E-Mail-ID (mit emails.get verwenden).

Beispiel: 1234
from_name
string | null

Anzeigename der externen Partei. Der Speicher führt keine Richtungs- oder Empfängerspalten, daher ist dies immer die externe Partei, nie ein Kollege, und die API kann nicht sagen, ob die E-Mail eingehend oder ausgehend war.

from_address
string | null

SMTP-Adresse der externen Partei.

subject
string | null
sent_at
string <date-time> | null

Wann die Nachricht gesendet wurde. Die Zeitzone des gespeicherten Wertes ist je nach Importpfad uneinheitlich (der IMAP-Worker speichert UTC, das Outlook-Add-in speichert eine Wandzeit in der Kanzleizone), daher ist sie bestmöglich, und die danach sortierte Listenreihenfolge kann quellenübergreifend um den UTC-Offset der Kanzlei abweichen. created_at ist der zuverlässige Zeitstempel.

size
integer | null

Bytes der gespeicherten .eml/.msg-Datei.

extension
string | null

"msg" (Outlook-Add-in) oder "eml" (IMAP / Standard); null bei einigen Alt-Zeilen.

saved_by_user_id
integer | null

Benutzer-ID des Kollegen, der die E-Mail in Flowyer gespeichert hat.

saved_by
string | null

Anzeigename dieses Kollegen.

created_at
string <date-time> | null

Wann die E-Mail in Flowyer gespeichert wurde (Wandzeit in der Kanzleizone). Der zuverlässige Zeitstempel für eine stabile Paginierung.

paginationerforderlich
object
Felder von pagination
limiterforderlich
integer
offseterforderlich
integer
totalerforderlich
integer

Gesamtanzahl der übereinstimmenden Datensätze.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/matters/1234/emails?q=invoice&limit=25' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": [
    {
      "id": 1234,
      "from_name": "string",
      "from_address": "string",
      "subject": "string",
      "sent_at": "2026-10-30T09:15:00+01:00",
      "size": 0,
      "extension": "string",
      "saved_by_user_id": 1234,
      "saved_by": "string",
      "created_at": "2026-10-30T09:15:00+01:00"
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 1
  }
}

E-Mail abrufen

GET /api/agent/emails/{id}

Gibt eine gespeicherte E-Mail einer Akte mit ihrem Klartext-Inhalt zurück (Absender, Betreff, Größe und wer sie gespeichert hat). Der rohe HTML-Inhalt wird nie zurückgegeben. Antwortet mit 404, wenn die E-Mail nicht existiert oder ihre Akte für den Benutzer, dem dieser API-Schlüssel gehört, nicht sichtbar ist.

Bereich
emails:read
Flowyer-Berechtigung
emails:read

Pfadparameter

iderforderlich
integer>= 1

E-Mail-ID.

Beispiel: 1234

Antworten

200

OK.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 1234
matter
object | null

Die Akte, unter der die E-Mail abgelegt ist, oder null bei einer aktenlosen E-Mail (außerhalb einer Akte gespeichert).

Felder von matter
id
integer
case_number
string
from_name
string | null

Anzeigename der externen Partei (nie ein Kollege; der Speicher hat keine Richtungsspalte).

from_address
string | null

SMTP-Adresse der externen Partei.

subject
string | null
body
string | null

Der Nachrichteninhalt als Klartext. Der rohe HTML-Inhalt wird bewusst nie zurückgegeben (nicht vertrauenswürdiges Drittanbieter-HTML). Bestmöglicher Klartext: Wenn das ursprüngliche HTML <style>/<script> enthielt, kann deren innerer Text darin erhalten bleiben.

sent_at
string <date-time> | null

Wann die Nachricht gesendet wurde. Die Zeitzone ist je nach Importpfad uneinheitlich (IMAP speichert UTC, das Outlook-Add-in eine Wandzeit in der Kanzleizone); created_at ist der zuverlässige Zeitstempel.

size
integer | null

Bytes der gespeicherten .eml/.msg-Datei.

extension
string | null

"msg" oder "eml"; null bei einigen Alt-Zeilen.

saved_by_user_id
integer | null

Benutzer-ID des Kollegen, der die E-Mail in Flowyer gespeichert hat.

saved_by
string | null

Anzeigename dieses Kollegen.

created_at
string <date-time> | null

Wann die E-Mail in Flowyer gespeichert wurde (Wandzeit in der Kanzleizone).

updated_at
string <date-time> | null
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/emails/1234' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": {
    "id": 1234,
    "matter": {
      "id": 1234,
      "case_number": "string"
    },
    "from_name": "string",
    "from_address": "string",
    "subject": "string",
    "body": "string",
    "sent_at": "2026-10-30T09:15:00+01:00",
    "size": 0,
    "extension": "string",
    "saved_by_user_id": 1234,
    "saved_by": "string",
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00"
  }
}

Prozessverlauf

Prozessverlauf einer Akte auflisten

GET /api/agent/matters/{id}/litigation

Listet die Einträge des Prozessverlaufs (pertörténet) einer Akte auf, neuestes Ereignis zuerst: eine datierte Notiz mit einem Titel, einer HTML-Beschreibung und einem Ort. Antwortet mit 404, wenn die Akte für den Benutzer nicht sichtbar ist.

Bereich
litigation:read
Flowyer-Berechtigung
cases:read

Pfadparameter

iderforderlich
integer>= 1

Angelegenheits-ID.

Beispiel: 1234

Abfrageparameter

limit
integer>= 1<= 100

Seitengröße, 1-100. Standard 25.

Standard: 25
Beispiel: 25
offset
integer>= 0

Anzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.

Standard: 0
Beispiel: 0

Antworten

200

OK.

dataerforderlich
object[]
Felder von data
id
integer
Beispiel: 4521
title
string

Titel des Eintrags. Klartext.

Beispiel: "Első tárgyalás elhalasztva"
description
string | null

Details des Eintrags als Rich-HTML, serverseitig bereinigt.

location
string | null

Wo es geschah (Klartext), z. B. ein Gerichtssaal; nullbar.

event_date
string <date> | null

Tag des Eintrags, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.

user_id
integer | null

Autor (der Benutzer, der den Eintrag erstellt hat).

created_by
string | null

Anzeigename des Autors.

last_editor_id
integer | null

Benutzer, der den Eintrag zuletzt bearbeitet hat.

last_editor
string | null

Anzeigename des letzten Bearbeiters.

created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an litigation.update als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent den Eintrag über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
paginationerforderlich
object
Felder von pagination
limiterforderlich
integer
offseterforderlich
integer
totalerforderlich
integer

Gesamtanzahl der übereinstimmenden Datensätze.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/matters/1234/litigation?limit=25' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": [
    {
      "id": 4521,
      "title": "Első tárgyalás elhalasztva",
      "description": "string",
      "location": "string",
      "event_date": "2026-10-30",
      "user_id": 1234,
      "created_by": "string",
      "last_editor_id": 1234,
      "last_editor": "string",
      "created_at": "2026-10-30T09:15:00+01:00",
      "updated_at": "2026-10-30T09:15:00+01:00",
      "created_via_api": {
        "kind": "key",
        "key_id": 1234,
        "key_name": "string",
        "user_id": 1234,
        "user": "string",
        "at": "2026-10-30T09:15:00+01:00"
      }
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 1
  }
}

Eintrag im Prozessverlauf anlegen

POST /api/agent/matters/{id}/litigation

Fügt einer Akte einen Eintrag im Prozessverlauf (pertörténet) hinzu: einen Titel (Klartext, "<"/">" nicht zulässig), eine optionale HTML-Beschreibung (serverseitig bereinigt), einen optionalen Ort und ein Ereignisdatum (Standard: heute). Antwortet mit 404, wenn die Akte nicht sichtbar ist.

Bereich
litigation:create
Flowyer-Berechtigung
cases:create

Pfadparameter

iderforderlich
integer>= 1

Akte, zu der der Eintrag gehört (muss sichtbar sein).

Beispiel: 1234

Header-Parameter

Idempotency-Key
stringhöchstens 128 Zeichen

Bei jeder Erstellung empfohlen. Ein eindeutiger Wert pro logischer Operation (z. B. eine UUID). Derselbe Wert gibt denselben Datensatz zurück: Ein erneuter Versuch damit gibt den beim ersten Mal erstellten Datensatz zurück, anstatt einen zweiten zu erstellen. Unterschiedliche Werte erstellen immer unterschiedliche Datensätze. Clients, die keine Header senden können, können denselben Wert im Body-Feld idempotency_key übergeben. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$

Anfragetext application/json

titleerforderlich
stringmindestens 1 Zeichenhöchstens 2000 Zeichen

Titel des Eintrags, höchstens 2000 Zeichen. Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
Beispiel: "Első tárgyalás elhalasztva"
description
string | null

Details des Eintrags. Rich-HTML, serverseitig mit dem Wissensdatenbank-Profil bereinigt.

location
string | nullhöchstens 255 Zeichen

Wo es geschah (Klartext, höchstens 255 Zeichen); "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
Beispiel: "Fővárosi Törvényszék, 215. tárgyaló"
event_date
string <date> | null

Tag des Eintrags, YYYY-MM-DD. Standard: heute (Zeitzone der Kanzlei).

Beispiel: "2026-11-15"
idempotency_key
stringhöchstens 128 Zeichen

Dieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$
Beispiel: "b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"

Antworten

201

Erstellt.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 4521
title
string

Titel des Eintrags. Klartext.

Beispiel: "Első tárgyalás elhalasztva"
description
string | null

Details des Eintrags als Rich-HTML, serverseitig bereinigt.

location
string | null

Wo es geschah (Klartext), z. B. ein Gerichtssaal; nullbar.

event_date
string <date> | null

Tag des Eintrags, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.

user_id
integer | null

Autor (der Benutzer, der den Eintrag erstellt hat).

created_by
string | null

Anzeigename des Autors.

last_editor_id
integer | null

Benutzer, der den Eintrag zuletzt bearbeitet hat.

last_editor
string | null

Anzeigename des letzten Bearbeiters.

created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an litigation.update als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent den Eintrag über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
created
boolean
Wert: true
200

Idempotentes Replay: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage innerhalb von 120 Sekunden) hat den Datensatz bereits erstellt; er wird erneut zurückgegeben, es wurde nichts Neues erstellt.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 4521
title
string

Titel des Eintrags. Klartext.

Beispiel: "Első tárgyalás elhalasztva"
description
string | null

Details des Eintrags als Rich-HTML, serverseitig bereinigt.

location
string | null

Wo es geschah (Klartext), z. B. ein Gerichtssaal; nullbar.

event_date
string <date> | null

Tag des Eintrags, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.

user_id
integer | null

Autor (der Benutzer, der den Eintrag erstellt hat).

created_by
string | null

Anzeigename des Autors.

last_editor_id
integer | null

Benutzer, der den Eintrag zuletzt bearbeitet hat.

last_editor
string | null

Anzeigename des letzten Bearbeiters.

created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an litigation.update als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent den Eintrag über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
created
boolean
Wert: false
idempotent_replay
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar. replay_not_visible: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage) hat den Datensatz bereits erstellt (details.record_id), aber dieser wurde inzwischen gelöscht oder ist für den Benutzer nicht sichtbar; es wurde nichts Neues erstellt, erstellen Sie ihn nicht erneut.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Idempotency-Key wurde für einen anderen Ressourcentyp verwendet (idempotency_key_reused), oder, ohne Schlüssel, eine identische Anfrage wird gerade verarbeitet (duplicate_in_progress; versuchen Sie es in Kürze erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X POST 'https://www.flowyer.de/api/agent/matters/1234/litigation' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 7f3a9c21-1b2c-4d5e-8f90-0a1b2c3d4e5f' \
  -d '{
  "title": "Első tárgyalás elhalasztva",
  "location": "Fővárosi Törvényszék, 215. tárgyaló",
  "event_date": "2026-11-15"
}'

Antwortbeispiele

{
  "data": {
    "id": 4521,
    "title": "Első tárgyalás elhalasztva",
    "description": "string",
    "location": "string",
    "event_date": "2026-10-30",
    "user_id": 1234,
    "created_by": "string",
    "last_editor_id": 1234,
    "last_editor": "string",
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    }
  },
  "created": true
}

Eintrag im Prozessverlauf aktualisieren

PATCH /api/agent/litigation/{id}

Ändert einen Eintrag im Prozessverlauf (pertörténet): Titel, Beschreibung, Ort oder Ereignisdatum. Nur die Felder, die Sie senden, werden geschrieben; die Beschreibung wird serverseitig bereinigt. Übergeben Sie expected_updated_at aus Ihrem letzten Lesevorgang; eine kollidierende Änderung antwortet mit 409.

Bereich
litigation:update
Flowyer-Berechtigung
cases:modify

Pfadparameter

iderforderlich
integer>= 1

ID des zu ändernden Datensatzes.

Anfragetext application/json

expected_updated_at
string <date-time> | null

Der Wert updated_at aus Ihrem letzten Lesevorgang dieses Datensatzes (erforderlich, sofern der Datensatz einen hat). Wenn sich der Datensatz seitdem geändert hat (ein Kollege hat ihn bearbeitet), antwortet die API mit 409, und Sie müssen vor einem erneuten Versuch erneut lesen. Ein Altdatensatz, dessen updated_at null ist, nimmt null an.

title
string | nullmindestens 1 Zeichenhöchstens 2000 Zeichen

Neuer Titel, höchstens 2000 Zeichen (Klartext; "<"/">" nicht zulässig). Weglassen, um den aktuellen beizubehalten.

Muster: ^[^<>]*$
Beispiel: "Ítélethirdetés elhalasztva"
description
string | null

Neue Details (Rich-HTML, bereinigt). Weglassen, um die aktuellen beizubehalten; null/leer löscht sie.

location
string | nullhöchstens 255 Zeichen

Neuer Ort (Klartext, höchstens 255 Zeichen; "<"/">" nicht zulässig). Weglassen, um ihn beizubehalten; null/leer löscht ihn.

Muster: ^[^<>]*$
event_date
string <date> | null

Neuer Ereignistag, YYYY-MM-DD. Weglassen, um ihn beizubehalten; null löscht ihn.

Antworten

200

Aktualisiert.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 4521
title
string

Titel des Eintrags. Klartext.

Beispiel: "Első tárgyalás elhalasztva"
description
string | null

Details des Eintrags als Rich-HTML, serverseitig bereinigt.

location
string | null

Wo es geschah (Klartext), z. B. ein Gerichtssaal; nullbar.

event_date
string <date> | null

Tag des Eintrags, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.

user_id
integer | null

Autor (der Benutzer, der den Eintrag erstellt hat).

created_by
string | null

Anzeigename des Autors.

last_editor_id
integer | null

Benutzer, der den Eintrag zuletzt bearbeitet hat.

last_editor
string | null

Anzeigename des letzten Bearbeiters.

created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an litigation.update als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent den Eintrag über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
updated
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Datensatz hat sich geändert, seit Sie ihn gelesen haben (record_conflict: expected_updated_at stimmt nicht mehr überein; lesen Sie ihn erneut und versuchen Sie es mit dem neuen updated_at erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X PATCH 'https://www.flowyer.de/api/agent/litigation/1234' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "expected_updated_at": "2026-10-30T09:15:00+01:00",
  "title": "Ítélethirdetés elhalasztva"
}'

Antwortbeispiele

{
  "data": {
    "id": 4521,
    "title": "Első tárgyalás elhalasztva",
    "description": "string",
    "location": "string",
    "event_date": "2026-10-30",
    "user_id": 1234,
    "created_by": "string",
    "last_editor_id": 1234,
    "last_editor": "string",
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    }
  },
  "updated": true
}

Postbuch

Postbuch auflisten

GET /api/agent/mail-register

Listet die Postbuch-Einträge (Postakönyv) auf, die gegen die für den Benutzer sichtbaren Akten abgelegt sind, neueste zuerst. Filtern Sie nach Akte, Richtung, Freitext (Betreff/Absender/Adressat/Sendungsnummer) und Datumsbereich. Post von archivierten Akten wird ausgeblendet, sofern include_archived nicht true ist.

Bereich
mail_register:read
Flowyer-Berechtigung
mail:read

Abfrageparameter

matter_id
integer>= 1

Nur Einträge dieser Akte (muss für den Benutzer sichtbar sein).

Beispiel: 1234
direction
string

Nur eingehende (empfangene) oder ausgehende (gesendete) Einträge.

Zulässige Werte: "incoming" "outgoing"
q
stringhöchstens 100 Zeichen

Freitextsuche über Betreff, Absender, Adressat, Empfänger und Sendungsnummer (Groß-/Kleinschreibung wird ignoriert).

Beispiel: "Kúria"
date_from
string <date>

Nur Einträge, deren Datum an oder nach diesem Tag liegt (YYYY-MM-DD).

Beispiel: "2026-01-01"
date_to
string <date>

Nur Einträge, deren Datum an oder vor diesem Tag liegt (YYYY-MM-DD).

Beispiel: "2026-12-31"
updated_since
string <date-time>

Nur Einträge, die zu diesem Zeitpunkt oder danach geändert wurden (ISO 8601).

Beispiel: "2026-10-01T00:00:00+02:00"
include_archived
boolean

Einträge von archivierten Akten einbeziehen.

Standard: false
limit
integer>= 1<= 100

Seitengröße, 1-100. Standard 25.

Standard: 25
Beispiel: 25
offset
integer>= 0

Anzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.

Standard: 0
Beispiel: 0

Antworten

200

OK.

dataerforderlich
object[]
Felder von data
id
integer

Id des Postbuch-Eintrags (mit mail_register.get / .update verwenden).

Beispiel: 4321
matter
object | null

Die Akte, gegen die der Eintrag abgelegt ist.

Felder von matter
id
integer
case_number
string
direction
string

incoming = empfangen, outgoing = gesendet.

Zulässige Werte: "incoming" "outgoing"
date
string <date> | null

Post-/Erfassungsdatum, YYYY-MM-DD (keine Uhrzeit).

subject
string | null
sender
string | null

Feladó: der Absender (Freitext).

to
string | null

Címzett: der Adressat (Freitext).

recipient
string | null

Bei einer eingehenden Post: der Anzeigename des Kollegen, der sie empfangen hat. Bei einer ausgehenden Post: der Freitext-Adressat/Empfänger.

recipient_user_id
integer | null

Nur bei einer eingehenden Post gesetzt, deren Empfänger ein Kollege ist (eine Benutzer-id); null bei einer ausgehenden Post.

electronic
boolean

True, wenn der Posten als elektronisch erfasst wurde (type_of_mail).

delivery_method_id
integer | null

Id der Zustellart (mail_delivery_methods).

delivery_method
string | null

Lokalisierte Bezeichnung der Zustellart (Posta, Cégkapu, Perkapu, ...) oder der elektronische/nicht-elektronische Fallback bei einer Alt-Zeile.

tracking_no
string | null

Azonosító: Sendungsnummer.

folder_path
string | null
recorded_by_user_id
integer | null

Der Kollege, der den Eintrag erfasst hat.

recorded_by
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an mail_register.update als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent den Eintrag über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
paginationerforderlich
object
Felder von pagination
limiterforderlich
integer
offseterforderlich
integer
totalerforderlich
integer

Gesamtanzahl der übereinstimmenden Datensätze.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/mail-register?matter_id=1234&q=K%C3%BAria&date_from=2026-01-01' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": [
    {
      "id": 4321,
      "matter": {
        "id": 1234,
        "case_number": "string"
      },
      "direction": "incoming",
      "date": "2026-10-30",
      "subject": "string",
      "sender": "string",
      "to": "string",
      "recipient": "string",
      "recipient_user_id": 1234,
      "electronic": true,
      "delivery_method_id": 1234,
      "delivery_method": "string",
      "tracking_no": "string",
      "folder_path": "string",
      "recorded_by_user_id": 1234,
      "recorded_by": "string",
      "created_at": "2026-10-30T09:15:00+01:00",
      "updated_at": "2026-10-30T09:15:00+01:00",
      "created_via_api": {
        "kind": "key",
        "key_id": 1234,
        "key_name": "string",
        "user_id": 1234,
        "user": "string",
        "at": "2026-10-30T09:15:00+01:00"
      }
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 1
  }
}

Postbuch-Eintrag abrufen

GET /api/agent/mail-register/{id}

Gibt einen Postbuch-Eintrag (Postakönyv) anhand der id zurück, mit seinem updated_at (dem Token, das mail_register.update nimmt). Antwortet mit 404, wenn der Eintrag nicht existiert oder seine Akte für den Benutzer nicht sichtbar ist.

Bereich
mail_register:read
Flowyer-Berechtigung
mail:read

Pfadparameter

iderforderlich
integer>= 1

Id des Postbuch-Eintrags.

Beispiel: 4321

Antworten

200

OK.

dataerforderlich
object
Felder von data
id
integer

Id des Postbuch-Eintrags (mit mail_register.get / .update verwenden).

Beispiel: 4321
matter
object | null

Die Akte, gegen die der Eintrag abgelegt ist.

Felder von matter
id
integer
case_number
string
direction
string

incoming = empfangen, outgoing = gesendet.

Zulässige Werte: "incoming" "outgoing"
date
string <date> | null

Post-/Erfassungsdatum, YYYY-MM-DD (keine Uhrzeit).

subject
string | null
sender
string | null

Feladó: der Absender (Freitext).

to
string | null

Címzett: der Adressat (Freitext).

recipient
string | null

Bei einer eingehenden Post: der Anzeigename des Kollegen, der sie empfangen hat. Bei einer ausgehenden Post: der Freitext-Adressat/Empfänger.

recipient_user_id
integer | null

Nur bei einer eingehenden Post gesetzt, deren Empfänger ein Kollege ist (eine Benutzer-id); null bei einer ausgehenden Post.

electronic
boolean

True, wenn der Posten als elektronisch erfasst wurde (type_of_mail).

delivery_method_id
integer | null

Id der Zustellart (mail_delivery_methods).

delivery_method
string | null

Lokalisierte Bezeichnung der Zustellart (Posta, Cégkapu, Perkapu, ...) oder der elektronische/nicht-elektronische Fallback bei einer Alt-Zeile.

tracking_no
string | null

Azonosító: Sendungsnummer.

folder_path
string | null
recorded_by_user_id
integer | null

Der Kollege, der den Eintrag erfasst hat.

recorded_by
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an mail_register.update als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent den Eintrag über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/mail-register/4321' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": {
    "id": 4321,
    "matter": {
      "id": 1234,
      "case_number": "string"
    },
    "direction": "incoming",
    "date": "2026-10-30",
    "subject": "string",
    "sender": "string",
    "to": "string",
    "recipient": "string",
    "recipient_user_id": 1234,
    "electronic": true,
    "delivery_method_id": 1234,
    "delivery_method": "string",
    "tracking_no": "string",
    "folder_path": "string",
    "recorded_by_user_id": 1234,
    "recorded_by": "string",
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    }
  }
}

Postbuch-Eintrag anlegen

POST /api/agent/mail-register

Legt einen neuen Postbuch-Eintrag (Postakönyv) auf einer Akte an. Verwenden Sie recipient_user_id für eine eingehende, von einem Kollegen empfangene Post oder recipient (Freitext) für eine ausgehende. delivery_method_id muss eine bekannte Methode sein. Antwortet mit 404, wenn die Akte nicht sichtbar ist.

Bereich
mail_register:create
Flowyer-Berechtigung
mail:create

Header-Parameter

Idempotency-Key
stringhöchstens 128 Zeichen

Bei jeder Erstellung empfohlen. Ein eindeutiger Wert pro logischer Operation (z. B. eine UUID). Derselbe Wert gibt denselben Datensatz zurück: Ein erneuter Versuch damit gibt den beim ersten Mal erstellten Datensatz zurück, anstatt einen zweiten zu erstellen. Unterschiedliche Werte erstellen immer unterschiedliche Datensätze. Clients, die keine Header senden können, können denselben Wert im Body-Feld idempotency_key übergeben. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$

Anfragetext application/json

matter_iderforderlich
integer>= 1

Akte, zu der der Eintrag gehört (muss sichtbar sein).

Beispiel: 1234
directionerforderlich
string

incoming = empfangen, outgoing = gesendet.

Zulässige Werte: "incoming" "outgoing"
dateerforderlich
string <date>

Post-/Erfassungsdatum, YYYY-MM-DD (keine Uhrzeit).

Beispiel: "2026-11-03"
subjecterforderlich
stringmindestens 1 Zeichenhöchstens 1000 Zeichen

Betreff der Korrespondenz. Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
Beispiel: "Fellebbezés a Kúriához"
sender
string | nullhöchstens 1000 Zeichen

Feladó: der Absender (Freitext). Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
to
string | nullhöchstens 1000 Zeichen

Címzett: der Adressat (Freitext). Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
recipient
string | nullhöchstens 1000 Zeichen

Ausgehende Post: der Freitext-Adressat/Empfänger. Nicht zusammen mit recipient_user_id zulässig. Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
recipient_user_id
integer | null>= 1

Eingehende Post: der Kollege, der sie empfangen hat (eine Benutzer-id aus colleagues.list), gespeichert als numerischer recipient. Nicht zusammen mit recipient zulässig.

electronic
boolean

Ob der Posten elektronisch ist (type_of_mail); unabhängig von der Zustellart. Standard false.

Standard: false
delivery_method_id
integer | null>= 1

Id der Zustellart (mail_delivery_methods): z. B. 1 Posta, 4 Cégkapu, 7 Perkapu. 422, wenn unbekannt.

tracking_no
string | nullhöchstens 255 Zeichen

Azonosító: Sendungsnummer. Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
folder_path
string | nullhöchstens 1000 Zeichen
Muster: ^[^<>]*$
idempotency_key
stringhöchstens 128 Zeichen

Dieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$
Beispiel: "b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"

Antworten

201

Erstellt.

dataerforderlich
object
Felder von data
id
integer

Id des Postbuch-Eintrags (mit mail_register.get / .update verwenden).

Beispiel: 4321
matter
object | null

Die Akte, gegen die der Eintrag abgelegt ist.

Felder von matter
id
integer
case_number
string
direction
string

incoming = empfangen, outgoing = gesendet.

Zulässige Werte: "incoming" "outgoing"
date
string <date> | null

Post-/Erfassungsdatum, YYYY-MM-DD (keine Uhrzeit).

subject
string | null
sender
string | null

Feladó: der Absender (Freitext).

to
string | null

Címzett: der Adressat (Freitext).

recipient
string | null

Bei einer eingehenden Post: der Anzeigename des Kollegen, der sie empfangen hat. Bei einer ausgehenden Post: der Freitext-Adressat/Empfänger.

recipient_user_id
integer | null

Nur bei einer eingehenden Post gesetzt, deren Empfänger ein Kollege ist (eine Benutzer-id); null bei einer ausgehenden Post.

electronic
boolean

True, wenn der Posten als elektronisch erfasst wurde (type_of_mail).

delivery_method_id
integer | null

Id der Zustellart (mail_delivery_methods).

delivery_method
string | null

Lokalisierte Bezeichnung der Zustellart (Posta, Cégkapu, Perkapu, ...) oder der elektronische/nicht-elektronische Fallback bei einer Alt-Zeile.

tracking_no
string | null

Azonosító: Sendungsnummer.

folder_path
string | null
recorded_by_user_id
integer | null

Der Kollege, der den Eintrag erfasst hat.

recorded_by
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an mail_register.update als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent den Eintrag über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
created
boolean
Wert: true
200

Idempotentes Replay: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage innerhalb von 120 Sekunden) hat den Datensatz bereits erstellt; er wird erneut zurückgegeben, es wurde nichts Neues erstellt.

dataerforderlich
object
Felder von data
id
integer

Id des Postbuch-Eintrags (mit mail_register.get / .update verwenden).

Beispiel: 4321
matter
object | null

Die Akte, gegen die der Eintrag abgelegt ist.

Felder von matter
id
integer
case_number
string
direction
string

incoming = empfangen, outgoing = gesendet.

Zulässige Werte: "incoming" "outgoing"
date
string <date> | null

Post-/Erfassungsdatum, YYYY-MM-DD (keine Uhrzeit).

subject
string | null
sender
string | null

Feladó: der Absender (Freitext).

to
string | null

Címzett: der Adressat (Freitext).

recipient
string | null

Bei einer eingehenden Post: der Anzeigename des Kollegen, der sie empfangen hat. Bei einer ausgehenden Post: der Freitext-Adressat/Empfänger.

recipient_user_id
integer | null

Nur bei einer eingehenden Post gesetzt, deren Empfänger ein Kollege ist (eine Benutzer-id); null bei einer ausgehenden Post.

electronic
boolean

True, wenn der Posten als elektronisch erfasst wurde (type_of_mail).

delivery_method_id
integer | null

Id der Zustellart (mail_delivery_methods).

delivery_method
string | null

Lokalisierte Bezeichnung der Zustellart (Posta, Cégkapu, Perkapu, ...) oder der elektronische/nicht-elektronische Fallback bei einer Alt-Zeile.

tracking_no
string | null

Azonosító: Sendungsnummer.

folder_path
string | null
recorded_by_user_id
integer | null

Der Kollege, der den Eintrag erfasst hat.

recorded_by
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an mail_register.update als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent den Eintrag über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
created
boolean
Wert: false
idempotent_replay
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar. replay_not_visible: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage) hat den Datensatz bereits erstellt (details.record_id), aber dieser wurde inzwischen gelöscht oder ist für den Benutzer nicht sichtbar; es wurde nichts Neues erstellt, erstellen Sie ihn nicht erneut.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Idempotency-Key wurde für einen anderen Ressourcentyp verwendet (idempotency_key_reused), oder, ohne Schlüssel, eine identische Anfrage wird gerade verarbeitet (duplicate_in_progress; versuchen Sie es in Kürze erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X POST 'https://www.flowyer.de/api/agent/mail-register' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 7f3a9c21-1b2c-4d5e-8f90-0a1b2c3d4e5f' \
  -d '{
  "matter_id": 1234,
  "direction": "incoming",
  "date": "2026-11-03",
  "subject": "Fellebbezés a Kúriához"
}'

Antwortbeispiele

{
  "data": {
    "id": 4321,
    "matter": {
      "id": 1234,
      "case_number": "string"
    },
    "direction": "incoming",
    "date": "2026-10-30",
    "subject": "string",
    "sender": "string",
    "to": "string",
    "recipient": "string",
    "recipient_user_id": 1234,
    "electronic": true,
    "delivery_method_id": 1234,
    "delivery_method": "string",
    "tracking_no": "string",
    "folder_path": "string",
    "recorded_by_user_id": 1234,
    "recorded_by": "string",
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    }
  },
  "created": true
}

Postbuch-Eintrag aktualisieren

PATCH /api/agent/mail-register/{id}

Aktualisiert einen Postbuch-Eintrag (Postakönyv); nur die Felder, die Sie senden, werden geändert. Der Eintrag bleibt auf seiner Akte. Übergeben Sie expected_updated_at aus Ihrem letzten Lesevorgang; eine kollidierende Änderung antwortet mit 409. Antwortet mit 404, wenn der Eintrag nicht sichtbar ist.

Bereich
mail_register:update
Flowyer-Berechtigung
mail:modify

Pfadparameter

iderforderlich
integer>= 1

ID des zu ändernden Datensatzes.

Anfragetext application/json

expected_updated_at
string <date-time> | null

Der Wert updated_at aus Ihrem letzten Lesevorgang dieses Datensatzes (erforderlich, sofern der Datensatz einen hat). Wenn sich der Datensatz seitdem geändert hat (ein Kollege hat ihn bearbeitet), antwortet die API mit 409, und Sie müssen vor einem erneuten Versuch erneut lesen. Ein Altdatensatz, dessen updated_at null ist, nimmt null an.

direction
string | null

incoming = empfangen, outgoing = gesendet.

Zulässige Werte: "incoming" "outgoing"
date
string <date> | null

Post-/Erfassungsdatum, YYYY-MM-DD.

subject
string | nullmindestens 1 Zeichenhöchstens 1000 Zeichen

Betreff. Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
sender
string | nullhöchstens 1000 Zeichen

Feladó: der Absender (Freitext). Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
to
string | nullhöchstens 1000 Zeichen

Címzett: der Adressat (Freitext). Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
recipient
string | nullhöchstens 1000 Zeichen

Ausgehende Post: der Freitext-Adressat. Nicht zusammen mit recipient_user_id zulässig. Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
recipient_user_id
integer | null>= 1

Eingehende Post: der empfangende Kollege (eine Benutzer-id), gespeichert als numerischer recipient. Nicht zusammen mit recipient zulässig.

electronic
boolean | null

Ob der Posten elektronisch ist (type_of_mail).

delivery_method_id
integer | null>= 1

Id der Zustellart (mail_delivery_methods); 422, wenn unbekannt.

tracking_no
string | nullhöchstens 255 Zeichen

Azonosító: Sendungsnummer. Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
folder_path
string | nullhöchstens 1000 Zeichen
Muster: ^[^<>]*$

Antworten

200

Aktualisiert.

dataerforderlich
object
Felder von data
id
integer

Id des Postbuch-Eintrags (mit mail_register.get / .update verwenden).

Beispiel: 4321
matter
object | null

Die Akte, gegen die der Eintrag abgelegt ist.

Felder von matter
id
integer
case_number
string
direction
string

incoming = empfangen, outgoing = gesendet.

Zulässige Werte: "incoming" "outgoing"
date
string <date> | null

Post-/Erfassungsdatum, YYYY-MM-DD (keine Uhrzeit).

subject
string | null
sender
string | null

Feladó: der Absender (Freitext).

to
string | null

Címzett: der Adressat (Freitext).

recipient
string | null

Bei einer eingehenden Post: der Anzeigename des Kollegen, der sie empfangen hat. Bei einer ausgehenden Post: der Freitext-Adressat/Empfänger.

recipient_user_id
integer | null

Nur bei einer eingehenden Post gesetzt, deren Empfänger ein Kollege ist (eine Benutzer-id); null bei einer ausgehenden Post.

electronic
boolean

True, wenn der Posten als elektronisch erfasst wurde (type_of_mail).

delivery_method_id
integer | null

Id der Zustellart (mail_delivery_methods).

delivery_method
string | null

Lokalisierte Bezeichnung der Zustellart (Posta, Cégkapu, Perkapu, ...) oder der elektronische/nicht-elektronische Fallback bei einer Alt-Zeile.

tracking_no
string | null

Azonosító: Sendungsnummer.

folder_path
string | null
recorded_by_user_id
integer | null

Der Kollege, der den Eintrag erfasst hat.

recorded_by
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an mail_register.update als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent den Eintrag über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
updated
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Datensatz hat sich geändert, seit Sie ihn gelesen haben (record_conflict: expected_updated_at stimmt nicht mehr überein; lesen Sie ihn erneut und versuchen Sie es mit dem neuen updated_at erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X PATCH 'https://www.flowyer.de/api/agent/mail-register/1234' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "expected_updated_at": "2026-10-30T09:15:00+01:00",
  "direction": "incoming"
}'

Antwortbeispiele

{
  "data": {
    "id": 4321,
    "matter": {
      "id": 1234,
      "case_number": "string"
    },
    "direction": "incoming",
    "date": "2026-10-30",
    "subject": "string",
    "sender": "string",
    "to": "string",
    "recipient": "string",
    "recipient_user_id": 1234,
    "electronic": true,
    "delivery_method_id": 1234,
    "delivery_method": "string",
    "tracking_no": "string",
    "folder_path": "string",
    "recorded_by_user_id": 1234,
    "recorded_by": "string",
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    }
  },
  "updated": true
}

Kommentare

Fallkommentare auflisten

GET /api/agent/matters/{id}/comments

Listet die Kommentare einer Akte auf, älteste zuerst: id, Autor, Inhalt (Rich-HTML) und die parent_id einer Antwort. Flach, nicht verschachtelt - bauen Sie die eine Ebene tiefen Threads aus parent_id neu auf. Übergeben Sie top_level_only, um Antworten auszuschließen. Antwortet mit 404, wenn die Akte für den Benutzer nicht sichtbar ist.

Bereich
comments:read
Flowyer-Berechtigung
cases:read

Pfadparameter

iderforderlich
integer>= 1

Akten-id (muss sichtbar sein).

Beispiel: 1234

Abfrageparameter

top_level_only
boolean

Nur übergeordnete Kommentare (Antworten ausschließen). Standard false.

Standard: false
limit
integer>= 1<= 100

Seitengröße, 1-100. Standard 25.

Standard: 25
Beispiel: 25
offset
integer>= 0

Anzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.

Standard: 0
Beispiel: 0

Antworten

200

OK.

dataerforderlich
object[]
Felder von data
id
integer
Beispiel: 9876
matter_id
integer

Die Akte (= case_id), zu der der Kommentar gehört.

parent_id
integer | null

Der übergeordnete Kommentar, auf den dieser antwortet; null bei einem übergeordneten Kommentar. Antworten sind eine Ebene tief.

author_user_id
integer | null

Benutzer-ID des Autors (null bei einem Altimport).

author_name
string | null

Anzeigename des Autors oder null.

body
string

Der Kommentar wie gespeichert: Rich-HTML, bereits mit HTMLPurifier bereinigt für über diese API geschriebene Kommentare.

created_at
string <date-time> | null

Wann der Kommentar gepostet wurde, ISO 8601 in der Kanzleizone.

updated_at
string <date-time> | null

Optimistic-Lock-Token: Übergeben Sie es an comments.update als expected_updated_at. Keine Anzeigezeit; null bei einem Altkommentar ohne eines.

edited
boolean

True, wenn der Kommentar seit dem Posten bearbeitet wurde.

paginationerforderlich
object
Felder von pagination
limiterforderlich
integer
offseterforderlich
integer
totalerforderlich
integer

Gesamtanzahl der übereinstimmenden Datensätze.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/matters/1234/comments?limit=25' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": [
    {
      "id": 9876,
      "matter_id": 1234,
      "parent_id": 1234,
      "author_user_id": 1234,
      "author_name": "string",
      "body": "string",
      "created_at": "2026-10-30T09:15:00+01:00",
      "updated_at": "2026-10-30T09:15:00+01:00",
      "edited": true
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 1
  }
}

Fallkommentar posten

POST /api/agent/matters/{id}/comments

Postet einen Kommentar auf einer Akte oder eine Antwort einer Ebene (parent_id = ein ÜBERGEORDNETER Kommentar DERSELBEN Akte). Der Inhalt ist Rich-HTML, serverseitig vor dem Speichern bereinigt. Antwortet mit 404, wenn die Akte nicht sichtbar ist, mit 422, wenn parent_id kein übergeordneter Kommentar der Akte ist.

Bereich
comments:create
Flowyer-Berechtigung
cases:create

Pfadparameter

iderforderlich
integer>= 1

Akten-id (muss sichtbar sein).

Beispiel: 1234

Header-Parameter

Idempotency-Key
stringhöchstens 128 Zeichen

Bei jeder Erstellung empfohlen. Ein eindeutiger Wert pro logischer Operation (z. B. eine UUID). Derselbe Wert gibt denselben Datensatz zurück: Ein erneuter Versuch damit gibt den beim ersten Mal erstellten Datensatz zurück, anstatt einen zweiten zu erstellen. Unterschiedliche Werte erstellen immer unterschiedliche Datensätze. Clients, die keine Header senden können, können denselben Wert im Body-Feld idempotency_key übergeben. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$

Anfragetext application/json

bodyerforderlich
stringmindestens 1 Zeichen

Der Kommentar, Rich-HTML (wie von TinyMCE erzeugt). Serverseitig mit HTMLPurifier bereinigt vor dem Speichern. Höchstens 100000 Zeichen.

Beispiel: "<p>Egyetértek, a határidő tartható.</p>"
parent_id
integer | null>= 1

Antworten Sie auf diesen ÜBERGEORDNETEN Kommentar DERSELBEN Akte (aus comments.list, parent_id = null); weglassen für einen neuen übergeordneten Kommentar.

idempotency_key
stringhöchstens 128 Zeichen

Dieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$
Beispiel: "b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"

Antworten

201

Erstellt.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 9876
matter_id
integer

Die Akte (= case_id), zu der der Kommentar gehört.

parent_id
integer | null

Der übergeordnete Kommentar, auf den dieser antwortet; null bei einem übergeordneten Kommentar. Antworten sind eine Ebene tief.

author_user_id
integer | null

Benutzer-ID des Autors (null bei einem Altimport).

author_name
string | null

Anzeigename des Autors oder null.

body
string

Der Kommentar wie gespeichert: Rich-HTML, bereits mit HTMLPurifier bereinigt für über diese API geschriebene Kommentare.

created_at
string <date-time> | null

Wann der Kommentar gepostet wurde, ISO 8601 in der Kanzleizone.

updated_at
string <date-time> | null

Optimistic-Lock-Token: Übergeben Sie es an comments.update als expected_updated_at. Keine Anzeigezeit; null bei einem Altkommentar ohne eines.

edited
boolean

True, wenn der Kommentar seit dem Posten bearbeitet wurde.

created
boolean
Wert: true
200

Idempotentes Replay: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage innerhalb von 120 Sekunden) hat den Datensatz bereits erstellt; er wird erneut zurückgegeben, es wurde nichts Neues erstellt.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 9876
matter_id
integer

Die Akte (= case_id), zu der der Kommentar gehört.

parent_id
integer | null

Der übergeordnete Kommentar, auf den dieser antwortet; null bei einem übergeordneten Kommentar. Antworten sind eine Ebene tief.

author_user_id
integer | null

Benutzer-ID des Autors (null bei einem Altimport).

author_name
string | null

Anzeigename des Autors oder null.

body
string

Der Kommentar wie gespeichert: Rich-HTML, bereits mit HTMLPurifier bereinigt für über diese API geschriebene Kommentare.

created_at
string <date-time> | null

Wann der Kommentar gepostet wurde, ISO 8601 in der Kanzleizone.

updated_at
string <date-time> | null

Optimistic-Lock-Token: Übergeben Sie es an comments.update als expected_updated_at. Keine Anzeigezeit; null bei einem Altkommentar ohne eines.

edited
boolean

True, wenn der Kommentar seit dem Posten bearbeitet wurde.

created
boolean
Wert: false
idempotent_replay
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar. replay_not_visible: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage) hat den Datensatz bereits erstellt (details.record_id), aber dieser wurde inzwischen gelöscht oder ist für den Benutzer nicht sichtbar; es wurde nichts Neues erstellt, erstellen Sie ihn nicht erneut.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Idempotency-Key wurde für einen anderen Ressourcentyp verwendet (idempotency_key_reused), oder, ohne Schlüssel, eine identische Anfrage wird gerade verarbeitet (duplicate_in_progress; versuchen Sie es in Kürze erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X POST 'https://www.flowyer.de/api/agent/matters/1234/comments' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 7f3a9c21-1b2c-4d5e-8f90-0a1b2c3d4e5f' \
  -d '{
  "body": "<p>Egyetértek, a határidő tartható.</p>"
}'

Antwortbeispiele

{
  "data": {
    "id": 9876,
    "matter_id": 1234,
    "parent_id": 1234,
    "author_user_id": 1234,
    "author_name": "string",
    "body": "string",
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "edited": true
  },
  "created": true
}

Eigenen Fallkommentar bearbeiten

PATCH /api/agent/comments/{id}

Bearbeitet einen Ihrer EIGENEN Kommentare (nur dessen Inhalt; Rich-HTML, serverseitig vor dem Speichern bereinigt). Übergeben Sie expected_updated_at aus Ihrem letzten Lesevorgang; eine kollidierende Änderung antwortet mit 409. Antwortet mit 404 bei einem Kommentar, der nicht Ihnen gehört oder zu einer Akte gehört, die Sie nicht sehen können.

Bereich
comments:update
Flowyer-Berechtigung
cases:modify

Pfadparameter

iderforderlich
integer>= 1

ID des zu ändernden Datensatzes.

Anfragetext application/json

expected_updated_at
string <date-time> | null

Der Wert updated_at aus Ihrem letzten Lesevorgang dieses Datensatzes (erforderlich, sofern der Datensatz einen hat). Wenn sich der Datensatz seitdem geändert hat (ein Kollege hat ihn bearbeitet), antwortet die API mit 409, und Sie müssen vor einem erneuten Versuch erneut lesen. Ein Altdatensatz, dessen updated_at null ist, nimmt null an.

bodyerforderlich
stringmindestens 1 Zeichen

Neuer Kommentarinhalt, Rich-HTML (wie von TinyMCE erzeugt). Serverseitig mit HTMLPurifier bereinigt vor dem Speichern. Höchstens 100000 Zeichen.

Beispiel: "<p>Pontosítás: a határidő november 15.</p>"

Antworten

200

Aktualisiert.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 9876
matter_id
integer

Die Akte (= case_id), zu der der Kommentar gehört.

parent_id
integer | null

Der übergeordnete Kommentar, auf den dieser antwortet; null bei einem übergeordneten Kommentar. Antworten sind eine Ebene tief.

author_user_id
integer | null

Benutzer-ID des Autors (null bei einem Altimport).

author_name
string | null

Anzeigename des Autors oder null.

body
string

Der Kommentar wie gespeichert: Rich-HTML, bereits mit HTMLPurifier bereinigt für über diese API geschriebene Kommentare.

created_at
string <date-time> | null

Wann der Kommentar gepostet wurde, ISO 8601 in der Kanzleizone.

updated_at
string <date-time> | null

Optimistic-Lock-Token: Übergeben Sie es an comments.update als expected_updated_at. Keine Anzeigezeit; null bei einem Altkommentar ohne eines.

edited
boolean

True, wenn der Kommentar seit dem Posten bearbeitet wurde.

updated
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Datensatz hat sich geändert, seit Sie ihn gelesen haben (record_conflict: expected_updated_at stimmt nicht mehr überein; lesen Sie ihn erneut und versuchen Sie es mit dem neuen updated_at erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X PATCH 'https://www.flowyer.de/api/agent/comments/1234' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "expected_updated_at": "2026-10-30T09:15:00+01:00",
  "body": "<p>Pontosítás: a határidő november 15.</p>"
}'

Antwortbeispiele

{
  "data": {
    "id": 9876,
    "matter_id": 1234,
    "parent_id": 1234,
    "author_user_id": 1234,
    "author_name": "string",
    "body": "string",
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "edited": true
  },
  "updated": true
}

Verhandlungen

Verhandlungen einer Akte auflisten

GET /api/agent/matters/{id}/trials

Listet die Gerichtsverhandlungen (tárgyalások) einer Akte auf: Datum, Gericht, Ort, die teilnehmenden Kollegen und den Richter, neueste zuerst. Optional gefiltert nach einem Von-/Bis-Tagesbereich oder nach updated_since. Antwortet mit 404, wenn die Akte für den Benutzer nicht sichtbar ist.

Bereich
trials:read
Flowyer-Berechtigung
trials:read

Pfadparameter

iderforderlich
integer>= 1

Angelegenheits-ID.

Beispiel: 1234

Abfrageparameter

from
string <date>

Nur Verhandlungen an oder nach diesem Tag (YYYY-MM-DD), in der Zeitzone der Kanzlei.

Beispiel: "2026-01-01"
to
string <date>

Nur Verhandlungen an oder vor diesem Tag (YYYY-MM-DD), in der Zeitzone der Kanzlei.

Beispiel: "2026-12-31"
updated_since
string <date-time>

Nur Verhandlungen, die zu dieser ISO-8601-Zeit oder danach geändert wurden.

limit
integer>= 1<= 100

Seitengröße, 1-100. Standard 25.

Standard: 25
Beispiel: 25
offset
integer>= 0

Anzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.

Standard: 0
Beispiel: 0

Antworten

200

OK.

dataerforderlich
object[]
Felder von data
id
integer
Beispiel: 4321
matter
object

Die Akte (Fall), zu der die Verhandlung gehört.

Felder von matter
id
integer
case_number
string
date
string <date-time> | null

Datum und Uhrzeit der Verhandlung, ISO 8601 in der Zeitzone der Kanzlei. Sie wird in UTC gespeichert, vergleichen Sie also Zeitpunkte statt des Wanduhr-Textes.

Beispiel: "2026-03-02T09:00:00+01:00"
participation
string | null

Ob die Teilnahme eines Kollegen erforderlich ist: "required", "not_required" oder null, wenn nicht gesetzt.

Zulässige Werte: "required" "not_required"
court
object | null

Das Gericht der Verhandlung, aufgelöst aus dem gemeinsamen Gerichtsverzeichnis; null, wenn kein Gericht gesetzt ist.

Felder von court
id
integer
name
string
city
string | null
zip
string | null
address
string | null
source
string

Immer "registry": Das Gericht ist eine Referenz auf das gemeinsame Gerichtsverzeichnis (courts.list), kein Freitext.

place
string | null

Raum oder Ort der Verhandlung. Klartext.

name_of_the_judge
string | null

Name des Richters. Klartext.

notes
string | null

Freitextnotizen zur Verhandlung. Klartext.

responsibles
object[]

An der Verhandlung teilnehmende Kollegen (ids aus colleagues.list).

Felder von responsibles
user_id
integer
name
string | null
recorded_by
object | null

Der Kollege, der die Verhandlung erfasst hat.

Felder von recorded_by
user_id
integer
name
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an trials.update als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
paginationerforderlich
object
Felder von pagination
limiterforderlich
integer
offseterforderlich
integer
totalerforderlich
integer

Gesamtanzahl der übereinstimmenden Datensätze.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/matters/1234/trials?from=2026-01-01&to=2026-12-31&limit=25' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": [
    {
      "id": 4321,
      "matter": {
        "id": 1234,
        "case_number": "string"
      },
      "date": "2026-03-02T09:00:00+01:00",
      "participation": "required",
      "court": {
        "id": 1234,
        "name": "string",
        "city": "string",
        "zip": "string",
        "address": "string",
        "source": "string"
      },
      "place": "string",
      "name_of_the_judge": "string",
      "notes": "string",
      "responsibles": [
        {
          "user_id": 1234,
          "name": "string"
        }
      ],
      "recorded_by": {
        "user_id": 1234,
        "name": "string"
      },
      "created_at": "2026-10-30T09:15:00+01:00",
      "updated_at": "2026-10-30T09:15:00+01:00",
      "created_via_api": {
        "kind": "key",
        "key_id": 1234,
        "key_name": "string",
        "user_id": 1234,
        "user": "string",
        "at": "2026-10-30T09:15:00+01:00"
      }
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 1
  }
}

Verhandlung abrufen

GET /api/agent/trials/{id}

Gibt eine Gerichtsverhandlung (tárgyalás) mit ihrer Akte, dem Gericht, den teilnehmenden Kollegen und dem updated_at-Sperrtoken für trials.update zurück. Antwortet mit 404, wenn die Verhandlung nicht existiert oder der Benutzer ihre Akte nicht sehen darf.

Bereich
trials:read
Flowyer-Berechtigung
trials:read

Pfadparameter

iderforderlich
integer>= 1

Verhandlungs-id.

Beispiel: 4321

Antworten

200

OK.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 4321
matter
object

Die Akte (Fall), zu der die Verhandlung gehört.

Felder von matter
id
integer
case_number
string
date
string <date-time> | null

Datum und Uhrzeit der Verhandlung, ISO 8601 in der Zeitzone der Kanzlei. Sie wird in UTC gespeichert, vergleichen Sie also Zeitpunkte statt des Wanduhr-Textes.

Beispiel: "2026-03-02T09:00:00+01:00"
participation
string | null

Ob die Teilnahme eines Kollegen erforderlich ist: "required", "not_required" oder null, wenn nicht gesetzt.

Zulässige Werte: "required" "not_required"
court
object | null

Das Gericht der Verhandlung, aufgelöst aus dem gemeinsamen Gerichtsverzeichnis; null, wenn kein Gericht gesetzt ist.

Felder von court
id
integer
name
string
city
string | null
zip
string | null
address
string | null
source
string

Immer "registry": Das Gericht ist eine Referenz auf das gemeinsame Gerichtsverzeichnis (courts.list), kein Freitext.

place
string | null

Raum oder Ort der Verhandlung. Klartext.

name_of_the_judge
string | null

Name des Richters. Klartext.

notes
string | null

Freitextnotizen zur Verhandlung. Klartext.

responsibles
object[]

An der Verhandlung teilnehmende Kollegen (ids aus colleagues.list).

Felder von responsibles
user_id
integer
name
string | null
recorded_by
object | null

Der Kollege, der die Verhandlung erfasst hat.

Felder von recorded_by
user_id
integer
name
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an trials.update als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/trials/4321' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": {
    "id": 4321,
    "matter": {
      "id": 1234,
      "case_number": "string"
    },
    "date": "2026-03-02T09:00:00+01:00",
    "participation": "required",
    "court": {
      "id": 1234,
      "name": "string",
      "city": "string",
      "zip": "string",
      "address": "string",
      "source": "string"
    },
    "place": "string",
    "name_of_the_judge": "string",
    "notes": "string",
    "responsibles": [
      {
        "user_id": 1234,
        "name": "string"
      }
    ],
    "recorded_by": {
      "user_id": 1234,
      "name": "string"
    },
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    }
  }
}

Verhandlung erfassen

POST /api/agent/matters/{id}/trials

Erfasst eine Gerichtsverhandlung (tárgyalás) auf einer Akte: Uhrzeit, ein optionales Gericht (court_id aus courts.list), den Raum, Richter, Notizen und teilnehmende Kollegen. Die Akte muss sichtbar und nicht archiviert sein; die Teilnehmer werden benachrichtigt. Eine Zeit ohne Offset wird in der Kanzleizone gelesen.

Bereich
trials:create
Flowyer-Berechtigung
trials:create

Pfadparameter

iderforderlich
integer>= 1

Akte, zu der die Verhandlung gehört (muss sichtbar und nicht archiviert sein).

Beispiel: 1234

Header-Parameter

Idempotency-Key
stringhöchstens 128 Zeichen

Bei jeder Erstellung empfohlen. Ein eindeutiger Wert pro logischer Operation (z. B. eine UUID). Derselbe Wert gibt denselben Datensatz zurück: Ein erneuter Versuch damit gibt den beim ersten Mal erstellten Datensatz zurück, anstatt einen zweiten zu erstellen. Unterschiedliche Werte erstellen immer unterschiedliche Datensätze. Clients, die keine Header senden können, können denselben Wert im Body-Feld idempotency_key übergeben. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$

Anfragetext application/json

dateerforderlich
string <date-time>

Datum und Uhrzeit der Verhandlung, ISO 8601. Mit einem Offset wird dieser berücksichtigt; ohne einen wird sie in der Zeitzone der Kanzlei gelesen. In UTC gespeichert.

Beispiel: "2026-03-02T09:00:00+01:00"
court_id
integer | null>= 1

Gericht der Verhandlung: eine id aus courts.list (das gemeinsame Gerichtsverzeichnis). Weglassen, wenn das Gericht nicht bekannt ist.

Beispiel: 42
participation
string | null

Ob die Teilnahme eines Kollegen erforderlich ist. Weglassen, um es ungesetzt zu lassen.

Zulässige Werte: "required" "not_required"
place
string | nullhöchstens 1000 Zeichen

Raum oder Ort der Verhandlung. Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
Beispiel: "II. emelet 205."
name_of_the_judge
string | nullhöchstens 255 Zeichen

Name des Richters. Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
notes
string | nullhöchstens 10000 Zeichen

Freitextnotizen zur Verhandlung. Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
responsible_user_ids
integer[] | null

Benutzer-ids der an der Verhandlung teilnehmenden Kollegen (aus colleagues.list).

idempotency_key
stringhöchstens 128 Zeichen

Dieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$
Beispiel: "b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"

Antworten

201

Erstellt.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 4321
matter
object

Die Akte (Fall), zu der die Verhandlung gehört.

Felder von matter
id
integer
case_number
string
date
string <date-time> | null

Datum und Uhrzeit der Verhandlung, ISO 8601 in der Zeitzone der Kanzlei. Sie wird in UTC gespeichert, vergleichen Sie also Zeitpunkte statt des Wanduhr-Textes.

Beispiel: "2026-03-02T09:00:00+01:00"
participation
string | null

Ob die Teilnahme eines Kollegen erforderlich ist: "required", "not_required" oder null, wenn nicht gesetzt.

Zulässige Werte: "required" "not_required"
court
object | null

Das Gericht der Verhandlung, aufgelöst aus dem gemeinsamen Gerichtsverzeichnis; null, wenn kein Gericht gesetzt ist.

Felder von court
id
integer
name
string
city
string | null
zip
string | null
address
string | null
source
string

Immer "registry": Das Gericht ist eine Referenz auf das gemeinsame Gerichtsverzeichnis (courts.list), kein Freitext.

place
string | null

Raum oder Ort der Verhandlung. Klartext.

name_of_the_judge
string | null

Name des Richters. Klartext.

notes
string | null

Freitextnotizen zur Verhandlung. Klartext.

responsibles
object[]

An der Verhandlung teilnehmende Kollegen (ids aus colleagues.list).

Felder von responsibles
user_id
integer
name
string | null
recorded_by
object | null

Der Kollege, der die Verhandlung erfasst hat.

Felder von recorded_by
user_id
integer
name
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an trials.update als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
created
boolean
Wert: true
200

Idempotentes Replay: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage innerhalb von 120 Sekunden) hat den Datensatz bereits erstellt; er wird erneut zurückgegeben, es wurde nichts Neues erstellt.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 4321
matter
object

Die Akte (Fall), zu der die Verhandlung gehört.

Felder von matter
id
integer
case_number
string
date
string <date-time> | null

Datum und Uhrzeit der Verhandlung, ISO 8601 in der Zeitzone der Kanzlei. Sie wird in UTC gespeichert, vergleichen Sie also Zeitpunkte statt des Wanduhr-Textes.

Beispiel: "2026-03-02T09:00:00+01:00"
participation
string | null

Ob die Teilnahme eines Kollegen erforderlich ist: "required", "not_required" oder null, wenn nicht gesetzt.

Zulässige Werte: "required" "not_required"
court
object | null

Das Gericht der Verhandlung, aufgelöst aus dem gemeinsamen Gerichtsverzeichnis; null, wenn kein Gericht gesetzt ist.

Felder von court
id
integer
name
string
city
string | null
zip
string | null
address
string | null
source
string

Immer "registry": Das Gericht ist eine Referenz auf das gemeinsame Gerichtsverzeichnis (courts.list), kein Freitext.

place
string | null

Raum oder Ort der Verhandlung. Klartext.

name_of_the_judge
string | null

Name des Richters. Klartext.

notes
string | null

Freitextnotizen zur Verhandlung. Klartext.

responsibles
object[]

An der Verhandlung teilnehmende Kollegen (ids aus colleagues.list).

Felder von responsibles
user_id
integer
name
string | null
recorded_by
object | null

Der Kollege, der die Verhandlung erfasst hat.

Felder von recorded_by
user_id
integer
name
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an trials.update als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
created
boolean
Wert: false
idempotent_replay
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar. replay_not_visible: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage) hat den Datensatz bereits erstellt (details.record_id), aber dieser wurde inzwischen gelöscht oder ist für den Benutzer nicht sichtbar; es wurde nichts Neues erstellt, erstellen Sie ihn nicht erneut.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Idempotency-Key wurde für einen anderen Ressourcentyp verwendet (idempotency_key_reused), oder, ohne Schlüssel, eine identische Anfrage wird gerade verarbeitet (duplicate_in_progress; versuchen Sie es in Kürze erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X POST 'https://www.flowyer.de/api/agent/matters/1234/trials' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 7f3a9c21-1b2c-4d5e-8f90-0a1b2c3d4e5f' \
  -d '{
  "date": "2026-03-02T09:00:00+01:00",
  "court_id": 42,
  "place": "II. emelet 205."
}'

Antwortbeispiele

{
  "data": {
    "id": 4321,
    "matter": {
      "id": 1234,
      "case_number": "string"
    },
    "date": "2026-03-02T09:00:00+01:00",
    "participation": "required",
    "court": {
      "id": 1234,
      "name": "string",
      "city": "string",
      "zip": "string",
      "address": "string",
      "source": "string"
    },
    "place": "string",
    "name_of_the_judge": "string",
    "notes": "string",
    "responsibles": [
      {
        "user_id": 1234,
        "name": "string"
      }
    ],
    "recorded_by": {
      "user_id": 1234,
      "name": "string"
    },
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    }
  },
  "created": true
}

Verhandlung aktualisieren

PATCH /api/agent/trials/{id}

Aktualisiert eine Gerichtsverhandlung (tárgyalás): ihre Uhrzeit, das Gericht, den Ort, Richter, Notizen, das Teilnahme-Flag und die Teilnehmer. Schreibt nur die Felder, die Sie senden; senden Sie responsible_user_ids, um die gesamte Teilnehmerliste zu ersetzen. Übergeben Sie expected_updated_at aus Ihrem letzten Lesevorgang; eine kollidierende Änderung antwortet mit 409.

Bereich
trials:update
Flowyer-Berechtigung
trials:modify

Pfadparameter

iderforderlich
integer>= 1

ID des zu ändernden Datensatzes.

Anfragetext application/json

expected_updated_at
string <date-time> | null

Der Wert updated_at aus Ihrem letzten Lesevorgang dieses Datensatzes (erforderlich, sofern der Datensatz einen hat). Wenn sich der Datensatz seitdem geändert hat (ein Kollege hat ihn bearbeitet), antwortet die API mit 409, und Sie müssen vor einem erneuten Versuch erneut lesen. Ein Altdatensatz, dessen updated_at null ist, nimmt null an.

date
string <date-time>

Neues Datum und neue Uhrzeit der Verhandlung, ISO 8601 (ein Offset wird berücksichtigt, eine zeitzonenlose Zeit wird in der Kanzleizone gelesen). In UTC gespeichert.

Beispiel: "2026-03-02T09:00:00+01:00"
court_id
integer | null>= 1

Neue Gerichts-id aus courts.list; null, um das Gericht zu löschen.

participation
string | null

Ob die Teilnahme eines Kollegen erforderlich ist; null, um es zu löschen.

Zulässige Werte: "required" "not_required"
place
string | nullhöchstens 1000 Zeichen

Raum oder Ort. Klartext; "<" und ">" sind nicht zulässig. "" löscht ihn.

Muster: ^[^<>]*$
name_of_the_judge
string | nullhöchstens 255 Zeichen

Name des Richters. Klartext; "<" und ">" sind nicht zulässig. "" löscht ihn.

Muster: ^[^<>]*$
notes
string | nullhöchstens 10000 Zeichen

Freitextnotizen. Klartext; "<" und ">" sind nicht zulässig. "" löscht sie.

Muster: ^[^<>]*$
responsible_user_ids
integer[] | null

Vollständiger Ersatzsatz von Teilnehmer-Benutzer-ids (aus colleagues.list). Weglassen, um die Teilnehmer unverändert zu lassen.

Antworten

200

Aktualisiert.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 4321
matter
object

Die Akte (Fall), zu der die Verhandlung gehört.

Felder von matter
id
integer
case_number
string
date
string <date-time> | null

Datum und Uhrzeit der Verhandlung, ISO 8601 in der Zeitzone der Kanzlei. Sie wird in UTC gespeichert, vergleichen Sie also Zeitpunkte statt des Wanduhr-Textes.

Beispiel: "2026-03-02T09:00:00+01:00"
participation
string | null

Ob die Teilnahme eines Kollegen erforderlich ist: "required", "not_required" oder null, wenn nicht gesetzt.

Zulässige Werte: "required" "not_required"
court
object | null

Das Gericht der Verhandlung, aufgelöst aus dem gemeinsamen Gerichtsverzeichnis; null, wenn kein Gericht gesetzt ist.

Felder von court
id
integer
name
string
city
string | null
zip
string | null
address
string | null
source
string

Immer "registry": Das Gericht ist eine Referenz auf das gemeinsame Gerichtsverzeichnis (courts.list), kein Freitext.

place
string | null

Raum oder Ort der Verhandlung. Klartext.

name_of_the_judge
string | null

Name des Richters. Klartext.

notes
string | null

Freitextnotizen zur Verhandlung. Klartext.

responsibles
object[]

An der Verhandlung teilnehmende Kollegen (ids aus colleagues.list).

Felder von responsibles
user_id
integer
name
string | null
recorded_by
object | null

Der Kollege, der die Verhandlung erfasst hat.

Felder von recorded_by
user_id
integer
name
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an trials.update als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
updated
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Datensatz hat sich geändert, seit Sie ihn gelesen haben (record_conflict: expected_updated_at stimmt nicht mehr überein; lesen Sie ihn erneut und versuchen Sie es mit dem neuen updated_at erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X PATCH 'https://www.flowyer.de/api/agent/trials/1234' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "expected_updated_at": "2026-10-30T09:15:00+01:00",
  "date": "2026-03-02T09:00:00+01:00"
}'

Antwortbeispiele

{
  "data": {
    "id": 4321,
    "matter": {
      "id": 1234,
      "case_number": "string"
    },
    "date": "2026-03-02T09:00:00+01:00",
    "participation": "required",
    "court": {
      "id": 1234,
      "name": "string",
      "city": "string",
      "zip": "string",
      "address": "string",
      "source": "string"
    },
    "place": "string",
    "name_of_the_judge": "string",
    "notes": "string",
    "responsibles": [
      {
        "user_id": 1234,
        "name": "string"
      }
    ],
    "recorded_by": {
      "user_id": 1234,
      "name": "string"
    },
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    }
  },
  "updated": true
}

Gerichte

Gerichte auflisten

GET /api/agent/courts

Listet das gemeinsame Gerichtsverzeichnis (id, name, city) für die court_id von trials.create / trials.update auf. Mit q (ein Gerichtsname wie gehört; Akzente, Groß-/Kleinschreibung und kleine Tippfehler werden toleriert) antwortet die Funktion mit dem Status exact/similar/none: Nur "exact" kann direkt gefahrlos verwendet werden. Es ist das ungarische Gerichtsverzeichnis.

Bereich
courts:read

Abfrageparameter

q
stringhöchstens 255 Zeichen

Ein nachzuschlagender Gerichtsname, wie gehört oder diktiert, in beliebiger Wortreihenfolge. Lassen Sie ihn weg, um jedes Gericht aufzulisten.

Beispiel: "Fővárosi Törvényszék"
limit
integer>= 1<= 500

Maximale Anzahl zurückzugebender Gerichte (Standard 200).

Standard: 200

Antworten

200

OK.

dataerforderlich
object
Felder von data
status
string | null

Nur mit q: exact = ein sicherer Treffer (seine id kann gefahrlos verwendet werden), similar = ungefähre oder mehrere Treffer (bestätigen Sie zuerst beim Benutzer), none = kein Treffer (fragen Sie den Benutzer). null ohne q.

Zulässige Werte: "exact" "similar" "none"
courts
object[]

Gerichte, mit q bester Treffer zuerst, andernfalls nach Namen.

Felder von courts
id
integer

Gerichts-id: Übergeben Sie sie als court_id an trials.create / trials.update.

name
string

Gerichtsname, wie er in Flowyer angezeigt wird.

city
string | null
zip
string | null
address
string | null
total
integer

Wie viele Gerichte übereinstimmten (ohne q alle Gerichte), bevor die Liste auf limit gekürzt wurde.

truncated
boolean

True, wenn mehr Gerichte übereinstimmten als zurückgegeben wurden: grenzen Sie q ein oder erhöhen Sie limit.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/courts?q=F%C5%91v%C3%A1rosi%20T%C3%B6rv%C3%A9nysz%C3%A9k' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": {
    "status": "exact",
    "courts": [
      {
        "id": 1234,
        "name": "string",
        "city": "string",
        "zip": "string",
        "address": "string"
      }
    ],
    "total": 1,
    "truncated": true
  }
}

HR

Mitarbeiterabwesenheiten auflisten

GET /api/agent/hr/leaves

Listet genehmigte Mitarbeiterabwesenheiten auf (wer abwesend ist oder sein wird): den Kollegen, Start-/Enddaten, die Anzahl der Arbeitstage, eine datenschutzbedingt geschwärzte Kategorie (leave/unpaid; Krankheit wird in leave zusammengeführt und ist nie identifizierbar) und etwaige Vertretungen. Gibt nie die Abwesenheitsart, Notizen oder den Genehmigenden zurück.

Bereich
hr:read
Flowyer-Berechtigung
hr-admin:read

Abfrageparameter

user_id
integer>= 1

Nur die Abwesenheiten dieses Kollegen. Eine zentrale Benutzer-id (aus colleagues.list), dem Mitarbeiter hinter der Abwesenheit zugeordnet.

Beispiel: 1234
on_date
string <date>

Wer an genau diesem Tag abwesend ist (start_date <= on_date <= end_date). Wenn gesetzt, übersteuert es date_from, date_to und timeframe.

date_from
string <date>

Nur Abwesenheiten, die an oder nach diesem Datum noch laufen (end_date >= date_from). Standardmäßig heute, sodass vollständig vergangene Abwesenheiten standardmäßig ausgeschlossen sind.

date_to
string <date>

Nur Abwesenheiten, die an oder vor diesem Datum beginnen (start_date <= date_to). Weglassen für eine offene Zukunft.

timeframe
string

Zusätzliche Startdatum-Einschränkung gegenüber heute: current = bereits begonnen (laufend), upcoming = noch nicht begonnen, all = keine zusätzliche. Ignoriert, wenn on_date gesetzt ist.

Zulässige Werte: "current" "upcoming" "all"
Standard: "all"
limit
integer>= 1<= 100

Seitengröße, 1-100. Standard 25.

Standard: 25
Beispiel: 25
offset
integer>= 0

Anzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.

Standard: 0
Beispiel: 0

Antworten

200

OK.

dataerforderlich
object[]
Felder von data
id
integer

Id des Abwesenheitsantrags (nur eine Kennung; nicht sensibel).

user_id
integer

Der abwesende Kollege (zentrale Benutzer-id).

user
string | null

Anzeigename des Kollegen.

start_date
string <date>

Erster Tag der Abwesenheit (YYYY-MM-DD).

end_date
string <date>

Letzter Tag der Abwesenheit, inklusiv (YYYY-MM-DD).

days_count
number | null

Arbeitstage der Abwesenheit. Verrät die Art nicht.

category
string

Datenschutzbedingt geschwärzte Abwesenheitsart: Jahresurlaub und Krankheit werden beide zu "leave" (Krankheit ist nie identifizierbar), unpaid bleibt "unpaid". Die rohe Abwesenheitsart wird nie offengelegt.

Zulässige Werte: "leave" "unpaid"
status
string

Immer "approved" - nur genehmigte Abwesenheiten werden zurückgegeben; pending, rejected und cancelled erscheinen nie.

Zulässige Werte: "approved"
substitute_user_id
integer | null

Vertretender Kollege für diese Abwesenheit (zentrale Benutzer-id) oder null.

substitute_user
string | null

Anzeigename des vertretenden Kollegen oder null.

paginationerforderlich
object
Felder von pagination
limiterforderlich
integer
offseterforderlich
integer
totalerforderlich
integer

Gesamtanzahl der übereinstimmenden Datensätze.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/hr/leaves?user_id=1234&limit=25' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": [
    {
      "id": 1234,
      "user_id": 1234,
      "user": "string",
      "start_date": "2026-10-30",
      "end_date": "2026-10-30",
      "days_count": 0,
      "category": "leave",
      "status": "approved",
      "substitute_user_id": 1234,
      "substitute_user": "string"
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 1
  }
}

Kalender

Kalendereinträge auflisten

GET /api/agent/calendar/events

Listet Kalendereinträge auf, die einen Datumsbereich [from, to] überschneiden: den Kanzleikalender, Ihren eigenen und mit Ihnen geteilte Kalender. Wiederkehrende Einträge werden einmal zurückgegeben (is_recurring), NICHT expandiert. Sortiert nach Beginn. Ein persönlicher Eintrag, der nicht mit Ihnen geteilt ist, erscheint nie.

Bereich
calendar:read
Flowyer-Berechtigung
calendar-office:read

Abfrageparameter

fromerforderlich
string <date-time>

Bereichsbeginn (einschließlich), ISO 8601. Einträge, die [from, to] überschneiden, werden zurückgegeben. Eine Zeit ohne Offset wird in der Kanzleizone gelesen.

Beispiel: "2026-03-01T00:00:00+01:00"
toerforderlich
string <date-time>

Bereichsende (einschließlich), ISO 8601. Muss an oder nach from liegen (andernfalls 422) und höchstens 366 Tage danach.

Beispiel: "2026-03-31T23:59:59+01:00"
calendar_ids
integer[]

Auf diese Container-Kalender-IDs eingrenzen; jede wird mit den Kalendern geschnitten, die Sie einsehen dürfen, sodass eine id, die Sie nicht sehen können, stillschweigend verworfen wird. Weglassen für jeden sichtbaren Kalender.

include_recurring
boolean

Wiederkehrende Master-Einträge einbeziehen, deren Regel den Bereich überschneidet (unexpandiert zurückgegeben, is_recurring = true). Standard true.

Standard: true
limit
integer>= 1<= 100

Seitengröße, 1-100. Standard 25.

Standard: 25
Beispiel: 25
offset
integer>= 0

Anzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.

Standard: 0
Beispiel: 0

Antworten

200

OK.

dataerforderlich
object[]
Felder von data
id
integer
Beispiel: 5501
calendar
object

Der Kalender, zu dem der Eintrag gehört.

Felder von calendar
id
integer | null

Container-Kalender-id oder null für den impliziten gemeinsamen Kanzleikalender (ein Alt-Eintrag ohne Container).

name
string | null
type
string

"office" = der gemeinsame Kanzleikalender (jeder Kanzleibenutzer darf ihn einsehen und bearbeiten); "personal" = der eigene Kalender eines Benutzers, nur für seinen Eigentümer und diejenigen sichtbar, mit denen er geteilt ist.

Zulässige Werte: "office" "personal"
owner
object | null

Eigentümer eines persönlichen Kalenders; null beim Kanzleikalender.

Felder von owner
user_id
integer
name
string | null
title
string | null

Titel des Eintrags. Klartext.

description
string | null

Beschreibung des Eintrags. Klartext.

location
string | null

Ort. Klartext.

participants
string | null

Teilnehmer, Freitext. Klartext.

start
string | null

Ein ganztägiger Eintrag: das Startdatum "YYYY-MM-DD". Ein zeitgebundener Eintrag: ISO 8601 in der Zeitzone der Kanzlei (der gespeicherte UTC-Zeitpunkt).

Beispiel: "2026-03-02T09:00:00+01:00"
end
string | null

Gleiche Kodierung wie start. Bei einem ganztägigen Eintrag ist das Enddatum INKLUSIV (der gespeicherte Wert, nicht der +1-Tag-Wert, den ein Kalenderraster verwendet). Null, wenn der Eintrag kein Ende hat.

all_day
boolean

True bei einem ganztägigen Eintrag (start/end sind reine Daten); false bei einem zeitgebundenen Eintrag (start/end sind ISO-8601-Zeitpunkte).

color
string | null

Anzeigefarbe, z. B. "#2c7be5".

is_recurring
boolean

True, wenn der Eintrag ein wiederkehrender Master ist. Wiederkehrende Einträge werden einmal zurückgegeben, NICHT in Vorkommen expandiert, und können nicht über calendar.events.update geändert werden.

recurrence
object | null

Die Wiederholungsregel eines wiederkehrenden Masters oder null bei einem einzelnen Eintrag. Schreibgeschützt.

Felder von recurrence
freq
string | null

daily | weekly | monthly | yearly.

interval
integer | null
byweekday
string | null

Durch Komma getrennte Wochentagscodes (z. B. "MO,WE,FR").

until
string | null
count
integer | null
created_by
object | null

Der Kollege, der den Eintrag erstellt hat.

Felder von created_by
user_id
integer
name
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an calendar.events.update als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
paginationerforderlich
object
Felder von pagination
limiterforderlich
integer
offseterforderlich
integer
totalerforderlich
integer

Gesamtanzahl der übereinstimmenden Datensätze.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/calendar/events?from=2026-03-01T00%3A00%3A00%2B01%3A00&to=2026-03-31T23%3A59%3A59%2B01%3A00&limit=25' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": [
    {
      "id": 5501,
      "calendar": {
        "id": 1234,
        "name": "string",
        "type": "office",
        "owner": {
          "user_id": 1234,
          "name": "string"
        }
      },
      "title": "string",
      "description": "string",
      "location": "string",
      "participants": "string",
      "start": "2026-03-02T09:00:00+01:00",
      "end": "string",
      "all_day": true,
      "color": "string",
      "is_recurring": true,
      "recurrence": {
        "freq": "string",
        "interval": 0,
        "byweekday": "string",
        "until": "string",
        "count": 0
      },
      "created_by": {
        "user_id": 1234,
        "name": "string"
      },
      "created_at": "2026-10-30T09:15:00+01:00",
      "updated_at": "2026-10-30T09:15:00+01:00",
      "created_via_api": {
        "kind": "key",
        "key_id": 1234,
        "key_name": "string",
        "user_id": 1234,
        "user": "string",
        "at": "2026-10-30T09:15:00+01:00"
      }
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 1
  }
}

Kalendereintrag abrufen

GET /api/agent/calendar/events/{id}

Gibt einen Kalendereintrag mit seinem Kalender, einer Wiederholungszusammenfassung und dem updated_at-Sperrtoken für calendar.events.update zurück. Antwortet mit 404, wenn der Eintrag nicht existiert oder sein Kalender für den Benutzer nicht sichtbar ist.

Bereich
calendar:read
Flowyer-Berechtigung
calendar-office:read

Pfadparameter

iderforderlich
integer>= 1

Eintrags-ID.

Beispiel: 5501

Antworten

200

OK.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 5501
calendar
object

Der Kalender, zu dem der Eintrag gehört.

Felder von calendar
id
integer | null

Container-Kalender-id oder null für den impliziten gemeinsamen Kanzleikalender (ein Alt-Eintrag ohne Container).

name
string | null
type
string

"office" = der gemeinsame Kanzleikalender (jeder Kanzleibenutzer darf ihn einsehen und bearbeiten); "personal" = der eigene Kalender eines Benutzers, nur für seinen Eigentümer und diejenigen sichtbar, mit denen er geteilt ist.

Zulässige Werte: "office" "personal"
owner
object | null

Eigentümer eines persönlichen Kalenders; null beim Kanzleikalender.

Felder von owner
user_id
integer
name
string | null
title
string | null

Titel des Eintrags. Klartext.

description
string | null

Beschreibung des Eintrags. Klartext.

location
string | null

Ort. Klartext.

participants
string | null

Teilnehmer, Freitext. Klartext.

start
string | null

Ein ganztägiger Eintrag: das Startdatum "YYYY-MM-DD". Ein zeitgebundener Eintrag: ISO 8601 in der Zeitzone der Kanzlei (der gespeicherte UTC-Zeitpunkt).

Beispiel: "2026-03-02T09:00:00+01:00"
end
string | null

Gleiche Kodierung wie start. Bei einem ganztägigen Eintrag ist das Enddatum INKLUSIV (der gespeicherte Wert, nicht der +1-Tag-Wert, den ein Kalenderraster verwendet). Null, wenn der Eintrag kein Ende hat.

all_day
boolean

True bei einem ganztägigen Eintrag (start/end sind reine Daten); false bei einem zeitgebundenen Eintrag (start/end sind ISO-8601-Zeitpunkte).

color
string | null

Anzeigefarbe, z. B. "#2c7be5".

is_recurring
boolean

True, wenn der Eintrag ein wiederkehrender Master ist. Wiederkehrende Einträge werden einmal zurückgegeben, NICHT in Vorkommen expandiert, und können nicht über calendar.events.update geändert werden.

recurrence
object | null

Die Wiederholungsregel eines wiederkehrenden Masters oder null bei einem einzelnen Eintrag. Schreibgeschützt.

Felder von recurrence
freq
string | null

daily | weekly | monthly | yearly.

interval
integer | null
byweekday
string | null

Durch Komma getrennte Wochentagscodes (z. B. "MO,WE,FR").

until
string | null
count
integer | null
created_by
object | null

Der Kollege, der den Eintrag erstellt hat.

Felder von created_by
user_id
integer
name
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an calendar.events.update als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/calendar/events/5501' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": {
    "id": 5501,
    "calendar": {
      "id": 1234,
      "name": "string",
      "type": "office",
      "owner": {
        "user_id": 1234,
        "name": "string"
      }
    },
    "title": "string",
    "description": "string",
    "location": "string",
    "participants": "string",
    "start": "2026-03-02T09:00:00+01:00",
    "end": "string",
    "all_day": true,
    "color": "string",
    "is_recurring": true,
    "recurrence": {
      "freq": "string",
      "interval": 0,
      "byweekday": "string",
      "until": "string",
      "count": 0
    },
    "created_by": {
      "user_id": 1234,
      "name": "string"
    },
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    }
  }
}

Kalendereintrag anlegen

POST /api/agent/calendar/events

Erstellt einen einzelnen Kalendereintrag (zeitgebunden oder ganztägig) im Kanzleikalender oder in einem Kalender, den Sie bearbeiten dürfen. Ein zeitgebundener start/end berücksichtigt einen ISO-8601-Offset, eine zeitzonenlose Zeit wird in der Kanzleizone gelesen; ein ganztägiges Enddatum ist inklusiv. Wiederkehrende Einträge werden hier nicht erstellt. Wird nicht an externe Kalender übertragen.

Bereich
calendar:create
Flowyer-Berechtigung
calendar-office:create

Header-Parameter

Idempotency-Key
stringhöchstens 128 Zeichen

Bei jeder Erstellung empfohlen. Ein eindeutiger Wert pro logischer Operation (z. B. eine UUID). Derselbe Wert gibt denselben Datensatz zurück: Ein erneuter Versuch damit gibt den beim ersten Mal erstellten Datensatz zurück, anstatt einen zweiten zu erstellen. Unterschiedliche Werte erstellen immer unterschiedliche Datensätze. Clients, die keine Header senden können, können denselben Wert im Body-Feld idempotency_key übergeben. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$

Anfragetext application/json

titleerforderlich
stringmindestens 1 Zeichenhöchstens 255 Zeichen

Titel des Eintrags. Klartext; "<" und ">" sind nicht zulässig (er fließt unmaskiert in die Erinnerungsbenachrichtigung).

Muster: ^[^<>]*$
Beispiel: "Ügyfél egyeztetés"
starterforderlich
string

Ganztägig (all_day true): ein Datum "YYYY-MM-DD". Zeitgebunden (all_day false): ISO 8601; ein Offset wird berücksichtigt, eine zeitzonenlose Zeit wird in der Kanzleizone gelesen.

Beispiel: "2026-03-02T09:00:00+01:00"
end
string | null

Gleiche Kodierung wie start. Standard = start. Bei einem ganztägigen Eintrag ist das Enddatum INKLUSIV. Darf nicht vor start liegen (andernfalls 422).

all_day
boolean

Ob der Eintrag ganztägig ist. Standard false (zeitgebunden).

Standard: false
calendar_id
integer | null>= 1

Ziel-Container-Kalender; Standard = der Kanzleikalender. Sie müssen Bearbeitungsrechte daran halten (andernfalls 403). Nur bei einem Tenant mit der Funktion für persönliche Kalender.

location
string | nullhöchstens 1000 Zeichen

Ort. Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
description
string | nullhöchstens 10000 Zeichen

Beschreibung, Klartext (kein HTML); "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
participants
string | nullhöchstens 1000 Zeichen

Teilnehmer, Freitext. Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
color
string | nullhöchstens 32 Zeichen

Anzeigefarbe, z. B. "#2c7be5".

Muster: ^#?[A-Za-z0-9_-]{1,31}$
idempotency_key
stringhöchstens 128 Zeichen

Dieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$
Beispiel: "b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"

Antworten

201

Erstellt.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 5501
calendar
object

Der Kalender, zu dem der Eintrag gehört.

Felder von calendar
id
integer | null

Container-Kalender-id oder null für den impliziten gemeinsamen Kanzleikalender (ein Alt-Eintrag ohne Container).

name
string | null
type
string

"office" = der gemeinsame Kanzleikalender (jeder Kanzleibenutzer darf ihn einsehen und bearbeiten); "personal" = der eigene Kalender eines Benutzers, nur für seinen Eigentümer und diejenigen sichtbar, mit denen er geteilt ist.

Zulässige Werte: "office" "personal"
owner
object | null

Eigentümer eines persönlichen Kalenders; null beim Kanzleikalender.

Felder von owner
user_id
integer
name
string | null
title
string | null

Titel des Eintrags. Klartext.

description
string | null

Beschreibung des Eintrags. Klartext.

location
string | null

Ort. Klartext.

participants
string | null

Teilnehmer, Freitext. Klartext.

start
string | null

Ein ganztägiger Eintrag: das Startdatum "YYYY-MM-DD". Ein zeitgebundener Eintrag: ISO 8601 in der Zeitzone der Kanzlei (der gespeicherte UTC-Zeitpunkt).

Beispiel: "2026-03-02T09:00:00+01:00"
end
string | null

Gleiche Kodierung wie start. Bei einem ganztägigen Eintrag ist das Enddatum INKLUSIV (der gespeicherte Wert, nicht der +1-Tag-Wert, den ein Kalenderraster verwendet). Null, wenn der Eintrag kein Ende hat.

all_day
boolean

True bei einem ganztägigen Eintrag (start/end sind reine Daten); false bei einem zeitgebundenen Eintrag (start/end sind ISO-8601-Zeitpunkte).

color
string | null

Anzeigefarbe, z. B. "#2c7be5".

is_recurring
boolean

True, wenn der Eintrag ein wiederkehrender Master ist. Wiederkehrende Einträge werden einmal zurückgegeben, NICHT in Vorkommen expandiert, und können nicht über calendar.events.update geändert werden.

recurrence
object | null

Die Wiederholungsregel eines wiederkehrenden Masters oder null bei einem einzelnen Eintrag. Schreibgeschützt.

Felder von recurrence
freq
string | null

daily | weekly | monthly | yearly.

interval
integer | null
byweekday
string | null

Durch Komma getrennte Wochentagscodes (z. B. "MO,WE,FR").

until
string | null
count
integer | null
created_by
object | null

Der Kollege, der den Eintrag erstellt hat.

Felder von created_by
user_id
integer
name
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an calendar.events.update als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
created
boolean
Wert: true
200

Idempotentes Replay: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage innerhalb von 120 Sekunden) hat den Datensatz bereits erstellt; er wird erneut zurückgegeben, es wurde nichts Neues erstellt.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 5501
calendar
object

Der Kalender, zu dem der Eintrag gehört.

Felder von calendar
id
integer | null

Container-Kalender-id oder null für den impliziten gemeinsamen Kanzleikalender (ein Alt-Eintrag ohne Container).

name
string | null
type
string

"office" = der gemeinsame Kanzleikalender (jeder Kanzleibenutzer darf ihn einsehen und bearbeiten); "personal" = der eigene Kalender eines Benutzers, nur für seinen Eigentümer und diejenigen sichtbar, mit denen er geteilt ist.

Zulässige Werte: "office" "personal"
owner
object | null

Eigentümer eines persönlichen Kalenders; null beim Kanzleikalender.

Felder von owner
user_id
integer
name
string | null
title
string | null

Titel des Eintrags. Klartext.

description
string | null

Beschreibung des Eintrags. Klartext.

location
string | null

Ort. Klartext.

participants
string | null

Teilnehmer, Freitext. Klartext.

start
string | null

Ein ganztägiger Eintrag: das Startdatum "YYYY-MM-DD". Ein zeitgebundener Eintrag: ISO 8601 in der Zeitzone der Kanzlei (der gespeicherte UTC-Zeitpunkt).

Beispiel: "2026-03-02T09:00:00+01:00"
end
string | null

Gleiche Kodierung wie start. Bei einem ganztägigen Eintrag ist das Enddatum INKLUSIV (der gespeicherte Wert, nicht der +1-Tag-Wert, den ein Kalenderraster verwendet). Null, wenn der Eintrag kein Ende hat.

all_day
boolean

True bei einem ganztägigen Eintrag (start/end sind reine Daten); false bei einem zeitgebundenen Eintrag (start/end sind ISO-8601-Zeitpunkte).

color
string | null

Anzeigefarbe, z. B. "#2c7be5".

is_recurring
boolean

True, wenn der Eintrag ein wiederkehrender Master ist. Wiederkehrende Einträge werden einmal zurückgegeben, NICHT in Vorkommen expandiert, und können nicht über calendar.events.update geändert werden.

recurrence
object | null

Die Wiederholungsregel eines wiederkehrenden Masters oder null bei einem einzelnen Eintrag. Schreibgeschützt.

Felder von recurrence
freq
string | null

daily | weekly | monthly | yearly.

interval
integer | null
byweekday
string | null

Durch Komma getrennte Wochentagscodes (z. B. "MO,WE,FR").

until
string | null
count
integer | null
created_by
object | null

Der Kollege, der den Eintrag erstellt hat.

Felder von created_by
user_id
integer
name
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an calendar.events.update als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
created
boolean
Wert: false
idempotent_replay
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar. replay_not_visible: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage) hat den Datensatz bereits erstellt (details.record_id), aber dieser wurde inzwischen gelöscht oder ist für den Benutzer nicht sichtbar; es wurde nichts Neues erstellt, erstellen Sie ihn nicht erneut.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Idempotency-Key wurde für einen anderen Ressourcentyp verwendet (idempotency_key_reused), oder, ohne Schlüssel, eine identische Anfrage wird gerade verarbeitet (duplicate_in_progress; versuchen Sie es in Kürze erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X POST 'https://www.flowyer.de/api/agent/calendar/events' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 7f3a9c21-1b2c-4d5e-8f90-0a1b2c3d4e5f' \
  -d '{
  "title": "Ügyfél egyeztetés",
  "start": "2026-03-02T09:00:00+01:00"
}'

Antwortbeispiele

{
  "data": {
    "id": 5501,
    "calendar": {
      "id": 1234,
      "name": "string",
      "type": "office",
      "owner": {
        "user_id": 1234,
        "name": "string"
      }
    },
    "title": "string",
    "description": "string",
    "location": "string",
    "participants": "string",
    "start": "2026-03-02T09:00:00+01:00",
    "end": "string",
    "all_day": true,
    "color": "string",
    "is_recurring": true,
    "recurrence": {
      "freq": "string",
      "interval": 0,
      "byweekday": "string",
      "until": "string",
      "count": 0
    },
    "created_by": {
      "user_id": 1234,
      "name": "string"
    },
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    }
  },
  "created": true
}

Kalendereintrag aktualisieren

PATCH /api/agent/calendar/events/{id}

Aktualisiert einen einzelnen Kalendereintrag: Titel, start/end, all_day, Ort, Beschreibung, Teilnehmer, Farbe. Schreibt nur die Felder, die Sie senden; "" löscht Ort/Beschreibung/Teilnehmer. Ein wiederkehrender Eintrag antwortet mit 422. Übergeben Sie expected_updated_at aus Ihrem letzten Lesevorgang; eine kollidierende Änderung antwortet mit 409.

Bereich
calendar:update
Flowyer-Berechtigung
calendar-office:modify

Pfadparameter

iderforderlich
integer>= 1

ID des zu ändernden Datensatzes.

Anfragetext application/json

expected_updated_at
string <date-time> | null

Der Wert updated_at aus Ihrem letzten Lesevorgang dieses Datensatzes (erforderlich, sofern der Datensatz einen hat). Wenn sich der Datensatz seitdem geändert hat (ein Kollege hat ihn bearbeitet), antwortet die API mit 409, und Sie müssen vor einem erneuten Versuch erneut lesen. Ein Altdatensatz, dessen updated_at null ist, nimmt null an.

title
stringmindestens 1 Zeichenhöchstens 255 Zeichen

Neuer Titel. Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
start
string

Neuer Beginn. Ganztägig: "YYYY-MM-DD". Zeitgebunden: ISO 8601 (ein Offset wird berücksichtigt, eine zeitzonenlose Zeit wird in der Kanzleizone gelesen). Wird neu kodiert, wenn sich all_day ändert.

end
string | null

Neues Ende, gleiche Kodierung wie start; "" löscht es. Bei einem ganztägigen Eintrag ist das Enddatum inklusiv. Darf nicht vor start liegen (andernfalls 422).

all_day
boolean

Wenn gesendet, werden start/end entsprechend neu kodiert; wenn weggelassen, wird das aktuelle all_day der Zeile verwendet.

location
string | nullhöchstens 1000 Zeichen

Ort. Klartext; "<" und ">" sind nicht zulässig. "" löscht ihn.

Muster: ^[^<>]*$
description
string | nullhöchstens 10000 Zeichen

Beschreibung, Klartext (kein HTML); "<" und ">" sind nicht zulässig. "" löscht sie.

Muster: ^[^<>]*$
participants
string | nullhöchstens 1000 Zeichen

Teilnehmer, Freitext. Klartext; "<" und ">" sind nicht zulässig. "" löscht sie.

Muster: ^[^<>]*$
color
string | nullhöchstens 32 Zeichen

Anzeigefarbe, z. B. "#2c7be5". "" löscht sie.

Muster: ^#?[A-Za-z0-9_-]{1,31}$

Antworten

200

Aktualisiert.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 5501
calendar
object

Der Kalender, zu dem der Eintrag gehört.

Felder von calendar
id
integer | null

Container-Kalender-id oder null für den impliziten gemeinsamen Kanzleikalender (ein Alt-Eintrag ohne Container).

name
string | null
type
string

"office" = der gemeinsame Kanzleikalender (jeder Kanzleibenutzer darf ihn einsehen und bearbeiten); "personal" = der eigene Kalender eines Benutzers, nur für seinen Eigentümer und diejenigen sichtbar, mit denen er geteilt ist.

Zulässige Werte: "office" "personal"
owner
object | null

Eigentümer eines persönlichen Kalenders; null beim Kanzleikalender.

Felder von owner
user_id
integer
name
string | null
title
string | null

Titel des Eintrags. Klartext.

description
string | null

Beschreibung des Eintrags. Klartext.

location
string | null

Ort. Klartext.

participants
string | null

Teilnehmer, Freitext. Klartext.

start
string | null

Ein ganztägiger Eintrag: das Startdatum "YYYY-MM-DD". Ein zeitgebundener Eintrag: ISO 8601 in der Zeitzone der Kanzlei (der gespeicherte UTC-Zeitpunkt).

Beispiel: "2026-03-02T09:00:00+01:00"
end
string | null

Gleiche Kodierung wie start. Bei einem ganztägigen Eintrag ist das Enddatum INKLUSIV (der gespeicherte Wert, nicht der +1-Tag-Wert, den ein Kalenderraster verwendet). Null, wenn der Eintrag kein Ende hat.

all_day
boolean

True bei einem ganztägigen Eintrag (start/end sind reine Daten); false bei einem zeitgebundenen Eintrag (start/end sind ISO-8601-Zeitpunkte).

color
string | null

Anzeigefarbe, z. B. "#2c7be5".

is_recurring
boolean

True, wenn der Eintrag ein wiederkehrender Master ist. Wiederkehrende Einträge werden einmal zurückgegeben, NICHT in Vorkommen expandiert, und können nicht über calendar.events.update geändert werden.

recurrence
object | null

Die Wiederholungsregel eines wiederkehrenden Masters oder null bei einem einzelnen Eintrag. Schreibgeschützt.

Felder von recurrence
freq
string | null

daily | weekly | monthly | yearly.

interval
integer | null
byweekday
string | null

Durch Komma getrennte Wochentagscodes (z. B. "MO,WE,FR").

until
string | null
count
integer | null
created_by
object | null

Der Kollege, der den Eintrag erstellt hat.

Felder von created_by
user_id
integer
name
string | null
created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an calendar.events.update als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
updated
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Datensatz hat sich geändert, seit Sie ihn gelesen haben (record_conflict: expected_updated_at stimmt nicht mehr überein; lesen Sie ihn erneut und versuchen Sie es mit dem neuen updated_at erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X PATCH 'https://www.flowyer.de/api/agent/calendar/events/1234' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "expected_updated_at": "2026-10-30T09:15:00+01:00",
  "title": "string"
}'

Antwortbeispiele

{
  "data": {
    "id": 5501,
    "calendar": {
      "id": 1234,
      "name": "string",
      "type": "office",
      "owner": {
        "user_id": 1234,
        "name": "string"
      }
    },
    "title": "string",
    "description": "string",
    "location": "string",
    "participants": "string",
    "start": "2026-03-02T09:00:00+01:00",
    "end": "string",
    "all_day": true,
    "color": "string",
    "is_recurring": true,
    "recurrence": {
      "freq": "string",
      "interval": 0,
      "byweekday": "string",
      "until": "string",
      "count": 0
    },
    "created_by": {
      "user_id": 1234,
      "name": "string"
    },
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    }
  },
  "updated": true
}

Terminbuchungen

Terminbuchungen auflisten

GET /api/agent/bookings

Listet die Terminbuchungen (időpontfoglalások) der Kanzlei auf, neueste zuerst. Optional gefiltert nach einem Von-/Bis-Tagesbereich (Zeitzone der Buchung), einem Anwalt (user_id), einem Status oder updated_since. Jeder Schlüsselinhaber sieht die Buchungen aller Anwälte.

Bereich
bookings:read

Abfrageparameter

from
string <date>

Nur Buchungen an oder nach diesem Tag (YYYY-MM-DD), wörtlich gegen das Datum in der Buchungszone abgeglichen.

Beispiel: "2026-01-01"
to
string <date>

Nur Buchungen an oder vor diesem Tag (YYYY-MM-DD).

Beispiel: "2026-12-31"
user_id
integer>= 1

Auf einen Anwalt eingrenzen (user_id aus colleagues.list). Weglassen für jeden Anwalt der Kanzlei.

status
string

Nach Status filtern.

Zulässige Werte: "pending" "confirmed" "cancelled" "completed" "awaiting_payment" "expired"
updated_since
string <date-time>

Nur Buchungen, die zu dieser ISO-8601-Zeit oder danach geändert wurden (updated_at ist zeitzonenlos in der Kanzleizone).

limit
integer>= 1<= 100

Seitengröße, 1-100. Standard 25.

Standard: 25
Beispiel: 25
offset
integer>= 0

Anzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.

Standard: 0
Beispiel: 0

Antworten

200

OK.

dataerforderlich
object[]
Felder von data
id
integer
Beispiel: 4321
booking_number
string

Menschenlesbare Buchungsnummer, z. B. "#B-0001".

status
string

pending = wartet auf die Bestätigung des Anwalts; confirmed = genehmigt; cancelled/completed; awaiting_payment/expired gehören zum Bezahlen-vor-Bestätigung-Ablauf.

Zulässige Werte: "pending" "confirmed" "cancelled" "completed" "awaiting_payment" "expired"
source
string

Woher die Buchung stammt. Eine über die API erstellte Buchung ist "manual".

Zulässige Werte: "flowyer" "website" "embed_widget" "manual"
lawyer
object | null

Der Anwalt (user_id aus colleagues.list), mit dem der Termin stattfindet.

Felder von lawyer
user_id
integer
name
string | null
date
string <date> | null

Kalenderdatum in der Zeitzone der Buchung (YYYY-MM-DD), wörtlich gespeichert.

start_time
string | null

Startzeit HH:MM in der Zeitzone der Buchung.

end_time
string | null

Endzeit HH:MM in der Zeitzone der Buchung.

start
string <date-time> | null

Eindeutiger ISO-8601-Zeitpunkt des Beginns, zusammengesetzt mit der Zeitzone der Buchung. Verwenden Sie diesen, um Zeitpunkte über Zonen hinweg zu vergleichen.

end
string <date-time> | null

Eindeutiger ISO-8601-Zeitpunkt des Endes.

timezone
string

Die Zeitzone der Buchung (booking_settings.timezone), z. B. "Europe/Budapest". Sie bestimmt date, start_time und end_time.

location_preference
string

Ob die Beratung in der Kanzlei oder online stattfindet.

Zulässige Werte: "office" "online"
meeting_link
string | null

URL des Online-Meetings, sofern gesetzt.

client
object

Der externe Mandant, der gebucht hat: Name, E-Mail, Telefon und der Betreff/die Notizen. Personenbezogene Daten — nur für das Kanzleipersonal.

Felder von client
name
string | null
email
string | null
phone
string | null
description
string | null
gdpr_consent
boolean

Ob die Einwilligung des Mandanten in die Datenverarbeitung erfasst ist.

gdpr_consent_at
string <date-time> | null

Wann die Einwilligung erfasst wurde.

cancel_reason
string | null

Bei der Stornierung erfasster Grund.

payment
object

Schreibgeschützter Zahlungsstatus. Die API ändert niemals die Zahlung; Buchungsgebühren werden in Flowyer verwaltet.

Felder von payment
status
string
Zulässige Werte: "none" "awaiting" "partial" "paid" "refunded"
method
string | null
Zulässige Werte: "card" "transfer"
amount
number | null
currency
string | null
invoice_number
string | null
confirmed_at
string <date-time> | null
cancelled_at
string <date-time> | null
created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an bookings.update / bookings.confirm / bookings.cancel als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent die Buchung über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
paginationerforderlich
object
Felder von pagination
limiterforderlich
integer
offseterforderlich
integer
totalerforderlich
integer

Gesamtanzahl der übereinstimmenden Datensätze.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/bookings?from=2026-01-01&to=2026-12-31&limit=25' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": [
    {
      "id": 4321,
      "booking_number": "string",
      "status": "pending",
      "source": "flowyer",
      "lawyer": {
        "user_id": 1234,
        "name": "string"
      },
      "date": "2026-10-30",
      "start_time": "string",
      "end_time": "string",
      "start": "2026-10-30T09:15:00+01:00",
      "end": "2026-10-30T09:15:00+01:00",
      "timezone": "string",
      "location_preference": "office",
      "meeting_link": "string",
      "client": {
        "name": "string",
        "email": "info@example.hu",
        "phone": "string",
        "description": "string"
      },
      "gdpr_consent": true,
      "gdpr_consent_at": "2026-10-30T09:15:00+01:00",
      "cancel_reason": "string",
      "payment": {
        "status": "none",
        "method": "card",
        "amount": 0,
        "currency": "string",
        "invoice_number": "string"
      },
      "confirmed_at": "2026-10-30T09:15:00+01:00",
      "cancelled_at": "2026-10-30T09:15:00+01:00",
      "created_at": "2026-10-30T09:15:00+01:00",
      "updated_at": "2026-10-30T09:15:00+01:00",
      "created_via_api": {
        "kind": "key",
        "key_id": 1234,
        "key_name": "string",
        "user_id": 1234,
        "user": "string",
        "at": "2026-10-30T09:15:00+01:00"
      }
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 1
  }
}

Terminbuchung abrufen

GET /api/agent/bookings/{id}

Gibt eine Terminbuchung mit dem Anwalt, den Angaben des Mandanten, den Start-/Endzeitpunkten, dem Zahlungsstatus und dem updated_at-Sperrtoken für bookings.update / .confirm / .cancel zurück. Antwortet mit 404, wenn die Buchung in dieser Kanzlei nicht existiert.

Bereich
bookings:read

Pfadparameter

iderforderlich
integer>= 1

Buchungs-ID.

Beispiel: 4321

Antworten

200

OK.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 4321
booking_number
string

Menschenlesbare Buchungsnummer, z. B. "#B-0001".

status
string

pending = wartet auf die Bestätigung des Anwalts; confirmed = genehmigt; cancelled/completed; awaiting_payment/expired gehören zum Bezahlen-vor-Bestätigung-Ablauf.

Zulässige Werte: "pending" "confirmed" "cancelled" "completed" "awaiting_payment" "expired"
source
string

Woher die Buchung stammt. Eine über die API erstellte Buchung ist "manual".

Zulässige Werte: "flowyer" "website" "embed_widget" "manual"
lawyer
object | null

Der Anwalt (user_id aus colleagues.list), mit dem der Termin stattfindet.

Felder von lawyer
user_id
integer
name
string | null
date
string <date> | null

Kalenderdatum in der Zeitzone der Buchung (YYYY-MM-DD), wörtlich gespeichert.

start_time
string | null

Startzeit HH:MM in der Zeitzone der Buchung.

end_time
string | null

Endzeit HH:MM in der Zeitzone der Buchung.

start
string <date-time> | null

Eindeutiger ISO-8601-Zeitpunkt des Beginns, zusammengesetzt mit der Zeitzone der Buchung. Verwenden Sie diesen, um Zeitpunkte über Zonen hinweg zu vergleichen.

end
string <date-time> | null

Eindeutiger ISO-8601-Zeitpunkt des Endes.

timezone
string

Die Zeitzone der Buchung (booking_settings.timezone), z. B. "Europe/Budapest". Sie bestimmt date, start_time und end_time.

location_preference
string

Ob die Beratung in der Kanzlei oder online stattfindet.

Zulässige Werte: "office" "online"
meeting_link
string | null

URL des Online-Meetings, sofern gesetzt.

client
object

Der externe Mandant, der gebucht hat: Name, E-Mail, Telefon und der Betreff/die Notizen. Personenbezogene Daten — nur für das Kanzleipersonal.

Felder von client
name
string | null
email
string | null
phone
string | null
description
string | null
gdpr_consent
boolean

Ob die Einwilligung des Mandanten in die Datenverarbeitung erfasst ist.

gdpr_consent_at
string <date-time> | null

Wann die Einwilligung erfasst wurde.

cancel_reason
string | null

Bei der Stornierung erfasster Grund.

payment
object

Schreibgeschützter Zahlungsstatus. Die API ändert niemals die Zahlung; Buchungsgebühren werden in Flowyer verwaltet.

Felder von payment
status
string
Zulässige Werte: "none" "awaiting" "partial" "paid" "refunded"
method
string | null
Zulässige Werte: "card" "transfer"
amount
number | null
currency
string | null
invoice_number
string | null
confirmed_at
string <date-time> | null
cancelled_at
string <date-time> | null
created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an bookings.update / bookings.confirm / bookings.cancel als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent die Buchung über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/bookings/4321' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": {
    "id": 4321,
    "booking_number": "string",
    "status": "pending",
    "source": "flowyer",
    "lawyer": {
      "user_id": 1234,
      "name": "string"
    },
    "date": "2026-10-30",
    "start_time": "string",
    "end_time": "string",
    "start": "2026-10-30T09:15:00+01:00",
    "end": "2026-10-30T09:15:00+01:00",
    "timezone": "string",
    "location_preference": "office",
    "meeting_link": "string",
    "client": {
      "name": "string",
      "email": "info@example.hu",
      "phone": "string",
      "description": "string"
    },
    "gdpr_consent": true,
    "gdpr_consent_at": "2026-10-30T09:15:00+01:00",
    "cancel_reason": "string",
    "payment": {
      "status": "none",
      "method": "card",
      "amount": 0,
      "currency": "string",
      "invoice_number": "string"
    },
    "confirmed_at": "2026-10-30T09:15:00+01:00",
    "cancelled_at": "2026-10-30T09:15:00+01:00",
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    }
  }
}

Terminbuchung anlegen

POST /api/agent/bookings

Bucht einen Termin und SENDET dem Mandanten die Bestätigung per E-Mail. Erfordert einen freien Slot für den Anwalt (andernfalls 409); der Kanzleikalender blockiert nie. source ist "manual". Ein Idempotency-Key-Replay bucht weder erneut noch sendet erneut eine E-Mail.

Bereich
bookings:create

Header-Parameter

Idempotency-Key
stringhöchstens 128 Zeichen

Bei jeder Erstellung empfohlen. Ein eindeutiger Wert pro logischer Operation (z. B. eine UUID). Derselbe Wert gibt denselben Datensatz zurück: Ein erneuter Versuch damit gibt den beim ersten Mal erstellten Datensatz zurück, anstatt einen zweiten zu erstellen. Unterschiedliche Werte erstellen immer unterschiedliche Datensätze. Clients, die keine Header senden können, können denselben Wert im Body-Feld idempotency_key übergeben. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$

Anfragetext application/json

user_iderforderlich
integer>= 1

Anwalt, mit dem der Termin stattfindet (user_id aus colleagues.list; muss ein aktiver Kollege der Kanzlei sein).

Beispiel: 42
dateerforderlich
string <date>

Termintag (YYYY-MM-DD) in der Zeitzone der Buchung.

Beispiel: "2026-03-02"
timeerforderlich
string

Startzeit HH:MM (24h) in der Zeitzone der Buchung. Die Endzeit ist time + die Slot-Länge der Kanzlei. Muss ein freier Slot sein.

Muster: ^([01]\d|2[0-3]):[0-5]\d$
Beispiel: "09:00"
client_nameerforderlich
stringhöchstens 255 Zeichen

Der Name des Mandanten. Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$
Beispiel: "Kovács Anna"
client_emailerforderlich
stringhöchstens 255 Zeichen

Die E-Mail des Mandanten: der Empfänger der Bestätigung.

Beispiel: "anna@example.com"
client_phone
string | nullhöchstens 50 Zeichen

Die Telefonnummer des Mandanten. Klartext.

Muster: ^[^<>]*$
client_description
string | nullhöchstens 2000 Zeichen

Betreff / Notizen des Mandanten. Klartext.

Muster: ^[^<>]*$
location_preference
string

Beratung in der Kanzlei oder online. Standard "office".

Zulässige Werte: "office" "online"
Standard: "office"
meeting_link
string | nullhöchstens 500 Zeichen

URL des Online-Meetings (http/https), für eine Online-Beratung.

gdpr_consent
boolean

Erfassen Sie die Einwilligung des Mandanten in die Datenverarbeitung. Standard true (das Kanzleipersonal bucht im Namen des Mandanten).

Standard: true
auto_confirm
boolean

Wenn true (oder die Kanzlei hat die automatische Bestätigung aktiviert), erstellen Sie die Buchung bereits bestätigt: Führen Sie die Kalendersynchronisation aus und senden Sie dem Mandanten eine Bestätigung statt einer Anfrage. Andernfalls ist sie pending.

Standard: false
idempotency_key
stringhöchstens 128 Zeichen

Dieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$
Beispiel: "b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"

Antworten

201

Erstellt.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 4321
booking_number
string

Menschenlesbare Buchungsnummer, z. B. "#B-0001".

status
string

pending = wartet auf die Bestätigung des Anwalts; confirmed = genehmigt; cancelled/completed; awaiting_payment/expired gehören zum Bezahlen-vor-Bestätigung-Ablauf.

Zulässige Werte: "pending" "confirmed" "cancelled" "completed" "awaiting_payment" "expired"
source
string

Woher die Buchung stammt. Eine über die API erstellte Buchung ist "manual".

Zulässige Werte: "flowyer" "website" "embed_widget" "manual"
lawyer
object | null

Der Anwalt (user_id aus colleagues.list), mit dem der Termin stattfindet.

Felder von lawyer
user_id
integer
name
string | null
date
string <date> | null

Kalenderdatum in der Zeitzone der Buchung (YYYY-MM-DD), wörtlich gespeichert.

start_time
string | null

Startzeit HH:MM in der Zeitzone der Buchung.

end_time
string | null

Endzeit HH:MM in der Zeitzone der Buchung.

start
string <date-time> | null

Eindeutiger ISO-8601-Zeitpunkt des Beginns, zusammengesetzt mit der Zeitzone der Buchung. Verwenden Sie diesen, um Zeitpunkte über Zonen hinweg zu vergleichen.

end
string <date-time> | null

Eindeutiger ISO-8601-Zeitpunkt des Endes.

timezone
string

Die Zeitzone der Buchung (booking_settings.timezone), z. B. "Europe/Budapest". Sie bestimmt date, start_time und end_time.

location_preference
string

Ob die Beratung in der Kanzlei oder online stattfindet.

Zulässige Werte: "office" "online"
meeting_link
string | null

URL des Online-Meetings, sofern gesetzt.

client
object

Der externe Mandant, der gebucht hat: Name, E-Mail, Telefon und der Betreff/die Notizen. Personenbezogene Daten — nur für das Kanzleipersonal.

Felder von client
name
string | null
email
string | null
phone
string | null
description
string | null
gdpr_consent
boolean

Ob die Einwilligung des Mandanten in die Datenverarbeitung erfasst ist.

gdpr_consent_at
string <date-time> | null

Wann die Einwilligung erfasst wurde.

cancel_reason
string | null

Bei der Stornierung erfasster Grund.

payment
object

Schreibgeschützter Zahlungsstatus. Die API ändert niemals die Zahlung; Buchungsgebühren werden in Flowyer verwaltet.

Felder von payment
status
string
Zulässige Werte: "none" "awaiting" "partial" "paid" "refunded"
method
string | null
Zulässige Werte: "card" "transfer"
amount
number | null
currency
string | null
invoice_number
string | null
confirmed_at
string <date-time> | null
cancelled_at
string <date-time> | null
created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an bookings.update / bookings.confirm / bookings.cancel als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent die Buchung über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
created
boolean
Wert: true
200

Idempotentes Replay: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage innerhalb von 120 Sekunden) hat den Datensatz bereits erstellt; er wird erneut zurückgegeben, es wurde nichts Neues erstellt.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 4321
booking_number
string

Menschenlesbare Buchungsnummer, z. B. "#B-0001".

status
string

pending = wartet auf die Bestätigung des Anwalts; confirmed = genehmigt; cancelled/completed; awaiting_payment/expired gehören zum Bezahlen-vor-Bestätigung-Ablauf.

Zulässige Werte: "pending" "confirmed" "cancelled" "completed" "awaiting_payment" "expired"
source
string

Woher die Buchung stammt. Eine über die API erstellte Buchung ist "manual".

Zulässige Werte: "flowyer" "website" "embed_widget" "manual"
lawyer
object | null

Der Anwalt (user_id aus colleagues.list), mit dem der Termin stattfindet.

Felder von lawyer
user_id
integer
name
string | null
date
string <date> | null

Kalenderdatum in der Zeitzone der Buchung (YYYY-MM-DD), wörtlich gespeichert.

start_time
string | null

Startzeit HH:MM in der Zeitzone der Buchung.

end_time
string | null

Endzeit HH:MM in der Zeitzone der Buchung.

start
string <date-time> | null

Eindeutiger ISO-8601-Zeitpunkt des Beginns, zusammengesetzt mit der Zeitzone der Buchung. Verwenden Sie diesen, um Zeitpunkte über Zonen hinweg zu vergleichen.

end
string <date-time> | null

Eindeutiger ISO-8601-Zeitpunkt des Endes.

timezone
string

Die Zeitzone der Buchung (booking_settings.timezone), z. B. "Europe/Budapest". Sie bestimmt date, start_time und end_time.

location_preference
string

Ob die Beratung in der Kanzlei oder online stattfindet.

Zulässige Werte: "office" "online"
meeting_link
string | null

URL des Online-Meetings, sofern gesetzt.

client
object

Der externe Mandant, der gebucht hat: Name, E-Mail, Telefon und der Betreff/die Notizen. Personenbezogene Daten — nur für das Kanzleipersonal.

Felder von client
name
string | null
email
string | null
phone
string | null
description
string | null
gdpr_consent
boolean

Ob die Einwilligung des Mandanten in die Datenverarbeitung erfasst ist.

gdpr_consent_at
string <date-time> | null

Wann die Einwilligung erfasst wurde.

cancel_reason
string | null

Bei der Stornierung erfasster Grund.

payment
object

Schreibgeschützter Zahlungsstatus. Die API ändert niemals die Zahlung; Buchungsgebühren werden in Flowyer verwaltet.

Felder von payment
status
string
Zulässige Werte: "none" "awaiting" "partial" "paid" "refunded"
method
string | null
Zulässige Werte: "card" "transfer"
amount
number | null
currency
string | null
invoice_number
string | null
confirmed_at
string <date-time> | null
cancelled_at
string <date-time> | null
created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an bookings.update / bookings.confirm / bookings.cancel als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent die Buchung über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
created
boolean
Wert: false
idempotent_replay
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar. replay_not_visible: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage) hat den Datensatz bereits erstellt (details.record_id), aber dieser wurde inzwischen gelöscht oder ist für den Benutzer nicht sichtbar; es wurde nichts Neues erstellt, erstellen Sie ihn nicht erneut.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Idempotency-Key wurde für einen anderen Ressourcentyp verwendet (idempotency_key_reused), oder, ohne Schlüssel, eine identische Anfrage wird gerade verarbeitet (duplicate_in_progress; versuchen Sie es in Kürze erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X POST 'https://www.flowyer.de/api/agent/bookings' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 7f3a9c21-1b2c-4d5e-8f90-0a1b2c3d4e5f' \
  -d '{
  "user_id": 42,
  "date": "2026-03-02",
  "time": "09:00",
  "client_name": "Kovács Anna",
  "client_email": "anna@example.com"
}'

Antwortbeispiele

{
  "data": {
    "id": 4321,
    "booking_number": "string",
    "status": "pending",
    "source": "flowyer",
    "lawyer": {
      "user_id": 1234,
      "name": "string"
    },
    "date": "2026-10-30",
    "start_time": "string",
    "end_time": "string",
    "start": "2026-10-30T09:15:00+01:00",
    "end": "2026-10-30T09:15:00+01:00",
    "timezone": "string",
    "location_preference": "office",
    "meeting_link": "string",
    "client": {
      "name": "string",
      "email": "info@example.hu",
      "phone": "string",
      "description": "string"
    },
    "gdpr_consent": true,
    "gdpr_consent_at": "2026-10-30T09:15:00+01:00",
    "cancel_reason": "string",
    "payment": {
      "status": "none",
      "method": "card",
      "amount": 0,
      "currency": "string",
      "invoice_number": "string"
    },
    "confirmed_at": "2026-10-30T09:15:00+01:00",
    "cancelled_at": "2026-10-30T09:15:00+01:00",
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    }
  },
  "created": true
}

Terminbuchung aktualisieren

PATCH /api/agent/bookings/{id}

Verlegt (date + time zusammen, erneut auf einen freien Slot geprüft) oder bearbeitet eine Buchung (Telefon, Notizen, Meeting-Link, Ort). Schreibt nur die Felder, die Sie senden. Benachrichtigt den Anwalt über eine Verlegung, nie den Mandanten. Übergeben Sie expected_updated_at aus Ihrem letzten Lesevorgang; ein veralteter Schreibvorgang antwortet mit 409.

Bereich
bookings:update

Pfadparameter

iderforderlich
integer>= 1

ID des zu ändernden Datensatzes.

Anfragetext application/json

expected_updated_at
string <date-time> | null

Der Wert updated_at aus Ihrem letzten Lesevorgang dieses Datensatzes (erforderlich, sofern der Datensatz einen hat). Wenn sich der Datensatz seitdem geändert hat (ein Kollege hat ihn bearbeitet), antwortet die API mit 409, und Sie müssen vor einem erneuten Versuch erneut lesen. Ein Altdatensatz, dessen updated_at null ist, nimmt null an.

date
string <date>

Neuer Tag (YYYY-MM-DD) in der Zeitzone der Buchung. Senden Sie date UND time zusammen, um zu verlegen.

Beispiel: "2026-03-05"
time
string

Neue Startzeit HH:MM. Die Endzeit wird aus der Slot-Länge der Kanzlei neu berechnet. Senden Sie date UND time zusammen.

Muster: ^([01]\d|2[0-3]):[0-5]\d$
Beispiel: "11:00"
client_phone
string | nullhöchstens 50 Zeichen

Die Telefonnummer des Mandanten. Klartext. "" löscht sie.

Muster: ^[^<>]*$
client_description
string | nullhöchstens 2000 Zeichen

Betreff / Notizen. Klartext. "" löscht sie.

Muster: ^[^<>]*$
meeting_link
string | nullhöchstens 500 Zeichen

URL des Online-Meetings (http/https). "" löscht sie.

location_preference
string

Beratung in der Kanzlei oder online.

Zulässige Werte: "office" "online"

Antworten

200

Aktualisiert.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 4321
booking_number
string

Menschenlesbare Buchungsnummer, z. B. "#B-0001".

status
string

pending = wartet auf die Bestätigung des Anwalts; confirmed = genehmigt; cancelled/completed; awaiting_payment/expired gehören zum Bezahlen-vor-Bestätigung-Ablauf.

Zulässige Werte: "pending" "confirmed" "cancelled" "completed" "awaiting_payment" "expired"
source
string

Woher die Buchung stammt. Eine über die API erstellte Buchung ist "manual".

Zulässige Werte: "flowyer" "website" "embed_widget" "manual"
lawyer
object | null

Der Anwalt (user_id aus colleagues.list), mit dem der Termin stattfindet.

Felder von lawyer
user_id
integer
name
string | null
date
string <date> | null

Kalenderdatum in der Zeitzone der Buchung (YYYY-MM-DD), wörtlich gespeichert.

start_time
string | null

Startzeit HH:MM in der Zeitzone der Buchung.

end_time
string | null

Endzeit HH:MM in der Zeitzone der Buchung.

start
string <date-time> | null

Eindeutiger ISO-8601-Zeitpunkt des Beginns, zusammengesetzt mit der Zeitzone der Buchung. Verwenden Sie diesen, um Zeitpunkte über Zonen hinweg zu vergleichen.

end
string <date-time> | null

Eindeutiger ISO-8601-Zeitpunkt des Endes.

timezone
string

Die Zeitzone der Buchung (booking_settings.timezone), z. B. "Europe/Budapest". Sie bestimmt date, start_time und end_time.

location_preference
string

Ob die Beratung in der Kanzlei oder online stattfindet.

Zulässige Werte: "office" "online"
meeting_link
string | null

URL des Online-Meetings, sofern gesetzt.

client
object

Der externe Mandant, der gebucht hat: Name, E-Mail, Telefon und der Betreff/die Notizen. Personenbezogene Daten — nur für das Kanzleipersonal.

Felder von client
name
string | null
email
string | null
phone
string | null
description
string | null
gdpr_consent
boolean

Ob die Einwilligung des Mandanten in die Datenverarbeitung erfasst ist.

gdpr_consent_at
string <date-time> | null

Wann die Einwilligung erfasst wurde.

cancel_reason
string | null

Bei der Stornierung erfasster Grund.

payment
object

Schreibgeschützter Zahlungsstatus. Die API ändert niemals die Zahlung; Buchungsgebühren werden in Flowyer verwaltet.

Felder von payment
status
string
Zulässige Werte: "none" "awaiting" "partial" "paid" "refunded"
method
string | null
Zulässige Werte: "card" "transfer"
amount
number | null
currency
string | null
invoice_number
string | null
confirmed_at
string <date-time> | null
cancelled_at
string <date-time> | null
created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an bookings.update / bookings.confirm / bookings.cancel als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent die Buchung über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
updated
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Datensatz hat sich geändert, seit Sie ihn gelesen haben (record_conflict: expected_updated_at stimmt nicht mehr überein; lesen Sie ihn erneut und versuchen Sie es mit dem neuen updated_at erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X PATCH 'https://www.flowyer.de/api/agent/bookings/1234' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "expected_updated_at": "2026-10-30T09:15:00+01:00",
  "date": "2026-03-05",
  "time": "11:00"
}'

Antwortbeispiele

{
  "data": {
    "id": 4321,
    "booking_number": "string",
    "status": "pending",
    "source": "flowyer",
    "lawyer": {
      "user_id": 1234,
      "name": "string"
    },
    "date": "2026-10-30",
    "start_time": "string",
    "end_time": "string",
    "start": "2026-10-30T09:15:00+01:00",
    "end": "2026-10-30T09:15:00+01:00",
    "timezone": "string",
    "location_preference": "office",
    "meeting_link": "string",
    "client": {
      "name": "string",
      "email": "info@example.hu",
      "phone": "string",
      "description": "string"
    },
    "gdpr_consent": true,
    "gdpr_consent_at": "2026-10-30T09:15:00+01:00",
    "cancel_reason": "string",
    "payment": {
      "status": "none",
      "method": "card",
      "amount": 0,
      "currency": "string",
      "invoice_number": "string"
    },
    "confirmed_at": "2026-10-30T09:15:00+01:00",
    "cancelled_at": "2026-10-30T09:15:00+01:00",
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    }
  },
  "updated": true
}

Terminbuchung bestätigen

POST /api/agent/bookings/{id}/confirm

Bestätigt eine ausstehende Buchung und SENDET dem Mandanten die Bestätigung per E-Mail (bei einer Online-Buchung mit dem Meeting-Link). Nur eine ausstehende Buchung kann bestätigt werden; jeder andere Status antwortet mit 409, sodass ein erneuter Versuch nie erneut eine E-Mail sendet. Optional können Sie expected_updated_at als Sperrtoken übergeben.

Bereich
bookings:send

Pfadparameter

iderforderlich
integer>= 1

Buchungs-ID.

Beispiel: 4321

Anfragetext application/json

expected_updated_at
string <date-time> | null

Optionales Optimistic-Lock-Token: das updated_at aus Ihrem letzten Lesevorgang. Wenn sich die Buchung seitdem geändert hat, antwortet die API mit 409, und Sie lesen vor einem erneuten Versuch erneut.

meeting_link
string | nullhöchstens 500 Zeichen

URL des Online-Meetings (http/https), die vor dem Versand der Bestätigungs-E-Mail an der Buchung gesetzt werden soll.

Antworten

200

OK.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 4321
booking_number
string

Menschenlesbare Buchungsnummer, z. B. "#B-0001".

status
string

pending = wartet auf die Bestätigung des Anwalts; confirmed = genehmigt; cancelled/completed; awaiting_payment/expired gehören zum Bezahlen-vor-Bestätigung-Ablauf.

Zulässige Werte: "pending" "confirmed" "cancelled" "completed" "awaiting_payment" "expired"
source
string

Woher die Buchung stammt. Eine über die API erstellte Buchung ist "manual".

Zulässige Werte: "flowyer" "website" "embed_widget" "manual"
lawyer
object | null

Der Anwalt (user_id aus colleagues.list), mit dem der Termin stattfindet.

Felder von lawyer
user_id
integer
name
string | null
date
string <date> | null

Kalenderdatum in der Zeitzone der Buchung (YYYY-MM-DD), wörtlich gespeichert.

start_time
string | null

Startzeit HH:MM in der Zeitzone der Buchung.

end_time
string | null

Endzeit HH:MM in der Zeitzone der Buchung.

start
string <date-time> | null

Eindeutiger ISO-8601-Zeitpunkt des Beginns, zusammengesetzt mit der Zeitzone der Buchung. Verwenden Sie diesen, um Zeitpunkte über Zonen hinweg zu vergleichen.

end
string <date-time> | null

Eindeutiger ISO-8601-Zeitpunkt des Endes.

timezone
string

Die Zeitzone der Buchung (booking_settings.timezone), z. B. "Europe/Budapest". Sie bestimmt date, start_time und end_time.

location_preference
string

Ob die Beratung in der Kanzlei oder online stattfindet.

Zulässige Werte: "office" "online"
meeting_link
string | null

URL des Online-Meetings, sofern gesetzt.

client
object

Der externe Mandant, der gebucht hat: Name, E-Mail, Telefon und der Betreff/die Notizen. Personenbezogene Daten — nur für das Kanzleipersonal.

Felder von client
name
string | null
email
string | null
phone
string | null
description
string | null
gdpr_consent
boolean

Ob die Einwilligung des Mandanten in die Datenverarbeitung erfasst ist.

gdpr_consent_at
string <date-time> | null

Wann die Einwilligung erfasst wurde.

cancel_reason
string | null

Bei der Stornierung erfasster Grund.

payment
object

Schreibgeschützter Zahlungsstatus. Die API ändert niemals die Zahlung; Buchungsgebühren werden in Flowyer verwaltet.

Felder von payment
status
string
Zulässige Werte: "none" "awaiting" "partial" "paid" "refunded"
method
string | null
Zulässige Werte: "card" "transfer"
amount
number | null
currency
string | null
invoice_number
string | null
confirmed_at
string <date-time> | null
cancelled_at
string <date-time> | null
created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an bookings.update / bookings.confirm / bookings.cancel als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent die Buchung über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X POST 'https://www.flowyer.de/api/agent/bookings/4321/confirm' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "expected_updated_at": "2026-10-30T09:15:00+01:00"
}'

Antwortbeispiele

{
  "data": {
    "id": 4321,
    "booking_number": "string",
    "status": "pending",
    "source": "flowyer",
    "lawyer": {
      "user_id": 1234,
      "name": "string"
    },
    "date": "2026-10-30",
    "start_time": "string",
    "end_time": "string",
    "start": "2026-10-30T09:15:00+01:00",
    "end": "2026-10-30T09:15:00+01:00",
    "timezone": "string",
    "location_preference": "office",
    "meeting_link": "string",
    "client": {
      "name": "string",
      "email": "info@example.hu",
      "phone": "string",
      "description": "string"
    },
    "gdpr_consent": true,
    "gdpr_consent_at": "2026-10-30T09:15:00+01:00",
    "cancel_reason": "string",
    "payment": {
      "status": "none",
      "method": "card",
      "amount": 0,
      "currency": "string",
      "invoice_number": "string"
    },
    "confirmed_at": "2026-10-30T09:15:00+01:00",
    "cancelled_at": "2026-10-30T09:15:00+01:00",
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    }
  }
}

Terminbuchung stornieren

POST /api/agent/bookings/{id}/cancel

Storniert eine Buchung und SENDET dem Mandanten (und dem Anwalt) die Stornierung per E-Mail. Eine bereits stornierte oder abgeschlossene Buchung antwortet mit 409, sodass ein erneuter Versuch nie erneut eine E-Mail sendet. Eine bezahlte Buchung wird storniert, aber nie erstattet (das erledigt die Kanzlei). Optional können Sie expected_updated_at übergeben.

Bereich
bookings:send

Pfadparameter

iderforderlich
integer>= 1

Buchungs-ID.

Beispiel: 4321

Anfragetext application/json

expected_updated_at
string <date-time> | null

Optionales Optimistic-Lock-Token: das updated_at aus Ihrem letzten Lesevorgang. Wenn sich die Buchung seitdem geändert hat, antwortet die API mit 409.

reason
string | nullhöchstens 255 Zeichen

Als cancel_reason erfasster Grund, der in der Stornierungs-E-Mail angezeigt wird. Klartext; "<" und ">" sind nicht zulässig.

Muster: ^[^<>]*$

Antworten

200

OK.

dataerforderlich
object
Felder von data
id
integer
Beispiel: 4321
booking_number
string

Menschenlesbare Buchungsnummer, z. B. "#B-0001".

status
string

pending = wartet auf die Bestätigung des Anwalts; confirmed = genehmigt; cancelled/completed; awaiting_payment/expired gehören zum Bezahlen-vor-Bestätigung-Ablauf.

Zulässige Werte: "pending" "confirmed" "cancelled" "completed" "awaiting_payment" "expired"
source
string

Woher die Buchung stammt. Eine über die API erstellte Buchung ist "manual".

Zulässige Werte: "flowyer" "website" "embed_widget" "manual"
lawyer
object | null

Der Anwalt (user_id aus colleagues.list), mit dem der Termin stattfindet.

Felder von lawyer
user_id
integer
name
string | null
date
string <date> | null

Kalenderdatum in der Zeitzone der Buchung (YYYY-MM-DD), wörtlich gespeichert.

start_time
string | null

Startzeit HH:MM in der Zeitzone der Buchung.

end_time
string | null

Endzeit HH:MM in der Zeitzone der Buchung.

start
string <date-time> | null

Eindeutiger ISO-8601-Zeitpunkt des Beginns, zusammengesetzt mit der Zeitzone der Buchung. Verwenden Sie diesen, um Zeitpunkte über Zonen hinweg zu vergleichen.

end
string <date-time> | null

Eindeutiger ISO-8601-Zeitpunkt des Endes.

timezone
string

Die Zeitzone der Buchung (booking_settings.timezone), z. B. "Europe/Budapest". Sie bestimmt date, start_time und end_time.

location_preference
string

Ob die Beratung in der Kanzlei oder online stattfindet.

Zulässige Werte: "office" "online"
meeting_link
string | null

URL des Online-Meetings, sofern gesetzt.

client
object

Der externe Mandant, der gebucht hat: Name, E-Mail, Telefon und der Betreff/die Notizen. Personenbezogene Daten — nur für das Kanzleipersonal.

Felder von client
name
string | null
email
string | null
phone
string | null
description
string | null
gdpr_consent
boolean

Ob die Einwilligung des Mandanten in die Datenverarbeitung erfasst ist.

gdpr_consent_at
string <date-time> | null

Wann die Einwilligung erfasst wurde.

cancel_reason
string | null

Bei der Stornierung erfasster Grund.

payment
object

Schreibgeschützter Zahlungsstatus. Die API ändert niemals die Zahlung; Buchungsgebühren werden in Flowyer verwaltet.

Felder von payment
status
string
Zulässige Werte: "none" "awaiting" "partial" "paid" "refunded"
method
string | null
Zulässige Werte: "card" "transfer"
amount
number | null
currency
string | null
invoice_number
string | null
confirmed_at
string <date-time> | null
cancelled_at
string <date-time> | null
created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an bookings.update / bookings.confirm / bookings.cancel als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn ein externer Agent die Buchung über diese API erstellt hat.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X POST 'https://www.flowyer.de/api/agent/bookings/4321/cancel' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "expected_updated_at": "2026-10-30T09:15:00+01:00"
}'

Antwortbeispiele

{
  "data": {
    "id": 4321,
    "booking_number": "string",
    "status": "pending",
    "source": "flowyer",
    "lawyer": {
      "user_id": 1234,
      "name": "string"
    },
    "date": "2026-10-30",
    "start_time": "string",
    "end_time": "string",
    "start": "2026-10-30T09:15:00+01:00",
    "end": "2026-10-30T09:15:00+01:00",
    "timezone": "string",
    "location_preference": "office",
    "meeting_link": "string",
    "client": {
      "name": "string",
      "email": "info@example.hu",
      "phone": "string",
      "description": "string"
    },
    "gdpr_consent": true,
    "gdpr_consent_at": "2026-10-30T09:15:00+01:00",
    "cancel_reason": "string",
    "payment": {
      "status": "none",
      "method": "card",
      "amount": 0,
      "currency": "string",
      "invoice_number": "string"
    },
    "confirmed_at": "2026-10-30T09:15:00+01:00",
    "cancelled_at": "2026-10-30T09:15:00+01:00",
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    }
  }
}

Support-Tickets

Support-Tickets auflisten

GET /api/agent/tickets

Listet die für den Benutzer sichtbaren Support-Tickets auf (Sichtbarkeit pro Postfach), neueste Aktivität zuerst. Filtern Sie nach Status (Standard open_states = new+open+pending; "all" schließt geschlossene ein), Postfach, Bearbeiter, Anfrager-E-Mail oder Freitext über Betreff/Anfrager/Ticketnummer.

Bereich
tickets:read
Flowyer-Berechtigung
ticketing:read

Abfrageparameter

status
string

open_states (Standard) = new+open+pending (die Standardansicht im Web); "all" schließt geschlossene ein; oder ein exakter Status.

Zulässige Werte: "new" "open" "pending" "closed" "open_states" "all"
Standard: "open_states"
mailbox_id
integer>= 1

Nur Tickets aus diesem Postfach. Ein Postfach, das der Benutzer nicht sehen darf, ergibt eine leere Liste (nie ein Leck).

Beispiel: 7
assigned_to_user_id
integer>= 0

Nur diesem Kollegen zugewiesene Tickets (id aus colleagues.list); 0 = nur nicht zugewiesene Tickets. Weglassen für jeden Bearbeiter.

requester_email
stringhöchstens 255 Zeichen

Nur Tickets, deren externe Anfrager-E-Mail genau übereinstimmt (Groß-/Kleinschreibung wird ignoriert).

Beispiel: "ugyfel@example.com"
q
stringhöchstens 100 Zeichen

Freitextsuche über Betreff, Anfragername/-E-Mail und Ticketnummer (Groß-/Kleinschreibung wird ignoriert).

Beispiel: "számla"
limit
integer>= 1<= 100

Seitengröße, 1-100. Standard 25.

Standard: 25
Beispiel: 25
offset
integer>= 0

Anzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.

Standard: 0
Beispiel: 0

Antworten

200

OK.

dataerforderlich
object[]
Felder von data
id
integer

Ticket-id (mit tickets.get / tickets.update verwenden).

Beispiel: 4321
ticket_number
string | null

Menschenlesbare Ticketnummer, z. B. FLW-000123.

subject
string | null
status
string
Zulässige Werte: "new" "open" "pending" "closed"
priority
string
Zulässige Werte: "low" "normal" "high"
mailbox
object | null

Das Postfach, über das das Ticket eingegangen ist (zentrales Verzeichnis).

Felder von mailbox
id
integer
email
string | null
display_name
string | null
requester
object

Die externe Person, die geschrieben hat.

Felder von requester
email
string | null
name
string | null
assigned_to
object | null

Der Kollege, dem das Ticket zugewiesen ist, oder null, wenn nicht zugewiesen.

Felder von assigned_to
user_id
integer
name
string | null
matter
object | null

Die mit dem Ticket verknüpfte Akte oder null.

Felder von matter
id
integer
case_number
string
client
object | null

Der mit dem Ticket verknüpfte Mandant oder null.

Felder von client
id
integer
name
string
last_message_at
string <date-time> | null

Zeitpunkt der jüngsten Thread-Aktivität; die Liste ist danach sortiert, neueste zuerst.

created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an tickets.update als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn das Ticket über diese API erstellt wurde.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
paginationerforderlich
object
Felder von pagination
limiterforderlich
integer
offseterforderlich
integer
totalerforderlich
integer

Gesamtanzahl der übereinstimmenden Datensätze.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/tickets?mailbox_id=7&requester_email=ugyfel%40example.com&q=sz%C3%A1mla' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": [
    {
      "id": 4321,
      "ticket_number": "string",
      "subject": "string",
      "status": "new",
      "priority": "low",
      "mailbox": {
        "id": 1234,
        "email": "info@example.hu",
        "display_name": "string"
      },
      "requester": {
        "email": "info@example.hu",
        "name": "string"
      },
      "assigned_to": {
        "user_id": 1234,
        "name": "string"
      },
      "matter": {
        "id": 1234,
        "case_number": "string"
      },
      "client": {
        "id": 1234,
        "name": "string"
      },
      "last_message_at": "2026-10-30T09:15:00+01:00",
      "created_at": "2026-10-30T09:15:00+01:00",
      "updated_at": "2026-10-30T09:15:00+01:00",
      "created_via_api": {
        "kind": "key",
        "key_id": 1234,
        "key_name": "string",
        "user_id": 1234,
        "user": "string",
        "at": "2026-10-30T09:15:00+01:00"
      }
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 1
  }
}

Support-Ticket abrufen

GET /api/agent/tickets/{id}

Gibt ein Support-Ticket mit seinem Nachrichten-Thread (älteste zuerst) und der verknüpften Akte/dem verknüpften Mandanten zurück. Antwortet mit 404, wenn das Ticket nicht existiert oder in einem Postfach liegt, das der Benutzer nicht sehen darf. Der Lesevorgang ändert das Ticket nie (ein NEW-Ticket wird nicht auf OPEN umgestellt).

Bereich
tickets:read
Flowyer-Berechtigung
ticketing:read

Pfadparameter

iderforderlich
integer>= 1

Ticket-id.

Beispiel: 4321

Abfrageparameter

messages_limit
integer | null>= 1<= 500

Nur die neuesten N Nachrichten des Threads zurückgeben (weiterhin älteste zuerst dargestellt). Weglassen für den gesamten Thread.

Antworten

200

OK.

dataerforderlich
object
Felder von data
id
integer

Ticket-id (mit tickets.get / tickets.update verwenden).

Beispiel: 4321
ticket_number
string | null

Menschenlesbare Ticketnummer, z. B. FLW-000123.

subject
string | null
status
string
Zulässige Werte: "new" "open" "pending" "closed"
priority
string
Zulässige Werte: "low" "normal" "high"
mailbox
object | null

Das Postfach, über das das Ticket eingegangen ist (zentrales Verzeichnis).

Felder von mailbox
id
integer
email
string | null
display_name
string | null
requester
object

Die externe Person, die geschrieben hat.

Felder von requester
email
string | null
name
string | null
assigned_to
object | null

Der Kollege, dem das Ticket zugewiesen ist, oder null, wenn nicht zugewiesen.

Felder von assigned_to
user_id
integer
name
string | null
matter
object | null

Die mit dem Ticket verknüpfte Akte oder null.

Felder von matter
id
integer
case_number
string
client
object | null

Der mit dem Ticket verknüpfte Mandant oder null.

Felder von client
id
integer
name
string
last_message_at
string <date-time> | null

Zeitpunkt der jüngsten Thread-Aktivität; die Liste ist danach sortiert, neueste zuerst.

created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an tickets.update als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn das Ticket über diese API erstellt wurde.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
messages
object[]

Der Nachrichten-Thread, älteste zuerst.

Felder von messages
id
integer
direction
string

in = vom Anfrager, out = vom Postfach gesendete Antwort/automatische Bestätigung, note = intern.

Zulässige Werte: "in" "out" "note"
from
object
Felder von from
email
string | null
name
string | null
to
object[]
Felder von to
email
string
name
string | null
cc
object[]
Felder von cc
email
string
name
string | null
sent_status
string | null

Zustellstatus einer ausgehenden Nachricht; null bei in/note.

Zulässige Werte: "pending" "sent" "failed" "scheduled"
body_html
string | null

Nachrichteninhalt als bereinigtes HTML (bereits beim Speichern sicher).

body_text
string | null
has_attachments
boolean
author
object | null

Der Kollege, der eine out/note-Nachricht geschrieben hat; null bei einer eingehenden Nachricht.

Felder von author
user_id
integer
name
string | null
created_at
string <date-time> | null
linked_matter
object | null

Die mit dem Ticket verknüpfte Akte (dieselbe wie matter).

Felder von linked_matter
id
integer
case_number
string
linked_client
object | null

Der mit dem Ticket verknüpfte Mandant (derselbe wie client).

Felder von linked_client
id
integer
name
string
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/tickets/4321' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": {
    "id": 4321,
    "ticket_number": "string",
    "subject": "string",
    "status": "new",
    "priority": "low",
    "mailbox": {
      "id": 1234,
      "email": "info@example.hu",
      "display_name": "string"
    },
    "requester": {
      "email": "info@example.hu",
      "name": "string"
    },
    "assigned_to": {
      "user_id": 1234,
      "name": "string"
    },
    "matter": {
      "id": 1234,
      "case_number": "string"
    },
    "client": {
      "id": 1234,
      "name": "string"
    },
    "last_message_at": "2026-10-30T09:15:00+01:00",
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    },
    "messages": [
      {
        "id": 1234,
        "direction": "in",
        "from": {
          "email": "info@example.hu",
          "name": "string"
        },
        "to": [
          {
            "email": "info@example.hu",
            "name": "string"
          }
        ],
        "cc": [
          {
            "email": "info@example.hu",
            "name": "string"
          }
        ],
        "sent_status": "pending",
        "body_html": "string",
        "body_text": "string",
        "has_attachments": true,
        "author": {
          "user_id": 1234,
          "name": "string"
        },
        "created_at": "2026-10-30T09:15:00+01:00"
      }
    ],
    "linked_matter": {
      "id": 1234,
      "case_number": "string"
    },
    "linked_client": {
      "id": 1234,
      "name": "string"
    }
  }
}

Auf Ticket antworten

POST /api/agent/tickets/{id}/reply

Antwortet auf ein Support-Ticket und SENDET die Antwort per E-Mail an den externen Anfrager (über das Postfach des Tickets). Der Inhalt ist Rich-HTML, serverseitig vor dem Speichern bereinigt. Ein erneuter Versuch mit demselben Idempotency-Key sendet nie eine zweite E-Mail.

Bereich
tickets:reply
Flowyer-Berechtigung
ticketing:read

Pfadparameter

iderforderlich
integer>= 1

Ticket-id (muss über die Postfach-ACL sichtbar sein).

Beispiel: 4321

Header-Parameter

Idempotency-Key
stringhöchstens 128 Zeichen

Bei jeder Erstellung empfohlen. Ein eindeutiger Wert pro logischer Operation (z. B. eine UUID). Derselbe Wert gibt denselben Datensatz zurück: Ein erneuter Versuch damit gibt den beim ersten Mal erstellten Datensatz zurück, anstatt einen zweiten zu erstellen. Unterschiedliche Werte erstellen immer unterschiedliche Datensätze. Clients, die keine Header senden können, können denselben Wert im Body-Feld idempotency_key übergeben. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$

Anfragetext application/json

body_htmlerforderlich
stringmindestens 1 Zeichen

Die Antwort, Rich-HTML (wie von TinyMCE erzeugt). Serverseitig mit HTMLPurifier bereinigt vor dem Speichern und vor dem Senden. Höchstens 100000 Zeichen; abgelehnt, wenn sie zu nichts bereinigt wird.

Beispiel: "<p>Köszönjük megkeresését, csatoltan küldjük a választ.</p>"
cc
string[]höchstens 10 Einträge

Zusätzliche Cc-Empfänger (höchstens 10). Der Anfrager und das Postfach werden automatisch ausgeschlossen; eine ungültige Adresse antwortet mit 422.

status
string

Ticketstatus, der nach dem Antworten gesetzt werden soll (Standard "pending" = wartet auf den Anfrager). Erfasst ein Statusänderungsereignis.

Zulässige Werte: "new" "open" "pending" "closed"
Standard: "pending"
append_signature
boolean

Fügt die gespeicherte Ticketsignatur des Schlüsselbenutzers nur der AUSGEHENDEN E-Mail hinzu (nie im Thread gespeichert).

Standard: false
idempotency_key
stringhöchstens 128 Zeichen

Dieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$
Beispiel: "b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"

Antworten

201

Erstellt.

dataerforderlich
object
Felder von data
ticket_id
integer
Beispiel: 4321
message_id
integer

Id der erstellten ausgehenden ticket_messages-Zeile.

Beispiel: 98765
direction
string

Immer "out".

sent_status
string | null

"pending" zum Erstellungszeitpunkt; der asynchrone Versand stellt es später auf sent/failed um.

Zulässige Werte: "pending" "sent" "failed" "scheduled"
status
string

Der Ticketstatus nach der Antwort.

Zulässige Werte: "new" "open" "pending" "closed"
created_at
string <date-time> | null
created_via_api
object | null

Vorhanden, wenn die Antwort über diese API erstellt wurde.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
created
boolean
Wert: true
200

Idempotentes Replay: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage innerhalb von 120 Sekunden) hat den Datensatz bereits erstellt; er wird erneut zurückgegeben, es wurde nichts Neues erstellt.

dataerforderlich
object
Felder von data
ticket_id
integer
Beispiel: 4321
message_id
integer

Id der erstellten ausgehenden ticket_messages-Zeile.

Beispiel: 98765
direction
string

Immer "out".

sent_status
string | null

"pending" zum Erstellungszeitpunkt; der asynchrone Versand stellt es später auf sent/failed um.

Zulässige Werte: "pending" "sent" "failed" "scheduled"
status
string

Der Ticketstatus nach der Antwort.

Zulässige Werte: "new" "open" "pending" "closed"
created_at
string <date-time> | null
created_via_api
object | null

Vorhanden, wenn die Antwort über diese API erstellt wurde.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
created
boolean
Wert: false
idempotent_replay
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar. replay_not_visible: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage) hat den Datensatz bereits erstellt (details.record_id), aber dieser wurde inzwischen gelöscht oder ist für den Benutzer nicht sichtbar; es wurde nichts Neues erstellt, erstellen Sie ihn nicht erneut.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Idempotency-Key wurde für einen anderen Ressourcentyp verwendet (idempotency_key_reused), oder, ohne Schlüssel, eine identische Anfrage wird gerade verarbeitet (duplicate_in_progress; versuchen Sie es in Kürze erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X POST 'https://www.flowyer.de/api/agent/tickets/4321/reply' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 7f3a9c21-1b2c-4d5e-8f90-0a1b2c3d4e5f' \
  -d '{
  "body_html": "<p>Köszönjük megkeresését, csatoltan küldjük a választ.</p>"
}'

Antwortbeispiele

{
  "data": {
    "ticket_id": 4321,
    "message_id": 98765,
    "direction": "string",
    "sent_status": "pending",
    "status": "new",
    "created_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    }
  },
  "created": true
}

Ticketstatus ändern

PATCH /api/agent/tickets/{id}

Ändert den Status eines Tickets (new, open, pending oder closed). "closed" stempelt closed_at; jeder andere Status löscht es. Übergeben Sie expected_updated_at aus Ihrem letzten Lesevorgang; eine kollidierende Änderung antwortet mit 409. Antwortet mit 404, wenn das Ticket nicht sichtbar ist.

Bereich
tickets:update
Flowyer-Berechtigung
ticketing:read

Pfadparameter

iderforderlich
integer>= 1

ID des zu ändernden Datensatzes.

Anfragetext application/json

expected_updated_at
string <date-time> | null

Der Wert updated_at aus Ihrem letzten Lesevorgang dieses Datensatzes (erforderlich, sofern der Datensatz einen hat). Wenn sich der Datensatz seitdem geändert hat (ein Kollege hat ihn bearbeitet), antwortet die API mit 409, und Sie müssen vor einem erneuten Versuch erneut lesen. Ein Altdatensatz, dessen updated_at null ist, nimmt null an.

statuserforderlich
string

Der neue Status. "closed" stempelt closed_at; jeder andere Status löscht es.

Zulässige Werte: "new" "open" "pending" "closed"
Beispiel: "open"

Antworten

200

Aktualisiert.

dataerforderlich
object
Felder von data
id
integer

Ticket-id (mit tickets.get / tickets.update verwenden).

Beispiel: 4321
ticket_number
string | null

Menschenlesbare Ticketnummer, z. B. FLW-000123.

subject
string | null
status
string
Zulässige Werte: "new" "open" "pending" "closed"
priority
string
Zulässige Werte: "low" "normal" "high"
mailbox
object | null

Das Postfach, über das das Ticket eingegangen ist (zentrales Verzeichnis).

Felder von mailbox
id
integer
email
string | null
display_name
string | null
requester
object

Die externe Person, die geschrieben hat.

Felder von requester
email
string | null
name
string | null
assigned_to
object | null

Der Kollege, dem das Ticket zugewiesen ist, oder null, wenn nicht zugewiesen.

Felder von assigned_to
user_id
integer
name
string | null
matter
object | null

Die mit dem Ticket verknüpfte Akte oder null.

Felder von matter
id
integer
case_number
string
client
object | null

Der mit dem Ticket verknüpfte Mandant oder null.

Felder von client
id
integer
name
string
last_message_at
string <date-time> | null

Zeitpunkt der jüngsten Thread-Aktivität; die Liste ist danach sortiert, neueste zuerst.

created_at
string <date-time> | null
updated_at
string <date-time> | null

Übergeben Sie dies an tickets.update als expected_updated_at.

created_via_api
object | null

Vorhanden, wenn das Ticket über diese API erstellt wurde.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
updated
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Datensatz hat sich geändert, seit Sie ihn gelesen haben (record_conflict: expected_updated_at stimmt nicht mehr überein; lesen Sie ihn erneut und versuchen Sie es mit dem neuen updated_at erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X PATCH 'https://www.flowyer.de/api/agent/tickets/1234' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -d '{
  "expected_updated_at": "2026-10-30T09:15:00+01:00",
  "status": "open"
}'

Antwortbeispiele

{
  "data": {
    "id": 4321,
    "ticket_number": "string",
    "subject": "string",
    "status": "new",
    "priority": "low",
    "mailbox": {
      "id": 1234,
      "email": "info@example.hu",
      "display_name": "string"
    },
    "requester": {
      "email": "info@example.hu",
      "name": "string"
    },
    "assigned_to": {
      "user_id": 1234,
      "name": "string"
    },
    "matter": {
      "id": 1234,
      "case_number": "string"
    },
    "client": {
      "id": 1234,
      "name": "string"
    },
    "last_message_at": "2026-10-30T09:15:00+01:00",
    "created_at": "2026-10-30T09:15:00+01:00",
    "updated_at": "2026-10-30T09:15:00+01:00",
    "created_via_api": {
      "kind": "key",
      "key_id": 1234,
      "key_name": "string",
      "user_id": 1234,
      "user": "string",
      "at": "2026-10-30T09:15:00+01:00"
    }
  },
  "updated": true
}

Mandantenportal

Mandantenportale auflisten

GET /api/agent/portals

Listet die Mandantenportale (Threads) auf, auf die der Benutzer zugreifen darf: die Akte, die mandantenseitigen Teilnehmer, die Nachrichten- und Teilnehmeranzahl und den Zeitpunkt der letzten Nachricht, neueste zuerst. Optional auf eine Akte eingegrenzt (matter_id). Eine Akte hat höchstens ein Portal.

Bereich
portal:read
Flowyer-Berechtigung
client-portal:read, cases:read

Abfrageparameter

matter_id
integer>= 1

Nur das Portal dieser Akte (404 matter_not_visible, wenn die Akte nicht sichtbar ist). Eine Akte hat höchstens ein Portal.

Beispiel: 1234
limit
integer>= 1<= 100

Seitengröße, 1-100. Standard 25.

Standard: 25
Beispiel: 25
offset
integer>= 0

Anzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.

Standard: 0
Beispiel: 0

Antworten

200

OK.

dataerforderlich
object[]
Felder von data
id
integer

Portal-(Thread-)id - die Kennung für portal.messages.list und portal.reply.

Beispiel: 57
matter
object

Die Akte (Fall), zu der das Portal gehört.

Felder von matter
id
integer
case_number
string
client_participants
object[]

Die externen mandantenseitigen Teilnehmer, mit denen die Kanzlei spricht.

Felder von client_participants
name
string | null
kind
string

client = ein Auftraggeber, contact = ein Mandantenkontakt, email = eine veraltete reine E-Mail-Berechtigung.

Zulässige Werte: "client" "contact" "email"
participant_count
integer

Anzahl der aktiven Teilnehmer (Personal und Mandant).

message_count
integer

Anzahl der nicht gelöschten Nachrichten im Thread.

last_message_at
string <date-time> | null

Wann die neueste nicht gelöschte Nachricht gepostet wurde, ISO 8601 in der Kanzleizone; null bei einem leeren Thread.

unread_for_me
integer | null

Ungelesene Nachrichten für die eigene Teilnehmerzeile des handelnden Benutzers; null, wenn der handelnde Benutzer kein Teilnehmer dieses Portals ist.

created_at
string <date-time> | null
paginationerforderlich
object
Felder von pagination
limiterforderlich
integer
offseterforderlich
integer
totalerforderlich
integer

Gesamtanzahl der übereinstimmenden Datensätze.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/portals?matter_id=1234&limit=25' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": [
    {
      "id": 57,
      "matter": {
        "id": 1234,
        "case_number": "string"
      },
      "client_participants": [
        {
          "name": "string",
          "kind": "client"
        }
      ],
      "participant_count": 0,
      "message_count": 0,
      "last_message_at": "2026-10-30T09:15:00+01:00",
      "unread_for_me": 0,
      "created_at": "2026-10-30T09:15:00+01:00"
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 1
  }
}

Portalnachrichten auflisten

GET /api/agent/portals/{id}/messages

Listet die Nachrichten eines Mandantenportal-Threads auf, älteste zuerst, mit dem Autor (Personal oder Mandant), dem Klartext-Inhalt und etwaigen Anhang-Metadaten. Antwortet mit 404, wenn das Portal nicht existiert oder nicht zugänglich ist. Markiert Nachrichten nicht als gelesen.

Bereich
portal:read
Flowyer-Berechtigung
client-portal:read, cases:read

Pfadparameter

iderforderlich
integer>= 1

Portal-id (muss zugänglich sein).

Beispiel: 57

Abfrageparameter

include_deleted
boolean

Gelöschte Nachrichten einbeziehen (ihr Inhalt ist geleert). Standard false.

Standard: false
limit
integer>= 1<= 100

Seitengröße, 1-100. Standard 25.

Standard: 25
Beispiel: 25
offset
integer>= 0

Anzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.

Standard: 0
Beispiel: 0

Antworten

200

OK.

dataerforderlich
object[]
Felder von data
id
integer

portal_messages.id.

Beispiel: 8012
author
object

Wer die Nachricht geschrieben hat.

Felder von author
participant_id
integer | null
name
string | null
kind
string

staff = ein Kollege der Kanzlei, client = der externe Mandant.

Zulässige Werte: "staff" "client"
direction
string

from_firm = ein Autor aus dem Personal, from_client = der externe Mandant.

Zulässige Werte: "from_firm" "from_client"
body
string

Die Nachricht als Klartext (<br> in Zeilenumbrüche dekodiert). Leerer String bei einer gelöschten Nachricht.

attachment
object | null

Anhang-Metadaten, wenn die Nachricht ein Dokument hat; das Herunterladen liegt außerhalb des Umfangs. Null, wenn keiner vorhanden ist.

Felder von attachment
portal_document_id
integer
file_name
string
is_deleted
boolean
deleted_at
string <date-time> | null
created_at
string <date-time> | null

Wann die Nachricht gepostet wurde, ISO 8601 in der Kanzleizone.

paginationerforderlich
object
Felder von pagination
limiterforderlich
integer
offseterforderlich
integer
totalerforderlich
integer

Gesamtanzahl der übereinstimmenden Datensätze.

400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl 'https://www.flowyer.de/api/agent/portals/57/messages?limit=25' \
  -H 'Authorization: Bearer flw_...'

Antwortbeispiele

{
  "data": [
    {
      "id": 8012,
      "author": {
        "participant_id": 1234,
        "name": "string",
        "kind": "staff"
      },
      "direction": "from_firm",
      "body": "string",
      "attachment": {
        "portal_document_id": 1234,
        "file_name": "string"
      },
      "is_deleted": true,
      "deleted_at": "2026-10-30T09:15:00+01:00",
      "created_at": "2026-10-30T09:15:00+01:00"
    }
  ],
  "pagination": {
    "limit": 25,
    "offset": 0,
    "total": 1
  }
}

Im Mandantenportal antworten

POST /api/agent/portals/{id}/messages

Postet eine Antwort des Personals in einem Mandantenportal-Thread. Der Mandant sieht sie im Portal und wird per E-Mail benachrichtigt (ein signierter Magic-Link-Hinweis, nicht der Text); Kollegen erhalten einen In-App-Hinweis. Klartext, beim Speichern maskiert. 404, wenn das Portal nicht zugänglich ist.

Bereich
portal:reply
Flowyer-Berechtigung
client-portal:read, cases:read

Pfadparameter

iderforderlich
integer>= 1

Portal-id, in der geantwortet werden soll (muss zugänglich sein).

Beispiel: 57

Header-Parameter

Idempotency-Key
stringhöchstens 128 Zeichen

Bei jeder Erstellung empfohlen. Ein eindeutiger Wert pro logischer Operation (z. B. eine UUID). Derselbe Wert gibt denselben Datensatz zurück: Ein erneuter Versuch damit gibt den beim ersten Mal erstellten Datensatz zurück, anstatt einen zweiten zu erstellen. Unterschiedliche Werte erstellen immer unterschiedliche Datensätze. Clients, die keine Header senden können, können denselben Wert im Body-Feld idempotency_key übergeben. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$

Anfragetext application/json

bodyerforderlich
stringmindestens 1 Zeichenhöchstens 20000 Zeichen

Die Antwort, Klartext. Spitze Klammern werden akzeptiert und beim Speichern maskiert. Höchstens 20000 Zeichen.

Beispiel: "Tisztelt Ügyfelünk! A beadványt ma benyújtottuk."
idempotency_key
stringhöchstens 128 Zeichen

Dieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.

Muster: ^[A-Za-z0-9_\-:.]{1,128}$
Beispiel: "b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"

Antworten

201

Erstellt.

dataerforderlich
object
Felder von data
message
object

Die gepostete Antwort.

Felder von message
id
integer
Beispiel: 8012
author
object

Der handelnde Personalbenutzer, der die Antwort gepostet hat.

Felder von author
participant_id
integer | null
name
string | null
kind
string

staff = ein Kollege der Kanzlei, client = der externe Mandant.

Zulässige Werte: "staff" "client"
direction
string

Immer "from_firm" bei einer über diese API geposteten Antwort.

Zulässige Werte: "from_firm" "from_client"
body
string

Die gepostete Nachricht als Klartext.

created_at
string <date-time> | null
portal
object

Das Portal (der Thread) und seine Akte, in dem die Antwort gepostet wurde.

Felder von portal
id
integer
matter
object
Felder von matter
id
integer
case_number
string
created_via_api
object | null

Herkunft der über diese API erstellten Nachricht.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
created
boolean
Wert: true
200

Idempotentes Replay: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage innerhalb von 120 Sekunden) hat den Datensatz bereits erstellt; er wird erneut zurückgegeben, es wurde nichts Neues erstellt.

dataerforderlich
object
Felder von data
message
object

Die gepostete Antwort.

Felder von message
id
integer
Beispiel: 8012
author
object

Der handelnde Personalbenutzer, der die Antwort gepostet hat.

Felder von author
participant_id
integer | null
name
string | null
kind
string

staff = ein Kollege der Kanzlei, client = der externe Mandant.

Zulässige Werte: "staff" "client"
direction
string

Immer "from_firm" bei einer über diese API geposteten Antwort.

Zulässige Werte: "from_firm" "from_client"
body
string

Die gepostete Nachricht als Klartext.

created_at
string <date-time> | null
portal
object

Das Portal (der Thread) und seine Akte, in dem die Antwort gepostet wurde.

Felder von portal
id
integer
matter
object
Felder von matter
id
integer
case_number
string
created_via_api
object | null

Herkunft der über diese API erstellten Nachricht.

Felder von created_via_api
kind
string

"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.

Zulässige Werte: "key" "oauth"
key_id
integer

ID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.

key_name
string

Name, den der Benutzer dem API-Schlüssel gegeben hat, z. B. "Grok integration", oder der Name der verbundenen App bei kind "oauth", z. B. "Claude".

user_id
integer
user
string | null
at
string <date-time> | null
created
boolean
Wert: false
idempotent_replay
boolean
Wert: true
400

Fehlerhafte Anfrage: ungültiger JSON-Body, falscher Host (verwenden Sie den www.-Host) oder eine nicht lesbare Anfrage.

401

Der Schlüssel fehlt, ist ungültig, widerrufen oder abgelaufen, oder sein Benutzer ist nicht mehr aktiv.

403

Fehlender Scope (scope_missing), fehlende Flowyer-Modulberechtigung (module_forbidden), API für die Kanzlei deaktiviert, Lizenz abgelaufen oder Kanzlei archiviert.

404

Unbekannter Endpunkt, oder der Datensatz existiert nicht / ist für den Benutzer nicht sichtbar. replay_not_visible: Dieser Idempotency-Key (oder, ohne Schlüssel, eine identische Anfrage) hat den Datensatz bereits erstellt (details.record_id), aber dieser wurde inzwischen gelöscht oder ist für den Benutzer nicht sichtbar; es wurde nichts Neues erstellt, erstellen Sie ihn nicht erneut.

405

Methode wird für diesen Pfad nicht angeboten (DELETE und PUT nie; PATCH nur dort, wo eine Aktualisierung angeboten wird).

409

Der Idempotency-Key wurde für einen anderen Ressourcentyp verwendet (idempotency_key_reused), oder, ohne Schlüssel, eine identische Anfrage wird gerade verarbeitet (duplicate_in_progress; versuchen Sie es in Kürze erneut).

413

Der Request-Body ist zu groß (request_too_large).

422

Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.

429

Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.

503

Die Kanzlei ist vorübergehend nicht verfügbar (Wartung oder Einrichtung läuft); Retry-After gibt an, wann ein erneuter Versuch möglich ist.

default

Jeder andere Fehler, im selben Envelope.

Anfragebeispiele

curl -X POST 'https://www.flowyer.de/api/agent/portals/57/messages' \
  -H 'Authorization: Bearer flw_...' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 7f3a9c21-1b2c-4d5e-8f90-0a1b2c3d4e5f' \
  -d '{
  "body": "Tisztelt Ügyfelünk! A beadványt ma benyújtottuk."
}'

Antwortbeispiele

{
  "data": {
    "message": {
      "id": 8012,
      "author": {
        "participant_id": 1234,
        "name": "string",
        "kind": "staff"
      },
      "direction": "from_firm",
      "body": "string",
      "created_at": "2026-10-30T09:15:00+01:00",
      "portal": {
        "id": 1234,
        "matter": {
          "id": 1234,
          "case_number": "string"
        }
      },
      "created_via_api": {
        "kind": "key",
        "key_id": 1234,
        "key_name": "string",
        "user_id": 1234,
        "user": "string",
        "at": "2026-10-30T09:15:00+01:00"
      }
    }
  },
  "created": true
}