API - Projekte Admin

📕 Für Administratoren und Entwickler.

Über die Public API können Projekte ausgelesen, erstellt, aktualisiert und gelöscht werden. Ausserdem lassen sich alle Aufgaben eines Projekts abrufen.

Basis-Pfad: /api/v1/projects


Referenzwerte

Projekt-Status-Werte

StatusBedeutung
PLANNEDGeplant
ACTIVEAktiv
COMPLETEDAbgeschlossen
ARCHIVEDArchiviert

Projekt-Prioritäts-Werte

PrioritätBedeutung
LOWNiedrig
NORMALNormal
HIGHHoch
CRITICALKritisch

Projekte auflisten

GET /api/v1/projects

Scope: projects:read

Query-Parameter:

ParameterTypPflichtBeschreibung
statusStringNeinFiltern nach Status (z.B. ACTIVE)
searchStringNeinVolltextsuche in Titel und Beschreibung
createdAfterString (ISO 8601)NeinNur Projekte, die nach diesem Zeitpunkt erstellt wurden
createdBeforeString (ISO 8601)NeinNur Projekte, die vor diesem Zeitpunkt erstellt wurden
pageIntegerNeinSeite (Standard: 0)
sizeIntegerNeinEinträge pro Seite, max. 100 (Standard: 20)
sortStringNeinSortierung (Standard: createdAt,desc). Erlaubte Felder: createdAt, updatedAt, title, status, priority

Antwort (200 OK):

{
  "data": [
    {
      "id": 5,
      "title": "Website-Relaunch ACME",
      "description": "Komplette Neugestaltung der Unternehmenswebseite für ACME GmbH.",
      "numberPrefix": "ACME",
      "color": "#3F51B5",
      "status": "ACTIVE",
      "priority": "HIGH",
      "startDate": "2025-01-01",
      "endDate": "2025-06-30",
      "progress": 32,
      "ownerId": 2,
      "assigneeId": 7,
      "teamMemberIds": [7, 8, 9],
      "customerName": "ACME GmbH",
      "createdAt": "2024-12-15T09:00:00Z",
      "updatedAt": "2025-02-28T16:45:00Z"
    }
  ],
  "pagination": {
    "page": 0,
    "size": 20,
    "totalElements": 12,
    "totalPages": 1
  },
  "meta": {
    "requestId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "timestamp": "2025-03-01T10:30:00Z"
  }
}

cURL-Beispiel:

curl -X GET "https://app.spiritflow.team/api/v1/projects?status=ACTIVE" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Einzelnes Projekt abrufen

GET /api/v1/projects/{id}

Scope: projects:read

Pfad-Parameter:

ParameterTypBeschreibung
idLongID des Projekts

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

Fehler-Codes:

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

cURL-Beispiel:

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

Projekt erstellen

POST /api/v1/projects

Scope: projects:write

Request-Body:

FeldTypPflichtStandardBeschreibung
titleStringJa-Projekttitel (max. 255 Zeichen)
numberPrefixStringJa-Ticket-Praefix (nur Grossbuchstaben und Ziffern, 1–10 Zeichen, z.B. ACME)
descriptionStringNeinnullProjektbeschreibung
colorStringNein#3F51B5Farbe als Hex-Code (Format: #RRGGBB)
statusStringNeinPLANNEDStatus (siehe Referenzwerte)
priorityStringNeinNORMALPriorität (siehe Referenzwerte)
startDateStringNeinnullStartdatum (Format: YYYY-MM-DD)
endDateStringNeinnullEnddatum (Format: YYYY-MM-DD)
assigneeIdLongNeinnullID des zugewiesenen Projektleiters
teamMemberIdsLong[]Nein[]IDs der Projektmitglieder
customerIdLongNeinnullID des zugeordneten Kunden

Hinweis zum numberPrefix: Das Praefix muss innerhalb des Mandanten eindeutig sein und wird für alle Ticket-Nummern dieses Projekts verwendet (z.B. ACME-0001, ACME-0002). Einmal vergeben, kann es nicht mehr geändert werden.

Beispiel-Request:

{
  "title": "Online-Shop Rollout Baeckerei Schneider",
  "numberPrefix": "BSNDR",
  "description": "Implementierung eines WooCommerce-basierten Online-Shops für Backwaren und Catering.",
  "color": "#FF9800",
  "status": "PLANNED",
  "priority": "HIGH",
  "startDate": "2025-04-01",
  "endDate": "2025-08-31",
  "assigneeId": 7,
  "teamMemberIds": [7, 8, 10],
  "customerId": 12
}

Antwort (201 Created):

{
  "data": {
    "id": 13,
    "title": "Online-Shop Rollout Baeckerei Schneider",
    "description": "Implementierung eines WooCommerce-basierten Online-Shops für Backwaren und Catering.",
    "numberPrefix": "BSNDR",
    "color": "#FF9800",
    "status": "PLANNED",
    "priority": "HIGH",
    "startDate": "2025-04-01",
    "endDate": "2025-08-31",
    "progress": 0,
    "ownerId": 2,
    "assigneeId": 7,
    "teamMemberIds": [7, 8, 10],
    "customerName": "Baeckerei Schneider",
    "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, numberPrefix ungültig oder Farbe im falschen Format
404NOT_FOUNDReferenzierter Kunde oder Benutzer nicht gefunden

cURL-Beispiel:

curl -X POST "https://app.spiritflow.team/api/v1/projects" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Online-Shop Rollout Baeckerei Schneider",
    "numberPrefix": "BSNDR",
    "color": "#FF9800",
    "startDate": "2025-04-01",
    "endDate": "2025-08-31"
  }'

Projekt aktualisieren

PUT /api/v1/projects/{id}

Scope: projects:write

Pfad-Parameter:

ParameterTypBeschreibung
idLongID des Projekts

Request-Body (alle Felder optional):

FeldTypBeschreibung
titleStringNeuer Titel (max. 255 Zeichen)
descriptionStringNeue Beschreibung
colorStringNeue Farbe (#RRGGBB)
statusStringNeuer Status (siehe Referenzwerte)
priorityStringNeue Priorität (siehe Referenzwerte)
startDateStringNeues Startdatum (YYYY-MM-DD)
endDateStringNeues Enddatum (YYYY-MM-DD)
assigneeIdLongNeuer Projektleiter (User-ID)
teamMemberIdsLong[]Neue Teammitglieder — ersetzt alle bisherigen Mitglieder vollständig
customerIdLongNeuer zugeordneter Kunde

Hinweis zu teamMemberIds: Das Feld ersetzt bei jeder Übertragung die gesamte Mitgliederliste. Um ein Mitglied hinzuzufuegen, müssen alle bisherigen IDs zusammen mit der neuen ID übergeben werden.

Beispiel-Request:

{
  "status": "ACTIVE",
  "endDate": "2025-09-30",
  "teamMemberIds": [7, 8, 10, 11]
}

Antwort (200 OK): Aktualisiertes PublicProjectDto-Objekt.

Fehler-Codes:

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

cURL-Beispiel:

curl -X PUT "https://app.spiritflow.team/api/v1/projects/13" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "ACTIVE",
    "endDate": "2025-09-30"
  }'

Projekt löschen (archivieren)

DELETE /api/v1/projects/{id}

Scope: projects:write

Pfad-Parameter:

ParameterTypBeschreibung
idLongID des Projekts

Antwort: 204 No Content

Fehler-Codes:

HTTP-StatusCodeBeschreibung
404NOT_FOUNDProjekt nicht gefunden

cURL-Beispiel:

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

Aufgaben eines Projekts auflisten

GET /api/v1/projects/{id}/tasks

Scope: projects:read und tasks:read (beide Scopes sind erforderlich)

Pfad-Parameter:

ParameterTypBeschreibung
idLongID des Projekts

Query-Parameter:

ParameterTypPflichtBeschreibung
pageIntegerNeinSeite (Standard: 0)
sizeIntegerNeinEinträge pro Seite, max. 100 (Standard: 20)
sortStringNeinSortierung (Standard: createdAt,desc)

Antwort (200 OK): Paginierte Liste von PublicTaskDto-Objekten. Die Struktur der einzelnen Aufgaben-Objekte entspricht der Antwort von GET /api/v1/tasks.

Fehler-Codes:

HTTP-StatusCodeBeschreibung
403ACCESS_DENIEDDer Scope tasks:read fehlt im API-Key
404NOT_FOUNDProjekt nicht gefunden

cURL-Beispiel:

curl -X GET "https://app.spiritflow.team/api/v1/projects/5/tasks?page=0&size=50" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Logo hochladen

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

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

Scope: projects:write

Pfad-Parameter:

ParameterTypBeschreibung
idLongID des Projekts

Request: Multipart Form-Data mit dem Feld file.

Antwort (200 OK):

{
  "data": {
    "logoUrl": "/api/attachments/project-logos/13_1234567890.png"
  }
}

Die Logo-URL ist öffentlich ohne Authentifizierung abrufbar.

Fehler-Codes:

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

cURL-Beispiel:

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

Logo entfernen

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

Entfernt das Logo eines Projekts.

Scope: projects:write

Pfad-Parameter:

ParameterTypBeschreibung
idLongID des Projekts

Antwort: 204 No Content

Fehler-Codes:

HTTP-StatusCodeBeschreibung
404NOT_FOUNDProjekt nicht gefunden

cURL-Beispiel:

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