API - Aufgaben Admin

📕 Für Administratoren und Entwickler

Über die Public API können Aufgaben programmatisch abgerufen, erstellt, aktualisiert und archiviert werden. Alle Endpunkte befinden sich unter dem Basis-Pfad /api/v1/tasks.

Für alle Anfragen wird ein gültiger API-Key als Header benötigt:

X-API-Key: sf_live_xxxxxxxx...

Status-Werte

StatusBedeutung
BACKLOGBacklog (kein Bearbeiter erforderlich)
DRAFTEntwurf (kein Bearbeiter erforderlich)
PLANNEDGeplant
IN_PROGRESSIn Bearbeitung
READY_FOR_REVIEWBereit zur Pruefung (erfordert einen Pruefer/Reviewer)
IN_REVIEWIn Pruefung
COMPLETEDAbgeschlossen
BLOCKEDBlockiert
REJECTEDAbgelehnt
ON_HOLDPausiert

Hinweis: Alle Status ausser BACKLOG und DRAFT erfordern einen zugewiesenen Benutzer (assigneeId). Wird eine Aufgabe ohne Bearbeiter auf einen dieser Status gesetzt, gibt die API einen 400 VALIDATION_ERROR zurück.


Prioritäts-Werte

PrioritätBedeutung
LOWNiedrig
MEDIUMMittel
HIGHHoch
CRITICALKritisch

Aufgaben auflisten

GET /api/v1/tasks

Erforderlicher Scope: tasks:read

Query-Parameter

ParameterTypPflichtBeschreibung
statusStringNeinFiltern nach Status (z.B. IN_PROGRESS)
priorityStringNeinFiltern nach Priorität (z.B. HIGH)
assigneeIdLongNeinFiltern nach zugewiesenem Benutzer (ID)
projectIdLongNeinFiltern nach Projekt (ID)
archivedBooleanNeinArchivierte Aufgaben einschließen (Standard: false)
searchStringNeinVolltextsuche in Titel und Beschreibung (Gross-/Kleinschreibung egal)
searchNotesBooleanNeinWenn true, wird die Suche auf Kommentare/Notizen erweitert (Standard: false)
createdAfterInstantNeinNur Aufgaben, die nach diesem Zeitpunkt erstellt wurden (ISO 8601, UTC)
createdBeforeInstantNeinNur Aufgaben, die vor diesem Zeitpunkt erstellt wurden (ISO 8601, UTC)
updatedAfterInstantNeinNur Aufgaben, die nach diesem Zeitpunkt aktualisiert wurden (ISO 8601, UTC)
updatedBeforeInstantNeinNur Aufgaben, die vor diesem Zeitpunkt aktualisiert wurden (ISO 8601, UTC)
dueDateAfterInstantNeinNur Aufgaben mit Fälligkeitsdatum nach diesem Zeitpunkt (ISO 8601, UTC)
dueDateBeforeInstantNeinNur Aufgaben mit Fälligkeitsdatum vor diesem Zeitpunkt (ISO 8601, UTC)
plannedStartAfterInstantNeinNur Aufgaben mit geplantem Start nach diesem Zeitpunkt (ISO 8601, UTC)
plannedStartBeforeInstantNeinNur Aufgaben mit geplantem Start vor diesem Zeitpunkt (ISO 8601, UTC)
pageIntegerNeinSeitennummer, nullbasiert (Standard: 0)
sizeIntegerNeinEinträge pro Seite, max. 100 (Standard: 20)
sortStringNeinSortierung (Standard: createdAt,desc)

Antwort (200 OK)

{
  "data": [
    {
      "id": 42,
      "ticketNumber": "PROJ-0042",
      "title": "Webseite für ACME GmbH erstellen",
      "description": "Komplette Neuentwicklung der Unternehmenswebseite.",
      "status": "IN_PROGRESS",
      "priority": "HIGH",
      "progress": 45,
      "assigneeId": 7,
      "reviewerId": 3,
      "ownerId": 2,
      "projectId": 5,
      "projectName": "Website-Relaunch ACME",
      "dueDate": "2025-04-30T22:00:00Z",
      "plannedStartDate": "2025-03-01T00:00:00Z",
      "completedAt": null,
      "timeBudgetMinutes": 4800,
      "timeSpentMinutes": 1320,
      "archived": false,
      "tags": [
        { "id": 1, "name": "Frontend", "color": "#3F51B5" },
        { "id": 2, "name": "Prio", "color": "#F44336" }
      ],
      "createdAt": "2025-01-15T08:30:00Z",
      "updatedAt": "2025-02-28T14:15:00Z"
    }
  ],
  "pagination": {
    "page": 0,
    "size": 20,
    "totalElements": 57,
    "totalPages": 3
  },
  "meta": {
    "requestId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "timestamp": "2025-03-01T10:30:00Z"
  }
}

cURL-Beispiel

curl -X GET "https://app.spiritflow.team/api/v1/tasks?status=IN_PROGRESS&priority=HIGH&page=0&size=20" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

# Mit Datumsfiltern und Suchbegriff (inkl. Kommentare)
curl -X GET "https://app.spiritflow.team/api/v1/tasks?search=Webseite&searchNotes=true&createdAfter=2025-01-01T00:00:00Z&dueDateBefore=2025-06-30T23:59:59Z" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Einzelne Aufgabe abrufen

GET /api/v1/tasks/{id}

Erforderlicher Scope: tasks:read

Pfad-Parameter

ParameterTypBeschreibung
idLongID der Aufgabe

Antwort (200 OK)

{
  "data": {
    "id": 42,
    "ticketNumber": "PROJ-0042",
    "title": "Webseite für ACME GmbH erstellen",
    "description": "Komplette Neuentwicklung der Unternehmenswebseite mit CMS-Anbindung.",
    "status": "IN_PROGRESS",
    "priority": "HIGH",
    "progress": 45,
    "assigneeId": 7,
    "reviewerId": 3,
    "ownerId": 2,
    "projectId": 5,
    "projectName": "Website-Relaunch ACME",
    "dueDate": "2025-04-30T22:00:00Z",
    "plannedStartDate": "2025-03-01T00:00:00Z",
    "completedAt": null,
    "timeBudgetMinutes": 4800,
    "timeSpentMinutes": 1320,
    "archived": false,
    "tags": [
      { "id": 1, "name": "Frontend", "color": "#3F51B5" }
    ],
    "createdAt": "2025-01-15T08:30:00Z",
    "updatedAt": "2025-02-28T14:15:00Z"
  },
  "meta": {
    "requestId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "timestamp": "2025-03-01T10:30:00Z"
  }
}

Fehler-Codes

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

cURL-Beispiel

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

Aufgabe nach Ticketnummer abrufen

GET /api/v1/tasks/by-ticket-number/{ticketNumber}

Erforderlicher Scope: tasks:read

Ticketnummern haben je nach Projekt ein eigenes Praefix, z.B. PROJ-0042 oder SPIR-0276. Die Antwort-Struktur ist identisch mit GET /api/v1/tasks/{id}.

Pfad-Parameter

ParameterTypBeschreibung
ticketNumberStringTicketnummer im Format PRAEFIX-NUMMER, z.B. PROJ-0042

Fehler-Codes

HTTP-StatusCodeBeschreibung
404NOT_FOUNDAufgabe mit dieser Ticketnummer nicht gefunden

cURL-Beispiel

curl -X GET "https://app.spiritflow.team/api/v1/tasks/by-ticket-number/PROJ-0042" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Aufgabe erstellen

POST /api/v1/tasks

Erforderlicher Scope: tasks:write

Request-Body

FeldTypPflichtStandardBeschreibung
titleStringJa-Titel der Aufgabe (max. 500 Zeichen)
descriptionStringNeinnullBeschreibung
statusStringNeinBACKLOGStatus (siehe Status-Werte oben). Alle Status ausser BACKLOG und DRAFT erfordern eine assigneeId.
priorityStringNeinMEDIUMPriorität (siehe Prioritäts-Werte oben)
assigneeIdLongNeinnullID des zugewiesenen Benutzers
reviewerIdLongNeinnullID des Pruefers
projectIdLongNeinnullID des zugehoerigen Projekts
dueDateInstantNeinnullFälligkeitsdatum (ISO 8601, UTC)
plannedStartDateInstantNeinnullGeplantes Startdatum (ISO 8601, UTC)
timeBudgetMinutesIntegerNeinnullZeitbudget in Minuten
tagIdsLong[]Nein[]Liste der Tag-IDs

Beispiel-Request

{
  "title": "Angebot für Mustermann GmbH erstellen",
  "description": "Detailliertes Angebot für die Neugestaltung der Firmenwebseite inkl. CMS.",
  "status": "PLANNED",
  "priority": "HIGH",
  "assigneeId": 7,
  "reviewerId": 3,
  "projectId": 5,
  "dueDate": "2025-04-15T22:00:00Z",
  "plannedStartDate": "2025-03-10T00:00:00Z",
  "timeBudgetMinutes": 480,
  "tagIds": [1, 4]
}

Antwort (201 Created)

{
  "data": {
    "id": 58,
    "ticketNumber": "PROJ-0058",
    "title": "Angebot für Mustermann GmbH erstellen",
    "description": "Detailliertes Angebot für die Neugestaltung der Firmenwebseite inkl. CMS.",
    "status": "PLANNED",
    "priority": "HIGH",
    "progress": null,
    "assigneeId": 7,
    "reviewerId": 3,
    "ownerId": 2,
    "projectId": 5,
    "projectName": "Website-Relaunch ACME",
    "dueDate": "2025-04-15T22:00:00Z",
    "plannedStartDate": "2025-03-10T00:00:00Z",
    "completedAt": null,
    "timeBudgetMinutes": 480,
    "timeSpentMinutes": null,
    "archived": false,
    "tags": [
      { "id": 1, "name": "Frontend", "color": "#3F51B5" },
      { "id": 4, "name": "Angebot", "color": "#4CAF50" }
    ],
    "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 oder ungültig
404NOT_FOUNDReferenziertes Projekt, Benutzer oder Tag nicht gefunden

cURL-Beispiel

curl -X POST "https://app.spiritflow.team/api/v1/tasks" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Angebot für Mustermann GmbH erstellen",
    "priority": "HIGH",
    "assigneeId": 7,
    "dueDate": "2025-04-15T22:00:00Z"
  }'

Aufgabe aktualisieren

PUT /api/v1/tasks/{id}

Erforderlicher Scope: tasks:write

Alle Felder im Request-Body sind optional. Nur übermittelte Felder werden aktualisiert. Ein Feld auf null zu setzen entfernt den Wert (sofern das Feld nullable ist).

Pfad-Parameter

ParameterTypBeschreibung
idLongID der Aufgabe

Request-Body (alle Felder optional)

FeldTypBeschreibung
titleStringNeuer Titel (max. 500 Zeichen)
descriptionStringNeue Beschreibung (null = löschen)
statusStringNeuer Status
priorityStringNeue Priorität
assigneeIdLongNeue Zuweisung (null = entfernen)
reviewerIdLongNeuer Pruefer (null = entfernen)
projectIdLongNeues Projekt (null = aus Projekt entfernen)
dueDateInstantNeues Fälligkeitsdatum (null = entfernen)
plannedStartDateInstantNeues geplantes Startdatum (null = entfernen)
timeBudgetMinutesIntegerNeues Zeitbudget in Minuten
progressIntegerFortschritt in Prozent (0-100)
tagIdsLong[]Tag-IDs (ersetzt alle bisherigen Tags vollständig)

Beispiel-Request

{
  "status": "IN_PROGRESS",
  "progress": 25,
  "assigneeId": 8
}

Antwort (200 OK)

Aktualisiertes Aufgaben-Objekt (gleiche Struktur wie beim Abrufen einer einzelnen Aufgabe).

Fehler-Codes

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

cURL-Beispiel

curl -X PUT "https://app.spiritflow.team/api/v1/tasks/42" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "IN_PROGRESS",
    "progress": 25
  }'

Aufgabe löschen (archivieren)

DELETE /api/v1/tasks/{id}

Erforderlicher Scope: tasks:write

Aufgaben werden nicht endgültig gelöscht, sondern archiviert. Archivierte Aufgaben können weiterhin mit dem Query-Parameter archived=true abgerufen werden.

Pfad-Parameter

ParameterTypBeschreibung
idLongID der Aufgabe

Antwort

204 No Content

Fehler-Codes

HTTP-StatusCodeBeschreibung
404NOT_FOUNDAufgabe nicht gefunden

cURL-Beispiel

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

Aufgaben-Status aktualisieren

PATCH /api/v1/tasks/{id}/status
PUT   /api/v1/tasks/{id}/status

Erforderlicher Scope: tasks:write

Dedizierter Endpunkt für reine Status-Aenderungen. Wenn der Status auf READY_FOR_REVIEW gesetzt wird und noch kein Pruefer zugewiesen ist, muss reviewerId mitgeliefert werden.

Pfad-Parameter

ParameterTypBeschreibung
idLongID der Aufgabe

Request-Body

FeldTypPflichtBeschreibung
statusStringJaNeuer Status (darf nicht leer sein)
reviewerIdLongNeinID des Pruefers. Erforderlich wenn Status auf READY_FOR_REVIEW gesetzt wird und noch kein Pruefer zugewiesen ist.

Beispiel-Request (einfacher Status-Wechsel)

{
  "status": "COMPLETED"
}

Beispiel-Request (mit Pruefer-Zuweisung)

{
  "status": "READY_FOR_REVIEW",
  "reviewerId": 3
}

Antwort (200 OK)

Aktualisiertes Aufgaben-Objekt (gleiche Struktur wie beim Abrufen einer einzelnen Aufgabe).

cURL-Beispiel

curl -X PATCH "https://app.spiritflow.team/api/v1/tasks/42/status" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"status": "COMPLETED"}'

Bearbeiter aktualisieren

PATCH /api/v1/tasks/{id}/assignee
PUT   /api/v1/tasks/{id}/assignee

Erforderlicher Scope: tasks:write

Dedizierter Endpunkt für die Zuweisung oder Aufhebung eines Bearbeiters. Um die Zuweisung zu entfernen, wird assigneeId auf null gesetzt.

Pfad-Parameter

ParameterTypBeschreibung
idLongID der Aufgabe

Request-Body

FeldTypPflichtBeschreibung
assigneeIdLongNeinID des neuen Bearbeiters. null hebt die Zuweisung auf.

Beispiel-Request (Bearbeiter setzen)

{
  "assigneeId": 9
}

Beispiel-Request (Zuweisung aufheben)

{
  "assigneeId": null
}

Antwort (200 OK)

Aktualisiertes Aufgaben-Objekt (gleiche Struktur wie beim Abrufen einer einzelnen Aufgabe).

cURL-Beispiel

# Bearbeiter setzen
curl -X PATCH "https://app.spiritflow.team/api/v1/tasks/42/assignee" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"assigneeId": 9}'

# Zuweisung aufheben
curl -X PATCH "https://app.spiritflow.team/api/v1/tasks/42/assignee" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"assigneeId": null}'

Kommentare (Notes)

Aufgaben können Kommentare haben. Es gibt drei Typen: normale Kommentare (COMMENT), Feldbericht-Einträge (FIELD_REPORT) und System-Einträge (SYSTEM). Über die API können COMMENT und FIELD_REPORT erstellt werden.

Kommentare abrufen

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

Erforderlicher Scope: tasks:read

Gibt alle Kommentare einer Aufgabe zurück, sortiert nach Erstellungsdatum (neueste zuerst).

Antwort-Felder

FeldTypBeschreibung
idnumberEindeutige ID des Kommentars
contentstringInhalt des Kommentars
noteTypestringTyp: COMMENT, FIELD_REPORT oder SYSTEM
authorIdnumberID des Autors
authorNamestringAnzeigename des Autors
createdAtstringErstellungszeitpunkt (ISO 8601, UTC)
updatedAtstringLetzte Aktualisierung (ISO 8601, UTC)

cURL-Beispiel

curl "https://app.spiritflow.team/api/v1/tasks/42/notes" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Kommentar erstellen

POST /api/v1/tasks/{id}/notes

Erforderlicher Scope: tasks:write

Erstellt einen neuen Kommentar zu einer Aufgabe. Als Autor wird der Inhaber des API-Keys eingetragen.

Request-Body

FeldTypPflichtBeschreibung
contentstringJaInhalt des Kommentars
noteTypestringNeinTyp des Kommentars (Standard: COMMENT). Erlaubt: COMMENT, FIELD_REPORT

cURL-Beispiel

curl -X POST "https://app.spiritflow.team/api/v1/tasks/42/notes" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"content": "Review abgeschlossen, sieht gut aus!"}'

Anhänge (Attachments)

Dateien können über die API an Aufgaben angehaengt, aufgelistet und heruntergeladen werden. Alle Endpunkte verwenden den Basis-Pfad /api/v1/tasks/{taskId}/attachments.

Anhänge auflisten

GET /api/v1/tasks/{taskId}/attachments

Erforderlicher Scope: tasks:read

Pfad-Parameter

ParameterTypBeschreibung
taskIdLongID der Aufgabe

Antwort-Felder

FeldTypBeschreibung
idnumberEindeutige ID des Anhangs
fileNamestringAngezeigter Dateiname
fileSizenumberDateigröße in Bytes
contentTypestringMIME-Typ der Datei
attachedBystringAnzeigename des Uploaders (kann null sein)
createdAtstringZeitpunkt des Hochladens (ISO 8601, UTC)

cURL-Beispiel

curl "https://app.spiritflow.team/api/v1/tasks/42/attachments" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Anhang herunterladen

GET /api/v1/tasks/{taskId}/attachments/{attachmentId}/download

Erforderlicher Scope: tasks:read

Pfad-Parameter

ParameterTypBeschreibung
taskIdLongID der Aufgabe
attachmentIdLongID des Anhangs

Antwort (200 OK)

Die Datei als Binaerdaten. Die Antwort enthält folgende Header:

HeaderBeispielwert
Content-Typeapplication/pdf (abhaengig vom Dateityp)
Content-Dispositionattachment; filename="rechnung.pdf"

Fehler-Codes

HTTP-StatusCodeBeschreibung
404NOT_FOUNDAufgabe oder Anhang nicht gefunden

cURL-Beispiel

curl "https://app.spiritflow.team/api/v1/tasks/42/attachments/7/download" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -o "heruntergeladene-datei.pdf"

Anhang hochladen

POST /api/v1/tasks/{taskId}/attachments

Erforderlicher Scope: tasks:write

Content-Type: multipart/form-data

Dateien werden vor dem Speichern automatisch auf Viren geprüft (ClamAV). Bei Duplikaten wird der vorhandene Speicher wiederverwendet (Hash-basierte Deduplizierung). Die maximale Dateigröße und das Speicherkontingent richten sich nach dem Lizenzplan des Mandanten.

Pfad-Parameter

ParameterTypBeschreibung
taskIdLongID der Aufgabe

Formular-Felder

FeldTypPflichtBeschreibung
fileFileJaDie hochzuladende Datei
descriptionStringNeinOptionale Beschreibung der Datei

Antwort (201 Created)

{
  "data": {
    "id": 7,
    "fileName": "angebot.pdf",
    "fileSize": 204800,
    "contentType": "application/pdf",
    "attachedBy": "Max Mustermann",
    "createdAt": "2025-03-01T10:30:00Z"
  },
  "meta": {
    "requestId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "timestamp": "2025-03-01T10:30:00Z"
  }
}

Fehler-Codes

HTTP-StatusCodeBeschreibung
400BAD_REQUESTDatei zu gross oder Speicherkontingent erschoepft
404NOT_FOUNDAufgabe nicht gefunden
422VIRUS_DETECTEDDatei wurde als infiziert erkannt und abgelehnt
503VIRUS_SCAN_FAILEDVirenscanner ist nicht verfügbar
503VIRUS_SCAN_TIMEOUTVirenscanner hat nicht rechtzeitig geantwortet

cURL-Beispiel

curl -X POST "https://app.spiritflow.team/api/v1/tasks/42/attachments" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -F "file=@/pfad/zur/datei.pdf" \
  -F "description=Angebot für Kunde"