Flowyer API-Referenz
API-Version: 90bdda12e80e
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.
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.
| HTTP | error | Bedeutung |
|---|---|---|
| 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
/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.
dataerforderlichFelder von data
userFelder von user
idnamelanguageofficeFelder von office
idnametimezoneIANA-Zone, in der die API Zeitstempel liest und schreibt, z. B. Europe/Budapest.
currency_idDie Währung der Kanzlei (Flowyer-Währungs-ID): costs.create bucht darin, wenn currency_id weggelassen wird.
currencyISO-Code der Währung der Kanzlei, z. B. HUF, EUR, RON.
keyFelder von key
idnameName, den der Benutzer diesem Schlüssel gegeben hat, oder die verbundene App bei einem OAuth-Token.
kind"key" = ein statischer API-Schlüssel, "oauth" = ein OAuth 2.1 Access-Token.
"key" "oauth" prefixErste Zeichen eines statischen Schlüssels, nur zur Identifikation; null bei OAuth.
expires_atlast_used_atscopesScopes dieses Credentials, z. B. "matters:read". Eine Operation, deren Scope fehlt, antwortet mit 403.
available_scopesAlle Scopes, die der Schlüsselinhaber in Flowyer aktivieren könnte.
limitsFelder von limits
requests_per_minutelist_max_limitchannelWie die Anfrage Flowyer erreicht hat.
"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.
details.fields benennt ihn.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/me", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/me",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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"
}
}
{
"error": "invalid_key",
"message": "The API key is not valid.",
"message_localized": "Der API-Schlüssel ist ungültig.",
"locale": "de",
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Kollegen
Kollegen auflisten
/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.
Abfrageparameter
qNachzuschlagender Name eines Kollegen, wie gehört oder diktiert, in beliebiger Wortreihenfolge. Lassen Sie ihn weg, um alle aktiven Kollegen aufzulisten.
"Nagy Péter"limitMaximale Anzahl zurückzugebender Kollegen (Standard 200).
200Antworten
200
OK.
dataerforderlichFelder von data
statusNur 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.
"exact" "similar" "none" colleaguesAktive Kollegen, mit q bester Treffer zuerst, andernfalls nach Namen.
Felder von colleagues
idBenutzer-ID: übergeben Sie sie als assigned_to_user_id / responsible_user_id.
nameAnzeigename, wie ihn Flowyer darstellt (ggf. mit dem Titel).
titleNamenszusatz wie "Dr." oder null.
totalWie viele Kollegen übereinstimmten (ohne q alle aktiven Kollegen), bevor die Liste auf limit gekürzt wurde.
truncatedtrue, 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/colleagues?q=Nagy%20P%C3%A9ter", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/colleagues?q=Nagy%20P%C3%A9ter",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
Antwortbeispiele
{
"data": {
"status": "exact",
"colleagues": [
{
"id": 1234,
"name": "string",
"title": "string"
}
],
"total": 1,
"truncated": true
}
}
{
"error": "scope_missing",
"message": "This API key does not have the \"colleagues:read\" 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 \"colleagues:read\" 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": "colleagues:read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Akten
Angelegenheiten auflisten
/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.
Abfrageparameter
qVolltextsuche 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".
"2026/0025"client_idNur Angelegenheiten dieses Mandanten.
512responsible_user_idNur 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_sinceNur Angelegenheiten, die zu diesem Zeitpunkt oder danach geändert wurden (ISO 8601).
"2026-10-01T00:00:00+02:00"include_archivedArchivierte Angelegenheiten einbeziehen.
falselimitSeitengröße, 1-100. Standard 25.
2525offsetAnzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.
00Antworten
200
OK.
dataerforderlichFelder von data
idAngelegenheits-ID. Verwenden Sie sie an anderer Stelle als matter_id.
1234case_numberAktenzeichen, wie es in Flowyer angezeigt wird, im Nummerierungsschema der Kanzlei.
"2026/0025"subject"Kovács Kft. v. Nagy Bt. - contract dispute"status"active" "archived" case_type_idcase_typeLokalisierter Name des Falltyps.
responsible_user_idresponsibleAnzeigename des verantwortlichen Anwalts.
clientsMandanten (Auftraggeber) der Angelegenheit.
Felder von clients
idnamestarted_onrestrictedTrue, wenn nur die verantwortlichen Anwälte die Angelegenheit sehen dürfen (Chinese Wall).
created_atupdated_atcreated_via_apiVorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratpaginationerforderlichFelder von pagination
limiterforderlichoffseterforderlichtotalerforderlichGesamtanzahl 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/matters?q=2026%2F0025&client_id=512&updated_since=2026-10-01T00%3A00%3A00%2B02%3A00", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/matters?q=2026%2F0025&client_id=512&updated_since=2026-10-01T00%3A00%3A00%2B02%3A00",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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
}
}
{
"error": "scope_missing",
"message": "This API key does not have the \"matters:read\" 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 \"matters:read\" 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": "matters:read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Angelegenheit anhand des Namens auflösen
/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.
Abfrageparameter
nameerforderlichBetreff der Angelegenheit oder Mandantenname zum Nachschlagen, wie gehört oder diktiert.
"ingatlan adásvétel"client_idNur Angelegenheiten dieses Mandanten (verwenden Sie dies, nachdem clients.resolve einen exakten Mandanten zurückgegeben hat).
limitMaximale Anzahl zurückzugebender Kandidaten (Standard 5).
5Antworten
200
OK.
dataerforderlichFelder von data
statusexact = 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.
"exact" "similar" "none" mattersKandidaten-Angelegenheiten, bester Treffer zuerst.
Felder von matters
idAngelegenheits-ID. Verwenden Sie sie an anderer Stelle als matter_id.
1234case_numberAktenzeichen, wie es in Flowyer angezeigt wird, im Nummerierungsschema der Kanzlei.
"2026/0025"subject"Kovács Kft. v. Nagy Bt. - contract dispute"status"active" "archived" case_type_idcase_typeLokalisierter Name des Falltyps.
responsible_user_idresponsibleAnzeigename des verantwortlichen Anwalts.
clientsMandanten (Auftraggeber) der Angelegenheit.
Felder von clients
idnamestarted_onrestrictedTrue, wenn nur die verantwortlichen Anwälte die Angelegenheit sehen dürfen (Chinese Wall).
created_atupdated_atcreated_via_apiVorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduserattotalWie viele Angelegenheiten übereingestimmt haben, bevor die Liste auf limit gekürzt wurde.
truncatedTrue, 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/matters/resolve?name=ingatlan%20ad%C3%A1sv%C3%A9tel", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/matters/resolve?name=ingatlan%20ad%C3%A1sv%C3%A9tel",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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
}
}
{
"error": "scope_missing",
"message": "This API key does not have the \"matters:read\" 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 \"matters:read\" 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": "matters:read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Angelegenheit abrufen
/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.
Pfadparameter
iderforderlichAngelegenheits-ID.
1234Antworten
200
OK.
dataerforderlichFelder von data
idAngelegenheits-ID. Verwenden Sie sie an anderer Stelle als matter_id.
1234case_numberAktenzeichen, wie es in Flowyer angezeigt wird, im Nummerierungsschema der Kanzlei.
"2026/0025"subject"Kovács Kft. v. Nagy Bt. - contract dispute"status"active" "archived" case_type_idcase_typeLokalisierter Name des Falltyps.
responsible_user_idresponsibleAnzeigename des verantwortlichen Anwalts.
clientsMandanten (Auftraggeber) der Angelegenheit.
Felder von clients
idnamestarted_onrestrictedTrue, wenn nur die verantwortlichen Anwälte die Angelegenheit sehen dürfen (Chinese Wall).
created_atupdated_atcreated_via_apiVorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratdescriptionlitigiousarchived_atTag, 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/matters/1234", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/matters/1234",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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"
}
}
{
"error": "matter_not_visible",
"message": "The matter 1234 does not exist, is archived, or is not visible to the user who owns this API key.",
"message_localized": "Die Akte 1234 existiert nicht, ist archiviert oder für den Inhaber dieses API-Schlüssels nicht sichtbar.",
"locale": "de",
"details": {
"matter_id": 1234
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Angelegenheit erstellen
/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.
Header-Parameter
Idempotency-KeyBei 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.
^[A-Za-z0-9_\-:.]{1,128}$Anfragetext application/json
subjecterforderlichKurztitel der Angelegenheit, wie er in Listen erscheint. Klartext; "<" und ">" sind nicht erlaubt.
^[^<>]*$"Kovács Kft. v. Nagy Bt. - contract dispute"case_type_iderforderlichFalltyp-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_idserforderlichIDs der Mandanten (Auftraggeber). Mindestens einer, höchstens 20.
[
512
]responsible_user_idVerantwortlicher Anwalt: eine Benutzer-ID aus colleagues.list (schlagen Sie einen diktierten Namen dort nach). Standard: der Benutzer hinter dem Schlüssel.
started_onStartdatum, YYYY-MM-DD. Standard: heute.
"2026-10-29"descriptionLängere Beschreibung, Klartext.
main_case_numberDas eigene Hauptaktenzeichen der Kanzlei für die Angelegenheit. Erforderlich, wenn das Nummerierungsschema der Kanzlei es verwendet (andernfalls antwortet die API mit 422).
restrictedtrue = nur die verantwortlichen Anwälte dürfen die Angelegenheit sehen (Chinese Wall).
falseidempotency_keyDieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.
^[A-Za-z0-9_\-:.]{1,128}$"b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"Antworten
201
Erstellt.
dataerforderlichFelder von data
idAngelegenheits-ID. Verwenden Sie sie an anderer Stelle als matter_id.
1234case_numberAktenzeichen, wie es in Flowyer angezeigt wird, im Nummerierungsschema der Kanzlei.
"2026/0025"subject"Kovács Kft. v. Nagy Bt. - contract dispute"status"active" "archived" case_type_idcase_typeLokalisierter Name des Falltyps.
responsible_user_idresponsibleAnzeigename des verantwortlichen Anwalts.
clientsMandanten (Auftraggeber) der Angelegenheit.
Felder von clients
idnamestarted_onrestrictedTrue, wenn nur die verantwortlichen Anwälte die Angelegenheit sehen dürfen (Chinese Wall).
created_atupdated_atcreated_via_apiVorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratdescriptionlitigiousarchived_atTag, an dem die Angelegenheit archiviert wurde, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.
createdtrue
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.
dataerforderlichFelder von data
idAngelegenheits-ID. Verwenden Sie sie an anderer Stelle als matter_id.
1234case_numberAktenzeichen, wie es in Flowyer angezeigt wird, im Nummerierungsschema der Kanzlei.
"2026/0025"subject"Kovács Kft. v. Nagy Bt. - contract dispute"status"active" "archived" case_type_idcase_typeLokalisierter Name des Falltyps.
responsible_user_idresponsibleAnzeigename des verantwortlichen Anwalts.
clientsMandanten (Auftraggeber) der Angelegenheit.
Felder von clients
idnamestarted_onrestrictedTrue, wenn nur die verantwortlichen Anwälte die Angelegenheit sehen dürfen (Chinese Wall).
created_atupdated_atcreated_via_apiVorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratdescriptionlitigiousarchived_atTag, an dem die Angelegenheit archiviert wurde, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.
createdfalseidempotent_replaytrue
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.
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/matters", {
method: "POST",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"subject": "Kovács Kft. v. Nagy Bt. - contract dispute",
"case_type_id": 1234,
"client_ids": [
512
],
"started_on": "2026-10-29"
}),
});
const result = await response.json();
import uuid
import requests
response = requests.post(
"https://www.flowyer.de/api/agent/matters",
headers={
"Authorization": "Bearer flw_...",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"subject": "Kovács Kft. v. Nagy Bt. - contract dispute",
"case_type_id": 1234,
"client_ids": [
512,
],
"started_on": "2026-10-29",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"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": false,
"idempotent_replay": true
}
{
"error": "validation_failed",
"message": "The request is invalid. See \"details.fields\" for the field-level errors.",
"message_localized": "Die Anfrage ist ungültig. Die Fehler je Feld stehen in \"details.fields\".",
"locale": "de",
"details": {
"fields": {
"subject": [
"Das Feld subject ist erforderlich."
]
}
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Angelegenheit aktualisieren
/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.
Pfadparameter
iderforderlichID des zu ändernden Datensatzes.
Anfragetext application/json
expected_updated_atDer 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.
subjectKurztitel 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.
descriptionLängere Beschreibung, Klartext, höchstens 10000 Zeichen als NEUER Wert; eine längere gespeicherte Beschreibung kann unverändert zurückgegeben werden.
started_onStartdatum, YYYY-MM-DD. null behält den aktuellen Wert bei (ein Startdatum kann nicht gelöscht werden).
litigiousOb die Angelegenheit streitig ist.
responsible_user_idNeuer 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.
dataerforderlichFelder von data
idAngelegenheits-ID. Verwenden Sie sie an anderer Stelle als matter_id.
1234case_numberAktenzeichen, wie es in Flowyer angezeigt wird, im Nummerierungsschema der Kanzlei.
"2026/0025"subject"Kovács Kft. v. Nagy Bt. - contract dispute"status"active" "archived" case_type_idcase_typeLokalisierter Name des Falltyps.
responsible_user_idresponsibleAnzeigename des verantwortlichen Anwalts.
clientsMandanten (Auftraggeber) der Angelegenheit.
Felder von clients
idnamestarted_onrestrictedTrue, wenn nur die verantwortlichen Anwälte die Angelegenheit sehen dürfen (Chinese Wall).
created_atupdated_atcreated_via_apiVorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratdescriptionlitigiousarchived_atTag, an dem die Angelegenheit archiviert wurde, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.
updatedtrue
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/matters/1234", {
method: "PATCH",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"subject": "string"
}),
});
const result = await response.json();
import requests
response = requests.patch(
"https://www.flowyer.de/api/agent/matters/1234",
headers={
"Authorization": "Bearer flw_...",
},
json={
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"subject": "string",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"error": "record_conflict",
"message": "The record changed since you read it (someone edited it). Read it again and retry with the new updated_at.",
"message_localized": "Der Datensatz hat sich seit dem Lesen geändert (jemand hat ihn bearbeitet). Lesen Sie ihn erneut und wiederholen Sie die Anfrage mit dem neuen updated_at.",
"locale": "de",
"details": {
"current_updated_at": "2026-10-30T10:42:05+01:00",
"reason": "modified_since_read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Verantwortliche einer Akte auflisten
/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.
Pfadparameter
iderforderlichAngelegenheits-ID.
1234Abfrageparameter
limitSeitengröße, 1-100. Standard 25.
2525offsetAnzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.
00Antworten
200
OK.
dataerforderlichFelder von data
type"user" = ein einzelner Kollege; "workgroup" = jedes Mitglied einer Arbeitsgruppe.
"user" "workgroup" user_idBenutzer-id des Kollegen bei einem "user"-Eintrag (übergeben Sie sie als user_id an matters.responsibles.add); null bei einer Arbeitsgruppe.
workgroup_idArbeitsgruppen-id bei einem "workgroup"-Eintrag; null bei einem einzelnen Kollegen. Verantwortliche Arbeitsgruppen werden in Flowyer verwaltet.
nameAnzeigename des Kollegen oder der Arbeitsgruppe.
paginationerforderlichFelder von pagination
limiterforderlichoffseterforderlichtotalerforderlichGesamtanzahl 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/matters/1234/responsibles?limit=25", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/matters/1234/responsibles?limit=25",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
Antwortbeispiele
{
"data": [
{
"type": "user",
"user_id": 1234,
"workgroup_id": 1234,
"name": "string"
}
],
"pagination": {
"limit": 25,
"offset": 0,
"total": 1
}
}
{
"error": "matter_not_visible",
"message": "The matter 1234 does not exist, is archived, or is not visible to the user who owns this API key.",
"message_localized": "Die Akte 1234 existiert nicht, ist archiviert oder für den Inhaber dieses API-Schlüssels nicht sichtbar.",
"locale": "de",
"details": {
"matter_id": 1234
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Verantwortlichen zu einer Akte hinzufügen
/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.
Pfadparameter
iderforderlichAkte, für die der Kollege verantwortlich wird (muss sichtbar sein).
1234Anfragetext application/json
user_iderforderlichHinzuzufügender Kollege: eine Benutzer-id aus colleagues.list. Das Hinzufügen gibt ihm Zugriff auf die Akte.
42Antworten
200
OK.
dataerforderlichFelder von data
user_idDer Kollege, der nun für die Akte verantwortlich ist.
nameAnzeigename des Kollegen.
already_responsibleTrue, wenn der Kollege bereits ein Verantwortlicher der Akte war (nichts hat sich geändert).
notifiedTrue, 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.
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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
}'
const response = await fetch("https://www.flowyer.de/api/agent/matters/1234/responsibles", {
method: "POST",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
"user_id": 42
}),
});
const result = await response.json();
import requests
response = requests.post(
"https://www.flowyer.de/api/agent/matters/1234/responsibles",
headers={
"Authorization": "Bearer flw_...",
},
json={
"user_id": 42,
},
timeout=30,
)
print(response.status_code, response.json())
{
"user_id": 42
}
Antwortbeispiele
{
"data": {
"user_id": 1234,
"name": "string",
"already_responsible": true,
"notified": true
}
}
{
"error": "validation_failed",
"message": "The request is invalid. See \"details.fields\" for the field-level errors.",
"message_localized": "Die Anfrage ist ungültig. Die Fehler je Feld stehen in \"details.fields\".",
"locale": "de",
"details": {
"fields": {
"user_id": [
"Das Feld user id ist erforderlich."
]
}
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Mandanten
Mandanten auflisten
/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.
Abfrageparameter
qSucht im Namen (Akzente und Groß-/Kleinschreibung werden ignoriert), in der E-Mail-Adresse und der Steuernummer.
"Kovács"is_persontrue = nur natürliche Personen, false = nur Unternehmen.
include_archivedfalselimitSeitengröße, 1-100. Standard 25.
2525offsetAnzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.
00Antworten
200
OK.
dataerforderlichFelder von data
idMandanten-ID. Verwenden Sie sie anderenorts als client_id.
512name"Kovács Kft."is_persontrue bei einer natürlichen Person, false bei einem Unternehmen.
emailphonearchivedrecorded_by_user_idrecorded_bycreated_atupdated_atcreated_via_apiFelder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratpaginationerforderlichFelder von pagination
limiterforderlichoffseterforderlichtotalerforderlichGesamtanzahl 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/clients?q=Kov%C3%A1cs&limit=25", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/clients?q=Kov%C3%A1cs&limit=25",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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
}
}
{
"error": "scope_missing",
"message": "This API key does not have the \"clients:read\" 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:read\" 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:read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Mandanten anhand des Namens auflösen
/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.
Abfrageparameter
nameerforderlichNachzuschlagender Mandantenname, wie gehört oder diktiert.
"Józsi ingatlan"limitMaximale Anzahl zurückzugebender Kandidaten (Standard 5).
5Antworten
200
OK.
dataerforderlichFelder von data
statusexact = 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.
"exact" "similar" "none" matchesMögliche Mandanten, bester Treffer zuerst.
Felder von matches
idMandanten-ID. Verwenden Sie sie anderenorts als client_id.
512name"Kovács Kft."is_persontrue bei einer natürlichen Person, false bei einem Unternehmen.
emailphonearchivedrecorded_by_user_idrecorded_bycreated_atupdated_atcreated_via_apiFelder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduserattotalWie viele Mandanten übereinstimmten, bevor die Liste auf limit gekürzt wurde.
truncatedtrue, 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/clients/resolve?name=J%C3%B3zsi%20ingatlan", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/clients/resolve?name=J%C3%B3zsi%20ingatlan",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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
}
}
{
"error": "scope_missing",
"message": "This API key does not have the \"clients:read\" 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:read\" 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:read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Mandanten abrufen
/api/agent/clients/{id}
Gibt einen Mandanten mit Anschrift und Registrierungsdaten zurück. Ausweisnummern und Gebühreneinstellungen werden nie zurückgegeben.
Pfadparameter
iderforderlichMandanten-ID.
512Antworten
200
OK.
dataerforderlichFelder von data
idMandanten-ID. Verwenden Sie sie anderenorts als client_id.
512name"Kovács Kft."is_persontrue bei einer natürlichen Person, false bei einem Unternehmen.
emailphonearchivedrecorded_by_user_idrecorded_bycreated_atupdated_atcreated_via_apiFelder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduserataddressFelder von address
zipcitystreetmailing_addressFelder von mailing_address
zipcitystreettax_numberNur bei Unternehmen; null bei einer natürlichen Person.
company_registration_numberNur bei Unternehmen; null bei einer natürlichen Person.
representative_nameNur bei Unternehmen; null bei einer natürlichen Person.
representative_positionNur bei Unternehmen; null bei einer natürlichen Person.
main_activityHaupttätigkeitsbereich. Nur bei Unternehmen; null bei einer natürlichen Person.
nationality_countrynote
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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/clients/512", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/clients/512",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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"
}
}
{
"error": "not_found",
"message": "The record was not found, or it is not visible to the user who owns this API key.",
"message_localized": "Der Datensatz wurde nicht gefunden oder ist für den Inhaber dieses API-Schlüssels nicht sichtbar.",
"locale": "de",
"details": {
"client_id": 512
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Mandanten anlegen
/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.
Header-Parameter
Idempotency-KeyBei 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.
^[A-Za-z0-9_\-:.]{1,128}$Anfragetext application/json
nameerforderlichVollständiger Name der Person oder Name des Unternehmens. Klartext; "<" und ">" sind nicht zulässig.
^[^<>]*$"Kovács Kft."is_persontrue bei einer natürlichen Person, false (Standard) bei einem Unternehmen.
falseemail"info@kovacskft.hu"phone"+36 1 234 5678"addressGemeldete Anschrift / Wohnanschrift.
Felder von address
zipcitystreetmailing_addressFelder von mailing_address
zipcitystreettax_numberSteuernummer des Unternehmens (nur bei Unternehmen).
"12345678-2-41"company_registration_numberHandelsregisternummer des Unternehmens (nur bei Unternehmen).
"01-09-123456"representative_nameNur bei Unternehmen.
representative_positionNur bei Unternehmen.
main_activityHaupttätigkeitsbereich (nur bei Unternehmen).
nationality_countrynoteallow_duplicate_nameAuch dann anlegen, wenn bereits ein aktiver Mandant mit demselben Namen existiert.
falseidempotency_keyDieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.
^[A-Za-z0-9_\-:.]{1,128}$"b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"Antworten
201
Erstellt.
dataerforderlichFelder von data
idMandanten-ID. Verwenden Sie sie anderenorts als client_id.
512name"Kovács Kft."is_persontrue bei einer natürlichen Person, false bei einem Unternehmen.
emailphonearchivedrecorded_by_user_idrecorded_bycreated_atupdated_atcreated_via_apiFelder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduserataddressFelder von address
zipcitystreetmailing_addressFelder von mailing_address
zipcitystreettax_numberNur bei Unternehmen; null bei einer natürlichen Person.
company_registration_numberNur bei Unternehmen; null bei einer natürlichen Person.
representative_nameNur bei Unternehmen; null bei einer natürlichen Person.
representative_positionNur bei Unternehmen; null bei einer natürlichen Person.
main_activityHaupttätigkeitsbereich. Nur bei Unternehmen; null bei einer natürlichen Person.
nationality_countrynotecreatedtrue
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.
dataerforderlichFelder von data
idMandanten-ID. Verwenden Sie sie anderenorts als client_id.
512name"Kovács Kft."is_persontrue bei einer natürlichen Person, false bei einem Unternehmen.
emailphonearchivedrecorded_by_user_idrecorded_bycreated_atupdated_atcreated_via_apiFelder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduserataddressFelder von address
zipcitystreetmailing_addressFelder von mailing_address
zipcitystreettax_numberNur bei Unternehmen; null bei einer natürlichen Person.
company_registration_numberNur bei Unternehmen; null bei einer natürlichen Person.
representative_nameNur bei Unternehmen; null bei einer natürlichen Person.
representative_positionNur bei Unternehmen; null bei einer natürlichen Person.
main_activityHaupttätigkeitsbereich. Nur bei Unternehmen; null bei einer natürlichen Person.
nationality_countrynotecreatedfalseidempotent_replaytrue
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.
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/clients", {
method: "POST",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"name": "Kovács Kft.",
"email": "info@kovacskft.hu",
"phone": "+36 1 234 5678",
"tax_number": "12345678-2-41",
"company_registration_number": "01-09-123456"
}),
});
const result = await response.json();
import uuid
import requests
response = requests.post(
"https://www.flowyer.de/api/agent/clients",
headers={
"Authorization": "Bearer flw_...",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"name": "Kovács Kft.",
"email": "info@kovacskft.hu",
"phone": "+36 1 234 5678",
"tax_number": "12345678-2-41",
"company_registration_number": "01-09-123456",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"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": false,
"idempotent_replay": true
}
{
"error": "validation_failed",
"message": "The request is invalid. See \"details.fields\" for the field-level errors.",
"message_localized": "Die Anfrage ist ungültig. Die Fehler je Feld stehen in \"details.fields\".",
"locale": "de",
"details": {
"fields": {
"name": [
"Das Feld name ist erforderlich."
]
}
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Mandanten aktualisieren
/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.
Pfadparameter
iderforderlichID des zu ändernden Datensatzes.
Anfragetext application/json
expected_updated_atDer 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.
nameVollstä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.
emailphoneaddressGemeldete Anschrift / Wohnanschrift.
Felder von address
zipcitystreetmailing_addressFelder von mailing_address
zipcitystreetrepresentative_nameNur bei Unternehmen.
representative_positionNur bei Unternehmen.
main_activityHaupttätigkeitsbereich (nur bei Unternehmen).
nationality_countrynoteFreitextnotiz, 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.
dataerforderlichFelder von data
idMandanten-ID. Verwenden Sie sie anderenorts als client_id.
512name"Kovács Kft."is_persontrue bei einer natürlichen Person, false bei einem Unternehmen.
emailphonearchivedrecorded_by_user_idrecorded_bycreated_atupdated_atcreated_via_apiFelder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduserataddressFelder von address
zipcitystreetmailing_addressFelder von mailing_address
zipcitystreettax_numberNur bei Unternehmen; null bei einer natürlichen Person.
company_registration_numberNur bei Unternehmen; null bei einer natürlichen Person.
representative_nameNur bei Unternehmen; null bei einer natürlichen Person.
representative_positionNur bei Unternehmen; null bei einer natürlichen Person.
main_activityHaupttätigkeitsbereich. Nur bei Unternehmen; null bei einer natürlichen Person.
nationality_countrynoteupdatedtrue
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/clients/1234", {
method: "PATCH",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"name": "string"
}),
});
const result = await response.json();
import requests
response = requests.patch(
"https://www.flowyer.de/api/agent/clients/1234",
headers={
"Authorization": "Bearer flw_...",
},
json={
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"name": "string",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"error": "record_conflict",
"message": "The record changed since you read it (someone edited it). Read it again and retry with the new updated_at.",
"message_localized": "Der Datensatz hat sich seit dem Lesen geändert (jemand hat ihn bearbeitet). Lesen Sie ihn erneut und wiederholen Sie die Anfrage mit dem neuen updated_at.",
"locale": "de",
"details": {
"current_updated_at": "2026-10-30T10:42:05+01:00",
"reason": "modified_since_read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Aufgaben
Aufgaben auflisten
/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.
Abfrageparameter
statusopen (Standard), closed oder all.
"open" "closed" "all" "open"assigned_to_user_idNur diesem Benutzer zugewiesene Aufgaben (eine Benutzer-ID aus colleagues.list).
matter_idNur Aufgaben dieser Akte.
client_idNur aktenlose Aufgaben dieses Mandanten.
deadline_fromFrist an oder nach diesem Datum.
"2026-11-01"deadline_toFrist an oder vor diesem Datum.
"2026-11-30"limitSeitengröße, 1-100. Standard 25.
2525offsetAnzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.
00Antworten
200
OK.
dataerforderlichFelder von data
id9876subject"Submit the statement of defence"descriptiondeadlineFälligkeitsdatum, YYYY-MM-DD.
"2026-11-15"priority1 = niedrig, 2 = mittel, 3 = hoch; null = nicht gesetzt (eine ältere Aufgabe ohne Priorität).
2status"open" "closed" closed_atTag, an dem die Aufgabe geschlossen wurde, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.
matterDie Akte, zu der die Aufgabe gehört, falls vorhanden.
Felder von matter
idcase_numberclientDer Mandant: der erste Mandant der Akte oder der eigene Mandant der Aufgabe, wenn sie keine Akte hat.
Felder von client
idnameassigned_to_user_idassigned_tocreated_by_user_idcreated_byflag_idcreated_atupdated_atcreated_via_apiFelder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratpaginationerforderlichFelder von pagination
limiterforderlichoffseterforderlichtotalerforderlichGesamtanzahl 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/tasks?deadline_from=2026-11-01&deadline_to=2026-11-30&limit=25", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/tasks?deadline_from=2026-11-01&deadline_to=2026-11-30&limit=25",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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
}
}
{
"error": "scope_missing",
"message": "This API key does not have the \"tasks:read\" 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 \"tasks:read\" 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": "tasks:read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Aufgabe abrufen
/api/agent/tasks/{id}
Gibt eine Aufgabe zurück. Antwortet mit 404, wenn die Aufgabe nicht existiert oder der Benutzer sie nicht sehen darf.
Pfadparameter
iderforderlichAufgaben-ID.
9876Antworten
200
OK.
dataerforderlichFelder von data
id9876subject"Submit the statement of defence"descriptiondeadlineFälligkeitsdatum, YYYY-MM-DD.
"2026-11-15"priority1 = niedrig, 2 = mittel, 3 = hoch; null = nicht gesetzt (eine ältere Aufgabe ohne Priorität).
2status"open" "closed" closed_atTag, an dem die Aufgabe geschlossen wurde, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.
matterDie Akte, zu der die Aufgabe gehört, falls vorhanden.
Felder von matter
idcase_numberclientDer Mandant: der erste Mandant der Akte oder der eigene Mandant der Aufgabe, wenn sie keine Akte hat.
Felder von client
idnameassigned_to_user_idassigned_tocreated_by_user_idcreated_byflag_idcreated_atupdated_atcreated_via_apiFelder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduserat
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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/tasks/9876", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/tasks/9876",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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"
}
}
}
{
"error": "not_found",
"message": "The record was not found, or it is not visible to the user who owns this API key.",
"message_localized": "Der Datensatz wurde nicht gefunden oder ist für den Inhaber dieses API-Schlüssels nicht sichtbar.",
"locale": "de",
"details": {
"task_id": 9876
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Aufgabe anlegen
/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.
Header-Parameter
Idempotency-KeyBei 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.
^[A-Za-z0-9_\-:.]{1,128}$Anfragetext application/json
subjecterforderlichWas zu erledigen ist. Klartext.
"Submit the statement of defence"deadlineerforderlichFälligkeitsdatum, YYYY-MM-DD.
"2026-11-15"matter_idAkte, zu der die Aufgabe gehört. Weglassen bei einer aktenlosen Aufgabe.
1234client_idMandant einer aktenlosen Aufgabe. Nicht zusammen mit matter_id zulässig (eine Aufgabe einer Akte übernimmt den Mandanten der Akte).
assigned_to_user_idFü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.
priority1 = niedrig, 2 = mittel (Standard), 3 = hoch.
2descriptionAusführlichere Details, Klartext.
flag_idId eines Aufgaben-Flags (Label) der Kanzlei.
idempotency_keyDieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.
^[A-Za-z0-9_\-:.]{1,128}$"b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"Antworten
201
Erstellt.
dataerforderlichFelder von data
id9876subject"Submit the statement of defence"descriptiondeadlineFälligkeitsdatum, YYYY-MM-DD.
"2026-11-15"priority1 = niedrig, 2 = mittel, 3 = hoch; null = nicht gesetzt (eine ältere Aufgabe ohne Priorität).
2status"open" "closed" closed_atTag, an dem die Aufgabe geschlossen wurde, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.
matterDie Akte, zu der die Aufgabe gehört, falls vorhanden.
Felder von matter
idcase_numberclientDer Mandant: der erste Mandant der Akte oder der eigene Mandant der Aufgabe, wenn sie keine Akte hat.
Felder von client
idnameassigned_to_user_idassigned_tocreated_by_user_idcreated_byflag_idcreated_atupdated_atcreated_via_apiFelder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratcreatedtrue
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.
dataerforderlichFelder von data
id9876subject"Submit the statement of defence"descriptiondeadlineFälligkeitsdatum, YYYY-MM-DD.
"2026-11-15"priority1 = niedrig, 2 = mittel, 3 = hoch; null = nicht gesetzt (eine ältere Aufgabe ohne Priorität).
2status"open" "closed" closed_atTag, an dem die Aufgabe geschlossen wurde, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.
matterDie Akte, zu der die Aufgabe gehört, falls vorhanden.
Felder von matter
idcase_numberclientDer Mandant: der erste Mandant der Akte oder der eigene Mandant der Aufgabe, wenn sie keine Akte hat.
Felder von client
idnameassigned_to_user_idassigned_tocreated_by_user_idcreated_byflag_idcreated_atupdated_atcreated_via_apiFelder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratcreatedfalseidempotent_replaytrue
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.
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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
}'
const response = await fetch("https://www.flowyer.de/api/agent/tasks", {
method: "POST",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"subject": "Submit the statement of defence",
"deadline": "2026-11-15",
"matter_id": 1234
}),
});
const result = await response.json();
import uuid
import requests
response = requests.post(
"https://www.flowyer.de/api/agent/tasks",
headers={
"Authorization": "Bearer flw_...",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"subject": "Submit the statement of defence",
"deadline": "2026-11-15",
"matter_id": 1234,
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"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": false,
"idempotent_replay": true
}
{
"error": "validation_failed",
"message": "The request is invalid. See \"details.fields\" for the field-level errors.",
"message_localized": "Die Anfrage ist ungültig. Die Fehler je Feld stehen in \"details.fields\".",
"locale": "de",
"details": {
"fields": {
"subject": [
"Das Feld subject ist erforderlich."
]
}
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Aufgabe aktualisieren
/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.
Pfadparameter
iderforderlichID des zu ändernden Datensatzes.
Anfragetext application/json
expected_updated_atDer 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.
subjectWas 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.
deadlineFälligkeitsdatum, YYYY-MM-DD. null behält die aktuelle Frist bei (eine Frist kann nicht gelöscht werden).
matter_idVerschiebt 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_idMandant einer aktenlosen Aufgabe. Nur zulässig, wenn die Aufgabe keine Akte hat.
assigned_to_user_idNeuer 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.
priority1 = 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.
descriptionAusführlichere Details, Klartext, als NEUER Wert höchstens 10000 Zeichen; eine längere gespeicherte Beschreibung kann unverändert zurückgesendet werden.
flag_idId eines Aufgaben-Flags (Label) der Kanzlei oder null, um es zu löschen.
Antworten
200
Aktualisiert.
dataerforderlichFelder von data
id9876subject"Submit the statement of defence"descriptiondeadlineFälligkeitsdatum, YYYY-MM-DD.
"2026-11-15"priority1 = niedrig, 2 = mittel, 3 = hoch; null = nicht gesetzt (eine ältere Aufgabe ohne Priorität).
2status"open" "closed" closed_atTag, an dem die Aufgabe geschlossen wurde, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.
matterDie Akte, zu der die Aufgabe gehört, falls vorhanden.
Felder von matter
idcase_numberclientDer Mandant: der erste Mandant der Akte oder der eigene Mandant der Aufgabe, wenn sie keine Akte hat.
Felder von client
idnameassigned_to_user_idassigned_tocreated_by_user_idcreated_byflag_idcreated_atupdated_atcreated_via_apiFelder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratupdatedtrue
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/tasks/1234", {
method: "PATCH",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"subject": "string"
}),
});
const result = await response.json();
import requests
response = requests.patch(
"https://www.flowyer.de/api/agent/tasks/1234",
headers={
"Authorization": "Bearer flw_...",
},
json={
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"subject": "string",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"error": "record_conflict",
"message": "The record changed since you read it (someone edited it). Read it again and retry with the new updated_at.",
"message_localized": "Der Datensatz hat sich seit dem Lesen geändert (jemand hat ihn bearbeitet). Lesen Sie ihn erneut und wiederholen Sie die Anfrage mit dem neuen updated_at.",
"locale": "de",
"details": {
"current_updated_at": "2026-10-30T10:42:05+01:00",
"reason": "modified_since_read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Aufgabe schließen
/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.
Pfadparameter
iderforderlichAufgaben-ID.
9876Anfragetext application/json
minutes_spentAufgewendete Zeit in Minuten. Das Buchen von Zeit benötigt den Scope workhours:create und eine Akte.
minutes_invoiceableAbrechenbare Minuten; auf die Stundenobergrenze der Kanzlei gekürzt.
minutes_normativeNormative Minuten; roh gespeichert, nie gekürzt.
matter_idWeist 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_idDirekter Mandant (Megbízó) für eine ohne Akte geschlossene aktenlose Aufgabe.
Antworten
200
OK.
dataerforderlichFelder von data
id9876subject"Submit the statement of defence"descriptiondeadlineFälligkeitsdatum, YYYY-MM-DD.
"2026-11-15"priority1 = niedrig, 2 = mittel, 3 = hoch; null = nicht gesetzt (eine ältere Aufgabe ohne Priorität).
2status"open" "closed" closed_atTag, an dem die Aufgabe geschlossen wurde, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.
matterDie Akte, zu der die Aufgabe gehört, falls vorhanden.
Felder von matter
idcase_numberclientDer Mandant: der erste Mandant der Akte oder der eigene Mandant der Aufgabe, wenn sie keine Akte hat.
Felder von client
idnameassigned_to_user_idassigned_tocreated_by_user_idcreated_byflag_idcreated_atupdated_atcreated_via_apiFelder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratbooked_workhourDer beim Schließen gebuchte Zeiteintrag oder null, wenn keine Zeit eingegeben wurde.
Felder von booked_workhour
idminutesminutes_invoiceableminutes_normative
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.
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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 '{}'
const response = await fetch("https://www.flowyer.de/api/agent/tasks/9876/close", {
method: "POST",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
},
body: JSON.stringify({}),
});
const result = await response.json();
import requests
response = requests.post(
"https://www.flowyer.de/api/agent/tasks/9876/close",
headers={
"Authorization": "Bearer flw_...",
},
json={},
timeout=30,
)
print(response.status_code, response.json())
{}
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
}
}
}
{
"error": "not_found",
"message": "The record was not found, or it is not visible to the user who owns this API key.",
"message_localized": "Der Datensatz wurde nicht gefunden oder ist für den Inhaber dieses API-Schlüssels nicht sichtbar.",
"locale": "de",
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Arbeitszeit
Zeiteinträge auflisten
/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.
Abfrageparameter
matter_idNur Einträge dieser Akte.
1234responsible_user_idNur für diesen Kollegen gebuchte Einträge (eine Benutzer-ID aus colleagues.list).
date_fromNur Einträge an oder nach diesem Datum (YYYY-MM-DD).
date_toNur Einträge an oder vor diesem Datum (YYYY-MM-DD).
limitSeitengröße, 1-100. Standard 25.
2525offsetAnzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.
00Antworten
200
OK.
dataerforderlichFelder von data
idZeiteintrags-ID.
matter_idAkte, auf die der Eintrag gebucht ist.
dateactivityWas erledigt wurde (Klartext).
minutesAufgewendete Minuten.
minutes_invoiceableAbrechenbare Minuten nach Anwendung der Stundenobergrenze der Kanzlei (können niedriger als angefordert sein). Sie zählen nur zur Abrechnung, solange excluded false ist.
minutes_normativeNormative Minuten (informativ; nie gekürzt).
responsible_user_idKollege, auf den die Zeit gebucht ist.
responsiblerecorded_by_user_idWer den Eintrag erfasst hat.
lockedtrue, wenn der Eintrag gesperrt ist (über die API schreibgeschützt).
excludedtrue, 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_atupdated_atSenden Sie dies bei einer Aktualisierung als expected_updated_at zurück.
paginationerforderlichFelder von pagination
limiterforderlichoffseterforderlichtotalerforderlichGesamtanzahl 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/workhours?matter_id=1234&limit=25", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/workhours?matter_id=1234&limit=25",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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
}
}
{
"error": "scope_missing",
"message": "This API key does not have the \"workhours:read\" 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 \"workhours:read\" 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": "workhours:read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Zeiteintrag abrufen
/api/agent/workhours/{id}
Gibt einen laufenden Zeiteintrag anhand der id zurück, sofern seine Akte für den Benutzer sichtbar ist.
Pfadparameter
iderforderlichZeiteintrags-ID.
Antworten
200
OK.
dataerforderlichFelder von data
idZeiteintrags-ID.
matter_idAkte, auf die der Eintrag gebucht ist.
dateactivityWas erledigt wurde (Klartext).
minutesAufgewendete Minuten.
minutes_invoiceableAbrechenbare Minuten nach Anwendung der Stundenobergrenze der Kanzlei (können niedriger als angefordert sein). Sie zählen nur zur Abrechnung, solange excluded false ist.
minutes_normativeNormative Minuten (informativ; nie gekürzt).
responsible_user_idKollege, auf den die Zeit gebucht ist.
responsiblerecorded_by_user_idWer den Eintrag erfasst hat.
lockedtrue, wenn der Eintrag gesperrt ist (über die API schreibgeschützt).
excludedtrue, 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_atupdated_atSenden 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/workhours/1234", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/workhours/1234",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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"
}
}
{
"error": "not_found",
"message": "The record was not found, or it is not visible to the user who owns this API key.",
"message_localized": "Der Datensatz wurde nicht gefunden oder ist für den Inhaber dieses API-Schlüssels nicht sichtbar.",
"locale": "de",
"details": {
"record_type": "workhour",
"record_id": 1234
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Zeiteintrag erfassen
/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.
Header-Parameter
Idempotency-KeyBei 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.
^[A-Za-z0-9_\-:.]{1,128}$Anfragetext application/json
matter_iderforderlichAkte, auf die die Zeit gebucht wird (muss sichtbar sein).
1234dateerforderlichDatum der Arbeit, YYYY-MM-DD.
"2026-10-30"subjectWas 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.
^[^<>]*$"Drafting the statement of claim"activityDasselbe Feld wie subject, unter dem von der Leseseite verwendeten Namen. Senden Sie einen der beiden.
^[^<>]*$minutesTatsächlich aufgewendete Minuten.
90minutes_invoiceableAngeforderte 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.
60minutes_normativeNormative Minuten (informativ; nie gekürzt).
responsible_user_idKollege, 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_keyDieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.
^[A-Za-z0-9_\-:.]{1,128}$"b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"Antworten
201
Erstellt.
dataerforderlichFelder von data
idZeiteintrags-ID.
matter_idAkte, auf die der Eintrag gebucht ist.
dateactivityWas erledigt wurde (Klartext).
minutesAufgewendete Minuten.
minutes_invoiceableAbrechenbare Minuten nach Anwendung der Stundenobergrenze der Kanzlei (können niedriger als angefordert sein). Sie zählen nur zur Abrechnung, solange excluded false ist.
minutes_normativeNormative Minuten (informativ; nie gekürzt).
responsible_user_idKollege, auf den die Zeit gebucht ist.
responsiblerecorded_by_user_idWer den Eintrag erfasst hat.
lockedtrue, wenn der Eintrag gesperrt ist (über die API schreibgeschützt).
excludedtrue, 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_atupdated_atSenden Sie dies bei einer Aktualisierung als expected_updated_at zurück.
createdtrue
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.
dataerforderlichFelder von data
idZeiteintrags-ID.
matter_idAkte, auf die der Eintrag gebucht ist.
dateactivityWas erledigt wurde (Klartext).
minutesAufgewendete Minuten.
minutes_invoiceableAbrechenbare Minuten nach Anwendung der Stundenobergrenze der Kanzlei (können niedriger als angefordert sein). Sie zählen nur zur Abrechnung, solange excluded false ist.
minutes_normativeNormative Minuten (informativ; nie gekürzt).
responsible_user_idKollege, auf den die Zeit gebucht ist.
responsiblerecorded_by_user_idWer den Eintrag erfasst hat.
lockedtrue, wenn der Eintrag gesperrt ist (über die API schreibgeschützt).
excludedtrue, 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_atupdated_atSenden Sie dies bei einer Aktualisierung als expected_updated_at zurück.
createdfalseidempotent_replaytrue
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.
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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
}'
const response = await fetch("https://www.flowyer.de/api/agent/workhours", {
method: "POST",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"matter_id": 1234,
"date": "2026-10-30",
"subject": "Drafting the statement of claim",
"minutes": 90,
"minutes_invoiceable": 60
}),
});
const result = await response.json();
import uuid
import requests
response = requests.post(
"https://www.flowyer.de/api/agent/workhours",
headers={
"Authorization": "Bearer flw_...",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"matter_id": 1234,
"date": "2026-10-30",
"subject": "Drafting the statement of claim",
"minutes": 90,
"minutes_invoiceable": 60,
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"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": false,
"idempotent_replay": true
}
{
"error": "validation_failed",
"message": "The request is invalid. See \"details.fields\" for the field-level errors.",
"message_localized": "Die Anfrage ist ungültig. Die Fehler je Feld stehen in \"details.fields\".",
"locale": "de",
"details": {
"fields": {
"matter_id": [
"Das Feld matter id ist erforderlich."
]
}
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Zeiteintrag aktualisieren
/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.
Pfadparameter
iderforderlichID des zu ändernden Datensatzes.
Anfragetext application/json
expected_updated_atDer 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.
dateDatum der Arbeit, YYYY-MM-DD. null behält das aktuelle Datum bei.
subjectWas 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.
activityDasselbe Feld wie subject, unter dem von der Leseseite verwendeten Namen. Senden Sie einen der beiden (null unter dem anderen ist zulässig).
minutesTatsächlich aufgewendete Minuten; null löscht sie.
minutes_invoiceableAngeforderte 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_normativeNormative Minuten (nie gekürzt); null löscht sie.
responsible_user_idNeuer 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.
dataerforderlichFelder von data
idZeiteintrags-ID.
matter_idAkte, auf die der Eintrag gebucht ist.
dateactivityWas erledigt wurde (Klartext).
minutesAufgewendete Minuten.
minutes_invoiceableAbrechenbare Minuten nach Anwendung der Stundenobergrenze der Kanzlei (können niedriger als angefordert sein). Sie zählen nur zur Abrechnung, solange excluded false ist.
minutes_normativeNormative Minuten (informativ; nie gekürzt).
responsible_user_idKollege, auf den die Zeit gebucht ist.
responsiblerecorded_by_user_idWer den Eintrag erfasst hat.
lockedtrue, wenn der Eintrag gesperrt ist (über die API schreibgeschützt).
excludedtrue, 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_atupdated_atSenden Sie dies bei einer Aktualisierung als expected_updated_at zurück.
updatedtrue
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/workhours/1234", {
method: "PATCH",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"date": "2026-10-30"
}),
});
const result = await response.json();
import requests
response = requests.patch(
"https://www.flowyer.de/api/agent/workhours/1234",
headers={
"Authorization": "Bearer flw_...",
},
json={
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"date": "2026-10-30",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"error": "record_conflict",
"message": "The record changed since you read it (someone edited it). Read it again and retry with the new updated_at.",
"message_localized": "Der Datensatz hat sich seit dem Lesen geändert (jemand hat ihn bearbeitet). Lesen Sie ihn erneut und wiederholen Sie die Anfrage mit dem neuen updated_at.",
"locale": "de",
"details": {
"current_updated_at": "2026-10-30T10:42:05+01:00",
"reason": "modified_since_read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Kosten
Kosten auflisten
/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.
Abfrageparameter
matter_idNur Kosten dieser Akte.
1234responsible_user_idNur für diesen Kollegen erfasste Kosten (eine Benutzer-ID aus colleagues.list).
date_fromNur Kosten an oder nach diesem Datum (YYYY-MM-DD).
date_toNur Kosten an oder vor diesem Datum (YYYY-MM-DD).
limitSeitengröße, 1-100. Standard 25.
2525offsetAnzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.
00Antworten
200
OK.
dataerforderlichFelder von data
idKosten-ID.
matter_idAkte, zu der die Kostenposition gehört.
dateactivityBeschreibung der Kostenposition (Klartext).
costNetto-Kostenbetrag (ohne USt.).
cost_invoiceableNetto-Betrag, der an den Mandanten weiterberechnet wird. Er zählt nur zur Abrechnung, solange excluded false ist.
currency_idWährungs-ID (Flowyer-Währungsliste).
currencyISO-Währungscode, z. B. HUF, EUR.
responsible_user_idresponsibleexcludedtrue, wenn ein Kollege die Kostenposition aus der Aktenzusammenfassung ausgeschlossen hat: Sie wird nicht abgerechnet und bleibt in den abrechenbaren Summen unberücksichtigt.
lockedtrue, 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_billingtrue, 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_atupdated_atSenden Sie dies bei einer Aktualisierung als expected_updated_at zurück.
paginationerforderlichFelder von pagination
limiterforderlichoffseterforderlichtotalerforderlichGesamtanzahl 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/costs?matter_id=1234&limit=25", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/costs?matter_id=1234&limit=25",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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
}
}
{
"error": "scope_missing",
"message": "This API key does not have the \"costs:read\" 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 \"costs:read\" 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": "costs:read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Kosten abrufen
/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.
Pfadparameter
iderforderlichKosten-ID.
Antworten
200
OK.
dataerforderlichFelder von data
idKosten-ID.
matter_idAkte, zu der die Kostenposition gehört.
dateactivityBeschreibung der Kostenposition (Klartext).
costNetto-Kostenbetrag (ohne USt.).
cost_invoiceableNetto-Betrag, der an den Mandanten weiterberechnet wird. Er zählt nur zur Abrechnung, solange excluded false ist.
currency_idWährungs-ID (Flowyer-Währungsliste).
currencyISO-Währungscode, z. B. HUF, EUR.
responsible_user_idresponsibleexcludedtrue, wenn ein Kollege die Kostenposition aus der Aktenzusammenfassung ausgeschlossen hat: Sie wird nicht abgerechnet und bleibt in den abrechenbaren Summen unberücksichtigt.
lockedtrue, 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_billingtrue, 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_atupdated_atSenden 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/costs/1234", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/costs/1234",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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"
}
}
{
"error": "not_found",
"message": "The record was not found, or it is not visible to the user who owns this API key.",
"message_localized": "Der Datensatz wurde nicht gefunden oder ist für den Inhaber dieses API-Schlüssels nicht sichtbar.",
"locale": "de",
"details": {
"record_type": "cost",
"record_id": 1234
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Kosten erfassen
/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.
Header-Parameter
Idempotency-KeyBei 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.
^[A-Za-z0-9_\-:.]{1,128}$Anfragetext application/json
matter_iderforderlichAkte, zu der die Kostenposition gehört (muss sichtbar sein).
1234dateerforderlichDatum der Kostenposition, YYYY-MM-DD.
"2026-10-30"subjectBeschreibung 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.
^[^<>]*$"Court filing fee"activityDasselbe Feld wie subject, unter dem von der Leseseite verwendeten Namen. Senden Sie einen der beiden.
^[^<>]*$costerforderlichNetto-Kostenbetrag (ohne USt.), eine ganze Zahl in der Haupteinheit der Währung (Cent werden nicht gespeichert).
15000cost_invoiceableNetto-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.
15000currency_idWä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_idVerantwortlicher Kollege: eine Benutzer-ID aus colleagues.list (schlagen Sie einen diktierten Namen dort nach). Standard: der Benutzer hinter dem Schlüssel.
idempotency_keyDieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.
^[A-Za-z0-9_\-:.]{1,128}$"b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"Antworten
201
Erstellt.
dataerforderlichFelder von data
idKosten-ID.
matter_idAkte, zu der die Kostenposition gehört.
dateactivityBeschreibung der Kostenposition (Klartext).
costNetto-Kostenbetrag (ohne USt.).
cost_invoiceableNetto-Betrag, der an den Mandanten weiterberechnet wird. Er zählt nur zur Abrechnung, solange excluded false ist.
currency_idWährungs-ID (Flowyer-Währungsliste).
currencyISO-Währungscode, z. B. HUF, EUR.
responsible_user_idresponsibleexcludedtrue, wenn ein Kollege die Kostenposition aus der Aktenzusammenfassung ausgeschlossen hat: Sie wird nicht abgerechnet und bleibt in den abrechenbaren Summen unberücksichtigt.
lockedtrue, 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_billingtrue, 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_atupdated_atSenden Sie dies bei einer Aktualisierung als expected_updated_at zurück.
createdtrue
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.
dataerforderlichFelder von data
idKosten-ID.
matter_idAkte, zu der die Kostenposition gehört.
dateactivityBeschreibung der Kostenposition (Klartext).
costNetto-Kostenbetrag (ohne USt.).
cost_invoiceableNetto-Betrag, der an den Mandanten weiterberechnet wird. Er zählt nur zur Abrechnung, solange excluded false ist.
currency_idWährungs-ID (Flowyer-Währungsliste).
currencyISO-Währungscode, z. B. HUF, EUR.
responsible_user_idresponsibleexcludedtrue, wenn ein Kollege die Kostenposition aus der Aktenzusammenfassung ausgeschlossen hat: Sie wird nicht abgerechnet und bleibt in den abrechenbaren Summen unberücksichtigt.
lockedtrue, 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_billingtrue, 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_atupdated_atSenden Sie dies bei einer Aktualisierung als expected_updated_at zurück.
createdfalseidempotent_replaytrue
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.
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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
}'
const response = await fetch("https://www.flowyer.de/api/agent/costs", {
method: "POST",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"matter_id": 1234,
"date": "2026-10-30",
"subject": "Court filing fee",
"cost": 15000,
"cost_invoiceable": 15000
}),
});
const result = await response.json();
import uuid
import requests
response = requests.post(
"https://www.flowyer.de/api/agent/costs",
headers={
"Authorization": "Bearer flw_...",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"matter_id": 1234,
"date": "2026-10-30",
"subject": "Court filing fee",
"cost": 15000,
"cost_invoiceable": 15000,
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"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": false,
"idempotent_replay": true
}
{
"error": "validation_failed",
"message": "The request is invalid. See \"details.fields\" for the field-level errors.",
"message_localized": "Die Anfrage ist ungültig. Die Fehler je Feld stehen in \"details.fields\".",
"locale": "de",
"details": {
"fields": {
"matter_id": [
"Das Feld matter id ist erforderlich."
]
}
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Kosten aktualisieren
/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.
Pfadparameter
iderforderlichID des zu ändernden Datensatzes.
Anfragetext application/json
expected_updated_atDer 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.
dateDatum der Kostenposition, YYYY-MM-DD. null behält das aktuelle Datum bei.
subjectBeschreibung 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.
activityDasselbe Feld wie subject, unter dem von der Leseseite verwendeten Namen. Senden Sie einen der beiden (null unter dem anderen ist zulässig).
costNetto-Kostenbetrag (ohne USt.), eine ganze Zahl in der Haupteinheit der Währung (Cent werden nicht gespeichert). null löscht den Betrag.
cost_invoiceableNetto-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_idWä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_idNeuer 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.
dataerforderlichFelder von data
idKosten-ID.
matter_idAkte, zu der die Kostenposition gehört.
dateactivityBeschreibung der Kostenposition (Klartext).
costNetto-Kostenbetrag (ohne USt.).
cost_invoiceableNetto-Betrag, der an den Mandanten weiterberechnet wird. Er zählt nur zur Abrechnung, solange excluded false ist.
currency_idWährungs-ID (Flowyer-Währungsliste).
currencyISO-Währungscode, z. B. HUF, EUR.
responsible_user_idresponsibleexcludedtrue, wenn ein Kollege die Kostenposition aus der Aktenzusammenfassung ausgeschlossen hat: Sie wird nicht abgerechnet und bleibt in den abrechenbaren Summen unberücksichtigt.
lockedtrue, 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_billingtrue, 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_atupdated_atSenden Sie dies bei einer Aktualisierung als expected_updated_at zurück.
updatedtrue
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/costs/1234", {
method: "PATCH",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"date": "2026-10-30"
}),
});
const result = await response.json();
import requests
response = requests.patch(
"https://www.flowyer.de/api/agent/costs/1234",
headers={
"Authorization": "Bearer flw_...",
},
json={
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"date": "2026-10-30",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"error": "record_conflict",
"message": "The record changed since you read it (someone edited it). Read it again and retry with the new updated_at.",
"message_localized": "Der Datensatz hat sich seit dem Lesen geändert (jemand hat ihn bearbeitet). Lesen Sie ihn erneut und wiederholen Sie die Anfrage mit dem neuen updated_at.",
"locale": "de",
"details": {
"current_updated_at": "2026-10-30T10:42:05+01:00",
"reason": "modified_since_read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Rechnungen
Rechnungen auflisten
/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.
Abfrageparameter
directionDie 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.
"incoming" "outgoing" "proforma" paid_status"unpaid" "paid" "partially_paid" "cancelled" client_idmatter_idissued_fromAusstellungsdatum an oder nach.
"2026-01-01"issued_toAusstellungsdatum an oder vor.
"2026-12-31"limitSeitengröße, 1-100. Standard 25.
2525offsetAnzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.
00Antworten
200
OK.
dataerforderlichFelder von data
id301invoice_number"FLW-2026-0042"directionoutgoing = von der Kanzlei ausgestellt, incoming = von der Kanzlei erhalten.
"incoming" "outgoing" document_type"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.
"invoice" "proforma" "receipt" source"manual" "szamlazz_outgoing" "szamlazz_imported" paid_status"unpaid" "paid" "partially_paid" "cancelled" issued_datedue_datepaid_datecompletion_datenet_amountgross_amountcurrency"HUF"payment_method_idpayment_methodLokalisierter 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.
supplierAussteller einer Eingangsrechnung.
clientFelder von client
idnamematter_idcreated_atupdated_atpaginationerforderlichFelder von pagination
limiterforderlichoffseterforderlichtotalerforderlichGesamtanzahl 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/invoices?issued_from=2026-01-01&issued_to=2026-12-31&limit=25", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/invoices?issued_from=2026-01-01&issued_to=2026-12-31&limit=25",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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
}
}
{
"error": "scope_missing",
"message": "This API key does not have the \"invoices:read\" 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 \"invoices:read\" 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": "invoices:read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Rechnung abrufen
/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.
Pfadparameter
iderforderlichRechnungs-ID.
301Antworten
200
OK.
dataerforderlichFelder von data
id301invoice_number"FLW-2026-0042"directionoutgoing = von der Kanzlei ausgestellt, incoming = von der Kanzlei erhalten.
"incoming" "outgoing" document_type"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.
"invoice" "proforma" "receipt" source"manual" "szamlazz_outgoing" "szamlazz_imported" paid_status"unpaid" "paid" "partially_paid" "cancelled" issued_datedue_datepaid_datecompletion_datenet_amountgross_amountcurrency"HUF"payment_method_idpayment_methodLokalisierter 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.
supplierAussteller einer Eingangsrechnung.
clientFelder von client
idnamematter_idcreated_atupdated_atnotesreceived_datesent_dateproforma_invoice_id
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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/invoices/301", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/invoices/301",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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
}
}
{
"error": "not_found",
"message": "The record was not found, or it is not visible to the user who owns this API key.",
"message_localized": "Der Datensatz wurde nicht gefunden oder ist für den Inhaber dieses API-Schlüssels nicht sichtbar.",
"locale": "de",
"details": {
"invoice_id": 301
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Dokumente
Dokumente einer Angelegenheit auflisten
/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.
Pfadparameter
iderforderlichAngelegenheits-ID.
1234Abfrageparameter
qNach Dateiname filtern.
"contract"limitSeitengröße, 1-100. Standard 25.
2525offsetAnzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.
00Antworten
200
OK.
dataerforderlichFelder von data
idnameDateiname, 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.
"Contract_v2.docx"sizeBytes.
versionAktuelle Versionsnummer der Datei.
folderDer 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
idnamepathOrdnerpfad innerhalb der Angelegenheit, "/"-getrennt.
folder_deletedTrue, 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_idcreated_bycreated_atupdated_atpaginationerforderlichFelder von pagination
limiterforderlichoffseterforderlichtotalerforderlichGesamtanzahl 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/matters/1234/documents?q=contract&limit=25", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/matters/1234/documents?q=contract&limit=25",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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
}
}
{
"error": "matter_not_visible",
"message": "The matter 1234 does not exist, is archived, or is not visible to the user who owns this API key.",
"message_localized": "Die Akte 1234 existiert nicht, ist archiviert oder für den Inhaber dieses API-Schlüssels nicht sichtbar.",
"locale": "de",
"details": {
"matter_id": 1234
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Ordner einer Angelegenheit auflisten
/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.
Pfadparameter
iderforderlichAngelegenheits-ID.
1234Abfrageparameter
qNur Ordner, deren Pfad diesen Text enthält (Groß-/Kleinschreibung und Akzente werden ignoriert), z. B. ein Ordnername.
"Beadványok"limitSeitengröße, 1-100. Standard 25.
2525offsetAnzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.
00Antworten
200
OK.
dataerforderlichFelder von data
idOrdner-ID: Übergeben Sie sie als folder_id an documents.upload.init.
nameOrdnername, wie er in Flowyer angezeigt wird.
parent_idID des übergeordneten Ordners; null für einen Ordner im Stammverzeichnis der Angelegenheit.
pathOrdnerpfad innerhalb der Angelegenheit, "/"-getrennt, z. B. "/Iratok/Beadványok" (derselbe Pfad, den documents.list für den Ordner einer Datei anzeigt).
updated_atÜbergeben Sie dies an documents.folders.rename als expected_updated_at.
paginationerforderlichFelder von pagination
limiterforderlichoffseterforderlichtotalerforderlichGesamtanzahl 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/matters/1234/folders?q=Beadv%C3%A1nyok&limit=25", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/matters/1234/folders?q=Beadv%C3%A1nyok&limit=25",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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
}
}
{
"error": "matter_not_visible",
"message": "The matter 1234 does not exist, is archived, or is not visible to the user who owns this API key.",
"message_localized": "Die Akte 1234 existiert nicht, ist archiviert oder für den Inhaber dieses API-Schlüssels nicht sichtbar.",
"locale": "de",
"details": {
"matter_id": 1234
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Aktenordner anlegen
/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.
Pfadparameter
iderforderlichAkte, zu der der Ordner gehört (muss sichtbar sein).
1234Header-Parameter
Idempotency-KeyBei 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.
^[A-Za-z0-9_\-:.]{1,128}$Anfragetext application/json
nameerforderlichOrdnername, höchstens 255 Zeichen. Klartext; "<" und ">" sind nicht zulässig.
^[^<>]*$"Beadványok"parent_idId des übergeordneten Ordners (aus documents.folders) innerhalb DERSELBEN Akte; weglassen für einen Ordner im Stammverzeichnis der Akte.
idempotency_keyDieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.
^[A-Za-z0-9_\-:.]{1,128}$"b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"Antworten
201
Erstellt.
dataerforderlichFelder von data
idOrdner-id: Übergeben Sie sie als folder_id an documents.upload.init oder als parent_id an documents.folders.create.
nameOrdnername, wie er in Flowyer angezeigt wird.
parent_idID des übergeordneten Ordners; null für einen Ordner im Stammverzeichnis der Angelegenheit.
pathOrdnerpfad innerhalb der Akte, "/"-getrennt, z. B. "/Iratok/Beadványok".
updated_atÜbergeben Sie dies an documents.folders.rename als expected_updated_at.
createdtrue
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.
dataerforderlichFelder von data
idOrdner-id: Übergeben Sie sie als folder_id an documents.upload.init oder als parent_id an documents.folders.create.
nameOrdnername, wie er in Flowyer angezeigt wird.
parent_idID des übergeordneten Ordners; null für einen Ordner im Stammverzeichnis der Angelegenheit.
pathOrdnerpfad innerhalb der Akte, "/"-getrennt, z. B. "/Iratok/Beadványok".
updated_atÜbergeben Sie dies an documents.folders.rename als expected_updated_at.
createdfalseidempotent_replaytrue
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.
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/matters/1234/folders", {
method: "POST",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"name": "Beadványok"
}),
});
const result = await response.json();
import uuid
import requests
response = requests.post(
"https://www.flowyer.de/api/agent/matters/1234/folders",
headers={
"Authorization": "Bearer flw_...",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"name": "Beadványok",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"data": {
"id": 1234,
"name": "string",
"parent_id": 1234,
"path": "string",
"updated_at": "2026-10-30T09:15:00+01:00"
},
"created": false,
"idempotent_replay": true
}
{
"error": "validation_failed",
"message": "The request is invalid. See \"details.fields\" for the field-level errors.",
"message_localized": "Die Anfrage ist ungültig. Die Fehler je Feld stehen in \"details.fields\".",
"locale": "de",
"details": {
"fields": {
"name": [
"Das Feld name ist erforderlich."
]
}
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Dokument-Upload starten
/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.
Pfadparameter
iderforderlichAngelegenheit, zu der das Dokument gehört (muss sichtbar sein).
Anfragetext application/json
filenameerforderlichDateiname mit Erweiterung, z. B. "Contract.pdf". Klartext; "<" und ">" sind nicht erlaubt. Ausführbare und Web-Dateitypen werden abgelehnt (422 blocked_file_type).
^[^<>]*$"Contract.pdf"content_typeerforderlichMIME-Typ, der beim PUT gesendet wird, z. B. "application/pdf". Er ist Teil der Signatur und muss genau übereinstimmen.
"application/pdf"sizeerforderlichDateigröße in Bytes, höchstens 104857600 (das Upload-Limit); eine größere Größe antwortet mit 413 file_too_large.
248000folder_idOrdner 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.
dataerforderlichFelder von data
upload_urlSignierte 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Übergeben Sie dies an documents.upload.complete, nachdem der PUT erfolgreich war.
content_typeSenden Sie genau diesen Content-Type beim PUT.
if_generation_matchSenden 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_keyInterner Speichername (zur Referenz).
expires_inSekunden, 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.
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).
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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
}'
const response = await fetch("https://www.flowyer.de/api/agent/matters/1234/documents/uploads", {
method: "POST",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
"filename": "Contract.pdf",
"content_type": "application/pdf",
"size": 248000
}),
});
const result = await response.json();
import requests
response = requests.post(
"https://www.flowyer.de/api/agent/matters/1234/documents/uploads",
headers={
"Authorization": "Bearer flw_...",
},
json={
"filename": "Contract.pdf",
"content_type": "application/pdf",
"size": 248000,
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
}
{
"error": "validation_failed",
"message": "The request is invalid. See \"details.fields\" for the field-level errors.",
"message_localized": "Die Anfrage ist ungültig. Die Fehler je Feld stehen in \"details.fields\".",
"locale": "de",
"details": {
"fields": {
"filename": [
"Das Feld filename ist erforderlich."
]
}
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Dokument-Upload abschließen
/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.
Pfadparameter
iderforderlichAngelegenheit, zu der das Dokument gehört (dieselbe wie in init).
Header-Parameter
Idempotency-KeyBei 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.
^[A-Za-z0-9_\-:.]{1,128}$Anfragetext application/json
upload_tokenerforderlichDas von documents.upload.init zurückgegebene Token.
idempotency_keyDieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.
^[A-Za-z0-9_\-:.]{1,128}$"b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"Antworten
201
Erstellt.
dataerforderlichFelder von data
idnameDateiname, 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.
"Contract_v2.docx"sizeBytes.
versionAktuelle Versionsnummer der Datei.
folderDer 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
idnamepathOrdnerpfad innerhalb der Angelegenheit, "/"-getrennt.
folder_deletedTrue, 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_idcreated_bycreated_atupdated_atcreatedtrue
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.
dataerforderlichFelder von data
idnameDateiname, 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.
"Contract_v2.docx"sizeBytes.
versionAktuelle Versionsnummer der Datei.
folderDer 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
idnamepathOrdnerpfad innerhalb der Angelegenheit, "/"-getrennt.
folder_deletedTrue, 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_idcreated_bycreated_atupdated_atcreatedfalseidempotent_replaytrue
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.
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.
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).
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).
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/matters/1234/documents", {
method: "POST",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"upload_token": "string"
}),
});
const result = await response.json();
import uuid
import requests
response = requests.post(
"https://www.flowyer.de/api/agent/matters/1234/documents",
headers={
"Authorization": "Bearer flw_...",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"upload_token": "string",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"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": false,
"idempotent_replay": true
}
{
"error": "validation_failed",
"message": "The request is invalid. See \"details.fields\" for the field-level errors.",
"message_localized": "Die Anfrage ist ungültig. Die Fehler je Feld stehen in \"details.fields\".",
"locale": "de",
"details": {
"fields": {
"upload_token": [
"Das Feld upload token ist erforderlich."
]
}
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Dokument herunterladen
/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.
Pfadparameter
iderforderlichDokument-ID (aus documents.list).
Antworten
200
OK.
dataerforderlichFelder von data
download_urlSignierte URL. Rufen Sie sie per GET ab, um die Datei-Bytes herunterzuladen.
filenameDateiname für den Download.
sizeBytes.
expires_inSekunden 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/documents/1234/download", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/documents/1234/download",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
Antwortbeispiele
{
"data": {
"download_url": "string",
"filename": "string",
"size": 0,
"expires_in": 0
}
}
{
"error": "not_found",
"message": "The record was not found, or it is not visible to the user who owns this API key.",
"message_localized": "Der Datensatz wurde nicht gefunden oder ist für den Inhaber dieses API-Schlüssels nicht sichtbar.",
"locale": "de",
"details": {
"record_type": "document",
"record_id": 1234
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Dokument umbenennen
/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.
Pfadparameter
iderforderlichID des zu ändernden Datensatzes.
Anfragetext application/json
expected_updated_atDer 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.
nameerforderlichNeuer 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.
^[^<>]*$"Contract_signed.pdf"Antworten
200
Aktualisiert.
dataerforderlichFelder von data
idnameDateiname, 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.
"Contract_v2.docx"sizeBytes.
versionAktuelle Versionsnummer der Datei.
folderDer 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
idnamepathOrdnerpfad innerhalb der Angelegenheit, "/"-getrennt.
folder_deletedTrue, 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_idcreated_bycreated_atupdated_atupdatedtrue
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/documents/1234", {
method: "PATCH",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"name": "Contract_signed.pdf"
}),
});
const result = await response.json();
import requests
response = requests.patch(
"https://www.flowyer.de/api/agent/documents/1234",
headers={
"Authorization": "Bearer flw_...",
},
json={
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"name": "Contract_signed.pdf",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"error": "record_conflict",
"message": "The record changed since you read it (someone edited it). Read it again and retry with the new updated_at.",
"message_localized": "Der Datensatz hat sich seit dem Lesen geändert (jemand hat ihn bearbeitet). Lesen Sie ihn erneut und wiederholen Sie die Anfrage mit dem neuen updated_at.",
"locale": "de",
"details": {
"current_updated_at": "2026-10-30T10:42:05+01:00",
"reason": "modified_since_read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Aktenordner umbenennen
/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.
Pfadparameter
iderforderlichID des zu ändernden Datensatzes.
Anfragetext application/json
expected_updated_atDer 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.
nameerforderlichNeuer Ordnername, höchstens 255 Zeichen. Klartext; "<" und ">" sind nicht zulässig.
^[^<>]*$"Beadványok"Antworten
200
Aktualisiert.
dataerforderlichFelder von data
idOrdner-id: Übergeben Sie sie als folder_id an documents.upload.init oder als parent_id an documents.folders.create.
nameOrdnername, wie er in Flowyer angezeigt wird.
parent_idID des übergeordneten Ordners; null für einen Ordner im Stammverzeichnis der Angelegenheit.
pathOrdnerpfad innerhalb der Akte, "/"-getrennt, z. B. "/Iratok/Beadványok".
updated_atÜbergeben Sie dies an documents.folders.rename als expected_updated_at.
updatedtrue
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/folders/1234", {
method: "PATCH",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"name": "Beadványok"
}),
});
const result = await response.json();
import requests
response = requests.patch(
"https://www.flowyer.de/api/agent/folders/1234",
headers={
"Authorization": "Bearer flw_...",
},
json={
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"name": "Beadványok",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"error": "record_conflict",
"message": "The record changed since you read it (someone edited it). Read it again and retry with the new updated_at.",
"message_localized": "Der Datensatz hat sich seit dem Lesen geändert (jemand hat ihn bearbeitet). Lesen Sie ihn erneut und wiederholen Sie die Anfrage mit dem neuen updated_at.",
"locale": "de",
"details": {
"current_updated_at": "2026-10-30T10:42:05+01:00",
"reason": "modified_since_read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Wissensdatenbank
Wissensdatenbank-Artikel auflisten
/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.
Abfrageparameter
qVolltext-Suchbegriff (Titel, Auszüge, Inhalt und Tag-Namen). Boolesche Operatoren werden entfernt.
"felmondási idő"statusNur Artikel mit diesem Status. Weglassen, um alle Status aufzulisten.
"draft" "published" "archived" limitSeitengröße, 1-100. Standard 25.
2525offsetAnzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.
00Antworten
200
OK.
dataerforderlichFelder von data
id9876slugServerseitig generierter URL-Slug.
"felmondasi-ido"title"Felmondási idő a munka törvénykönyvében"excerptKurze Zusammenfassung (Rich-HTML, wie gespeichert). Für den vollständigen Text knowledge.articles.get verwenden.
status"draft" "published" "archived" is_featuredOb der Artikel auf der Startseite der Wissensdatenbank angeheftet ist (nicht über die API setzbar).
category_idcategory_nameauthor_idBenutzer-ID des Autors; 0 bei einem globalen (Standard-)Artikel.
author_nameeditor_idBenutzer-ID des letzten Bearbeiters oder null, falls nie bearbeitet.
editor_nameviews_countdownloads_countshared_rolesRollen-IDs, mit denen der Artikel geteilt ist (leer = nur der Autor/global).
tagsTag-Namen am Artikel.
published_atZeitpunkt der Erstveröffentlichung des Artikels oder null.
created_atupdated_atpaginationerforderlichFelder von pagination
limiterforderlichoffseterforderlichtotalerforderlichGesamtanzahl 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/knowledge/articles?q=felmond%C3%A1si%20id%C5%91&limit=25", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/knowledge/articles?q=felmond%C3%A1si%20id%C5%91&limit=25",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
Antwortbeispiele
{
"data": [
{
"id": 9876,
"slug": "felmondasi-ido",
"title": "Felmondási idő a munka törvénykönyvében",
"excerpt": "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
}
}
{
"error": "scope_missing",
"message": "This API key does not have the \"knowledge:read\" 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 \"knowledge:read\" 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": "knowledge:read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Wissensdatenbank-Artikel abrufen
/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.
Pfadparameter
iderforderlichArtikel-ID.
9876Antworten
200
OK.
dataerforderlichFelder von data
id9876slugServerseitig generierter URL-Slug.
"felmondasi-ido"title"Felmondási idő a munka törvénykönyvében"excerptKurze Zusammenfassung (Rich-HTML, wie gespeichert). Für den vollständigen Text knowledge.articles.get verwenden.
status"draft" "published" "archived" is_featuredOb der Artikel auf der Startseite der Wissensdatenbank angeheftet ist (nicht über die API setzbar).
category_idcategory_nameauthor_idBenutzer-ID des Autors; 0 bei einem globalen (Standard-)Artikel.
author_nameeditor_idBenutzer-ID des letzten Bearbeiters oder null, falls nie bearbeitet.
editor_nameviews_countdownloads_countshared_rolesRollen-IDs, mit denen der Artikel geteilt ist (leer = nur der Autor/global).
tagsTag-Namen am Artikel.
published_atZeitpunkt der Erstveröffentlichung des Artikels oder null.
created_atupdated_atcontentDer vollständige Artikeltext wie gespeichert (Rich-HTML).
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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/knowledge/articles/9876", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/knowledge/articles/9876",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
Antwortbeispiele
{
"data": {
"id": 9876,
"slug": "felmondasi-ido",
"title": "Felmondási idő a munka törvénykönyvében",
"excerpt": "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",
"content": "string"
}
}
{
"error": "not_found",
"message": "The record was not found, or it is not visible to the user who owns this API key.",
"message_localized": "Der Datensatz wurde nicht gefunden oder ist für den Inhaber dieses API-Schlüssels nicht sichtbar.",
"locale": "de",
"details": {
"article_id": 9876
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Wissensdatenbank-Artikel anlegen
/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.
Header-Parameter
Idempotency-KeyBei 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.
^[A-Za-z0-9_\-:.]{1,128}$Anfragetext application/json
titleerforderlichArtikeltitel. Klartext.
"Felmondási idő a munka törvénykönyvében"excerptKurze Zusammenfassung (HTML erlaubt, serverseitig bereinigt), höchstens 200 Zeichen.
contenterforderlichDer Artikeltext. Rich-HTML, serverseitig mit dem Wissensdatenbank-Profil bereinigt.
category_iderforderlichId einer vorhandenen, aktiven Wissensdatenbank-Kategorie.
12statuserforderlichdraft, published oder archived. published setzt published_at.
"draft" "published" "archived" tagsTag-Namen; neue Tags werden bei Bedarf erstellt.
shared_rolesRollen-IDs, mit denen der Artikel geteilt werden soll. Leer bedeutet, dass nur der Autor ihn sehen kann.
idempotency_keyDieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.
^[A-Za-z0-9_\-:.]{1,128}$"b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"Antworten
201
Erstellt.
dataerforderlichFelder von data
id9876slugServerseitig generierter URL-Slug.
"felmondasi-ido"title"Felmondási idő a munka törvénykönyvében"excerptKurze Zusammenfassung (Rich-HTML, wie gespeichert). Für den vollständigen Text knowledge.articles.get verwenden.
status"draft" "published" "archived" is_featuredOb der Artikel auf der Startseite der Wissensdatenbank angeheftet ist (nicht über die API setzbar).
category_idcategory_nameauthor_idBenutzer-ID des Autors; 0 bei einem globalen (Standard-)Artikel.
author_nameeditor_idBenutzer-ID des letzten Bearbeiters oder null, falls nie bearbeitet.
editor_nameviews_countdownloads_countshared_rolesRollen-IDs, mit denen der Artikel geteilt ist (leer = nur der Autor/global).
tagsTag-Namen am Artikel.
published_atZeitpunkt der Erstveröffentlichung des Artikels oder null.
created_atupdated_atcontentDer vollständige Artikeltext wie gespeichert (Rich-HTML).
createdtrue
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.
dataerforderlichFelder von data
id9876slugServerseitig generierter URL-Slug.
"felmondasi-ido"title"Felmondási idő a munka törvénykönyvében"excerptKurze Zusammenfassung (Rich-HTML, wie gespeichert). Für den vollständigen Text knowledge.articles.get verwenden.
status"draft" "published" "archived" is_featuredOb der Artikel auf der Startseite der Wissensdatenbank angeheftet ist (nicht über die API setzbar).
category_idcategory_nameauthor_idBenutzer-ID des Autors; 0 bei einem globalen (Standard-)Artikel.
author_nameeditor_idBenutzer-ID des letzten Bearbeiters oder null, falls nie bearbeitet.
editor_nameviews_countdownloads_countshared_rolesRollen-IDs, mit denen der Artikel geteilt ist (leer = nur der Autor/global).
tagsTag-Namen am Artikel.
published_atZeitpunkt der Erstveröffentlichung des Artikels oder null.
created_atupdated_atcontentDer vollständige Artikeltext wie gespeichert (Rich-HTML).
createdfalseidempotent_replaytrue
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.
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/knowledge/articles", {
method: "POST",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"title": "Felmondási idő a munka törvénykönyvében",
"content": "string",
"category_id": 12,
"status": "draft"
}),
});
const result = await response.json();
import uuid
import requests
response = requests.post(
"https://www.flowyer.de/api/agent/knowledge/articles",
headers={
"Authorization": "Bearer flw_...",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"title": "Felmondási idő a munka törvénykönyvében",
"content": "string",
"category_id": 12,
"status": "draft",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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",
"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",
"content": "string"
},
"created": true
}
{
"data": {
"id": 9876,
"slug": "felmondasi-ido",
"title": "Felmondási idő a munka törvénykönyvében",
"excerpt": "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",
"content": "string"
},
"created": false,
"idempotent_replay": true
}
{
"error": "validation_failed",
"message": "The request is invalid. See \"details.fields\" for the field-level errors.",
"message_localized": "Die Anfrage ist ungültig. Die Fehler je Feld stehen in \"details.fields\".",
"locale": "de",
"details": {
"fields": {
"title": [
"Das Feld title ist erforderlich."
]
}
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Wissensdatenbank-Artikel aktualisieren
/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.
Pfadparameter
iderforderlichID des zu ändernden Datensatzes.
Anfragetext application/json
expected_updated_atDer 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.
titleArtikeltitel (Klartext). null behält den aktuellen Titel bei; ein neuer Titel leitet den Slug neu ab.
excerptKurze Zusammenfassung (HTML erlaubt, bereinigt), als NEUER Wert höchstens 200 Zeichen. Leer/null löscht sie; weglassen, um sie beizubehalten.
contentDer Artikeltext (Rich-HTML, bereinigt). null behält den aktuellen Inhalt bei; er kann nicht gelöscht werden.
category_idVerschiebt den Artikel in diese vorhandene, aktive Kategorie. null behält die aktuelle bei.
statusdraft, published oder archived. Der erste Wechsel zu published setzt published_at; es wird nie gelöscht. null behält den aktuellen Status bei.
"draft" "published" "archived" tagsErsetzt den gesamten Tag-Satz (neue Tags werden erstellt). Ein leeres Array löscht alle Tags; weglassen, um sie beizubehalten.
shared_rolesErsetzt den gesamten Satz geteilter Rollen. Ein leeres Array entfernt jede Freigabe (nur der Autor sieht ihn); weglassen, um sie beizubehalten.
Antworten
200
Aktualisiert.
dataerforderlichFelder von data
id9876slugServerseitig generierter URL-Slug.
"felmondasi-ido"title"Felmondási idő a munka törvénykönyvében"excerptKurze Zusammenfassung (Rich-HTML, wie gespeichert). Für den vollständigen Text knowledge.articles.get verwenden.
status"draft" "published" "archived" is_featuredOb der Artikel auf der Startseite der Wissensdatenbank angeheftet ist (nicht über die API setzbar).
category_idcategory_nameauthor_idBenutzer-ID des Autors; 0 bei einem globalen (Standard-)Artikel.
author_nameeditor_idBenutzer-ID des letzten Bearbeiters oder null, falls nie bearbeitet.
editor_nameviews_countdownloads_countshared_rolesRollen-IDs, mit denen der Artikel geteilt ist (leer = nur der Autor/global).
tagsTag-Namen am Artikel.
published_atZeitpunkt der Erstveröffentlichung des Artikels oder null.
created_atupdated_atcontentDer vollständige Artikeltext wie gespeichert (Rich-HTML).
updatedtrue
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/knowledge/articles/1234", {
method: "PATCH",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"title": "string"
}),
});
const result = await response.json();
import requests
response = requests.patch(
"https://www.flowyer.de/api/agent/knowledge/articles/1234",
headers={
"Authorization": "Bearer flw_...",
},
json={
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"title": "string",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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",
"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",
"content": "string"
},
"updated": true
}
{
"error": "record_conflict",
"message": "The record changed since you read it (someone edited it). Read it again and retry with the new updated_at.",
"message_localized": "Der Datensatz hat sich seit dem Lesen geändert (jemand hat ihn bearbeitet). Lesen Sie ihn erneut und wiederholen Sie die Anfrage mit dem neuen updated_at.",
"locale": "de",
"details": {
"current_updated_at": "2026-10-30T10:42:05+01:00",
"reason": "modified_since_read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Wissensdatenbank-Kategorien auflisten
/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).
Abfrageparameter
limitSeitengröße, 1-100. Standard 25.
2525offsetAnzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.
00Antworten
200
OK.
dataerforderlichFelder von data
id42slugURL-Slug, aus dem Namen generiert.
"munkajog"name"Munkajog"descriptionBeschreibung als Klartext oder null.
iconIcon-Bezeichner, der neben der Kategorie angezeigt wird, oder null.
order_columnSortierposition unter gleichrangigen Kategorien.
0is_activeparent_idId der übergeordneten Kategorie oder null bei einer Wurzelkategorie.
author_idBenutzer-ID des Erstellers; 0 bei einer integrierten Standardkategorie, die für alle sichtbar ist.
author_nameAnzeigename des Erstellers oder null bei einer Standardkategorie.
articles_countAnzahl der veröffentlichten Artikel in dieser Kategorie, die der Aufrufer sehen darf.
shared_rolesRollen-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_atupdated_atpaginationerforderlichFelder von pagination
limiterforderlichoffseterforderlichtotalerforderlichGesamtanzahl 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/knowledge/categories?limit=25", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/knowledge/categories?limit=25",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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
}
}
{
"error": "scope_missing",
"message": "This API key does not have the \"knowledge:read\" 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 \"knowledge:read\" 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": "knowledge:read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Wissensdatenbank-Kategorie abrufen
/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.
Pfadparameter
iderforderlichKategorie-ID.
42Antworten
200
OK.
dataerforderlichFelder von data
id42slugURL-Slug, aus dem Namen generiert.
"munkajog"name"Munkajog"descriptionBeschreibung als Klartext oder null.
iconIcon-Bezeichner, der neben der Kategorie angezeigt wird, oder null.
order_columnSortierposition unter gleichrangigen Kategorien.
0is_activeparent_idId der übergeordneten Kategorie oder null bei einer Wurzelkategorie.
author_idBenutzer-ID des Erstellers; 0 bei einer integrierten Standardkategorie, die für alle sichtbar ist.
author_nameAnzeigename des Erstellers oder null bei einer Standardkategorie.
articles_countAnzahl der veröffentlichten Artikel in dieser Kategorie, die der Aufrufer sehen darf.
shared_rolesRollen-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_atupdated_at
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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/knowledge/categories/42", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/knowledge/categories/42",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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"
}
}
{
"error": "not_found",
"message": "The record was not found, or it is not visible to the user who owns this API key.",
"message_localized": "Der Datensatz wurde nicht gefunden oder ist für den Inhaber dieses API-Schlüssels nicht sichtbar.",
"locale": "de",
"details": {
"category_id": 42
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Wissensdatenbank-Kategorie anlegen
/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.
Header-Parameter
Idempotency-KeyBei 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.
^[A-Za-z0-9_\-:.]{1,128}$Anfragetext application/json
nameerforderlichKategoriename. Klartext; "<" und ">" sind nicht zulässig.
^[^<>]*$"Munkajog"descriptionOptionale Beschreibung, Klartext.
parent_idId der übergeordneten Kategorie (muss existieren und aktiv sein). Weglassen bei einer Wurzelkategorie.
iconOptionaler Icon-Bezeichner. Klartext; "<" und ">" sind nicht zulässig.
^[^<>]*$is_activeOb die Kategorie aktiv ist. Standard true.
trueorder_columnSortierposition unter gleichrangigen Kategorien. Standard 0.
0shared_rolesRollen-IDs, mit denen diese Kategorie geteilt werden soll. Weglassen, sodass nur Sie (der Autor) sie sehen können.
idempotency_keyDieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.
^[A-Za-z0-9_\-:.]{1,128}$"b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"Antworten
201
Erstellt.
dataerforderlichFelder von data
id42slugURL-Slug, aus dem Namen generiert.
"munkajog"name"Munkajog"descriptionBeschreibung als Klartext oder null.
iconIcon-Bezeichner, der neben der Kategorie angezeigt wird, oder null.
order_columnSortierposition unter gleichrangigen Kategorien.
0is_activeparent_idId der übergeordneten Kategorie oder null bei einer Wurzelkategorie.
author_idBenutzer-ID des Erstellers; 0 bei einer integrierten Standardkategorie, die für alle sichtbar ist.
author_nameAnzeigename des Erstellers oder null bei einer Standardkategorie.
articles_countAnzahl der veröffentlichten Artikel in dieser Kategorie, die der Aufrufer sehen darf.
shared_rolesRollen-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_atupdated_atcreatedtrue
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.
dataerforderlichFelder von data
id42slugURL-Slug, aus dem Namen generiert.
"munkajog"name"Munkajog"descriptionBeschreibung als Klartext oder null.
iconIcon-Bezeichner, der neben der Kategorie angezeigt wird, oder null.
order_columnSortierposition unter gleichrangigen Kategorien.
0is_activeparent_idId der übergeordneten Kategorie oder null bei einer Wurzelkategorie.
author_idBenutzer-ID des Erstellers; 0 bei einer integrierten Standardkategorie, die für alle sichtbar ist.
author_nameAnzeigename des Erstellers oder null bei einer Standardkategorie.
articles_countAnzahl der veröffentlichten Artikel in dieser Kategorie, die der Aufrufer sehen darf.
shared_rolesRollen-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_atupdated_atcreatedfalseidempotent_replaytrue
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.
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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
}'
const response = await fetch("https://www.flowyer.de/api/agent/knowledge/categories", {
method: "POST",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"name": "Munkajog",
"order_column": 0
}),
});
const result = await response.json();
import uuid
import requests
response = requests.post(
"https://www.flowyer.de/api/agent/knowledge/categories",
headers={
"Authorization": "Bearer flw_...",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"name": "Munkajog",
"order_column": 0,
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"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": false,
"idempotent_replay": true
}
{
"error": "validation_failed",
"message": "The request is invalid. See \"details.fields\" for the field-level errors.",
"message_localized": "Die Anfrage ist ungültig. Die Fehler je Feld stehen in \"details.fields\".",
"locale": "de",
"details": {
"fields": {
"name": [
"Das Feld name ist erforderlich."
]
}
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Wissensdatenbank-Kategorie aktualisieren
/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.
Pfadparameter
iderforderlichID des zu ändernden Datensatzes.
Anfragetext application/json
expected_updated_atDer 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.
nameKategoriename. 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.
descriptionBeschreibung als Klartext. null löscht sie.
parent_idVerschiebt die Kategorie unter diese übergeordnete Kategorie (muss existieren, aktiv sein und keinen Zyklus erzeugen) oder null, um sie zu einer Wurzelkategorie zu machen.
iconIcon-Bezeichner. Als NEUER Wert höchstens 100 Zeichen; "<" und ">" können nicht eingeführt werden. null löscht ihn.
is_activeAktiv-Flag. Weglassen oder null, um den aktuellen Wert beizubehalten.
order_columnSortierposition unter gleichrangigen Kategorien. Weglassen oder null, um den aktuellen Wert beizubehalten.
shared_rolesErsetzt 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.
dataerforderlichFelder von data
id42slugURL-Slug, aus dem Namen generiert.
"munkajog"name"Munkajog"descriptionBeschreibung als Klartext oder null.
iconIcon-Bezeichner, der neben der Kategorie angezeigt wird, oder null.
order_columnSortierposition unter gleichrangigen Kategorien.
0is_activeparent_idId der übergeordneten Kategorie oder null bei einer Wurzelkategorie.
author_idBenutzer-ID des Erstellers; 0 bei einer integrierten Standardkategorie, die für alle sichtbar ist.
author_nameAnzeigename des Erstellers oder null bei einer Standardkategorie.
articles_countAnzahl der veröffentlichten Artikel in dieser Kategorie, die der Aufrufer sehen darf.
shared_rolesRollen-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_atupdated_atupdatedtrue
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/knowledge/categories/1234", {
method: "PATCH",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"name": "string"
}),
});
const result = await response.json();
import requests
response = requests.patch(
"https://www.flowyer.de/api/agent/knowledge/categories/1234",
headers={
"Authorization": "Bearer flw_...",
},
json={
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"name": "string",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"error": "record_conflict",
"message": "The record changed since you read it (someone edited it). Read it again and retry with the new updated_at.",
"message_localized": "Der Datensatz hat sich seit dem Lesen geändert (jemand hat ihn bearbeitet). Lesen Sie ihn erneut und wiederholen Sie die Anfrage mit dem neuen updated_at.",
"locale": "de",
"details": {
"current_updated_at": "2026-10-30T10:42:05+01:00",
"reason": "modified_since_read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
E-Mails
E-Mails einer Akte auflisten
/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.
Pfadparameter
iderforderlichAngelegenheits-ID.
1234Abfrageparameter
qNach Betreff, Absendername oder Absenderadresse filtern (akzent- und Groß-/Kleinschreibungsunabhängig). Nicht der Inhalt.
"invoice"limitSeitengröße, 1-100. Standard 25.
2525offsetAnzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.
00Antworten
200
OK.
dataerforderlichFelder von data
idE-Mail-ID (mit emails.get verwenden).
1234from_nameAnzeigename 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_addressSMTP-Adresse der externen Partei.
subjectsent_atWann 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.
sizeBytes der gespeicherten .eml/.msg-Datei.
extension"msg" (Outlook-Add-in) oder "eml" (IMAP / Standard); null bei einigen Alt-Zeilen.
saved_by_user_idBenutzer-ID des Kollegen, der die E-Mail in Flowyer gespeichert hat.
saved_byAnzeigename dieses Kollegen.
created_atWann die E-Mail in Flowyer gespeichert wurde (Wandzeit in der Kanzleizone). Der zuverlässige Zeitstempel für eine stabile Paginierung.
paginationerforderlichFelder von pagination
limiterforderlichoffseterforderlichtotalerforderlichGesamtanzahl 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/matters/1234/emails?q=invoice&limit=25", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/matters/1234/emails?q=invoice&limit=25",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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
}
}
{
"error": "matter_not_visible",
"message": "The matter 1234 does not exist, is archived, or is not visible to the user who owns this API key.",
"message_localized": "Die Akte 1234 existiert nicht, ist archiviert oder für den Inhaber dieses API-Schlüssels nicht sichtbar.",
"locale": "de",
"details": {
"matter_id": 1234
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
E-Mail abrufen
/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.
Pfadparameter
iderforderlichE-Mail-ID.
1234Antworten
200
OK.
dataerforderlichFelder von data
id1234matterDie Akte, unter der die E-Mail abgelegt ist, oder null bei einer aktenlosen E-Mail (außerhalb einer Akte gespeichert).
Felder von matter
idcase_numberfrom_nameAnzeigename der externen Partei (nie ein Kollege; der Speicher hat keine Richtungsspalte).
from_addressSMTP-Adresse der externen Partei.
subjectbodyDer 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_atWann 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.
sizeBytes der gespeicherten .eml/.msg-Datei.
extension"msg" oder "eml"; null bei einigen Alt-Zeilen.
saved_by_user_idBenutzer-ID des Kollegen, der die E-Mail in Flowyer gespeichert hat.
saved_byAnzeigename dieses Kollegen.
created_atWann die E-Mail in Flowyer gespeichert wurde (Wandzeit in der Kanzleizone).
updated_at
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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/emails/1234", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/emails/1234",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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"
}
}
{
"error": "email_not_visible",
"message": "The email :id does not exist, or is on a matter that is not visible to the user who owns this API key.",
"message_localized": "Die E-Mail :id existiert nicht oder gehört zu einer Akte, die für den Benutzer dieses API-Schlüssels nicht sichtbar ist.",
"locale": "de",
"details": {
"email_id": 1234
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Prozessverlauf
Prozessverlauf einer Akte auflisten
/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.
Pfadparameter
iderforderlichAngelegenheits-ID.
1234Abfrageparameter
limitSeitengröße, 1-100. Standard 25.
2525offsetAnzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.
00Antworten
200
OK.
dataerforderlichFelder von data
id4521titleTitel des Eintrags. Klartext.
"Első tárgyalás elhalasztva"descriptionDetails des Eintrags als Rich-HTML, serverseitig bereinigt.
locationWo es geschah (Klartext), z. B. ein Gerichtssaal; nullbar.
event_dateTag des Eintrags, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.
user_idAutor (der Benutzer, der den Eintrag erstellt hat).
created_byAnzeigename des Autors.
last_editor_idBenutzer, der den Eintrag zuletzt bearbeitet hat.
last_editorAnzeigename des letzten Bearbeiters.
created_atupdated_atÜbergeben Sie dies an litigation.update als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent den Eintrag über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratpaginationerforderlichFelder von pagination
limiterforderlichoffseterforderlichtotalerforderlichGesamtanzahl 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/matters/1234/litigation?limit=25", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/matters/1234/litigation?limit=25",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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
}
}
{
"error": "matter_not_visible",
"message": "The matter 1234 does not exist, is archived, or is not visible to the user who owns this API key.",
"message_localized": "Die Akte 1234 existiert nicht, ist archiviert oder für den Inhaber dieses API-Schlüssels nicht sichtbar.",
"locale": "de",
"details": {
"matter_id": 1234
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Eintrag im Prozessverlauf anlegen
/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.
Pfadparameter
iderforderlichAkte, zu der der Eintrag gehört (muss sichtbar sein).
1234Header-Parameter
Idempotency-KeyBei 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.
^[A-Za-z0-9_\-:.]{1,128}$Anfragetext application/json
titleerforderlichTitel des Eintrags, höchstens 2000 Zeichen. Klartext; "<" und ">" sind nicht zulässig.
^[^<>]*$"Első tárgyalás elhalasztva"descriptionDetails des Eintrags. Rich-HTML, serverseitig mit dem Wissensdatenbank-Profil bereinigt.
locationWo es geschah (Klartext, höchstens 255 Zeichen); "<" und ">" sind nicht zulässig.
^[^<>]*$"Fővárosi Törvényszék, 215. tárgyaló"event_dateTag des Eintrags, YYYY-MM-DD. Standard: heute (Zeitzone der Kanzlei).
"2026-11-15"idempotency_keyDieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.
^[A-Za-z0-9_\-:.]{1,128}$"b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"Antworten
201
Erstellt.
dataerforderlichFelder von data
id4521titleTitel des Eintrags. Klartext.
"Első tárgyalás elhalasztva"descriptionDetails des Eintrags als Rich-HTML, serverseitig bereinigt.
locationWo es geschah (Klartext), z. B. ein Gerichtssaal; nullbar.
event_dateTag des Eintrags, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.
user_idAutor (der Benutzer, der den Eintrag erstellt hat).
created_byAnzeigename des Autors.
last_editor_idBenutzer, der den Eintrag zuletzt bearbeitet hat.
last_editorAnzeigename des letzten Bearbeiters.
created_atupdated_atÜbergeben Sie dies an litigation.update als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent den Eintrag über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratcreatedtrue
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.
dataerforderlichFelder von data
id4521titleTitel des Eintrags. Klartext.
"Első tárgyalás elhalasztva"descriptionDetails des Eintrags als Rich-HTML, serverseitig bereinigt.
locationWo es geschah (Klartext), z. B. ein Gerichtssaal; nullbar.
event_dateTag des Eintrags, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.
user_idAutor (der Benutzer, der den Eintrag erstellt hat).
created_byAnzeigename des Autors.
last_editor_idBenutzer, der den Eintrag zuletzt bearbeitet hat.
last_editorAnzeigename des letzten Bearbeiters.
created_atupdated_atÜbergeben Sie dies an litigation.update als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent den Eintrag über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratcreatedfalseidempotent_replaytrue
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.
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/matters/1234/litigation", {
method: "POST",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"title": "Első tárgyalás elhalasztva",
"location": "Fővárosi Törvényszék, 215. tárgyaló",
"event_date": "2026-11-15"
}),
});
const result = await response.json();
import uuid
import requests
response = requests.post(
"https://www.flowyer.de/api/agent/matters/1234/litigation",
headers={
"Authorization": "Bearer flw_...",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"title": "Első tárgyalás elhalasztva",
"location": "Fővárosi Törvényszék, 215. tárgyaló",
"event_date": "2026-11-15",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"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": false,
"idempotent_replay": true
}
{
"error": "validation_failed",
"message": "The request is invalid. See \"details.fields\" for the field-level errors.",
"message_localized": "Die Anfrage ist ungültig. Die Fehler je Feld stehen in \"details.fields\".",
"locale": "de",
"details": {
"fields": {
"title": [
"Das Feld title ist erforderlich."
]
}
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Eintrag im Prozessverlauf aktualisieren
/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.
Pfadparameter
iderforderlichID des zu ändernden Datensatzes.
Anfragetext application/json
expected_updated_atDer 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.
titleNeuer Titel, höchstens 2000 Zeichen (Klartext; "<"/">" nicht zulässig). Weglassen, um den aktuellen beizubehalten.
^[^<>]*$"Ítélethirdetés elhalasztva"descriptionNeue Details (Rich-HTML, bereinigt). Weglassen, um die aktuellen beizubehalten; null/leer löscht sie.
locationNeuer Ort (Klartext, höchstens 255 Zeichen; "<"/">" nicht zulässig). Weglassen, um ihn beizubehalten; null/leer löscht ihn.
^[^<>]*$event_dateNeuer Ereignistag, YYYY-MM-DD. Weglassen, um ihn beizubehalten; null löscht ihn.
Antworten
200
Aktualisiert.
dataerforderlichFelder von data
id4521titleTitel des Eintrags. Klartext.
"Első tárgyalás elhalasztva"descriptionDetails des Eintrags als Rich-HTML, serverseitig bereinigt.
locationWo es geschah (Klartext), z. B. ein Gerichtssaal; nullbar.
event_dateTag des Eintrags, YYYY-MM-DD. Flowyer erfasst nur das Datum, keine Uhrzeit.
user_idAutor (der Benutzer, der den Eintrag erstellt hat).
created_byAnzeigename des Autors.
last_editor_idBenutzer, der den Eintrag zuletzt bearbeitet hat.
last_editorAnzeigename des letzten Bearbeiters.
created_atupdated_atÜbergeben Sie dies an litigation.update als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent den Eintrag über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratupdatedtrue
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/litigation/1234", {
method: "PATCH",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"title": "Ítélethirdetés elhalasztva"
}),
});
const result = await response.json();
import requests
response = requests.patch(
"https://www.flowyer.de/api/agent/litigation/1234",
headers={
"Authorization": "Bearer flw_...",
},
json={
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"title": "Ítélethirdetés elhalasztva",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"error": "record_conflict",
"message": "The record changed since you read it (someone edited it). Read it again and retry with the new updated_at.",
"message_localized": "Der Datensatz hat sich seit dem Lesen geändert (jemand hat ihn bearbeitet). Lesen Sie ihn erneut und wiederholen Sie die Anfrage mit dem neuen updated_at.",
"locale": "de",
"details": {
"current_updated_at": "2026-10-30T10:42:05+01:00",
"reason": "modified_since_read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Postbuch
Postbuch auflisten
/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.
Abfrageparameter
matter_idNur Einträge dieser Akte (muss für den Benutzer sichtbar sein).
1234directionNur eingehende (empfangene) oder ausgehende (gesendete) Einträge.
"incoming" "outgoing" qFreitextsuche über Betreff, Absender, Adressat, Empfänger und Sendungsnummer (Groß-/Kleinschreibung wird ignoriert).
"Kúria"date_fromNur Einträge, deren Datum an oder nach diesem Tag liegt (YYYY-MM-DD).
"2026-01-01"date_toNur Einträge, deren Datum an oder vor diesem Tag liegt (YYYY-MM-DD).
"2026-12-31"updated_sinceNur Einträge, die zu diesem Zeitpunkt oder danach geändert wurden (ISO 8601).
"2026-10-01T00:00:00+02:00"include_archivedEinträge von archivierten Akten einbeziehen.
falselimitSeitengröße, 1-100. Standard 25.
2525offsetAnzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.
00Antworten
200
OK.
dataerforderlichFelder von data
idId des Postbuch-Eintrags (mit mail_register.get / .update verwenden).
4321matterDie Akte, gegen die der Eintrag abgelegt ist.
Felder von matter
idcase_numberdirectionincoming = empfangen, outgoing = gesendet.
"incoming" "outgoing" datePost-/Erfassungsdatum, YYYY-MM-DD (keine Uhrzeit).
subjectsenderFeladó: der Absender (Freitext).
toCímzett: der Adressat (Freitext).
recipientBei einer eingehenden Post: der Anzeigename des Kollegen, der sie empfangen hat. Bei einer ausgehenden Post: der Freitext-Adressat/Empfänger.
recipient_user_idNur bei einer eingehenden Post gesetzt, deren Empfänger ein Kollege ist (eine Benutzer-id); null bei einer ausgehenden Post.
electronicTrue, wenn der Posten als elektronisch erfasst wurde (type_of_mail).
delivery_method_idId der Zustellart (mail_delivery_methods).
delivery_methodLokalisierte Bezeichnung der Zustellart (Posta, Cégkapu, Perkapu, ...) oder der elektronische/nicht-elektronische Fallback bei einer Alt-Zeile.
tracking_noAzonosító: Sendungsnummer.
folder_pathrecorded_by_user_idDer Kollege, der den Eintrag erfasst hat.
recorded_bycreated_atupdated_atÜbergeben Sie dies an mail_register.update als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent den Eintrag über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratpaginationerforderlichFelder von pagination
limiterforderlichoffseterforderlichtotalerforderlichGesamtanzahl 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/mail-register?matter_id=1234&q=K%C3%BAria&date_from=2026-01-01", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/mail-register?matter_id=1234&q=K%C3%BAria&date_from=2026-01-01",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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
}
}
{
"error": "scope_missing",
"message": "This API key does not have the \"mail_register:read\" 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 \"mail_register:read\" 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": "mail_register:read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Postbuch-Eintrag abrufen
/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.
Pfadparameter
iderforderlichId des Postbuch-Eintrags.
4321Antworten
200
OK.
dataerforderlichFelder von data
idId des Postbuch-Eintrags (mit mail_register.get / .update verwenden).
4321matterDie Akte, gegen die der Eintrag abgelegt ist.
Felder von matter
idcase_numberdirectionincoming = empfangen, outgoing = gesendet.
"incoming" "outgoing" datePost-/Erfassungsdatum, YYYY-MM-DD (keine Uhrzeit).
subjectsenderFeladó: der Absender (Freitext).
toCímzett: der Adressat (Freitext).
recipientBei einer eingehenden Post: der Anzeigename des Kollegen, der sie empfangen hat. Bei einer ausgehenden Post: der Freitext-Adressat/Empfänger.
recipient_user_idNur bei einer eingehenden Post gesetzt, deren Empfänger ein Kollege ist (eine Benutzer-id); null bei einer ausgehenden Post.
electronicTrue, wenn der Posten als elektronisch erfasst wurde (type_of_mail).
delivery_method_idId der Zustellart (mail_delivery_methods).
delivery_methodLokalisierte Bezeichnung der Zustellart (Posta, Cégkapu, Perkapu, ...) oder der elektronische/nicht-elektronische Fallback bei einer Alt-Zeile.
tracking_noAzonosító: Sendungsnummer.
folder_pathrecorded_by_user_idDer Kollege, der den Eintrag erfasst hat.
recorded_bycreated_atupdated_atÜbergeben Sie dies an mail_register.update als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent den Eintrag über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduserat
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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/mail-register/4321", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/mail-register/4321",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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"
}
}
}
{
"error": "not_found",
"message": "The record was not found, or it is not visible to the user who owns this API key.",
"message_localized": "Der Datensatz wurde nicht gefunden oder ist für den Inhaber dieses API-Schlüssels nicht sichtbar.",
"locale": "de",
"details": {
"record_type": "mail",
"record_id": 4321
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Postbuch-Eintrag anlegen
/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.
Header-Parameter
Idempotency-KeyBei 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.
^[A-Za-z0-9_\-:.]{1,128}$Anfragetext application/json
matter_iderforderlichAkte, zu der der Eintrag gehört (muss sichtbar sein).
1234directionerforderlichincoming = empfangen, outgoing = gesendet.
"incoming" "outgoing" dateerforderlichPost-/Erfassungsdatum, YYYY-MM-DD (keine Uhrzeit).
"2026-11-03"subjecterforderlichBetreff der Korrespondenz. Klartext; "<" und ">" sind nicht zulässig.
^[^<>]*$"Fellebbezés a Kúriához"senderFeladó: der Absender (Freitext). Klartext; "<" und ">" sind nicht zulässig.
^[^<>]*$toCímzett: der Adressat (Freitext). Klartext; "<" und ">" sind nicht zulässig.
^[^<>]*$recipientAusgehende Post: der Freitext-Adressat/Empfänger. Nicht zusammen mit recipient_user_id zulässig. Klartext; "<" und ">" sind nicht zulässig.
^[^<>]*$recipient_user_idEingehende Post: der Kollege, der sie empfangen hat (eine Benutzer-id aus colleagues.list), gespeichert als numerischer recipient. Nicht zusammen mit recipient zulässig.
electronicOb der Posten elektronisch ist (type_of_mail); unabhängig von der Zustellart. Standard false.
falsedelivery_method_idId der Zustellart (mail_delivery_methods): z. B. 1 Posta, 4 Cégkapu, 7 Perkapu. 422, wenn unbekannt.
tracking_noAzonosító: Sendungsnummer. Klartext; "<" und ">" sind nicht zulässig.
^[^<>]*$folder_path^[^<>]*$idempotency_keyDieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.
^[A-Za-z0-9_\-:.]{1,128}$"b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"Antworten
201
Erstellt.
dataerforderlichFelder von data
idId des Postbuch-Eintrags (mit mail_register.get / .update verwenden).
4321matterDie Akte, gegen die der Eintrag abgelegt ist.
Felder von matter
idcase_numberdirectionincoming = empfangen, outgoing = gesendet.
"incoming" "outgoing" datePost-/Erfassungsdatum, YYYY-MM-DD (keine Uhrzeit).
subjectsenderFeladó: der Absender (Freitext).
toCímzett: der Adressat (Freitext).
recipientBei einer eingehenden Post: der Anzeigename des Kollegen, der sie empfangen hat. Bei einer ausgehenden Post: der Freitext-Adressat/Empfänger.
recipient_user_idNur bei einer eingehenden Post gesetzt, deren Empfänger ein Kollege ist (eine Benutzer-id); null bei einer ausgehenden Post.
electronicTrue, wenn der Posten als elektronisch erfasst wurde (type_of_mail).
delivery_method_idId der Zustellart (mail_delivery_methods).
delivery_methodLokalisierte Bezeichnung der Zustellart (Posta, Cégkapu, Perkapu, ...) oder der elektronische/nicht-elektronische Fallback bei einer Alt-Zeile.
tracking_noAzonosító: Sendungsnummer.
folder_pathrecorded_by_user_idDer Kollege, der den Eintrag erfasst hat.
recorded_bycreated_atupdated_atÜbergeben Sie dies an mail_register.update als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent den Eintrag über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratcreatedtrue
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.
dataerforderlichFelder von data
idId des Postbuch-Eintrags (mit mail_register.get / .update verwenden).
4321matterDie Akte, gegen die der Eintrag abgelegt ist.
Felder von matter
idcase_numberdirectionincoming = empfangen, outgoing = gesendet.
"incoming" "outgoing" datePost-/Erfassungsdatum, YYYY-MM-DD (keine Uhrzeit).
subjectsenderFeladó: der Absender (Freitext).
toCímzett: der Adressat (Freitext).
recipientBei einer eingehenden Post: der Anzeigename des Kollegen, der sie empfangen hat. Bei einer ausgehenden Post: der Freitext-Adressat/Empfänger.
recipient_user_idNur bei einer eingehenden Post gesetzt, deren Empfänger ein Kollege ist (eine Benutzer-id); null bei einer ausgehenden Post.
electronicTrue, wenn der Posten als elektronisch erfasst wurde (type_of_mail).
delivery_method_idId der Zustellart (mail_delivery_methods).
delivery_methodLokalisierte Bezeichnung der Zustellart (Posta, Cégkapu, Perkapu, ...) oder der elektronische/nicht-elektronische Fallback bei einer Alt-Zeile.
tracking_noAzonosító: Sendungsnummer.
folder_pathrecorded_by_user_idDer Kollege, der den Eintrag erfasst hat.
recorded_bycreated_atupdated_atÜbergeben Sie dies an mail_register.update als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent den Eintrag über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratcreatedfalseidempotent_replaytrue
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.
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/mail-register", {
method: "POST",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"matter_id": 1234,
"direction": "incoming",
"date": "2026-11-03",
"subject": "Fellebbezés a Kúriához"
}),
});
const result = await response.json();
import uuid
import requests
response = requests.post(
"https://www.flowyer.de/api/agent/mail-register",
headers={
"Authorization": "Bearer flw_...",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"matter_id": 1234,
"direction": "incoming",
"date": "2026-11-03",
"subject": "Fellebbezés a Kúriához",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"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": false,
"idempotent_replay": true
}
{
"error": "validation_failed",
"message": "The request is invalid. See \"details.fields\" for the field-level errors.",
"message_localized": "Die Anfrage ist ungültig. Die Fehler je Feld stehen in \"details.fields\".",
"locale": "de",
"details": {
"fields": {
"matter_id": [
"Das Feld matter id ist erforderlich."
]
}
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Postbuch-Eintrag aktualisieren
/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.
Pfadparameter
iderforderlichID des zu ändernden Datensatzes.
Anfragetext application/json
expected_updated_atDer 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.
directionincoming = empfangen, outgoing = gesendet.
"incoming" "outgoing" datePost-/Erfassungsdatum, YYYY-MM-DD.
subjectBetreff. Klartext; "<" und ">" sind nicht zulässig.
^[^<>]*$senderFeladó: der Absender (Freitext). Klartext; "<" und ">" sind nicht zulässig.
^[^<>]*$toCímzett: der Adressat (Freitext). Klartext; "<" und ">" sind nicht zulässig.
^[^<>]*$recipientAusgehende Post: der Freitext-Adressat. Nicht zusammen mit recipient_user_id zulässig. Klartext; "<" und ">" sind nicht zulässig.
^[^<>]*$recipient_user_idEingehende Post: der empfangende Kollege (eine Benutzer-id), gespeichert als numerischer recipient. Nicht zusammen mit recipient zulässig.
electronicOb der Posten elektronisch ist (type_of_mail).
delivery_method_idId der Zustellart (mail_delivery_methods); 422, wenn unbekannt.
tracking_noAzonosító: Sendungsnummer. Klartext; "<" und ">" sind nicht zulässig.
^[^<>]*$folder_path^[^<>]*$Antworten
200
Aktualisiert.
dataerforderlichFelder von data
idId des Postbuch-Eintrags (mit mail_register.get / .update verwenden).
4321matterDie Akte, gegen die der Eintrag abgelegt ist.
Felder von matter
idcase_numberdirectionincoming = empfangen, outgoing = gesendet.
"incoming" "outgoing" datePost-/Erfassungsdatum, YYYY-MM-DD (keine Uhrzeit).
subjectsenderFeladó: der Absender (Freitext).
toCímzett: der Adressat (Freitext).
recipientBei einer eingehenden Post: der Anzeigename des Kollegen, der sie empfangen hat. Bei einer ausgehenden Post: der Freitext-Adressat/Empfänger.
recipient_user_idNur bei einer eingehenden Post gesetzt, deren Empfänger ein Kollege ist (eine Benutzer-id); null bei einer ausgehenden Post.
electronicTrue, wenn der Posten als elektronisch erfasst wurde (type_of_mail).
delivery_method_idId der Zustellart (mail_delivery_methods).
delivery_methodLokalisierte Bezeichnung der Zustellart (Posta, Cégkapu, Perkapu, ...) oder der elektronische/nicht-elektronische Fallback bei einer Alt-Zeile.
tracking_noAzonosító: Sendungsnummer.
folder_pathrecorded_by_user_idDer Kollege, der den Eintrag erfasst hat.
recorded_bycreated_atupdated_atÜbergeben Sie dies an mail_register.update als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent den Eintrag über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratupdatedtrue
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/mail-register/1234", {
method: "PATCH",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"direction": "incoming"
}),
});
const result = await response.json();
import requests
response = requests.patch(
"https://www.flowyer.de/api/agent/mail-register/1234",
headers={
"Authorization": "Bearer flw_...",
},
json={
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"direction": "incoming",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"error": "record_conflict",
"message": "The record changed since you read it (someone edited it). Read it again and retry with the new updated_at.",
"message_localized": "Der Datensatz hat sich seit dem Lesen geändert (jemand hat ihn bearbeitet). Lesen Sie ihn erneut und wiederholen Sie die Anfrage mit dem neuen updated_at.",
"locale": "de",
"details": {
"current_updated_at": "2026-10-30T10:42:05+01:00",
"reason": "modified_since_read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Kommentare
Fallkommentare auflisten
/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.
Pfadparameter
iderforderlichAkten-id (muss sichtbar sein).
1234Abfrageparameter
top_level_onlyNur übergeordnete Kommentare (Antworten ausschließen). Standard false.
falselimitSeitengröße, 1-100. Standard 25.
2525offsetAnzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.
00Antworten
200
OK.
dataerforderlichFelder von data
id9876matter_idDie Akte (= case_id), zu der der Kommentar gehört.
parent_idDer übergeordnete Kommentar, auf den dieser antwortet; null bei einem übergeordneten Kommentar. Antworten sind eine Ebene tief.
author_user_idBenutzer-ID des Autors (null bei einem Altimport).
author_nameAnzeigename des Autors oder null.
bodyDer Kommentar wie gespeichert: Rich-HTML, bereits mit HTMLPurifier bereinigt für über diese API geschriebene Kommentare.
created_atWann der Kommentar gepostet wurde, ISO 8601 in der Kanzleizone.
updated_atOptimistic-Lock-Token: Übergeben Sie es an comments.update als expected_updated_at. Keine Anzeigezeit; null bei einem Altkommentar ohne eines.
editedTrue, wenn der Kommentar seit dem Posten bearbeitet wurde.
paginationerforderlichFelder von pagination
limiterforderlichoffseterforderlichtotalerforderlichGesamtanzahl 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/matters/1234/comments?limit=25", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/matters/1234/comments?limit=25",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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
}
}
{
"error": "matter_not_visible",
"message": "The matter 1234 does not exist, is archived, or is not visible to the user who owns this API key.",
"message_localized": "Die Akte 1234 existiert nicht, ist archiviert oder für den Inhaber dieses API-Schlüssels nicht sichtbar.",
"locale": "de",
"details": {
"matter_id": 1234
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Fallkommentar posten
/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.
Pfadparameter
iderforderlichAkten-id (muss sichtbar sein).
1234Header-Parameter
Idempotency-KeyBei 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.
^[A-Za-z0-9_\-:.]{1,128}$Anfragetext application/json
bodyerforderlichDer Kommentar, Rich-HTML (wie von TinyMCE erzeugt). Serverseitig mit HTMLPurifier bereinigt vor dem Speichern. Höchstens 100000 Zeichen.
"<p>Egyetértek, a határidő tartható.</p>"parent_idAntworten Sie auf diesen ÜBERGEORDNETEN Kommentar DERSELBEN Akte (aus comments.list, parent_id = null); weglassen für einen neuen übergeordneten Kommentar.
idempotency_keyDieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.
^[A-Za-z0-9_\-:.]{1,128}$"b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"Antworten
201
Erstellt.
dataerforderlichFelder von data
id9876matter_idDie Akte (= case_id), zu der der Kommentar gehört.
parent_idDer übergeordnete Kommentar, auf den dieser antwortet; null bei einem übergeordneten Kommentar. Antworten sind eine Ebene tief.
author_user_idBenutzer-ID des Autors (null bei einem Altimport).
author_nameAnzeigename des Autors oder null.
bodyDer Kommentar wie gespeichert: Rich-HTML, bereits mit HTMLPurifier bereinigt für über diese API geschriebene Kommentare.
created_atWann der Kommentar gepostet wurde, ISO 8601 in der Kanzleizone.
updated_atOptimistic-Lock-Token: Übergeben Sie es an comments.update als expected_updated_at. Keine Anzeigezeit; null bei einem Altkommentar ohne eines.
editedTrue, wenn der Kommentar seit dem Posten bearbeitet wurde.
createdtrue
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.
dataerforderlichFelder von data
id9876matter_idDie Akte (= case_id), zu der der Kommentar gehört.
parent_idDer übergeordnete Kommentar, auf den dieser antwortet; null bei einem übergeordneten Kommentar. Antworten sind eine Ebene tief.
author_user_idBenutzer-ID des Autors (null bei einem Altimport).
author_nameAnzeigename des Autors oder null.
bodyDer Kommentar wie gespeichert: Rich-HTML, bereits mit HTMLPurifier bereinigt für über diese API geschriebene Kommentare.
created_atWann der Kommentar gepostet wurde, ISO 8601 in der Kanzleizone.
updated_atOptimistic-Lock-Token: Übergeben Sie es an comments.update als expected_updated_at. Keine Anzeigezeit; null bei einem Altkommentar ohne eines.
editedTrue, wenn der Kommentar seit dem Posten bearbeitet wurde.
createdfalseidempotent_replaytrue
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.
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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>"
}'
const response = await fetch("https://www.flowyer.de/api/agent/matters/1234/comments", {
method: "POST",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"body": "<p>Egyetértek, a határidő tartható.</p>"
}),
});
const result = await response.json();
import uuid
import requests
response = requests.post(
"https://www.flowyer.de/api/agent/matters/1234/comments",
headers={
"Authorization": "Bearer flw_...",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"body": "<p>Egyetértek, a határidő tartható.</p>",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"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": false,
"idempotent_replay": true
}
{
"error": "validation_failed",
"message": "The request is invalid. See \"details.fields\" for the field-level errors.",
"message_localized": "Die Anfrage ist ungültig. Die Fehler je Feld stehen in \"details.fields\".",
"locale": "de",
"details": {
"fields": {
"body": [
"Das Feld body ist erforderlich."
]
}
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Eigenen Fallkommentar bearbeiten
/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.
Pfadparameter
iderforderlichID des zu ändernden Datensatzes.
Anfragetext application/json
expected_updated_atDer 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.
bodyerforderlichNeuer Kommentarinhalt, Rich-HTML (wie von TinyMCE erzeugt). Serverseitig mit HTMLPurifier bereinigt vor dem Speichern. Höchstens 100000 Zeichen.
"<p>Pontosítás: a határidő november 15.</p>"Antworten
200
Aktualisiert.
dataerforderlichFelder von data
id9876matter_idDie Akte (= case_id), zu der der Kommentar gehört.
parent_idDer übergeordnete Kommentar, auf den dieser antwortet; null bei einem übergeordneten Kommentar. Antworten sind eine Ebene tief.
author_user_idBenutzer-ID des Autors (null bei einem Altimport).
author_nameAnzeigename des Autors oder null.
bodyDer Kommentar wie gespeichert: Rich-HTML, bereits mit HTMLPurifier bereinigt für über diese API geschriebene Kommentare.
created_atWann der Kommentar gepostet wurde, ISO 8601 in der Kanzleizone.
updated_atOptimistic-Lock-Token: Übergeben Sie es an comments.update als expected_updated_at. Keine Anzeigezeit; null bei einem Altkommentar ohne eines.
editedTrue, wenn der Kommentar seit dem Posten bearbeitet wurde.
updatedtrue
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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>"
}'
const response = await fetch("https://www.flowyer.de/api/agent/comments/1234", {
method: "PATCH",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"body": "<p>Pontosítás: a határidő november 15.</p>"
}),
});
const result = await response.json();
import requests
response = requests.patch(
"https://www.flowyer.de/api/agent/comments/1234",
headers={
"Authorization": "Bearer flw_...",
},
json={
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"body": "<p>Pontosítás: a határidő november 15.</p>",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"error": "record_conflict",
"message": "The record changed since you read it (someone edited it). Read it again and retry with the new updated_at.",
"message_localized": "Der Datensatz hat sich seit dem Lesen geändert (jemand hat ihn bearbeitet). Lesen Sie ihn erneut und wiederholen Sie die Anfrage mit dem neuen updated_at.",
"locale": "de",
"details": {
"current_updated_at": "2026-10-30T10:42:05+01:00",
"reason": "modified_since_read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Verhandlungen
Verhandlungen einer Akte auflisten
/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.
Pfadparameter
iderforderlichAngelegenheits-ID.
1234Abfrageparameter
fromNur Verhandlungen an oder nach diesem Tag (YYYY-MM-DD), in der Zeitzone der Kanzlei.
"2026-01-01"toNur Verhandlungen an oder vor diesem Tag (YYYY-MM-DD), in der Zeitzone der Kanzlei.
"2026-12-31"updated_sinceNur Verhandlungen, die zu dieser ISO-8601-Zeit oder danach geändert wurden.
limitSeitengröße, 1-100. Standard 25.
2525offsetAnzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.
00Antworten
200
OK.
dataerforderlichFelder von data
id4321matterDie Akte (Fall), zu der die Verhandlung gehört.
Felder von matter
idcase_numberdateDatum und Uhrzeit der Verhandlung, ISO 8601 in der Zeitzone der Kanzlei. Sie wird in UTC gespeichert, vergleichen Sie also Zeitpunkte statt des Wanduhr-Textes.
"2026-03-02T09:00:00+01:00"participationOb die Teilnahme eines Kollegen erforderlich ist: "required", "not_required" oder null, wenn nicht gesetzt.
"required" "not_required" courtDas Gericht der Verhandlung, aufgelöst aus dem gemeinsamen Gerichtsverzeichnis; null, wenn kein Gericht gesetzt ist.
Felder von court
idnamecityzipaddresssourceImmer "registry": Das Gericht ist eine Referenz auf das gemeinsame Gerichtsverzeichnis (courts.list), kein Freitext.
placeRaum oder Ort der Verhandlung. Klartext.
name_of_the_judgeName des Richters. Klartext.
notesFreitextnotizen zur Verhandlung. Klartext.
responsiblesAn der Verhandlung teilnehmende Kollegen (ids aus colleagues.list).
Felder von responsibles
user_idnamerecorded_byDer Kollege, der die Verhandlung erfasst hat.
Felder von recorded_by
user_idnamecreated_atupdated_atÜbergeben Sie dies an trials.update als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratpaginationerforderlichFelder von pagination
limiterforderlichoffseterforderlichtotalerforderlichGesamtanzahl 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/matters/1234/trials?from=2026-01-01&to=2026-12-31&limit=25", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/matters/1234/trials?from=2026-01-01&to=2026-12-31&limit=25",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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
}
}
{
"error": "matter_not_visible",
"message": "The matter 1234 does not exist, is archived, or is not visible to the user who owns this API key.",
"message_localized": "Die Akte 1234 existiert nicht, ist archiviert oder für den Inhaber dieses API-Schlüssels nicht sichtbar.",
"locale": "de",
"details": {
"matter_id": 1234
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Verhandlung abrufen
/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.
Pfadparameter
iderforderlichVerhandlungs-id.
4321Antworten
200
OK.
dataerforderlichFelder von data
id4321matterDie Akte (Fall), zu der die Verhandlung gehört.
Felder von matter
idcase_numberdateDatum und Uhrzeit der Verhandlung, ISO 8601 in der Zeitzone der Kanzlei. Sie wird in UTC gespeichert, vergleichen Sie also Zeitpunkte statt des Wanduhr-Textes.
"2026-03-02T09:00:00+01:00"participationOb die Teilnahme eines Kollegen erforderlich ist: "required", "not_required" oder null, wenn nicht gesetzt.
"required" "not_required" courtDas Gericht der Verhandlung, aufgelöst aus dem gemeinsamen Gerichtsverzeichnis; null, wenn kein Gericht gesetzt ist.
Felder von court
idnamecityzipaddresssourceImmer "registry": Das Gericht ist eine Referenz auf das gemeinsame Gerichtsverzeichnis (courts.list), kein Freitext.
placeRaum oder Ort der Verhandlung. Klartext.
name_of_the_judgeName des Richters. Klartext.
notesFreitextnotizen zur Verhandlung. Klartext.
responsiblesAn der Verhandlung teilnehmende Kollegen (ids aus colleagues.list).
Felder von responsibles
user_idnamerecorded_byDer Kollege, der die Verhandlung erfasst hat.
Felder von recorded_by
user_idnamecreated_atupdated_atÜbergeben Sie dies an trials.update als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduserat
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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/trials/4321", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/trials/4321",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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"
}
}
}
{
"error": "not_found",
"message": "The record was not found, or it is not visible to the user who owns this API key.",
"message_localized": "Der Datensatz wurde nicht gefunden oder ist für den Inhaber dieses API-Schlüssels nicht sichtbar.",
"locale": "de",
"details": {
"record_type": "trial",
"record_id": 4321
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Verhandlung erfassen
/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.
Pfadparameter
iderforderlichAkte, zu der die Verhandlung gehört (muss sichtbar und nicht archiviert sein).
1234Header-Parameter
Idempotency-KeyBei 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.
^[A-Za-z0-9_\-:.]{1,128}$Anfragetext application/json
dateerforderlichDatum 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.
"2026-03-02T09:00:00+01:00"court_idGericht der Verhandlung: eine id aus courts.list (das gemeinsame Gerichtsverzeichnis). Weglassen, wenn das Gericht nicht bekannt ist.
42participationOb die Teilnahme eines Kollegen erforderlich ist. Weglassen, um es ungesetzt zu lassen.
"required" "not_required" placeRaum oder Ort der Verhandlung. Klartext; "<" und ">" sind nicht zulässig.
^[^<>]*$"II. emelet 205."name_of_the_judgeName des Richters. Klartext; "<" und ">" sind nicht zulässig.
^[^<>]*$notesFreitextnotizen zur Verhandlung. Klartext; "<" und ">" sind nicht zulässig.
^[^<>]*$responsible_user_idsBenutzer-ids der an der Verhandlung teilnehmenden Kollegen (aus colleagues.list).
idempotency_keyDieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.
^[A-Za-z0-9_\-:.]{1,128}$"b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"Antworten
201
Erstellt.
dataerforderlichFelder von data
id4321matterDie Akte (Fall), zu der die Verhandlung gehört.
Felder von matter
idcase_numberdateDatum und Uhrzeit der Verhandlung, ISO 8601 in der Zeitzone der Kanzlei. Sie wird in UTC gespeichert, vergleichen Sie also Zeitpunkte statt des Wanduhr-Textes.
"2026-03-02T09:00:00+01:00"participationOb die Teilnahme eines Kollegen erforderlich ist: "required", "not_required" oder null, wenn nicht gesetzt.
"required" "not_required" courtDas Gericht der Verhandlung, aufgelöst aus dem gemeinsamen Gerichtsverzeichnis; null, wenn kein Gericht gesetzt ist.
Felder von court
idnamecityzipaddresssourceImmer "registry": Das Gericht ist eine Referenz auf das gemeinsame Gerichtsverzeichnis (courts.list), kein Freitext.
placeRaum oder Ort der Verhandlung. Klartext.
name_of_the_judgeName des Richters. Klartext.
notesFreitextnotizen zur Verhandlung. Klartext.
responsiblesAn der Verhandlung teilnehmende Kollegen (ids aus colleagues.list).
Felder von responsibles
user_idnamerecorded_byDer Kollege, der die Verhandlung erfasst hat.
Felder von recorded_by
user_idnamecreated_atupdated_atÜbergeben Sie dies an trials.update als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratcreatedtrue
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.
dataerforderlichFelder von data
id4321matterDie Akte (Fall), zu der die Verhandlung gehört.
Felder von matter
idcase_numberdateDatum und Uhrzeit der Verhandlung, ISO 8601 in der Zeitzone der Kanzlei. Sie wird in UTC gespeichert, vergleichen Sie also Zeitpunkte statt des Wanduhr-Textes.
"2026-03-02T09:00:00+01:00"participationOb die Teilnahme eines Kollegen erforderlich ist: "required", "not_required" oder null, wenn nicht gesetzt.
"required" "not_required" courtDas Gericht der Verhandlung, aufgelöst aus dem gemeinsamen Gerichtsverzeichnis; null, wenn kein Gericht gesetzt ist.
Felder von court
idnamecityzipaddresssourceImmer "registry": Das Gericht ist eine Referenz auf das gemeinsame Gerichtsverzeichnis (courts.list), kein Freitext.
placeRaum oder Ort der Verhandlung. Klartext.
name_of_the_judgeName des Richters. Klartext.
notesFreitextnotizen zur Verhandlung. Klartext.
responsiblesAn der Verhandlung teilnehmende Kollegen (ids aus colleagues.list).
Felder von responsibles
user_idnamerecorded_byDer Kollege, der die Verhandlung erfasst hat.
Felder von recorded_by
user_idnamecreated_atupdated_atÜbergeben Sie dies an trials.update als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratcreatedfalseidempotent_replaytrue
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.
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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."
}'
const response = await fetch("https://www.flowyer.de/api/agent/matters/1234/trials", {
method: "POST",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"date": "2026-03-02T09:00:00+01:00",
"court_id": 42,
"place": "II. emelet 205."
}),
});
const result = await response.json();
import uuid
import requests
response = requests.post(
"https://www.flowyer.de/api/agent/matters/1234/trials",
headers={
"Authorization": "Bearer flw_...",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"date": "2026-03-02T09:00:00+01:00",
"court_id": 42,
"place": "II. emelet 205.",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"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": false,
"idempotent_replay": true
}
{
"error": "validation_failed",
"message": "The request is invalid. See \"details.fields\" for the field-level errors.",
"message_localized": "Die Anfrage ist ungültig. Die Fehler je Feld stehen in \"details.fields\".",
"locale": "de",
"details": {
"fields": {
"date": [
"Das Feld date ist erforderlich."
]
}
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Verhandlung aktualisieren
/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.
Pfadparameter
iderforderlichID des zu ändernden Datensatzes.
Anfragetext application/json
expected_updated_atDer 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.
dateNeues Datum und neue Uhrzeit der Verhandlung, ISO 8601 (ein Offset wird berücksichtigt, eine zeitzonenlose Zeit wird in der Kanzleizone gelesen). In UTC gespeichert.
"2026-03-02T09:00:00+01:00"court_idNeue Gerichts-id aus courts.list; null, um das Gericht zu löschen.
participationOb die Teilnahme eines Kollegen erforderlich ist; null, um es zu löschen.
"required" "not_required" placeRaum oder Ort. Klartext; "<" und ">" sind nicht zulässig. "" löscht ihn.
^[^<>]*$name_of_the_judgeName des Richters. Klartext; "<" und ">" sind nicht zulässig. "" löscht ihn.
^[^<>]*$notesFreitextnotizen. Klartext; "<" und ">" sind nicht zulässig. "" löscht sie.
^[^<>]*$responsible_user_idsVollständiger Ersatzsatz von Teilnehmer-Benutzer-ids (aus colleagues.list). Weglassen, um die Teilnehmer unverändert zu lassen.
Antworten
200
Aktualisiert.
dataerforderlichFelder von data
id4321matterDie Akte (Fall), zu der die Verhandlung gehört.
Felder von matter
idcase_numberdateDatum und Uhrzeit der Verhandlung, ISO 8601 in der Zeitzone der Kanzlei. Sie wird in UTC gespeichert, vergleichen Sie also Zeitpunkte statt des Wanduhr-Textes.
"2026-03-02T09:00:00+01:00"participationOb die Teilnahme eines Kollegen erforderlich ist: "required", "not_required" oder null, wenn nicht gesetzt.
"required" "not_required" courtDas Gericht der Verhandlung, aufgelöst aus dem gemeinsamen Gerichtsverzeichnis; null, wenn kein Gericht gesetzt ist.
Felder von court
idnamecityzipaddresssourceImmer "registry": Das Gericht ist eine Referenz auf das gemeinsame Gerichtsverzeichnis (courts.list), kein Freitext.
placeRaum oder Ort der Verhandlung. Klartext.
name_of_the_judgeName des Richters. Klartext.
notesFreitextnotizen zur Verhandlung. Klartext.
responsiblesAn der Verhandlung teilnehmende Kollegen (ids aus colleagues.list).
Felder von responsibles
user_idnamerecorded_byDer Kollege, der die Verhandlung erfasst hat.
Felder von recorded_by
user_idnamecreated_atupdated_atÜbergeben Sie dies an trials.update als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratupdatedtrue
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/trials/1234", {
method: "PATCH",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"date": "2026-03-02T09:00:00+01:00"
}),
});
const result = await response.json();
import requests
response = requests.patch(
"https://www.flowyer.de/api/agent/trials/1234",
headers={
"Authorization": "Bearer flw_...",
},
json={
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"date": "2026-03-02T09:00:00+01:00",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"error": "record_conflict",
"message": "The record changed since you read it (someone edited it). Read it again and retry with the new updated_at.",
"message_localized": "Der Datensatz hat sich seit dem Lesen geändert (jemand hat ihn bearbeitet). Lesen Sie ihn erneut und wiederholen Sie die Anfrage mit dem neuen updated_at.",
"locale": "de",
"details": {
"current_updated_at": "2026-10-30T10:42:05+01:00",
"reason": "modified_since_read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Gerichte
Gerichte auflisten
/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.
Abfrageparameter
qEin nachzuschlagender Gerichtsname, wie gehört oder diktiert, in beliebiger Wortreihenfolge. Lassen Sie ihn weg, um jedes Gericht aufzulisten.
"Fővárosi Törvényszék"limitMaximale Anzahl zurückzugebender Gerichte (Standard 200).
200Antworten
200
OK.
dataerforderlichFelder von data
statusNur 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.
"exact" "similar" "none" courtsGerichte, mit q bester Treffer zuerst, andernfalls nach Namen.
Felder von courts
idGerichts-id: Übergeben Sie sie als court_id an trials.create / trials.update.
nameGerichtsname, wie er in Flowyer angezeigt wird.
cityzipaddresstotalWie viele Gerichte übereinstimmten (ohne q alle Gerichte), bevor die Liste auf limit gekürzt wurde.
truncatedTrue, 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/courts?q=F%C5%91v%C3%A1rosi%20T%C3%B6rv%C3%A9nysz%C3%A9k", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/courts?q=F%C5%91v%C3%A1rosi%20T%C3%B6rv%C3%A9nysz%C3%A9k",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
Antwortbeispiele
{
"data": {
"status": "exact",
"courts": [
{
"id": 1234,
"name": "string",
"city": "string",
"zip": "string",
"address": "string"
}
],
"total": 1,
"truncated": true
}
}
{
"error": "scope_missing",
"message": "This API key does not have the \"courts:read\" 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 \"courts:read\" 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": "courts:read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
HR
Mitarbeiterabwesenheiten auflisten
/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.
Abfrageparameter
user_idNur die Abwesenheiten dieses Kollegen. Eine zentrale Benutzer-id (aus colleagues.list), dem Mitarbeiter hinter der Abwesenheit zugeordnet.
1234on_dateWer an genau diesem Tag abwesend ist (start_date <= on_date <= end_date). Wenn gesetzt, übersteuert es date_from, date_to und timeframe.
date_fromNur 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_toNur Abwesenheiten, die an oder vor diesem Datum beginnen (start_date <= date_to). Weglassen für eine offene Zukunft.
timeframeZusä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.
"current" "upcoming" "all" "all"limitSeitengröße, 1-100. Standard 25.
2525offsetAnzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.
00Antworten
200
OK.
dataerforderlichFelder von data
idId des Abwesenheitsantrags (nur eine Kennung; nicht sensibel).
user_idDer abwesende Kollege (zentrale Benutzer-id).
userAnzeigename des Kollegen.
start_dateErster Tag der Abwesenheit (YYYY-MM-DD).
end_dateLetzter Tag der Abwesenheit, inklusiv (YYYY-MM-DD).
days_countArbeitstage der Abwesenheit. Verrät die Art nicht.
categoryDatenschutzbedingt geschwärzte Abwesenheitsart: Jahresurlaub und Krankheit werden beide zu "leave" (Krankheit ist nie identifizierbar), unpaid bleibt "unpaid". Die rohe Abwesenheitsart wird nie offengelegt.
"leave" "unpaid" statusImmer "approved" - nur genehmigte Abwesenheiten werden zurückgegeben; pending, rejected und cancelled erscheinen nie.
"approved" substitute_user_idVertretender Kollege für diese Abwesenheit (zentrale Benutzer-id) oder null.
substitute_userAnzeigename des vertretenden Kollegen oder null.
paginationerforderlichFelder von pagination
limiterforderlichoffseterforderlichtotalerforderlichGesamtanzahl 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/hr/leaves?user_id=1234&limit=25", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/hr/leaves?user_id=1234&limit=25",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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
}
}
{
"error": "scope_missing",
"message": "This API key does not have the \"hr:read\" 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 \"hr:read\" 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": "hr:read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Kalender
Kalendereinträge auflisten
/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.
Abfrageparameter
fromerforderlichBereichsbeginn (einschließlich), ISO 8601. Einträge, die [from, to] überschneiden, werden zurückgegeben. Eine Zeit ohne Offset wird in der Kanzleizone gelesen.
"2026-03-01T00:00:00+01:00"toerforderlichBereichsende (einschließlich), ISO 8601. Muss an oder nach from liegen (andernfalls 422) und höchstens 366 Tage danach.
"2026-03-31T23:59:59+01:00"calendar_idsAuf 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_recurringWiederkehrende Master-Einträge einbeziehen, deren Regel den Bereich überschneidet (unexpandiert zurückgegeben, is_recurring = true). Standard true.
truelimitSeitengröße, 1-100. Standard 25.
2525offsetAnzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.
00Antworten
200
OK.
dataerforderlichFelder von data
id5501calendarDer Kalender, zu dem der Eintrag gehört.
Felder von calendar
idContainer-Kalender-id oder null für den impliziten gemeinsamen Kanzleikalender (ein Alt-Eintrag ohne Container).
nametype"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.
"office" "personal" ownerEigentümer eines persönlichen Kalenders; null beim Kanzleikalender.
Felder von owner
user_idnametitleTitel des Eintrags. Klartext.
descriptionBeschreibung des Eintrags. Klartext.
locationOrt. Klartext.
participantsTeilnehmer, Freitext. Klartext.
startEin ganztägiger Eintrag: das Startdatum "YYYY-MM-DD". Ein zeitgebundener Eintrag: ISO 8601 in der Zeitzone der Kanzlei (der gespeicherte UTC-Zeitpunkt).
"2026-03-02T09:00:00+01:00"endGleiche 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_dayTrue bei einem ganztägigen Eintrag (start/end sind reine Daten); false bei einem zeitgebundenen Eintrag (start/end sind ISO-8601-Zeitpunkte).
colorAnzeigefarbe, z. B. "#2c7be5".
is_recurringTrue, 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.
recurrenceDie Wiederholungsregel eines wiederkehrenden Masters oder null bei einem einzelnen Eintrag. Schreibgeschützt.
Felder von recurrence
freqdaily | weekly | monthly | yearly.
intervalbyweekdayDurch Komma getrennte Wochentagscodes (z. B. "MO,WE,FR").
untilcountcreated_byDer Kollege, der den Eintrag erstellt hat.
Felder von created_by
user_idnamecreated_atupdated_atÜbergeben Sie dies an calendar.events.update als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratpaginationerforderlichFelder von pagination
limiterforderlichoffseterforderlichtotalerforderlichGesamtanzahl 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("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", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"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",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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
}
}
{
"error": "scope_missing",
"message": "This API key does not have the \"calendar:read\" 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 \"calendar:read\" 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": "calendar:read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Kalendereintrag abrufen
/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.
Pfadparameter
iderforderlichEintrags-ID.
5501Antworten
200
OK.
dataerforderlichFelder von data
id5501calendarDer Kalender, zu dem der Eintrag gehört.
Felder von calendar
idContainer-Kalender-id oder null für den impliziten gemeinsamen Kanzleikalender (ein Alt-Eintrag ohne Container).
nametype"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.
"office" "personal" ownerEigentümer eines persönlichen Kalenders; null beim Kanzleikalender.
Felder von owner
user_idnametitleTitel des Eintrags. Klartext.
descriptionBeschreibung des Eintrags. Klartext.
locationOrt. Klartext.
participantsTeilnehmer, Freitext. Klartext.
startEin ganztägiger Eintrag: das Startdatum "YYYY-MM-DD". Ein zeitgebundener Eintrag: ISO 8601 in der Zeitzone der Kanzlei (der gespeicherte UTC-Zeitpunkt).
"2026-03-02T09:00:00+01:00"endGleiche 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_dayTrue bei einem ganztägigen Eintrag (start/end sind reine Daten); false bei einem zeitgebundenen Eintrag (start/end sind ISO-8601-Zeitpunkte).
colorAnzeigefarbe, z. B. "#2c7be5".
is_recurringTrue, 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.
recurrenceDie Wiederholungsregel eines wiederkehrenden Masters oder null bei einem einzelnen Eintrag. Schreibgeschützt.
Felder von recurrence
freqdaily | weekly | monthly | yearly.
intervalbyweekdayDurch Komma getrennte Wochentagscodes (z. B. "MO,WE,FR").
untilcountcreated_byDer Kollege, der den Eintrag erstellt hat.
Felder von created_by
user_idnamecreated_atupdated_atÜbergeben Sie dies an calendar.events.update als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduserat
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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/calendar/events/5501", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/calendar/events/5501",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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"
}
}
}
{
"error": "not_found",
"message": "The record was not found, or it is not visible to the user who owns this API key.",
"message_localized": "Der Datensatz wurde nicht gefunden oder ist für den Inhaber dieses API-Schlüssels nicht sichtbar.",
"locale": "de",
"details": {
"record_type": "calendar_event",
"record_id": 5501
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Kalendereintrag anlegen
/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.
Header-Parameter
Idempotency-KeyBei 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.
^[A-Za-z0-9_\-:.]{1,128}$Anfragetext application/json
titleerforderlichTitel des Eintrags. Klartext; "<" und ">" sind nicht zulässig (er fließt unmaskiert in die Erinnerungsbenachrichtigung).
^[^<>]*$"Ügyfél egyeztetés"starterforderlichGanztä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.
"2026-03-02T09:00:00+01:00"endGleiche Kodierung wie start. Standard = start. Bei einem ganztägigen Eintrag ist das Enddatum INKLUSIV. Darf nicht vor start liegen (andernfalls 422).
all_dayOb der Eintrag ganztägig ist. Standard false (zeitgebunden).
falsecalendar_idZiel-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.
locationOrt. Klartext; "<" und ">" sind nicht zulässig.
^[^<>]*$descriptionBeschreibung, Klartext (kein HTML); "<" und ">" sind nicht zulässig.
^[^<>]*$participantsTeilnehmer, Freitext. Klartext; "<" und ">" sind nicht zulässig.
^[^<>]*$colorAnzeigefarbe, z. B. "#2c7be5".
^#?[A-Za-z0-9_-]{1,31}$idempotency_keyDieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.
^[A-Za-z0-9_\-:.]{1,128}$"b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"Antworten
201
Erstellt.
dataerforderlichFelder von data
id5501calendarDer Kalender, zu dem der Eintrag gehört.
Felder von calendar
idContainer-Kalender-id oder null für den impliziten gemeinsamen Kanzleikalender (ein Alt-Eintrag ohne Container).
nametype"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.
"office" "personal" ownerEigentümer eines persönlichen Kalenders; null beim Kanzleikalender.
Felder von owner
user_idnametitleTitel des Eintrags. Klartext.
descriptionBeschreibung des Eintrags. Klartext.
locationOrt. Klartext.
participantsTeilnehmer, Freitext. Klartext.
startEin ganztägiger Eintrag: das Startdatum "YYYY-MM-DD". Ein zeitgebundener Eintrag: ISO 8601 in der Zeitzone der Kanzlei (der gespeicherte UTC-Zeitpunkt).
"2026-03-02T09:00:00+01:00"endGleiche 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_dayTrue bei einem ganztägigen Eintrag (start/end sind reine Daten); false bei einem zeitgebundenen Eintrag (start/end sind ISO-8601-Zeitpunkte).
colorAnzeigefarbe, z. B. "#2c7be5".
is_recurringTrue, 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.
recurrenceDie Wiederholungsregel eines wiederkehrenden Masters oder null bei einem einzelnen Eintrag. Schreibgeschützt.
Felder von recurrence
freqdaily | weekly | monthly | yearly.
intervalbyweekdayDurch Komma getrennte Wochentagscodes (z. B. "MO,WE,FR").
untilcountcreated_byDer Kollege, der den Eintrag erstellt hat.
Felder von created_by
user_idnamecreated_atupdated_atÜbergeben Sie dies an calendar.events.update als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratcreatedtrue
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.
dataerforderlichFelder von data
id5501calendarDer Kalender, zu dem der Eintrag gehört.
Felder von calendar
idContainer-Kalender-id oder null für den impliziten gemeinsamen Kanzleikalender (ein Alt-Eintrag ohne Container).
nametype"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.
"office" "personal" ownerEigentümer eines persönlichen Kalenders; null beim Kanzleikalender.
Felder von owner
user_idnametitleTitel des Eintrags. Klartext.
descriptionBeschreibung des Eintrags. Klartext.
locationOrt. Klartext.
participantsTeilnehmer, Freitext. Klartext.
startEin ganztägiger Eintrag: das Startdatum "YYYY-MM-DD". Ein zeitgebundener Eintrag: ISO 8601 in der Zeitzone der Kanzlei (der gespeicherte UTC-Zeitpunkt).
"2026-03-02T09:00:00+01:00"endGleiche 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_dayTrue bei einem ganztägigen Eintrag (start/end sind reine Daten); false bei einem zeitgebundenen Eintrag (start/end sind ISO-8601-Zeitpunkte).
colorAnzeigefarbe, z. B. "#2c7be5".
is_recurringTrue, 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.
recurrenceDie Wiederholungsregel eines wiederkehrenden Masters oder null bei einem einzelnen Eintrag. Schreibgeschützt.
Felder von recurrence
freqdaily | weekly | monthly | yearly.
intervalbyweekdayDurch Komma getrennte Wochentagscodes (z. B. "MO,WE,FR").
untilcountcreated_byDer Kollege, der den Eintrag erstellt hat.
Felder von created_by
user_idnamecreated_atupdated_atÜbergeben Sie dies an calendar.events.update als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratcreatedfalseidempotent_replaytrue
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.
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/calendar/events", {
method: "POST",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"title": "Ügyfél egyeztetés",
"start": "2026-03-02T09:00:00+01:00"
}),
});
const result = await response.json();
import uuid
import requests
response = requests.post(
"https://www.flowyer.de/api/agent/calendar/events",
headers={
"Authorization": "Bearer flw_...",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"title": "Ügyfél egyeztetés",
"start": "2026-03-02T09:00:00+01:00",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"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": false,
"idempotent_replay": true
}
{
"error": "validation_failed",
"message": "The request is invalid. See \"details.fields\" for the field-level errors.",
"message_localized": "Die Anfrage ist ungültig. Die Fehler je Feld stehen in \"details.fields\".",
"locale": "de",
"details": {
"fields": {
"title": [
"Das Feld title ist erforderlich."
]
}
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Kalendereintrag aktualisieren
/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.
Pfadparameter
iderforderlichID des zu ändernden Datensatzes.
Anfragetext application/json
expected_updated_atDer 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.
titleNeuer Titel. Klartext; "<" und ">" sind nicht zulässig.
^[^<>]*$startNeuer 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.
endNeues 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_dayWenn gesendet, werden start/end entsprechend neu kodiert; wenn weggelassen, wird das aktuelle all_day der Zeile verwendet.
locationOrt. Klartext; "<" und ">" sind nicht zulässig. "" löscht ihn.
^[^<>]*$descriptionBeschreibung, Klartext (kein HTML); "<" und ">" sind nicht zulässig. "" löscht sie.
^[^<>]*$participantsTeilnehmer, Freitext. Klartext; "<" und ">" sind nicht zulässig. "" löscht sie.
^[^<>]*$colorAnzeigefarbe, z. B. "#2c7be5". "" löscht sie.
^#?[A-Za-z0-9_-]{1,31}$Antworten
200
Aktualisiert.
dataerforderlichFelder von data
id5501calendarDer Kalender, zu dem der Eintrag gehört.
Felder von calendar
idContainer-Kalender-id oder null für den impliziten gemeinsamen Kanzleikalender (ein Alt-Eintrag ohne Container).
nametype"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.
"office" "personal" ownerEigentümer eines persönlichen Kalenders; null beim Kanzleikalender.
Felder von owner
user_idnametitleTitel des Eintrags. Klartext.
descriptionBeschreibung des Eintrags. Klartext.
locationOrt. Klartext.
participantsTeilnehmer, Freitext. Klartext.
startEin ganztägiger Eintrag: das Startdatum "YYYY-MM-DD". Ein zeitgebundener Eintrag: ISO 8601 in der Zeitzone der Kanzlei (der gespeicherte UTC-Zeitpunkt).
"2026-03-02T09:00:00+01:00"endGleiche 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_dayTrue bei einem ganztägigen Eintrag (start/end sind reine Daten); false bei einem zeitgebundenen Eintrag (start/end sind ISO-8601-Zeitpunkte).
colorAnzeigefarbe, z. B. "#2c7be5".
is_recurringTrue, 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.
recurrenceDie Wiederholungsregel eines wiederkehrenden Masters oder null bei einem einzelnen Eintrag. Schreibgeschützt.
Felder von recurrence
freqdaily | weekly | monthly | yearly.
intervalbyweekdayDurch Komma getrennte Wochentagscodes (z. B. "MO,WE,FR").
untilcountcreated_byDer Kollege, der den Eintrag erstellt hat.
Felder von created_by
user_idnamecreated_atupdated_atÜbergeben Sie dies an calendar.events.update als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent den Datensatz über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratupdatedtrue
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/calendar/events/1234", {
method: "PATCH",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"title": "string"
}),
});
const result = await response.json();
import requests
response = requests.patch(
"https://www.flowyer.de/api/agent/calendar/events/1234",
headers={
"Authorization": "Bearer flw_...",
},
json={
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"title": "string",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"error": "record_conflict",
"message": "The record changed since you read it (someone edited it). Read it again and retry with the new updated_at.",
"message_localized": "Der Datensatz hat sich seit dem Lesen geändert (jemand hat ihn bearbeitet). Lesen Sie ihn erneut und wiederholen Sie die Anfrage mit dem neuen updated_at.",
"locale": "de",
"details": {
"current_updated_at": "2026-10-30T10:42:05+01:00",
"reason": "modified_since_read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Terminbuchungen
Terminbuchungen auflisten
/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.
Abfrageparameter
fromNur Buchungen an oder nach diesem Tag (YYYY-MM-DD), wörtlich gegen das Datum in der Buchungszone abgeglichen.
"2026-01-01"toNur Buchungen an oder vor diesem Tag (YYYY-MM-DD).
"2026-12-31"user_idAuf einen Anwalt eingrenzen (user_id aus colleagues.list). Weglassen für jeden Anwalt der Kanzlei.
statusNach Status filtern.
"pending" "confirmed" "cancelled" "completed" "awaiting_payment" "expired" updated_sinceNur Buchungen, die zu dieser ISO-8601-Zeit oder danach geändert wurden (updated_at ist zeitzonenlos in der Kanzleizone).
limitSeitengröße, 1-100. Standard 25.
2525offsetAnzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.
00Antworten
200
OK.
dataerforderlichFelder von data
id4321booking_numberMenschenlesbare Buchungsnummer, z. B. "#B-0001".
statuspending = wartet auf die Bestätigung des Anwalts; confirmed = genehmigt; cancelled/completed; awaiting_payment/expired gehören zum Bezahlen-vor-Bestätigung-Ablauf.
"pending" "confirmed" "cancelled" "completed" "awaiting_payment" "expired" sourceWoher die Buchung stammt. Eine über die API erstellte Buchung ist "manual".
"flowyer" "website" "embed_widget" "manual" lawyerDer Anwalt (user_id aus colleagues.list), mit dem der Termin stattfindet.
Felder von lawyer
user_idnamedateKalenderdatum in der Zeitzone der Buchung (YYYY-MM-DD), wörtlich gespeichert.
start_timeStartzeit HH:MM in der Zeitzone der Buchung.
end_timeEndzeit HH:MM in der Zeitzone der Buchung.
startEindeutiger ISO-8601-Zeitpunkt des Beginns, zusammengesetzt mit der Zeitzone der Buchung. Verwenden Sie diesen, um Zeitpunkte über Zonen hinweg zu vergleichen.
endEindeutiger ISO-8601-Zeitpunkt des Endes.
timezoneDie Zeitzone der Buchung (booking_settings.timezone), z. B. "Europe/Budapest". Sie bestimmt date, start_time und end_time.
location_preferenceOb die Beratung in der Kanzlei oder online stattfindet.
"office" "online" meeting_linkURL des Online-Meetings, sofern gesetzt.
clientDer externe Mandant, der gebucht hat: Name, E-Mail, Telefon und der Betreff/die Notizen. Personenbezogene Daten — nur für das Kanzleipersonal.
Felder von client
nameemailphonedescriptiongdpr_consentOb die Einwilligung des Mandanten in die Datenverarbeitung erfasst ist.
gdpr_consent_atWann die Einwilligung erfasst wurde.
cancel_reasonBei der Stornierung erfasster Grund.
paymentSchreibgeschützter Zahlungsstatus. Die API ändert niemals die Zahlung; Buchungsgebühren werden in Flowyer verwaltet.
Felder von payment
status"none" "awaiting" "partial" "paid" "refunded" method"card" "transfer" amountcurrencyinvoice_numberconfirmed_atcancelled_atcreated_atupdated_atÜbergeben Sie dies an bookings.update / bookings.confirm / bookings.cancel als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent die Buchung über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratpaginationerforderlichFelder von pagination
limiterforderlichoffseterforderlichtotalerforderlichGesamtanzahl 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/bookings?from=2026-01-01&to=2026-12-31&limit=25", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/bookings?from=2026-01-01&to=2026-12-31&limit=25",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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
}
}
{
"error": "scope_missing",
"message": "This API key does not have the \"bookings:read\" 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 \"bookings:read\" 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": "bookings:read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Terminbuchung abrufen
/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.
Pfadparameter
iderforderlichBuchungs-ID.
4321Antworten
200
OK.
dataerforderlichFelder von data
id4321booking_numberMenschenlesbare Buchungsnummer, z. B. "#B-0001".
statuspending = wartet auf die Bestätigung des Anwalts; confirmed = genehmigt; cancelled/completed; awaiting_payment/expired gehören zum Bezahlen-vor-Bestätigung-Ablauf.
"pending" "confirmed" "cancelled" "completed" "awaiting_payment" "expired" sourceWoher die Buchung stammt. Eine über die API erstellte Buchung ist "manual".
"flowyer" "website" "embed_widget" "manual" lawyerDer Anwalt (user_id aus colleagues.list), mit dem der Termin stattfindet.
Felder von lawyer
user_idnamedateKalenderdatum in der Zeitzone der Buchung (YYYY-MM-DD), wörtlich gespeichert.
start_timeStartzeit HH:MM in der Zeitzone der Buchung.
end_timeEndzeit HH:MM in der Zeitzone der Buchung.
startEindeutiger ISO-8601-Zeitpunkt des Beginns, zusammengesetzt mit der Zeitzone der Buchung. Verwenden Sie diesen, um Zeitpunkte über Zonen hinweg zu vergleichen.
endEindeutiger ISO-8601-Zeitpunkt des Endes.
timezoneDie Zeitzone der Buchung (booking_settings.timezone), z. B. "Europe/Budapest". Sie bestimmt date, start_time und end_time.
location_preferenceOb die Beratung in der Kanzlei oder online stattfindet.
"office" "online" meeting_linkURL des Online-Meetings, sofern gesetzt.
clientDer externe Mandant, der gebucht hat: Name, E-Mail, Telefon und der Betreff/die Notizen. Personenbezogene Daten — nur für das Kanzleipersonal.
Felder von client
nameemailphonedescriptiongdpr_consentOb die Einwilligung des Mandanten in die Datenverarbeitung erfasst ist.
gdpr_consent_atWann die Einwilligung erfasst wurde.
cancel_reasonBei der Stornierung erfasster Grund.
paymentSchreibgeschützter Zahlungsstatus. Die API ändert niemals die Zahlung; Buchungsgebühren werden in Flowyer verwaltet.
Felder von payment
status"none" "awaiting" "partial" "paid" "refunded" method"card" "transfer" amountcurrencyinvoice_numberconfirmed_atcancelled_atcreated_atupdated_atÜbergeben Sie dies an bookings.update / bookings.confirm / bookings.cancel als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent die Buchung über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduserat
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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/bookings/4321", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/bookings/4321",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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"
}
}
}
{
"error": "not_found",
"message": "The record was not found, or it is not visible to the user who owns this API key.",
"message_localized": "Der Datensatz wurde nicht gefunden oder ist für den Inhaber dieses API-Schlüssels nicht sichtbar.",
"locale": "de",
"details": {
"record_type": "booking",
"record_id": 4321
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Terminbuchung anlegen
/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.
Header-Parameter
Idempotency-KeyBei 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.
^[A-Za-z0-9_\-:.]{1,128}$Anfragetext application/json
user_iderforderlichAnwalt, mit dem der Termin stattfindet (user_id aus colleagues.list; muss ein aktiver Kollege der Kanzlei sein).
42dateerforderlichTermintag (YYYY-MM-DD) in der Zeitzone der Buchung.
"2026-03-02"timeerforderlichStartzeit HH:MM (24h) in der Zeitzone der Buchung. Die Endzeit ist time + die Slot-Länge der Kanzlei. Muss ein freier Slot sein.
^([01]\d|2[0-3]):[0-5]\d$"09:00"client_nameerforderlichDer Name des Mandanten. Klartext; "<" und ">" sind nicht zulässig.
^[^<>]*$"Kovács Anna"client_emailerforderlichDie E-Mail des Mandanten: der Empfänger der Bestätigung.
"anna@example.com"client_phoneDie Telefonnummer des Mandanten. Klartext.
^[^<>]*$client_descriptionBetreff / Notizen des Mandanten. Klartext.
^[^<>]*$location_preferenceBeratung in der Kanzlei oder online. Standard "office".
"office" "online" "office"meeting_linkURL des Online-Meetings (http/https), für eine Online-Beratung.
gdpr_consentErfassen Sie die Einwilligung des Mandanten in die Datenverarbeitung. Standard true (das Kanzleipersonal bucht im Namen des Mandanten).
trueauto_confirmWenn 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.
falseidempotency_keyDieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.
^[A-Za-z0-9_\-:.]{1,128}$"b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"Antworten
201
Erstellt.
dataerforderlichFelder von data
id4321booking_numberMenschenlesbare Buchungsnummer, z. B. "#B-0001".
statuspending = wartet auf die Bestätigung des Anwalts; confirmed = genehmigt; cancelled/completed; awaiting_payment/expired gehören zum Bezahlen-vor-Bestätigung-Ablauf.
"pending" "confirmed" "cancelled" "completed" "awaiting_payment" "expired" sourceWoher die Buchung stammt. Eine über die API erstellte Buchung ist "manual".
"flowyer" "website" "embed_widget" "manual" lawyerDer Anwalt (user_id aus colleagues.list), mit dem der Termin stattfindet.
Felder von lawyer
user_idnamedateKalenderdatum in der Zeitzone der Buchung (YYYY-MM-DD), wörtlich gespeichert.
start_timeStartzeit HH:MM in der Zeitzone der Buchung.
end_timeEndzeit HH:MM in der Zeitzone der Buchung.
startEindeutiger ISO-8601-Zeitpunkt des Beginns, zusammengesetzt mit der Zeitzone der Buchung. Verwenden Sie diesen, um Zeitpunkte über Zonen hinweg zu vergleichen.
endEindeutiger ISO-8601-Zeitpunkt des Endes.
timezoneDie Zeitzone der Buchung (booking_settings.timezone), z. B. "Europe/Budapest". Sie bestimmt date, start_time und end_time.
location_preferenceOb die Beratung in der Kanzlei oder online stattfindet.
"office" "online" meeting_linkURL des Online-Meetings, sofern gesetzt.
clientDer externe Mandant, der gebucht hat: Name, E-Mail, Telefon und der Betreff/die Notizen. Personenbezogene Daten — nur für das Kanzleipersonal.
Felder von client
nameemailphonedescriptiongdpr_consentOb die Einwilligung des Mandanten in die Datenverarbeitung erfasst ist.
gdpr_consent_atWann die Einwilligung erfasst wurde.
cancel_reasonBei der Stornierung erfasster Grund.
paymentSchreibgeschützter Zahlungsstatus. Die API ändert niemals die Zahlung; Buchungsgebühren werden in Flowyer verwaltet.
Felder von payment
status"none" "awaiting" "partial" "paid" "refunded" method"card" "transfer" amountcurrencyinvoice_numberconfirmed_atcancelled_atcreated_atupdated_atÜbergeben Sie dies an bookings.update / bookings.confirm / bookings.cancel als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent die Buchung über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratcreatedtrue
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.
dataerforderlichFelder von data
id4321booking_numberMenschenlesbare Buchungsnummer, z. B. "#B-0001".
statuspending = wartet auf die Bestätigung des Anwalts; confirmed = genehmigt; cancelled/completed; awaiting_payment/expired gehören zum Bezahlen-vor-Bestätigung-Ablauf.
"pending" "confirmed" "cancelled" "completed" "awaiting_payment" "expired" sourceWoher die Buchung stammt. Eine über die API erstellte Buchung ist "manual".
"flowyer" "website" "embed_widget" "manual" lawyerDer Anwalt (user_id aus colleagues.list), mit dem der Termin stattfindet.
Felder von lawyer
user_idnamedateKalenderdatum in der Zeitzone der Buchung (YYYY-MM-DD), wörtlich gespeichert.
start_timeStartzeit HH:MM in der Zeitzone der Buchung.
end_timeEndzeit HH:MM in der Zeitzone der Buchung.
startEindeutiger ISO-8601-Zeitpunkt des Beginns, zusammengesetzt mit der Zeitzone der Buchung. Verwenden Sie diesen, um Zeitpunkte über Zonen hinweg zu vergleichen.
endEindeutiger ISO-8601-Zeitpunkt des Endes.
timezoneDie Zeitzone der Buchung (booking_settings.timezone), z. B. "Europe/Budapest". Sie bestimmt date, start_time und end_time.
location_preferenceOb die Beratung in der Kanzlei oder online stattfindet.
"office" "online" meeting_linkURL des Online-Meetings, sofern gesetzt.
clientDer externe Mandant, der gebucht hat: Name, E-Mail, Telefon und der Betreff/die Notizen. Personenbezogene Daten — nur für das Kanzleipersonal.
Felder von client
nameemailphonedescriptiongdpr_consentOb die Einwilligung des Mandanten in die Datenverarbeitung erfasst ist.
gdpr_consent_atWann die Einwilligung erfasst wurde.
cancel_reasonBei der Stornierung erfasster Grund.
paymentSchreibgeschützter Zahlungsstatus. Die API ändert niemals die Zahlung; Buchungsgebühren werden in Flowyer verwaltet.
Felder von payment
status"none" "awaiting" "partial" "paid" "refunded" method"card" "transfer" amountcurrencyinvoice_numberconfirmed_atcancelled_atcreated_atupdated_atÜbergeben Sie dies an bookings.update / bookings.confirm / bookings.cancel als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent die Buchung über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratcreatedfalseidempotent_replaytrue
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.
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/bookings", {
method: "POST",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"user_id": 42,
"date": "2026-03-02",
"time": "09:00",
"client_name": "Kovács Anna",
"client_email": "anna@example.com"
}),
});
const result = await response.json();
import uuid
import requests
response = requests.post(
"https://www.flowyer.de/api/agent/bookings",
headers={
"Authorization": "Bearer flw_...",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"user_id": 42,
"date": "2026-03-02",
"time": "09:00",
"client_name": "Kovács Anna",
"client_email": "anna@example.com",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"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": false,
"idempotent_replay": true
}
{
"error": "validation_failed",
"message": "The request is invalid. See \"details.fields\" for the field-level errors.",
"message_localized": "Die Anfrage ist ungültig. Die Fehler je Feld stehen in \"details.fields\".",
"locale": "de",
"details": {
"fields": {
"user_id": [
"Das Feld user id ist erforderlich."
]
}
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Terminbuchung aktualisieren
/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.
Pfadparameter
iderforderlichID des zu ändernden Datensatzes.
Anfragetext application/json
expected_updated_atDer 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.
dateNeuer Tag (YYYY-MM-DD) in der Zeitzone der Buchung. Senden Sie date UND time zusammen, um zu verlegen.
"2026-03-05"timeNeue Startzeit HH:MM. Die Endzeit wird aus der Slot-Länge der Kanzlei neu berechnet. Senden Sie date UND time zusammen.
^([01]\d|2[0-3]):[0-5]\d$"11:00"client_phoneDie Telefonnummer des Mandanten. Klartext. "" löscht sie.
^[^<>]*$client_descriptionBetreff / Notizen. Klartext. "" löscht sie.
^[^<>]*$meeting_linkURL des Online-Meetings (http/https). "" löscht sie.
location_preferenceBeratung in der Kanzlei oder online.
"office" "online" Antworten
200
Aktualisiert.
dataerforderlichFelder von data
id4321booking_numberMenschenlesbare Buchungsnummer, z. B. "#B-0001".
statuspending = wartet auf die Bestätigung des Anwalts; confirmed = genehmigt; cancelled/completed; awaiting_payment/expired gehören zum Bezahlen-vor-Bestätigung-Ablauf.
"pending" "confirmed" "cancelled" "completed" "awaiting_payment" "expired" sourceWoher die Buchung stammt. Eine über die API erstellte Buchung ist "manual".
"flowyer" "website" "embed_widget" "manual" lawyerDer Anwalt (user_id aus colleagues.list), mit dem der Termin stattfindet.
Felder von lawyer
user_idnamedateKalenderdatum in der Zeitzone der Buchung (YYYY-MM-DD), wörtlich gespeichert.
start_timeStartzeit HH:MM in der Zeitzone der Buchung.
end_timeEndzeit HH:MM in der Zeitzone der Buchung.
startEindeutiger ISO-8601-Zeitpunkt des Beginns, zusammengesetzt mit der Zeitzone der Buchung. Verwenden Sie diesen, um Zeitpunkte über Zonen hinweg zu vergleichen.
endEindeutiger ISO-8601-Zeitpunkt des Endes.
timezoneDie Zeitzone der Buchung (booking_settings.timezone), z. B. "Europe/Budapest". Sie bestimmt date, start_time und end_time.
location_preferenceOb die Beratung in der Kanzlei oder online stattfindet.
"office" "online" meeting_linkURL des Online-Meetings, sofern gesetzt.
clientDer externe Mandant, der gebucht hat: Name, E-Mail, Telefon und der Betreff/die Notizen. Personenbezogene Daten — nur für das Kanzleipersonal.
Felder von client
nameemailphonedescriptiongdpr_consentOb die Einwilligung des Mandanten in die Datenverarbeitung erfasst ist.
gdpr_consent_atWann die Einwilligung erfasst wurde.
cancel_reasonBei der Stornierung erfasster Grund.
paymentSchreibgeschützter Zahlungsstatus. Die API ändert niemals die Zahlung; Buchungsgebühren werden in Flowyer verwaltet.
Felder von payment
status"none" "awaiting" "partial" "paid" "refunded" method"card" "transfer" amountcurrencyinvoice_numberconfirmed_atcancelled_atcreated_atupdated_atÜbergeben Sie dies an bookings.update / bookings.confirm / bookings.cancel als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent die Buchung über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratupdatedtrue
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/bookings/1234", {
method: "PATCH",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"date": "2026-03-05",
"time": "11:00"
}),
});
const result = await response.json();
import requests
response = requests.patch(
"https://www.flowyer.de/api/agent/bookings/1234",
headers={
"Authorization": "Bearer flw_...",
},
json={
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"date": "2026-03-05",
"time": "11:00",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"error": "record_conflict",
"message": "The record changed since you read it (someone edited it). Read it again and retry with the new updated_at.",
"message_localized": "Der Datensatz hat sich seit dem Lesen geändert (jemand hat ihn bearbeitet). Lesen Sie ihn erneut und wiederholen Sie die Anfrage mit dem neuen updated_at.",
"locale": "de",
"details": {
"current_updated_at": "2026-10-30T10:42:05+01:00",
"reason": "modified_since_read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Terminbuchung bestätigen
/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.
Pfadparameter
iderforderlichBuchungs-ID.
4321Anfragetext application/json
expected_updated_atOptionales 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_linkURL des Online-Meetings (http/https), die vor dem Versand der Bestätigungs-E-Mail an der Buchung gesetzt werden soll.
Antworten
200
OK.
dataerforderlichFelder von data
id4321booking_numberMenschenlesbare Buchungsnummer, z. B. "#B-0001".
statuspending = wartet auf die Bestätigung des Anwalts; confirmed = genehmigt; cancelled/completed; awaiting_payment/expired gehören zum Bezahlen-vor-Bestätigung-Ablauf.
"pending" "confirmed" "cancelled" "completed" "awaiting_payment" "expired" sourceWoher die Buchung stammt. Eine über die API erstellte Buchung ist "manual".
"flowyer" "website" "embed_widget" "manual" lawyerDer Anwalt (user_id aus colleagues.list), mit dem der Termin stattfindet.
Felder von lawyer
user_idnamedateKalenderdatum in der Zeitzone der Buchung (YYYY-MM-DD), wörtlich gespeichert.
start_timeStartzeit HH:MM in der Zeitzone der Buchung.
end_timeEndzeit HH:MM in der Zeitzone der Buchung.
startEindeutiger ISO-8601-Zeitpunkt des Beginns, zusammengesetzt mit der Zeitzone der Buchung. Verwenden Sie diesen, um Zeitpunkte über Zonen hinweg zu vergleichen.
endEindeutiger ISO-8601-Zeitpunkt des Endes.
timezoneDie Zeitzone der Buchung (booking_settings.timezone), z. B. "Europe/Budapest". Sie bestimmt date, start_time und end_time.
location_preferenceOb die Beratung in der Kanzlei oder online stattfindet.
"office" "online" meeting_linkURL des Online-Meetings, sofern gesetzt.
clientDer externe Mandant, der gebucht hat: Name, E-Mail, Telefon und der Betreff/die Notizen. Personenbezogene Daten — nur für das Kanzleipersonal.
Felder von client
nameemailphonedescriptiongdpr_consentOb die Einwilligung des Mandanten in die Datenverarbeitung erfasst ist.
gdpr_consent_atWann die Einwilligung erfasst wurde.
cancel_reasonBei der Stornierung erfasster Grund.
paymentSchreibgeschützter Zahlungsstatus. Die API ändert niemals die Zahlung; Buchungsgebühren werden in Flowyer verwaltet.
Felder von payment
status"none" "awaiting" "partial" "paid" "refunded" method"card" "transfer" amountcurrencyinvoice_numberconfirmed_atcancelled_atcreated_atupdated_atÜbergeben Sie dies an bookings.update / bookings.confirm / bookings.cancel als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent die Buchung über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduserat
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.
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/bookings/4321/confirm", {
method: "POST",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
"expected_updated_at": "2026-10-30T09:15:00+01:00"
}),
});
const result = await response.json();
import requests
response = requests.post(
"https://www.flowyer.de/api/agent/bookings/4321/confirm",
headers={
"Authorization": "Bearer flw_...",
},
json={
"expected_updated_at": "2026-10-30T09:15:00+01:00",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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"
}
}
}
{
"error": "not_found",
"message": "The record was not found, or it is not visible to the user who owns this API key.",
"message_localized": "Der Datensatz wurde nicht gefunden oder ist für den Inhaber dieses API-Schlüssels nicht sichtbar.",
"locale": "de",
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Terminbuchung stornieren
/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.
Pfadparameter
iderforderlichBuchungs-ID.
4321Anfragetext application/json
expected_updated_atOptionales Optimistic-Lock-Token: das updated_at aus Ihrem letzten Lesevorgang. Wenn sich die Buchung seitdem geändert hat, antwortet die API mit 409.
reasonAls cancel_reason erfasster Grund, der in der Stornierungs-E-Mail angezeigt wird. Klartext; "<" und ">" sind nicht zulässig.
^[^<>]*$Antworten
200
OK.
dataerforderlichFelder von data
id4321booking_numberMenschenlesbare Buchungsnummer, z. B. "#B-0001".
statuspending = wartet auf die Bestätigung des Anwalts; confirmed = genehmigt; cancelled/completed; awaiting_payment/expired gehören zum Bezahlen-vor-Bestätigung-Ablauf.
"pending" "confirmed" "cancelled" "completed" "awaiting_payment" "expired" sourceWoher die Buchung stammt. Eine über die API erstellte Buchung ist "manual".
"flowyer" "website" "embed_widget" "manual" lawyerDer Anwalt (user_id aus colleagues.list), mit dem der Termin stattfindet.
Felder von lawyer
user_idnamedateKalenderdatum in der Zeitzone der Buchung (YYYY-MM-DD), wörtlich gespeichert.
start_timeStartzeit HH:MM in der Zeitzone der Buchung.
end_timeEndzeit HH:MM in der Zeitzone der Buchung.
startEindeutiger ISO-8601-Zeitpunkt des Beginns, zusammengesetzt mit der Zeitzone der Buchung. Verwenden Sie diesen, um Zeitpunkte über Zonen hinweg zu vergleichen.
endEindeutiger ISO-8601-Zeitpunkt des Endes.
timezoneDie Zeitzone der Buchung (booking_settings.timezone), z. B. "Europe/Budapest". Sie bestimmt date, start_time und end_time.
location_preferenceOb die Beratung in der Kanzlei oder online stattfindet.
"office" "online" meeting_linkURL des Online-Meetings, sofern gesetzt.
clientDer externe Mandant, der gebucht hat: Name, E-Mail, Telefon und der Betreff/die Notizen. Personenbezogene Daten — nur für das Kanzleipersonal.
Felder von client
nameemailphonedescriptiongdpr_consentOb die Einwilligung des Mandanten in die Datenverarbeitung erfasst ist.
gdpr_consent_atWann die Einwilligung erfasst wurde.
cancel_reasonBei der Stornierung erfasster Grund.
paymentSchreibgeschützter Zahlungsstatus. Die API ändert niemals die Zahlung; Buchungsgebühren werden in Flowyer verwaltet.
Felder von payment
status"none" "awaiting" "partial" "paid" "refunded" method"card" "transfer" amountcurrencyinvoice_numberconfirmed_atcancelled_atcreated_atupdated_atÜbergeben Sie dies an bookings.update / bookings.confirm / bookings.cancel als expected_updated_at.
created_via_apiVorhanden, wenn ein externer Agent die Buchung über diese API erstellt hat.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduserat
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.
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/bookings/4321/cancel", {
method: "POST",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
"expected_updated_at": "2026-10-30T09:15:00+01:00"
}),
});
const result = await response.json();
import requests
response = requests.post(
"https://www.flowyer.de/api/agent/bookings/4321/cancel",
headers={
"Authorization": "Bearer flw_...",
},
json={
"expected_updated_at": "2026-10-30T09:15:00+01:00",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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"
}
}
}
{
"error": "not_found",
"message": "The record was not found, or it is not visible to the user who owns this API key.",
"message_localized": "Der Datensatz wurde nicht gefunden oder ist für den Inhaber dieses API-Schlüssels nicht sichtbar.",
"locale": "de",
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Support-Tickets
Support-Tickets auflisten
/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.
Abfrageparameter
statusopen_states (Standard) = new+open+pending (die Standardansicht im Web); "all" schließt geschlossene ein; oder ein exakter Status.
"new" "open" "pending" "closed" "open_states" "all" "open_states"mailbox_idNur Tickets aus diesem Postfach. Ein Postfach, das der Benutzer nicht sehen darf, ergibt eine leere Liste (nie ein Leck).
7assigned_to_user_idNur diesem Kollegen zugewiesene Tickets (id aus colleagues.list); 0 = nur nicht zugewiesene Tickets. Weglassen für jeden Bearbeiter.
requester_emailNur Tickets, deren externe Anfrager-E-Mail genau übereinstimmt (Groß-/Kleinschreibung wird ignoriert).
"ugyfel@example.com"qFreitextsuche über Betreff, Anfragername/-E-Mail und Ticketnummer (Groß-/Kleinschreibung wird ignoriert).
"számla"limitSeitengröße, 1-100. Standard 25.
2525offsetAnzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.
00Antworten
200
OK.
dataerforderlichFelder von data
idTicket-id (mit tickets.get / tickets.update verwenden).
4321ticket_numberMenschenlesbare Ticketnummer, z. B. FLW-000123.
subjectstatus"new" "open" "pending" "closed" priority"low" "normal" "high" mailboxDas Postfach, über das das Ticket eingegangen ist (zentrales Verzeichnis).
Felder von mailbox
idemaildisplay_namerequesterDie externe Person, die geschrieben hat.
Felder von requester
emailnameassigned_toDer Kollege, dem das Ticket zugewiesen ist, oder null, wenn nicht zugewiesen.
Felder von assigned_to
user_idnamematterDie mit dem Ticket verknüpfte Akte oder null.
Felder von matter
idcase_numberclientDer mit dem Ticket verknüpfte Mandant oder null.
Felder von client
idnamelast_message_atZeitpunkt der jüngsten Thread-Aktivität; die Liste ist danach sortiert, neueste zuerst.
created_atupdated_atÜbergeben Sie dies an tickets.update als expected_updated_at.
created_via_apiVorhanden, wenn das Ticket über diese API erstellt wurde.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratpaginationerforderlichFelder von pagination
limiterforderlichoffseterforderlichtotalerforderlichGesamtanzahl 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/tickets?mailbox_id=7&requester_email=ugyfel%40example.com&q=sz%C3%A1mla", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/tickets?mailbox_id=7&requester_email=ugyfel%40example.com&q=sz%C3%A1mla",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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
}
}
{
"error": "scope_missing",
"message": "This API key does not have the \"tickets:read\" 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 \"tickets:read\" 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": "tickets:read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Support-Ticket abrufen
/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).
Pfadparameter
iderforderlichTicket-id.
4321Abfrageparameter
messages_limitNur die neuesten N Nachrichten des Threads zurückgeben (weiterhin älteste zuerst dargestellt). Weglassen für den gesamten Thread.
Antworten
200
OK.
dataerforderlichFelder von data
idTicket-id (mit tickets.get / tickets.update verwenden).
4321ticket_numberMenschenlesbare Ticketnummer, z. B. FLW-000123.
subjectstatus"new" "open" "pending" "closed" priority"low" "normal" "high" mailboxDas Postfach, über das das Ticket eingegangen ist (zentrales Verzeichnis).
Felder von mailbox
idemaildisplay_namerequesterDie externe Person, die geschrieben hat.
Felder von requester
emailnameassigned_toDer Kollege, dem das Ticket zugewiesen ist, oder null, wenn nicht zugewiesen.
Felder von assigned_to
user_idnamematterDie mit dem Ticket verknüpfte Akte oder null.
Felder von matter
idcase_numberclientDer mit dem Ticket verknüpfte Mandant oder null.
Felder von client
idnamelast_message_atZeitpunkt der jüngsten Thread-Aktivität; die Liste ist danach sortiert, neueste zuerst.
created_atupdated_atÜbergeben Sie dies an tickets.update als expected_updated_at.
created_via_apiVorhanden, wenn das Ticket über diese API erstellt wurde.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratmessagesDer Nachrichten-Thread, älteste zuerst.
Felder von messages
iddirectionin = vom Anfrager, out = vom Postfach gesendete Antwort/automatische Bestätigung, note = intern.
"in" "out" "note" fromFelder von from
emailnametoFelder von to
emailnameccFelder von cc
emailnamesent_statusZustellstatus einer ausgehenden Nachricht; null bei in/note.
"pending" "sent" "failed" "scheduled" body_textNachrichtentext als Klartext. Der HTML-Text wird bewusst weggelassen, damit der Verlauf kompakt bleibt; ist der gespeicherte Text leer, wird er aus dem HTML abgeleitet.
has_attachmentsauthorDer Kollege, der eine out/note-Nachricht geschrieben hat; null bei einer eingehenden Nachricht.
Felder von author
user_idnamecreated_atlinked_matterDie mit dem Ticket verknüpfte Akte (dieselbe wie matter).
Felder von linked_matter
idcase_numberlinked_clientDer mit dem Ticket verknüpfte Mandant (derselbe wie client).
Felder von linked_client
idname
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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/tickets/4321", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/tickets/4321",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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_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"
}
}
}
{
"error": "not_found",
"message": "The record was not found, or it is not visible to the user who owns this API key.",
"message_localized": "Der Datensatz wurde nicht gefunden oder ist für den Inhaber dieses API-Schlüssels nicht sichtbar.",
"locale": "de",
"details": {
"record_type": "ticket",
"record_id": 4321
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Auf Ticket antworten
/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.
Pfadparameter
iderforderlichTicket-id (muss über die Postfach-ACL sichtbar sein).
4321Header-Parameter
Idempotency-KeyBei 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.
^[A-Za-z0-9_\-:.]{1,128}$Anfragetext application/json
body_htmlerforderlichDie 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.
"<p>Köszönjük megkeresését, csatoltan küldjük a választ.</p>"ccZusätzliche Cc-Empfänger (höchstens 10). Der Anfrager und das Postfach werden automatisch ausgeschlossen; eine ungültige Adresse antwortet mit 422.
statusTicketstatus, der nach dem Antworten gesetzt werden soll (Standard "pending" = wartet auf den Anfrager). Erfasst ein Statusänderungsereignis.
"new" "open" "pending" "closed" "pending"append_signatureFügt die gespeicherte Ticketsignatur des Schlüsselbenutzers nur der AUSGEHENDEN E-Mail hinzu (nie im Thread gespeichert).
falseidempotency_keyDieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.
^[A-Za-z0-9_\-:.]{1,128}$"b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"Antworten
201
Erstellt.
dataerforderlichFelder von data
ticket_id4321message_idId der erstellten ausgehenden ticket_messages-Zeile.
98765directionImmer "out".
sent_status"pending" zum Erstellungszeitpunkt; der asynchrone Versand stellt es später auf sent/failed um.
"pending" "sent" "failed" "scheduled" statusDer Ticketstatus nach der Antwort.
"new" "open" "pending" "closed" created_atcreated_via_apiVorhanden, wenn die Antwort über diese API erstellt wurde.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratcreatedtrue
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.
dataerforderlichFelder von data
ticket_id4321message_idId der erstellten ausgehenden ticket_messages-Zeile.
98765directionImmer "out".
sent_status"pending" zum Erstellungszeitpunkt; der asynchrone Versand stellt es später auf sent/failed um.
"pending" "sent" "failed" "scheduled" statusDer Ticketstatus nach der Antwort.
"new" "open" "pending" "closed" created_atcreated_via_apiVorhanden, wenn die Antwort über diese API erstellt wurde.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratcreatedfalseidempotent_replaytrue
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.
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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>"
}'
const response = await fetch("https://www.flowyer.de/api/agent/tickets/4321/reply", {
method: "POST",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"body_html": "<p>Köszönjük megkeresését, csatoltan küldjük a választ.</p>"
}),
});
const result = await response.json();
import uuid
import requests
response = requests.post(
"https://www.flowyer.de/api/agent/tickets/4321/reply",
headers={
"Authorization": "Bearer flw_...",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"body_html": "<p>Köszönjük megkeresését, csatoltan küldjük a választ.</p>",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"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": false,
"idempotent_replay": true
}
{
"error": "validation_failed",
"message": "The request is invalid. See \"details.fields\" for the field-level errors.",
"message_localized": "Die Anfrage ist ungültig. Die Fehler je Feld stehen in \"details.fields\".",
"locale": "de",
"details": {
"fields": {
"body_html": [
"Das Feld body html ist erforderlich."
]
}
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Ticketstatus ändern
/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.
Pfadparameter
iderforderlichID des zu ändernden Datensatzes.
Anfragetext application/json
expected_updated_atDer 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.
statuserforderlichDer neue Status. "closed" stempelt closed_at; jeder andere Status löscht es.
"new" "open" "pending" "closed" "open"Antworten
200
Aktualisiert.
dataerforderlichFelder von data
idTicket-id (mit tickets.get / tickets.update verwenden).
4321ticket_numberMenschenlesbare Ticketnummer, z. B. FLW-000123.
subjectstatus"new" "open" "pending" "closed" priority"low" "normal" "high" mailboxDas Postfach, über das das Ticket eingegangen ist (zentrales Verzeichnis).
Felder von mailbox
idemaildisplay_namerequesterDie externe Person, die geschrieben hat.
Felder von requester
emailnameassigned_toDer Kollege, dem das Ticket zugewiesen ist, oder null, wenn nicht zugewiesen.
Felder von assigned_to
user_idnamematterDie mit dem Ticket verknüpfte Akte oder null.
Felder von matter
idcase_numberclientDer mit dem Ticket verknüpfte Mandant oder null.
Felder von client
idnamelast_message_atZeitpunkt der jüngsten Thread-Aktivität; die Liste ist danach sortiert, neueste zuerst.
created_atupdated_atÜbergeben Sie dies an tickets.update als expected_updated_at.
created_via_apiVorhanden, wenn das Ticket über diese API erstellt wurde.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratupdatedtrue
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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"
}'
const response = await fetch("https://www.flowyer.de/api/agent/tickets/1234", {
method: "PATCH",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
},
body: JSON.stringify({
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"status": "open"
}),
});
const result = await response.json();
import requests
response = requests.patch(
"https://www.flowyer.de/api/agent/tickets/1234",
headers={
"Authorization": "Bearer flw_...",
},
json={
"expected_updated_at": "2026-10-30T09:15:00+01:00",
"status": "open",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"error": "record_conflict",
"message": "The record changed since you read it (someone edited it). Read it again and retry with the new updated_at.",
"message_localized": "Der Datensatz hat sich seit dem Lesen geändert (jemand hat ihn bearbeitet). Lesen Sie ihn erneut und wiederholen Sie die Anfrage mit dem neuen updated_at.",
"locale": "de",
"details": {
"current_updated_at": "2026-10-30T10:42:05+01:00",
"reason": "modified_since_read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Mandantenportal
Mandantenportale auflisten
/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.
Abfrageparameter
matter_idNur das Portal dieser Akte (404 matter_not_visible, wenn die Akte nicht sichtbar ist). Eine Akte hat höchstens ein Portal.
1234limitSeitengröße, 1-100. Standard 25.
2525offsetAnzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.
00Antworten
200
OK.
dataerforderlichFelder von data
idPortal-(Thread-)id - die Kennung für portal.messages.list und portal.reply.
57matterDie Akte (Fall), zu der das Portal gehört.
Felder von matter
idcase_numberclient_participantsDie externen mandantenseitigen Teilnehmer, mit denen die Kanzlei spricht.
Felder von client_participants
namekindclient = ein Auftraggeber, contact = ein Mandantenkontakt, email = eine veraltete reine E-Mail-Berechtigung.
"client" "contact" "email" participant_countAnzahl der aktiven Teilnehmer (Personal und Mandant).
message_countAnzahl der nicht gelöschten Nachrichten im Thread.
last_message_atWann die neueste nicht gelöschte Nachricht gepostet wurde, ISO 8601 in der Kanzleizone; null bei einem leeren Thread.
unread_for_meUngelesene Nachrichten für die eigene Teilnehmerzeile des handelnden Benutzers; null, wenn der handelnde Benutzer kein Teilnehmer dieses Portals ist.
created_atpaginationerforderlichFelder von pagination
limiterforderlichoffseterforderlichtotalerforderlichGesamtanzahl 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/portals?matter_id=1234&limit=25", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/portals?matter_id=1234&limit=25",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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
}
}
{
"error": "scope_missing",
"message": "This API key does not have the \"portal:read\" 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 \"portal:read\" 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": "portal:read"
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Portalnachrichten auflisten
/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.
Pfadparameter
iderforderlichPortal-id (muss zugänglich sein).
57Abfrageparameter
include_deletedGelöschte Nachrichten einbeziehen (ihr Inhalt ist geleert). Standard false.
falselimitSeitengröße, 1-100. Standard 25.
2525offsetAnzahl der zu überspringenden Datensätze. Verwenden Sie offset + limit der vorherigen Seite, um die nächste abzurufen; pagination.total ist die Gesamtanzahl.
00Antworten
200
OK.
dataerforderlichFelder von data
idportal_messages.id.
8012authorWer die Nachricht geschrieben hat.
Felder von author
participant_idnamekindstaff = ein Kollege der Kanzlei, client = der externe Mandant.
"staff" "client" directionfrom_firm = ein Autor aus dem Personal, from_client = der externe Mandant.
"from_firm" "from_client" bodyDie Nachricht als Klartext (<br> in Zeilenumbrüche dekodiert). Leerer String bei einer gelöschten Nachricht.
attachmentAnhang-Metadaten, wenn die Nachricht ein Dokument hat; das Herunterladen liegt außerhalb des Umfangs. Null, wenn keiner vorhanden ist.
Felder von attachment
portal_document_idfile_nameis_deleteddeleted_atcreated_atWann die Nachricht gepostet wurde, ISO 8601 in der Kanzleizone.
paginationerforderlichFelder von pagination
limiterforderlichoffseterforderlichtotalerforderlichGesamtanzahl 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.
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.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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_...'
const response = await fetch("https://www.flowyer.de/api/agent/portals/57/messages?limit=25", {
headers: {
"Authorization": "Bearer flw_...",
},
});
const result = await response.json();
import requests
response = requests.get(
"https://www.flowyer.de/api/agent/portals/57/messages?limit=25",
headers={
"Authorization": "Bearer flw_...",
},
timeout=30,
)
print(response.status_code, response.json())
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
}
}
{
"error": "portal_not_visible",
"message": "The client portal :id does not exist, or is not accessible to the user who owns this API key.",
"message_localized": "Das Mandantenportal :id existiert nicht oder ist für den Benutzer dieses API-Schlüssels nicht zugänglich.",
"locale": "de",
"details": {
"portal_id": 57
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}
Im Mandantenportal antworten
/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.
Pfadparameter
iderforderlichPortal-id, in der geantwortet werden soll (muss zugänglich sein).
57Header-Parameter
Idempotency-KeyBei 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.
^[A-Za-z0-9_\-:.]{1,128}$Anfragetext application/json
bodyerforderlichDie Antwort, Klartext. Spitze Klammern werden akzeptiert und beim Speichern maskiert. Höchstens 20000 Zeichen.
"Tisztelt Ügyfelünk! A beadványt ma benyújtottuk."idempotency_keyDieselbe Rolle wie der Header Idempotency-Key, für Clients, die keine benutzerdefinierten Header senden können. Buchstaben, Ziffern, _, -, : oder ., höchstens 128 Zeichen.
^[A-Za-z0-9_\-:.]{1,128}$"b8f1c2e0-6f7a-4d2e-9c1b-2a3d4e5f6a7b"Antworten
201
Erstellt.
dataerforderlichFelder von data
messageDie gepostete Antwort.
Felder von message
id8012authorDer handelnde Personalbenutzer, der die Antwort gepostet hat.
Felder von author
participant_idnamekindstaff = ein Kollege der Kanzlei, client = der externe Mandant.
"staff" "client" directionImmer "from_firm" bei einer über diese API geposteten Antwort.
"from_firm" "from_client" bodyDie gepostete Nachricht als Klartext.
created_atportalDas Portal (der Thread) und seine Akte, in dem die Antwort gepostet wurde.
Felder von portal
idmatterFelder von matter
idcase_numbercreated_via_apiHerkunft der über diese API erstellten Nachricht.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratcreatedtrue
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.
dataerforderlichFelder von data
messageDie gepostete Antwort.
Felder von message
id8012authorDer handelnde Personalbenutzer, der die Antwort gepostet hat.
Felder von author
participant_idnamekindstaff = ein Kollege der Kanzlei, client = der externe Mandant.
"staff" "client" directionImmer "from_firm" bei einer über diese API geposteten Antwort.
"from_firm" "from_client" bodyDie gepostete Nachricht als Klartext.
created_atportalDas Portal (der Thread) und seine Akte, in dem die Antwort gepostet wurde.
Felder von portal
idmatterFelder von matter
idcase_numbercreated_via_apiHerkunft der über diese API erstellten Nachricht.
Felder von created_via_api
kind"key": mit einem statischen API-Schlüssel erstellt; "oauth": von einer über OAuth verbundenen App erstellt.
"key" "oauth" key_idID des API-Schlüssels (kind "key") oder der verbundenen App (kind "oauth"); beide werden getrennt nummeriert.
key_nameName, 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_iduseratcreatedfalseidempotent_replaytrue
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.
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.
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).
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).
request_too_large).
422
Validierung fehlgeschlagen oder unbekanntes Feld; details.fields listet die Feldfehler auf.
details.fields listet die Feldfehler auf.
429
Rate-Limit überschritten; Retry-After gibt an, wann ein erneuter Versuch möglich ist.
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.
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."
}'
const response = await fetch("https://www.flowyer.de/api/agent/portals/57/messages", {
method: "POST",
headers: {
"Authorization": "Bearer flw_...",
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
"body": "Tisztelt Ügyfelünk! A beadványt ma benyújtottuk."
}),
});
const result = await response.json();
import uuid
import requests
response = requests.post(
"https://www.flowyer.de/api/agent/portals/57/messages",
headers={
"Authorization": "Bearer flw_...",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"body": "Tisztelt Ügyfelünk! A beadványt ma benyújtottuk.",
},
timeout=30,
)
print(response.status_code, response.json())
{
"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
}
{
"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": false,
"idempotent_replay": true
}
{
"error": "validation_failed",
"message": "The request is invalid. See \"details.fields\" for the field-level errors.",
"message_localized": "Die Anfrage ist ungültig. Die Fehler je Feld stehen in \"details.fields\".",
"locale": "de",
"details": {
"fields": {
"body": [
"Das Feld body ist erforderlich."
]
}
},
"request_id": "3f0c8a5e-2b1d-4c7a-9e6f-5a4b3c2d1e0f"
}