API - Kunden & Kontakte Admin

📕 Für Administratoren und Entwickler

Über die spiritflow Public API können Kunden und deren Kontaktpersonen programmatisch verwaltet werden. Alle Endpunkte sind unter dem Basis-Pfad /api/v1/customers erreichbar und erfordern einen gültigen API-Key mit dem entsprechenden Scope.


Referenzwerte

Kunden-Status-Werte

StatusBedeutung
ACTIVEAktiver Kunde
LEADLead / Interessent
PROSPECTPotenzieller Kunde
LOSTVerlorener Kunde
INACTIVEInaktiv
SUSPENDEDGesperrt
ARCHIVEDArchiviert

Kunden-Typen

TypBedeutung
COMPANYUnternehmen
INDIVIDUALPrivatperson

Kunden auflisten

GET /api/v1/customers

Erforderlicher Scope: customers:read

Query-Parameter:

ParameterTypPflichtBeschreibung
statusStringNeinFiltern nach Status (z.B. ACTIVE)
customerTypeStringNeinFiltern nach Typ (COMPANY oder INDIVIDUAL)
searchStringNeinVolltextsuche in Name, E-Mail, Kundennummer
createdAfterString (ISO 8601)NeinNur Kunden, die nach diesem Zeitpunkt erstellt wurden
createdBeforeString (ISO 8601)NeinNur Kunden, die vor diesem Zeitpunkt erstellt wurden
pageIntegerNeinSeite (Standard: 0)
sizeIntegerNeinEinträge pro Seite, max. 100 (Standard: 20)
sortStringNeinSortierung (Standard: name,asc). Erlaubte Felder: createdAt, updatedAt, name, customerNumber, email, city, status

Antwort (200 OK):

{
  "data": [
    {
      "id": 12,
      "name": "ACME GmbH",
      "customerNumber": "KD-00042",
      "email": "kontakt@acme-gmbh.de",
      "phone": "+49 40 123456",
      "mobile": null,
      "street": "Musterstrasse 1",
      "postalCode": "20095",
      "city": "Hamburg",
      "country": "Deutschland",
      "website": "https://www.acme-gmbh.de",
      "description": "Langjaehriger Kunde seit 2018.",
      "taxNumber": "48/123/45678",
      "vatId": "DE123456789",
      "status": "ACTIVE",
      "industry": "Software",
      "customerType": "COMPANY",
      "customerSince": "2018-06-01T00:00:00Z",
      "createdAt": "2018-06-01T09:00:00Z",
      "updatedAt": "2025-01-15T11:30:00Z"
    }
  ],
  "pagination": {
    "page": 0,
    "size": 20,
    "totalElements": 34,
    "totalPages": 2
  },
  "meta": {
    "requestId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "timestamp": "2025-03-01T10:30:00Z"
  }
}

cURL-Beispiel:

curl -X GET "https://app.spiritflow.team/api/v1/customers?status=ACTIVE&sort=name,asc" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Einzelnen Kunden abrufen

GET /api/v1/customers/{id}

Erforderlicher Scope: customers:read

Pfad-Parameter:

ParameterTypBeschreibung
idLongID des Kunden

Antwort (200 OK): Einzelnes Kunden-Objekt (gleiche Struktur wie in der Liste)

Fehler-Codes:

HTTP-StatusCodeBeschreibung
404NOT_FOUNDKunde nicht gefunden oder gehoert nicht zu diesem Mandanten

cURL-Beispiel:

curl -X GET "https://app.spiritflow.team/api/v1/customers/12" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Kunden erstellen

POST /api/v1/customers

Erforderlicher Scope: customers:write

Request-Body:

FeldTypPflichtStandardBeschreibung
nameStringJa-Name des Kunden (max. 255 Zeichen)
customerNumberStringNeinnullKundennummer (max. 50 Zeichen)
emailStringNeinnullE-Mail-Adresse (max. 255 Zeichen, muss gültig sein)
phoneStringNeinnullTelefonnummer (max. 50 Zeichen)
mobileStringNeinnullMobilnummer (max. 50 Zeichen)
streetStringNeinnullStrasse und Hausnummer (max. 255 Zeichen)
postalCodeStringNeinnullPostleitzahl (max. 10 Zeichen)
cityStringNeinnullStadt (max. 100 Zeichen)
countryStringNeinnullLand (max. 100 Zeichen)
websiteStringNeinnullWebseite (max. 100 Zeichen)
descriptionStringNeinnullNotizen / Beschreibung
taxNumberStringNeinnullSteuernummer (max. 50 Zeichen)
vatIdStringNeinnullUSt-IdNr. (max. 50 Zeichen)
statusStringNeinACTIVEStatus (siehe Referenzwerte oben)
industryStringNeinnullBranche (max. 100 Zeichen)
customerTypeStringNeinCOMPANYKundentyp (COMPANY oder INDIVIDUAL)

Beispiel-Request:

{
  "name": "Mustermann GmbH",
  "customerNumber": "KD-00099",
  "email": "info@mustermann-gmbh.de",
  "phone": "+49 30 987654",
  "street": "Berliner Allee 42",
  "postalCode": "10115",
  "city": "Berlin",
  "country": "Deutschland",
  "website": "https://www.mustermann-gmbh.de",
  "vatId": "DE987654321",
  "status": "LEAD",
  "industry": "Handwerk",
  "customerType": "COMPANY"
}

Antwort (201 Created):

{
  "data": {
    "id": 35,
    "name": "Mustermann GmbH",
    "customerNumber": "KD-00099",
    "email": "info@mustermann-gmbh.de",
    "phone": "+49 30 987654",
    "mobile": null,
    "street": "Berliner Allee 42",
    "postalCode": "10115",
    "city": "Berlin",
    "country": "Deutschland",
    "website": "https://www.mustermann-gmbh.de",
    "description": null,
    "taxNumber": null,
    "vatId": "DE987654321",
    "status": "LEAD",
    "industry": "Handwerk",
    "customerType": "COMPANY",
    "customerSince": "2025-03-01T10:30:00Z",
    "createdAt": "2025-03-01T10:30:00Z",
    "updatedAt": "2025-03-01T10:30:00Z"
  },
  "meta": {
    "requestId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "timestamp": "2025-03-01T10:30:00Z"
  }
}

Fehler-Codes:

HTTP-StatusCodeBeschreibung
400VALIDATION_ERRORPflichtfeld fehlt, E-Mail ungültig oder Feldlimit überschritten

cURL-Beispiel:

curl -X POST "https://app.spiritflow.team/api/v1/customers" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Mustermann GmbH",
    "email": "info@mustermann-gmbh.de",
    "status": "LEAD",
    "customerType": "COMPANY"
  }'

Kunden aktualisieren

PUT /api/v1/customers/{id}

Erforderlicher Scope: customers:write

Pfad-Parameter:

ParameterTypBeschreibung
idLongID des Kunden

Request-Body (alle Felder optional):

Gleiche Felder wie beim Erstellen, alle optional. Nur übermittelte Felder werden aktualisiert.

Beispiel-Request:

{
  "status": "ACTIVE",
  "email": "neuemail@mustermann-gmbh.de",
  "phone": "+49 30 112233"
}

Antwort (200 OK): Aktualisiertes Kunden-Objekt

Fehler-Codes:

HTTP-StatusCodeBeschreibung
400VALIDATION_ERRORUngültige Feldwerte
404NOT_FOUNDKunde nicht gefunden

cURL-Beispiel:

curl -X PUT "https://app.spiritflow.team/api/v1/customers/35" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "ACTIVE",
    "email": "neuemail@mustermann-gmbh.de"
  }'

Kunden löschen (archivieren)

DELETE /api/v1/customers/{id}

Erforderlicher Scope: customers:write

Pfad-Parameter:

ParameterTypBeschreibung
idLongID des Kunden

Antwort: 204 No Content

Fehler-Codes:

HTTP-StatusCodeBeschreibung
404NOT_FOUNDKunde nicht gefunden

cURL-Beispiel:

curl -X DELETE "https://app.spiritflow.team/api/v1/customers/35" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Kontaktpersonen

Basis-Pfad: /api/v1/customers/{customerId}/contacts

Kontaktpersonen sind Ansprechpartner eines Kunden, zum Beispiel Geschäftsführer, Projektleiter oder Buchhaltung. Sie sind immer einem Kunden zugeordnet.

Kontaktpersonen auflisten

GET /api/v1/customers/{customerId}/contacts

Erforderlicher Scope: customers:read

Pfad-Parameter:

ParameterTypBeschreibung
customerIdLongID des Kunden

Antwort-Felder:

FeldTypBeschreibung
idnumberEindeutige ID der Kontaktperson
customerIdnumberID des zugehoerigen Kunden
salutationstring?Anrede
firstNamestringVorname
lastNamestringNachname
positionstring?Position / Funktion
departmentstring?Abteilung
emailstring?E-Mail-Adresse
phonestring?Telefonnummer
mobilestring?Mobilnummer
isPrimarybooleanIst Hauptansprechpartner
notesstring?Notizen
preferredLanguagestring?Bevorzugte Sprache (ISO-Code)
createdAtstringErstellungszeitpunkt (ISO 8601)
updatedAtstringLetzter Aenderungszeitpunkt (ISO 8601)

cURL-Beispiel:

curl -X GET "https://app.spiritflow.team/api/v1/customers/12/contacts" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Einzelne Kontaktperson abrufen

GET /api/v1/customers/{customerId}/contacts/{contactId}

Erforderlicher Scope: customers:read

Pfad-Parameter:

ParameterTypBeschreibung
customerIdLongID des Kunden
contactIdLongID der Kontaktperson

Antwort (200 OK): Einzelnes Kontaktpersonen-Objekt (gleiche Felder wie in der Liste)

cURL-Beispiel:

curl -X GET "https://app.spiritflow.team/api/v1/customers/12/contacts/7" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Kontaktperson erstellen

POST /api/v1/customers/{customerId}/contacts

Erforderlicher Scope: customers:write

Pfad-Parameter:

ParameterTypBeschreibung
customerIdLongID des Kunden

Request-Body:

FeldTypPflichtBeschreibung
firstNamestringJaVorname (max. 100 Zeichen)
lastNamestringJaNachname (max. 100 Zeichen)
salutationstringNeinAnrede (max. 20 Zeichen)
positionstringNeinPosition / Funktion (max. 200 Zeichen)
departmentstringNeinAbteilung (max. 100 Zeichen)
emailstringNeinE-Mail-Adresse
phonestringNeinTelefonnummer (max. 50 Zeichen)
mobilestringNeinMobilnummer (max. 50 Zeichen)
isPrimarybooleanNeinHauptansprechpartner (Standard: false)
notesstringNeinNotizen
preferredLanguagestringNeinSprachcode, z.B. de oder en (Standard: de)

Antwort (201 Created): Gleiche Felder wie bei der Kontaktliste.

cURL-Beispiel:

curl -X POST "https://app.spiritflow.team/api/v1/customers/15/contacts" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "firstName": "Andrea",
    "lastName": "Bauer",
    "position": "Geschäftsführerin",
    "email": "a.bauer@acme.de",
    "phone": "+49 221 12345678",
    "isPrimary": true
  }'

Logo hochladen

POST /api/v1/customers/{id}/logo

Lädt ein Logo für den Kunden hoch. Das Bild wird auf max. 512px verkleinert. Unterstützte Formate: JPEG, PNG, WebP.

Erforderlicher Scope: customers:write

Pfad-Parameter:

ParameterTypBeschreibung
idLongID des Kunden

Request: Multipart Form-Data mit dem Feld file.

Antwort (200 OK):

{
  "data": {
    "logoUrl": "/api/attachments/customer-logos/50_1234567890.png"
  }
}

Die Logo-URL ist öffentlich ohne Authentifizierung abrufbar.

Fehler-Codes:

HTTP-StatusCodeBeschreibung
400BAD_REQUESTDateiformat nicht unterstützt oder Datei fehlt
404NOT_FOUNDKunde nicht gefunden

cURL-Beispiel:

curl -X POST "https://app.spiritflow.team/api/v1/customers/12/logo" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -F "file=@/pfad/zum/logo.png"

Logo entfernen

DELETE /api/v1/customers/{id}/logo

Entfernt das Logo eines Kunden.

Erforderlicher Scope: customers:write

Pfad-Parameter:

ParameterTypBeschreibung
idLongID des Kunden

Antwort: 204 No Content

Fehler-Codes:

HTTP-StatusCodeBeschreibung
404NOT_FOUNDKunde nicht gefunden

cURL-Beispiel:

curl -X DELETE "https://app.spiritflow.team/api/v1/customers/12/logo" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"