🚀 Jetzt neu: FlowAI! Ein revolutionärer Chat mit personalisierten AI-Agenten. 🌟

FlowCRM API - für moderne CRM-Integrationen

Eine moderne REST API zur Verwaltung von Kundendaten, Leads, Kanban-Boards und Timeline-Einträgen. Perfekt für CRM-Integrationen, Lead-Ingest, Automatisierung und individuelle Anwendungen.

🔐 Schnellstart

Basis-URL: https://creativeskyline.de/api/clients https://creativeskyline.de/api/clients/{uuid}/timeline https://creativeskyline.de/api/clients/{uuid}/projects https://creativeskyline.de/api/leads https://creativeskyline.de/api/lead-boards https://creativeskyline.de/api/leads/{uuid}/docs
Sicherheitshinweis
Behandeln Sie Ihren API-Key wie ein Passwort und teilen Sie ihn niemals öffentlich.
Zugriff auf die Leads-Endpunkte
Die Leads-, Board- und Lead-FlowDoc-Endpunkte erfordern zusätzlich zum FlowCRM-Modul die Leads-Unterberechtigung Ihres Teams. Ein Token ohne diese Unterberechtigung erhält HTTP 403. Die Kunden-Endpunkte sowie die FlowDoc-Endpunkte für Kunden, Kontakte und Projekte benötigen nur den FlowCRM-Modulzugriff.

1. API-Zugangsdaten abrufen

Bevor Sie die API nutzen können, benötigen Sie Ihre persönlichen Zugangsdaten: Melden Sie sich an, navigieren Sie zu Profil → API-Zugang und kopieren Sie Ihren persönlichen API-Key (pk_...).

2. Authentifizierung

Alle API-Anfragen benötigen diesen HTTP-Header. Akzeptiert werden ein persönlicher Key (pk_...) oder ein Team-API-Token (at_...):

Authorization: Bearer pk_dein_api_key
Accept: application/json

Pro Token sind bis zu 300 Anfragen pro Minute erlaubt.

🏢 Kunden-Verwaltung

Basis-URL: https://creativeskyline.de/api/clients https://creativeskyline.de/api/clients/{uuid}/timeline https://creativeskyline.de/api/clients/{uuid}/projects https://creativeskyline.de/api/leads https://creativeskyline.de/api/lead-boards https://creativeskyline.de/api/leads/{uuid}/docs

Kunden auflisten

GET /api/clients

Ruft eine Liste aller aktiven Kunden Ihres Teams ab. Verwenden Sie für die Adressierung einzelner Kunden ausschließlich das Feld uuid.

GET /api/clients/search

Durchsucht die Kundendatenbank nach Name, Firmenname oder E-Mail-Adresse.

Query-Parameter:

search string * Suchbegriff für die Kundensuche

Kunde anlegen (Find-or-Create)

POST /api/clients

Legt einen Kunden im Team des Tokens an. Idempotent per Find-or-Create: Zuerst wird über eine gesetzte external_id gesucht, danach über die E-Mail-Adresse (teamweit, Gross-/Kleinschreibung egal). Wird ein bestehender aktiver Kunde gefunden, gibt die Antwort diesen mit created: false zurück und synchronisiert nur die mitgesendeten tag_uuids und sources. Nur bei einer echten Neuanlage ist created: true (HTTP 201). Kollidiert die E-Mail oder external_id mit einem Kunden im Papierkorb, antwortet der Endpunkt mit HTTP 409.

Request Body:

name string * Name des Kunden
email string * E-Mail-Adresse (dient als Find-or-Create-Schlüssel)
phone string Telefonnummer
source string Einzelne Herkunftsquelle als Freitext
external_id string Maschinen-Kennung für den Upsert-Abgleich (hat Vorrang vor der E-Mail)
whmcs_client_id integer Optionale WHMCS-Kunden-ID
address_line_1 string Adresszeile 1
address_line_2 string Adresszeile 2
postal_code string Postleitzahl
city string Ort
country string Land (ISO-Code oder Name)
contact_person string Ansprechpartner
tax_id string Steuernummer / USt-IdNr.
tag_uuids array Liste team-eigener Tag-UUIDs, die dem Kunden zugeordnet werden
sources array Liste von Herkunftsquellen als Freitext
stripe_customer_id string Optionale Stripe-Kunden-ID (Präfix cus_), wird in die Zahlungszuordnung geschrieben

Kunde aktualisieren

PATCH /api/clients/{uuid}

Aktualisiert einen team-eigenen Kunden anhand seiner UUID. Nur explizit gesendete Felder werden geschrieben, ausgelassene Felder bleiben unverändert. Breaking Change: Der frühere numerische Pfad /api/clients/{id} wurde ersatzlos entfernt (HTTP 404); es gilt ausschließlich der UUID-Pfad.

Request Body:

name string Name des Kunden
contact_person string Ansprechpartner
phone string Telefonnummer
website string Webseite
address_line_1 string Adresszeile 1
address_line_2 string Adresszeile 2
postal_code string Postleitzahl
city string Ort
state string Bundesland / Region
country string Land
tax_id string Steuernummer / USt-IdNr.

📅 Timeline-Verwaltung

Basis-URL: https://creativeskyline.de/api/clients https://creativeskyline.de/api/clients/{uuid}/timeline https://creativeskyline.de/api/clients/{uuid}/projects https://creativeskyline.de/api/leads https://creativeskyline.de/api/lead-boards https://creativeskyline.de/api/leads/{uuid}/docs

Timeline-Einträge auflisten

GET /api/clients/{uuid}/timeline

Ruft alle Timeline-Einträge für einen bestimmten Kunden chronologisch sortiert ab.

Timeline-Eintrag erstellen

POST /api/clients/{uuid}/timeline

Erstellt einen neuen Timeline-Eintrag für den angegebenen Kunden.

Request Body:

title string * Titel des Eintrags
content string Inhalt des Eintrags
event_date string Ereignisdatum (ISO 8601, Standard: jetzt)
GET /api/clients/{uuid}/timeline/search

Durchsucht die Timeline-Einträge eines Kunden nach Titel oder Inhalt.

Query-Parameter:

search string * Suchbegriff

📁 Projekt-Verwaltung

Basis-URL: https://creativeskyline.de/api/clients https://creativeskyline.de/api/clients/{uuid}/timeline https://creativeskyline.de/api/clients/{uuid}/projects https://creativeskyline.de/api/leads https://creativeskyline.de/api/lead-boards https://creativeskyline.de/api/leads/{uuid}/docs

Kundenprojekte auflisten

GET /api/clients/{uuid}/projects

Listet alle Projekte des angegebenen Kunden auf, inklusive Status, Beschreibung und einem modules-Array mit aktiven Integrationen (flowcall, flowtime, flowtasks).

🗂️ Projekt-Timeline

Basis-URL: https://creativeskyline.de/api/clients https://creativeskyline.de/api/clients/{uuid}/timeline https://creativeskyline.de/api/clients/{uuid}/projects https://creativeskyline.de/api/leads https://creativeskyline.de/api/lead-boards https://creativeskyline.de/api/leads/{uuid}/docs

Projekt-Timeline abrufen

GET /api/clients/{uuid}/projects/{project_uuid}/timeline

Ruft alle Timeline-Einträge für ein bestimmtes Projekt ab, analog zur Kunden-Timeline.

🎯 Leads-Verwaltung

Basis-URL: https://creativeskyline.de/api/clients https://creativeskyline.de/api/clients/{uuid}/timeline https://creativeskyline.de/api/clients/{uuid}/projects https://creativeskyline.de/api/leads https://creativeskyline.de/api/lead-boards https://creativeskyline.de/api/leads/{uuid}/docs
Berechtigung
Alle Leads-Endpunkte erfordern den FlowCRM-Modulzugriff plus die Leads-Unterberechtigung Ihres Teams.
Idempotentes Anlegen
Senden Sie beim Anlegen ein Paar aus external_source und external_id. Ein zweiter POST mit demselben Paar aktualisiert den bestehenden Lead (Upsert), statt ein Duplikat zu erzeugen. Dabei werden nur die tatsächlich gesendeten Felder überschrieben.

Leads sind team-eigen: team_id und status werden serverseitig gesetzt und nie aus dem Request übernommen. Ein neuer Lead startet im Standard-Status des Teams. Der Status wird ausschliesslich über den eigenen Status-Endpunkt geändert, der Systemstatus converted nur über die Konvertierung.

Idempotenz: Trifft ein POST über external_source + external_id auf einen bestehenden Lead, werden nur die im Payload enthaltenen Felder aktualisiert (Merge). Nicht gesendete Felder bleiben unberührt. Ein solcher Wiederholungs-POST liefert created: false. Das Roh-Payload wird als source_payload gespeichert, erscheint aber nie in der Antwort.

Duplikatwarnung: Wird beim Anlegen ein mögliches Duplikat erkannt, wird der Lead trotzdem angelegt und die Antwort trägt ein Feld duplicate_warning mit den Treffern. Ohne Treffer ist das Feld null.

Leads auflisten

GET /api/leads

Listet die Leads des Teams paginiert auf. Standardmässig wird nur die offene Pipeline gezeigt (abgeschlossene und konvertierte Leads ausgeblendet); mit pipeline=false wird der volle Satz zurückgegeben. Die Antwort folgt dem Standard-Paginierungsformat mit data, links und meta.

Query-Parameter:

pipeline boolean Standard true (nur offene Pipeline). false zeigt alle Leads inkl. abgeschlossener
search string Volltextsuche über Firmenname, Vor-/Nachname und E-Mail
source string Filter auf eine Quelle oder mehrere per Komma getrennt
tag_uuid string Filter auf eine team-eigene Tag-UUID
assigned_user_uuid string Filter auf die UUID des zugewiesenen Benutzers. Eine UUID ausserhalb des Teams liefert eine leere Liste. Breaking Change: assigned_user_id wird nicht mehr akzeptiert (422)
created_from string Erstellt ab (Datum, YYYY-MM-DD)
created_to string Erstellt bis (Datum, YYYY-MM-DD)
updated_from string Geändert ab (Datum, YYYY-MM-DD)
updated_to string Geändert bis (Datum, YYYY-MM-DD)
per_page integer Einträge pro Seite (Standard 50, Maximum 100)
include string Zusätzliche Relationen, per Komma: contacts, sources, tags, status, board_cards, assigned_user, notes, custom_fields

Lead anlegen (Upsert)

POST /api/leads

Legt einen Lead an oder aktualisiert per external_source + external_id idempotent einen bestehenden (Merge nur der gesendeten Felder). Der Status kann hier nie gesetzt werden; ein neuer Lead startet im Standard-Status. Ein optionales doc-Objekt befüllt beim erstmaligen Anlegen das FlowDoc des Leads, nicht bei einem idempotenten Wiederholungs-POST. Das frühere docs[]-Array wird nicht mehr akzeptiert (422), weil ein Lead genau ein FlowDoc hat. Die Antwort trägt created (bool) und duplicate_warning (Objekt mit matches oder null). HTTP 201 bei Neuanlage, 200 bei idempotenter Aktualisierung.

Request Body:

type string * company oder person
company_name string Firmenname (Pflicht wenn type=company)
first_name string Vorname (Pflicht wenn type=person)
last_name string Nachname
email string E-Mail-Adresse
phone string Telefonnummer
website string Webseite
address_line_1 string Adresszeile 1
address_line_2 string Adresszeile 2
postal_code string Postleitzahl
city string Ort
state string Bundesland / Region
country string Land (ISO-Code)
country_display string Anzeigename des Landes
deal_value number Potenzieller Auftragswert
deal_currency string Währung (3-stelliger ISO-Code)
notes string Freitext-Notiz am Lead
external_source string Quellsystem-Kennung, Teil des Idempotenzschlüssels
external_id string Datensatz-Kennung im Quellsystem, Teil des Idempotenzschlüssels
source_payload object Roh-Payload der Quelle. Wird gespeichert, erscheint aber nie in der Antwort
sources array Liste von Herkunftsquellen als Freitext (max. 20 Einträge)
tag_uuids array Liste team-eigener Tag-UUIDs (max. 50 Einträge)
assigned_user_uuid string UUID eines Team-Mitglieds als zugewiesener Benutzer. Benutzer außerhalb des Teams werden mit 422 abgelehnt. Breaking Change: assigned_user_id wird nicht mehr akzeptiert (Validierungsfehler)
contacts array Ansprechpartner-Objekte (first_name, last_name, email, phone, role; max. 50 Einträge)
custom_fields array Custom-Field-Werte (definition_uuid oder name, plus value). Bei Feldern vom Typ reference ist value die UUID des Ziels (Kunde, Kontakt, Projekt oder Team-Mitglied), zum Beispiel {"definition_uuid": "...", "value": "3f7c1a02-9b64-4d1e-a5c8-2e7b90d41f6a"}. Breaking Change: definition_id wird nicht mehr akzeptiert, und eine numerische Ziel-ID in value wird bei Referenzfeldern ebenfalls mit 422 abgelehnt
doc object Das FlowDoc des Leads, nur bei Neuanlage. Einziges Feld ist content als Markdown-String; ein Titel ist nicht vorgesehen. Breaking Change: das frühere docs[]-Array wird mit 422 abgelehnt

Lead abrufen

GET /api/leads/{uuid}

Ruft einen einzelnen team-eigenen Lead per UUID ab. Status, Quellen, Tags, Ansprechpartner und zugewiesener Benutzer sind enthalten. Custom-Field-Werte nur mit include=custom_fields; Referenzfelder werden ausschließlich per UUID adressiert.

Query-Parameter:

include string custom_fields, um die Custom-Field-Werte mitzuladen. Referenzfelder liefern die UUID des Ziels in value und referenced_uuid sowie den Anzeigenamen in referenced_name; ist das Ziel nicht mehr vorhanden, ist referenced_uuid null

Lead aktualisieren

PATCH /api/leads/{uuid}

Aktualisiert die Kernfelder eines team-eigenen Leads (Teil-Update, nur gesendete Felder). Der Status kann hier nicht gesetzt werden (status und status_id werden mit 422 abgelehnt), dafür dient der Status-Endpunkt. Die Antwort trägt zusätzlich duplicate_warning.

Request Body:

type string company oder person
company_name string Firmenname
first_name string Vorname
last_name string Nachname
email string E-Mail-Adresse
phone string Telefonnummer
website string Webseite
address_line_1 string Adresszeile 1
address_line_2 string Adresszeile 2
postal_code string Postleitzahl
city string Ort
state string Bundesland / Region
country string Land (ISO-Code)
country_display string Anzeigename des Landes
deal_value number Potenzieller Auftragswert
deal_currency string Währung (3-stelliger ISO-Code)
notes string Freitext-Notiz
external_source string Quellsystem-Kennung
external_id string Datensatz-Kennung im Quellsystem
source_payload object Roh-Payload der Quelle. Wird gespeichert, erscheint aber nie in der Antwort
sources array Herkunftsquellen, additiv (fügt nur hinzu, entfernt nie; zum Ersetzen dient PUT /sources; max. 20 Einträge)
tag_uuids array Team-eigene Tag-UUIDs, additiv (zum Ersetzen dient PUT /tags; max. 50 Einträge)
assigned_user_uuid string UUID eines Team-Mitglieds als zugewiesener Benutzer; null entfernt die Zuweisung. Benutzer außerhalb des Teams werden mit 422 abgelehnt. Breaking Change: assigned_user_id wird nicht mehr akzeptiert (Validierungsfehler)
contacts array Ansprechpartner-Objekte (first_name, last_name, email, phone, role), additiv: legt neue Ansprechpartner an, verändert oder löscht keine bestehenden (dafür die /contacts-Endpunkte; max. 50 Einträge)
custom_fields array Custom-Field-Werte (definition_uuid oder name, plus value). Bei Feldern vom Typ reference ist value die UUID des Ziels (Kunde, Kontakt, Projekt oder Team-Mitglied). Breaking Change: definition_id wird nicht mehr akzeptiert, und eine numerische Ziel-ID in value wird bei Referenzfeldern ebenfalls mit 422 abgelehnt

Lead löschen

DELETE /api/leads/{uuid}

Löscht einen team-eigenen Lead (Soft-Delete).

🔗 Lead-Beziehungen

Basis-URL: https://creativeskyline.de/api/clients https://creativeskyline.de/api/clients/{uuid}/timeline https://creativeskyline.de/api/clients/{uuid}/projects https://creativeskyline.de/api/leads https://creativeskyline.de/api/lead-boards https://creativeskyline.de/api/leads/{uuid}/docs
Sync ersetzt, Notizen sind append-only
PUT auf Quellen und Tags ist ein voller Sync: die gesendete Liste ersetzt die gespeicherte (ausgelassene Werte werden entfernt, ein leeres Array leert die Relation). Notizen sind unveränderlich, es gibt bewusst kein PATCH oder DELETE.

Alle Endpunkte sind team-scoped: eine fremde Lead-UUID ergibt 404. Fremd-Team-Tag-UUIDs werden als ungültige Auswahl (422) abgelehnt. Die Autorenschaft einer Notiz stammt immer vom Token-Benutzer und kann nicht mitgesendet werden.

Quellen synchronisieren

PUT /api/leads/{uuid}/sources

Voller Sync der Quellen des Leads: die gesendete Liste ersetzt die gespeicherte. Ein leeres Array leert die Quellen. Trimmen, Leer-Entfernen und Deduplizieren übernimmt der Server.

Request Body:

sources array * Vollständige Liste der Quellen (Freitext, max. 50 Einträge). Muss vorhanden sein; leeres Array leert die Quellen

Tags synchronisieren

PUT /api/leads/{uuid}/tags

Voller Sync der Tags des Leads über team-eigene Tag-UUIDs: die gesendete Liste ersetzt die gespeicherte. Behaltene Tags behalten ihre Pivot-Quelle, neu angehängte erhalten source=api, ausgelassene werden entfernt. Ein leeres Array entfernt alle Tags. Eine Fremd-Team-UUID wird mit 422 abgelehnt.

Request Body:

tag_uuids array * Vollständige Liste team-eigener Tag-UUIDs (max. 50 Einträge). Muss vorhanden sein; leeres Array entfernt alle Tags

Ansprechpartner auflisten

GET /api/leads/{uuid}/contacts

Listet die Ansprechpartner eines team-eigenen Leads auf.

Ansprechpartner anlegen

POST /api/leads/{uuid}/contacts

Legt einen Ansprechpartner am Lead an. Nur first_name ist Pflicht.

Request Body:

first_name string * Vorname
last_name string Nachname
email string E-Mail-Adresse
phone string Telefonnummer
role string Rolle / Funktion

Ansprechpartner aktualisieren

PATCH /api/leads/{uuid}/contacts/{contactUuid}

Aktualisiert einen Ansprechpartner (Teil-Update). first_name darf, wenn gesendet, nicht leer sein. Der Ansprechpartner wird per UUID innerhalb des Leads adressiert; numerische IDs werden nicht mehr akzeptiert (HTTP 404).

Request Body:

first_name string Vorname (darf nicht geleert werden)
last_name string Nachname
email string E-Mail-Adresse
phone string Telefonnummer
role string Rolle / Funktion

Ansprechpartner entfernen

DELETE /api/leads/{uuid}/contacts/{contactUuid}

Entfernt einen Ansprechpartner des Leads.

Notizen auflisten

GET /api/leads/{uuid}/notes

Listet die Notizen des Leads auf, neueste zuerst. Der Autor wird als Objekt (uuid, name) mitgeliefert.

Notiz anhängen

POST /api/leads/{uuid}/notes

Hängt eine Notiz an den Lead an. Notizen sind append-only, es gibt kein Bearbeiten oder Löschen. Der Autor ist immer der Token-Benutzer.

Request Body:

body string * Notizinhalt (max. 65535 Zeichen)

🚦 Lead-Status

Basis-URL: https://creativeskyline.de/api/clients https://creativeskyline.de/api/clients/{uuid}/timeline https://creativeskyline.de/api/clients/{uuid}/projects https://creativeskyline.de/api/leads https://creativeskyline.de/api/lead-boards https://creativeskyline.de/api/leads/{uuid}/docs
converted ist nicht setzbar
Der Systemstatus converted kann über diesen Endpunkt nicht gesetzt werden (HTTP 422). Er entsteht ausschliesslich über die Konvertierung. Andere Status (auch gewonnen/verloren) sind normal setzbar.

Der Status wird ausschliesslich über seine team-eigene UUID gesetzt, nie über einen Schlüssel oder eine numerische id. Eine Fremd-Team-Status-UUID wird als ungültige Auswahl (422) abgelehnt. Der Schreibvorgang läuft über denselben Pfad wie die Detailseite, sodass derselbe Timeline-Eintrag geschrieben und das Board synchronisiert wird.

Status setzen

PUT /api/leads/{uuid}/status

Setzt den Status eines team-eigenen Leads auf einen team-eigenen Status, adressiert per Status-UUID. converted wird mit 422 abgelehnt; eine UUID, die die Validierung passiert, aber keinen auffindbaren Status trifft, liefert 404.

Request Body:

status_uuid string * UUID eines team-eigenen Lead-Status

📆 Lead-Timeline

Basis-URL: https://creativeskyline.de/api/clients https://creativeskyline.de/api/clients/{uuid}/timeline https://creativeskyline.de/api/clients/{uuid}/projects https://creativeskyline.de/api/leads https://creativeskyline.de/api/lead-boards https://creativeskyline.de/api/leads/{uuid}/docs

Die Lead-Timeline spiegelt die Kunden-Timeline: GET ist paginiert (neueste zuerst), POST hängt einen Eintrag an. Über die API angelegte Einträge bleiben in der bestehenden Timeline sichtbar und fliessen nach einer Konvertierung in die Kunden-Timeline. Ein konvertierter Lead ist schreibgeschützt: ein POST wird mit HTTP 409 abgelehnt.

Timeline abrufen

GET /api/leads/{uuid}/timeline

Ruft die Timeline-Einträge eines team-eigenen Leads paginiert ab (neueste zuerst).

Query-Parameter:

per_page integer Einträge pro Seite (Standard 50, Maximum 100)

Timeline-Eintrag anlegen

POST /api/leads/{uuid}/timeline

Hängt einen Timeline-Eintrag an den Lead an. type wird gegen die erlaubte Timeline-Typenliste geprüft; fehlt type, wird note verwendet. Bei einem konvertierten Lead antwortet der Endpunkt mit HTTP 409.

Request Body:

content string * Inhalt des Eintrags
type string Timeline-Typ aus der erlaubten Vokabel (Standard note)
event_date string Ereignisdatum (ISO 8601, Standard: jetzt)

🔄 Lead-Konvertierung

Basis-URL: https://creativeskyline.de/api/clients https://creativeskyline.de/api/clients/{uuid}/timeline https://creativeskyline.de/api/clients/{uuid}/projects https://creativeskyline.de/api/leads https://creativeskyline.de/api/lead-boards https://creativeskyline.de/api/leads/{uuid}/docs
Einmalig und unumkehrbar
Eine Konvertierung ist unumkehrbar. Der konvertierte Lead wird schreibgeschützt. Ein zweiter Konvertierungsversuch desselben Leads wird mit HTTP 409 abgelehnt.

Konvertiert einen team-eigenen Lead in einen neuen Kunden über denselben Konvertierungsdienst wie das UI-Modal. Die vier optionalen Transfer-Flags entsprechen den Checkboxen im Modal; ohne Flag wird die jeweilige Kategorie nicht übertragen. Die Flags tragen keine IDs, der Dienst leitet jede übertragene Zeile serverseitig vom gesperrten Lead ab. Die Antwort ist der neu angelegte Kunde (nicht der Lead).

Lead in Kunden konvertieren

POST /api/leads/{uuid}/convert

Konvertiert den Lead in einen neuen Kunden. Ohne client_name wird der Name aus dem Lead abgeleitet (Firmenname bei Firma, Vor- und Nachname bei Person). Die Antwort ist der neue Kunde (CmmClient) mit HTTP 201. Ein bereits konvertierter Lead ergibt 409.

Request Body:

client_name string Expliziter Kundenname (überschreibt den abgeleiteten Namen)
transfer_contacts boolean Ansprechpartner mit übernehmen
transfer_todos boolean Aufgaben mit übernehmen
transfer_docs boolean FlowDocs mit übernehmen
transfer_custom_fields boolean Custom-Field-Werte mit übernehmen

🗂️ Lead-Boards

Basis-URL: https://creativeskyline.de/api/clients https://creativeskyline.de/api/clients/{uuid}/timeline https://creativeskyline.de/api/clients/{uuid}/projects https://creativeskyline.de/api/leads https://creativeskyline.de/api/lead-boards https://creativeskyline.de/api/leads/{uuid}/docs
Berechtigung und Adressierung
Alle Board-Endpunkte erfordern FlowCRM plus die Leads-Unterberechtigung. Boards, Spalten und Karten werden ausschliesslich über ihre UUID adressiert. Pro Team sind maximal 5 Boards erlaubt.

Kanban-Boards für Leads: ein Board enthält Spalten, eine Spalte enthält Karten, jede Karte verweist auf genau einen Lead. Das Verschieben einer Karte in eine status-gemappte Spalte setzt den Status des Leads über denselben Pfad wie das Drag-and-Drop im UI. Karten dieses Endpunkts verweisen immer auf einen Lead, nie auf einen Kunden.

Boards auflisten

GET /api/lead-boards

Listet die Boards des Teams auf. Mit include=columns oder include=columns.cards werden Spalten bzw. Spalten samt Karten mitgeladen.

Query-Parameter:

include string columns oder columns.cards

Board anlegen

POST /api/lead-boards

Legt ein neues Board an. Bei überschrittenem Limit (5 pro Team) antwortet der Endpunkt mit HTTP 422.

Request Body:

name string * Name des Boards

Board abrufen

GET /api/lead-boards/{uuid}

Ruft ein team-eigenes Board ab. Mit include=columns oder columns.cards inklusive Spalten bzw. Karten.

Query-Parameter:

include string columns oder columns.cards

Board umbenennen

PATCH /api/lead-boards/{uuid}

Benennt ein team-eigenes Board um.

Request Body:

name string Neuer Name des Boards

Board löschen

DELETE /api/lead-boards/{uuid}

Löscht ein team-eigenes Board samt seiner Spalten und Karten. Die verknüpften Leads bleiben bestehen.

Spalte anlegen

POST /api/lead-boards/{uuid}/columns

Legt eine Spalte in einem team-eigenen Board an. Ohne sort_order wird die Spalte hinten angefügt.

Request Body:

name string * Name der Spalte
sort_order integer Position der Spalte (Standard: hinten angefügt)

Spalte aktualisieren

PATCH /api/lead-board-columns/{uuid}

Aktualisiert Name oder Position einer team-eigenen Spalte.

Request Body:

name string Neuer Name der Spalte
sort_order integer Neue Position der Spalte

Spalte löschen

DELETE /api/lead-board-columns/{uuid}

Löscht eine team-eigene Spalte. Die Karten der Spalte werden mitentfernt; die verknüpften Leads bleiben bestehen.

Karte anlegen

POST /api/lead-board-columns/{uuid}/cards

Legt eine Karte in einer team-eigenen Spalte an. Genau eine der beiden Varianten angeben: entweder lead_uuid (bestehender Lead) ODER ein verschachteltes lead-Objekt (neuer Lead und Karte in einer Transaktion). Die Karten-eigenen deal_value/deal_currency sind unabhängig von den Deal-Feldern des Leads.

Request Body:

lead_uuid string UUID eines bestehenden team-eigenen Leads (Alternative zu lead)
lead object Neuer Lead (type plus company_name/first_name usw., analog zum Lead-Anlegen; Alternative zu lead_uuid)
deal_value number Auftragswert der Karte
deal_currency string Währung der Karte (3-stelliger ISO-Code)
sort_order integer Position der Karte in der Spalte

Karte aktualisieren

PATCH /api/lead-board-cards/{uuid}

Aktualisiert die Deal-Felder oder die Position einer team-eigenen Karte. Die Verknüpfung zum Lead und die Spalte werden hier nicht geändert (dafür dient der Move-Endpunkt).

Request Body:

deal_value number Auftragswert der Karte
deal_currency string Währung der Karte (3-stelliger ISO-Code)
sort_order integer Position der Karte in der Spalte

Karte verschieben

PUT /api/lead-board-cards/{uuid}/move

Verschiebt eine team-eigene Karte in eine team-eigene Zielspalte. Ist die Zielspalte status-gemappt, wird der Status des Leads über denselben Pfad wie das UI-Drag-and-Drop gesetzt. Die Verknüpfung der Karte kann dabei nicht geändert werden.

Request Body:

target_column_uuid string * UUID der team-eigenen Zielspalte
sort_order integer Zielposition in der Spalte

Karte löschen

DELETE /api/lead-board-cards/{uuid}

Löscht eine team-eigene Karte. Der verknüpfte Lead bleibt bestehen.

📝 FlowDocs

Basis-URL: https://creativeskyline.de/api/clients https://creativeskyline.de/api/clients/{uuid}/timeline https://creativeskyline.de/api/clients/{uuid}/projects https://creativeskyline.de/api/leads https://creativeskyline.de/api/lead-boards https://creativeskyline.de/api/leads/{uuid}/docs
Berechtigung je Eigentümer
FlowDocs an einem Lead erfordern FlowCRM plus die Leads-Unterberechtigung. FlowDocs an Kunden, Kontakten und Projekten benötigen nur den FlowCRM-Modulzugriff.
Versionierung
Jeder Schreibvorgang erzeugt eine neue Version. Die API akzeptiert content ausschließlich als Markdown-String und wandelt ihn serverseitig in TipTap um. content in der Antwort ist das interne TipTap-JSON und die Quelle der Wahrheit. content_html ist eine bereinigte Darstellungsform, die nur ausgegeben und nie entgegengenommen wird.
Technische Markdown-Inhalte
content darf technische Dokumentation mit Backticks, Codebeispielen, SQL-Begriffen, URLs, relativen Pfadsegmenten und Tabellen enthalten. Diese Inhalte werden als Markdown verarbeitet. Pfad, Query-Parameter und alle übrigen API-Felder bleiben durch die Web Application Firewall geschützt.

Jede der vier Eigentümer-Entitäten — Lead, Kunde, Kontakt und Projekt — hat genau ein FlowDoc. Es gibt deshalb weder eine Liste noch einen Anlege-Endpunkt noch eine Dokument-UUID im Pfad: GET /api/{eigentümer}/{uuid}/docs liefert das Dokument und legt es beim ersten Zugriff an, PUT auf denselben Pfad ersetzt den Inhalt vollständig. Breaking Change: POST auf /docs antwortet mit HTTP 405, die früheren Pfade /docs/{docUuid} mit HTTP 404. Der Eigentümer wird per UUID adressiert. title steht aus Kompatibilitätsgründen weiterhin in der Antwort, ist immer Notizen und wird im Request-Body mit 422 abgelehnt; team_id und die Eigentümer-Verknüpfung ebenso. Für Schreibvorgänge wird content ausschließlich als Markdown-String übergeben. TipTap-JSON wird als Eingabe nicht akzeptiert. Die Syntax folgt CommonMark und unterstützt zusätzlich Aufgabenlisten im GitHub-Stil. Verarbeitet werden Überschriften, Absätze, Aufzählungen, nummerierte Listen, Aufgabenlisten, Fett, Kursiv, Links und feste Zeilenumbrüche. Echte LF- und CRLF-Zeilenumbrüche werden verarbeitet und auch einzelne Zeilenumbrüche sichtbar bewahrt; ein vollständig doppelt kodierter Inhalt mit literalen -Sequenzen wird ebenfalls normalisiert. Eingebettetes HTML wird verworfen. Beim Anlegen eines Leads kann das doc-Feld den Inhalt direkt mitliefern (siehe Lead anlegen). Die folgende Referenz zeigt den vollen Payload einmal für Leads; die Endpunkte für Kunden, Kontakte und Projekte sind identisch aufgebaut und unterscheiden sich nur im Pfad und in der Berechtigung.

Lead-Dokument abrufen

GET /api/leads/{uuid}/docs

Ruft das FlowDoc eines team-eigenen Leads ab, inklusive latest_version_number. Existiert noch keines, wird es beim ersten Aufruf angelegt und leer zurückgegeben. documentable.type ist crm_lead.

Lead-Dokument aktualisieren

PUT /api/leads/{uuid}/docs

Ersetzt den Inhalt des FlowDocs vollständig. content muss übergeben werden; null oder ein leerer String leert das Dokument. Jeder Aufruf erzeugt eine neue Version und erhöht latest_version_number. title wird im Body mit 422 abgelehnt.

Request Body:

content string * Markdown-Inhalt, wird serverseitig in TipTap umgewandelt. null oder leerer String leert das Dokument

Kunden-Dokument abrufen

GET /api/clients/{uuid}/docs

Ruft das FlowDoc eines team-eigenen Kunden ab, inklusive latest_version_number. Existiert noch keines, wird es beim ersten Aufruf angelegt und leer zurückgegeben. documentable.type ist cmm_client.

Kunden-Dokument aktualisieren

PUT /api/clients/{uuid}/docs

Ersetzt den Inhalt des FlowDocs vollständig. content muss übergeben werden; null oder ein leerer String leert das Dokument. Jeder Aufruf erzeugt eine neue Version und erhöht latest_version_number. title wird im Body mit 422 abgelehnt.

Request Body:

content string * Markdown-Inhalt, wird serverseitig in TipTap umgewandelt. null oder leerer String leert das Dokument

Kontakt-Dokument abrufen

GET /api/contacts/{uuid}/docs

Ruft das FlowDoc eines Kontakts (ein privater Kontakt ohne Team ist nur für seinen Eigentümer erreichbar) ab, inklusive latest_version_number. Existiert noch keines, wird es beim ersten Aufruf angelegt und leer zurückgegeben. documentable.type ist cmm_contact.

Kontakt-Dokument aktualisieren

PUT /api/contacts/{uuid}/docs

Ersetzt den Inhalt des FlowDocs vollständig. content muss übergeben werden; null oder ein leerer String leert das Dokument. Jeder Aufruf erzeugt eine neue Version und erhöht latest_version_number. title wird im Body mit 422 abgelehnt.

Request Body:

content string * Markdown-Inhalt, wird serverseitig in TipTap umgewandelt. null oder leerer String leert das Dokument

Projekt-Dokument abrufen

GET /api/projects/{uuid}/docs

Ruft das FlowDoc eines Projekts (ein Projekt hat kein eigenes Team und wird über seinen Kunden team-scoped) ab, inklusive latest_version_number. Existiert noch keines, wird es beim ersten Aufruf angelegt und leer zurückgegeben. documentable.type ist cmm_client_project.

Projekt-Dokument aktualisieren

PUT /api/projects/{uuid}/docs

Ersetzt den Inhalt des FlowDocs vollständig. content muss übergeben werden; null oder ein leerer String leert das Dokument. Jeder Aufruf erzeugt eine neue Version und erhöht latest_version_number. title wird im Body mit 422 abgelehnt.

Request Body:

content string * Markdown-Inhalt, wird serverseitig in TipTap umgewandelt. null oder leerer String leert das Dokument