SpedySpedy Docs

Tickets

Tickets erstellen, aktualisieren, zuweisen und überführen -- die zentralen Arbeitsobjekte in Spedy.

Tickets sind die grundlegenden Arbeitsobjekte in Spedy. Jede Aufgabe, jeder Bug, jede Feature-Anfrage oder jedes Arbeitspaket lebt als Ticket auf einem Board. Tickets unterstützen Status, Prioritäten, Zuweisungen, Labels, Fälligkeitsdaten, Zeitschätzungen und mehr.

Tickets auflisten

GET /api/v1/boards/{boardId}/tickets

Gibt eine paginierte Liste der Tickets auf dem Board zurück.

Query-Parameter

ParameterTypPflichtBeschreibung
pagenumberNeinSeitennummer (Standard: 1)
limitnumberNeinEinträge pro Seite (Standard: 20, max: 100)
statusIdstringNeinNach Status-ID filtern
assigneeIdstringNeinNach Verantwortlichem filtern
customerIdstringNeinNach Kunden-ID filtern
needsReassignmentbooleanNeinTickets filtern, die neu zugewiesen werden müssen
typeIdstringNeinNach Tickettyp-ID filtern (kommagetrennt für mehrere)
labelIdstringNeinNach Label-ID filtern (kommagetrennt für mehrere)
searchstringNeinSuche in Titel und Beschreibung
includePlanningbooleanNeinTickets in PLANNING-Status einschließen (Standard: false)
includeArchivedbooleanNeinArchivierte/erledigte Tickets einschließen
overduebooleanNeinNur überfällige Tickets
noDueDatebooleanNeinNur Tickets ohne Fälligkeitsdatum
dueBeforestringNeinTickets fällig bis zu diesem Datum (ISO 8601)
dueAfterstringNeinTickets fällig ab diesem Datum (ISO 8601)
impactLevelstringNeinNach Auswirkungsstufe filtern (kommagetrennt)
externalReferencestringNeinNach externer Referenz filtern (Teilübereinstimmung)

Beispiel-Response

{
  "data": [
    {
      "id": "tkt_abc123",
      "displayId": "WEB-42",
      "title": "Login-Seite Styling fixen",
      "status": {
        "id": "sts_def456",
        "name": "In Bearbeitung",
        "category": "ACTIVE"
      },
      "priority": "high",
      "assignee": {
        "id": "usr_abc123",
        "name": "Alex Smith"
      },
      "type": {
        "id": "typ_abc123",
        "name": "Bug"
      },
      "labels": [],
      "dueDate": "2025-04-01T00:00:00Z",
      "createdAt": "2025-03-15T10:00:00Z"
    }
  ],
  "total": 42,
  "page": 1,
  "pageSize": 20,
  "totalPages": 3
}

Ticket erstellen

POST /api/v1/boards/{boardId}/tickets

Request Body

FeldTypPflichtBeschreibung
titlestringJaTicket-Titel (max. 200 Zeichen)
descriptionstringNeinDetaillierte Beschreibung (max. 50.000 Zeichen)
statusIdstringNeinInitialer Status-ID (Standard: Backlog)
assigneeIdstringNeinVerantwortlicher Nutzer-ID
customerIdstringNeinKunden-ID
prioritystringNeinlow, medium, high oder critical
typeIdstringNeinTickettyp-ID
labelIdsstring[]NeinLabel-IDs zum Anhängen
dueDatestringNeinFälligkeitsdatum (ISO 8601)
startDatestringNeinGeplantes Startdatum (ISO 8601)
estimatedHoursnumberNeinGeschätzte Stunden (min. 0,1)
storyPointsnumberNeinStory Points
externalReferencestringNeinExterne Referenz-ID (max. 200 Zeichen)
impactLevelstringNeinlow, medium, high oder critical

Beispiel-Request

{
  "title": "Login-Seite Styling fixen",
  "description": "Der Login-Button ist auf mobilen Geräten falsch ausgerichtet.",
  "priority": "high",
  "typeId": "typ_bug123",
  "assigneeId": "usr_abc123",
  "labelIds": ["lbl_frontend"],
  "dueDate": "2025-04-01T00:00:00Z"
}

Ticket abrufen

GET /api/v1/boards/{boardId}/tickets/{ticketId}

Gibt vollständige Ticket-Details einschließlich Beschreibung, Kommentaranzahl, Anhanganzahl und verknüpfter Daten zurück.

Ticket aktualisieren

PATCH /api/v1/boards/{boardId}/tickets/{ticketId}

Alle Felder sind optional. Sende nur die Felder, die du ändern möchtest. Setze ein Feld auf null, um es zu leeren.

Request Body

FeldTypPflichtBeschreibung
titlestringNeinTicket-Titel
descriptionstringNeinDetaillierte Beschreibung
assigneeIdstring | nullNeinVerantwortlicher (null zum Entfernen)
customerIdstring | nullNeinKunde (null zum Entfernen)
prioritystring | nullNeinlow, medium, high, critical (null zum Entfernen)
typeIdstringNeinTickettyp-ID
statusIdstringNeinStatus-ID
statusChangeReasonstringNeinGrund für Statusänderung (für Explainable-Status-Logging, max. 500 Zeichen)
isArchivedbooleanNeinArchivierungsstatus (true zum Archivieren, false zum Wiederherstellen)
labelIdsstring[]NeinLabel-IDs (ersetzt bestehende Labels)
dueDatestring | nullNeinFälligkeitsdatum (null zum Entfernen)
startDatestring | nullNeinStartdatum (null zum Entfernen)
estimatedHoursnumber | nullNeinGeschätzte Stunden (null zum Entfernen)
timeSpentnumber | nullNeinAufgewendete Zeit in Stunden (null zum Entfernen)
storyPointsnumber | nullNeinStory Points (null zum Entfernen)
externalReferencestring | nullNeinExterne Referenz (null zum Entfernen)
impactLevelstring | nullNeinlow, medium, high, critical (null zum Entfernen)
milestoneIdstring | nullNeinMeilenstein-ID (null zum Entfernen)
resolutionstring | nullNeinLösungsbeschreibung
resolutionTypestring | nullNeinfixed, wont_fix, duplicate, cannot_reproduce oder by_design

Ticket löschen

DELETE /api/v1/boards/{boardId}/tickets/{ticketId}

Führt ein Soft-Delete des Tickets durch (markiert als gelöscht, Daten bleiben erhalten). Gibt 204 No Content zurück.

Ticket-Status aktualisieren

PATCH /api/v1/boards/{boardId}/tickets/{ticketId}/status

Ändert den Workflow-Status des Tickets.

Request Body

FeldTypPflichtBeschreibung
statusIdstringJaZiel-Status-ID
reasonstringNeinGrund für Statusänderung (für Explainable-Status-Logging, max. 500 Zeichen)

Ticket zuweisen

PATCH /api/v1/boards/{boardId}/tickets/{ticketId}/assign

Einen Nutzer dem Ticket zuweisen oder die Zuweisung entfernen.

Request Body

FeldTypPflichtBeschreibung
assigneeIdstring | nullJaNutzer-ID zur Zuweisung, oder null zum Entfernen

Ticket verschieben

POST /api/v1/boards/{boardId}/tickets/{ticketId}/move

Verschiebt ein Ticket auf ein anderes Board. Untertickets und Tickets mit Untertickets können nicht verschoben werden.

Request Body

FeldTypPflichtBeschreibung
targetBoardIdstringJaZiel-Board-ID

Beispiel-Response

{
  "data": {
    "id": "tkt_abc123",
    "displayId": "NEW-1",
    "title": "Login-Seite Styling fixen",
    "boardId": "brd_newboard"
  }
}

Ticket überführen

POST /api/v1/boards/{boardId}/tickets/{ticketId}/transition

Überführt ein Ticket in einen neuen Status mit Validierung der Übergangsregeln.

Request Body

FeldTypPflichtBeschreibung
toStatusIdstringJaZiel-Status-ID
reasonstringNeinGrund für den Übergang (erforderlich wenn Explainable-Status-Feature aktiviert ist)
blockerInfoobjectNeinBlocker-Informationen (erforderlich beim Übergang zu BLOCKED-Status)
blockerInfo.reasonstringJa*Grund für die Blockierung (*erforderlich innerhalb von blockerInfo)
blockerInfo.blockedBystringNeinNutzer-ID, die das Ticket blockiert hat

Beispiel-Request

{
  "toStatusId": "sts_blocked123",
  "reason": "Warte auf Design-Freigabe",
  "blockerInfo": {
    "reason": "Design-Team muss Mockups überprüfen",
    "blockedBy": "usr_designer456"
  }
}

Ticket genehmigen

POST /api/v1/boards/{boardId}/tickets/{ticketId}/approve

Genehmigt ein Ticket im Planungs-/Backlog-Status und verschiebt es in den aktiven Workflow.

Tickets mit Neuzuweisungsbedarf

GET /api/v1/boards/{boardId}/tickets/needing-reassignment

Gibt Tickets zurück, die als neuzuweisungsbedürftig markiert wurden (z.B. nach Entfernung eines Teammitglieds vom Board).

Ticket neu ordnen

PATCH /api/v1/boards/{boardId}/tickets/reorder

Ordnet ein Ticket innerhalb einer oder über Spalten (Status) auf einem Board neu.

Request Body

FeldTypPflichtBeschreibung
ticketIdstringJaTicket-ID zum Neuordnen
positionnumberJaNeue Position (Fließkommazahl)
statusIdstringNeinOptionale neue Status-ID (für spaltenübergreifendes Ziehen)

Inline-Ticket-Aktualisierung

PATCH /api/v1/boards/{boardId}/tickets/{ticketId}/inline

Aktualisiert mehrere Ticket-Felder gleichzeitig mit optimistischer Sperrung zur Konflikterkennung.

Request Body

FeldTypPflichtBeschreibung
titlestringNeinTicket-Titel (max. 200 Zeichen)
descriptionstringNeinTicket-Beschreibung
statusIdstringNeinStatus-ID
assigneeIdstring | nullNeinVerantwortlicher Nutzer-ID (null zum Entfernen)
dueDatestring | nullNeinFälligkeitsdatum (null zum Entfernen)
expectedUpdatedAtstringNeinErwarteter updatedAt-Zeitstempel zur Konflikterkennung

Benutzerdefinierte Feldwerte setzen

PUT /api/v1/boards/{boardId}/tickets/{ticketId}/custom-fields

Berechtigung erforderlich: custom-fields:manage

Setzt benutzerdefinierte Feldwerte für ein Ticket.

Request Body

FeldTypPflichtBeschreibung
valuesarrayJaArray von benutzerdefinierten Feldwert-Objekten
values[].customFieldIdstringJaBenutzerdefinierte Feld-ID
values[].valuestring | nullNeinZu setzender Wert (null zum Leeren)

Beispiel-Request

{
  "values": [
    { "customFieldId": "cf_abc123", "value": "Enterprise" },
    { "customFieldId": "cf_def456", "value": null }
  ]
}

Abschluss-Prüfung

GET /api/v1/boards/{boardId}/tickets/{ticketId}/completion-check

Prüft, ob ein Ticket bereit für den Abschluss ist. Gibt Blocker, Anforderungen und Unterticket-Status zurück.

Beispiel-Response

{
  "data": {
    "canComplete": false,
    "hasOpenSubtickets": true,
    "openSubtickets": [
      { "id": "tkt_sub1", "title": "Design-Review", "displayId": "WEB-43" }
    ],
    "aggregation": {
      "total": 3,
      "completed": 1,
      "summary": "in_progress"
    },
    "blockers": [],
    "requirements": {
      "hasDescription": true,
      "hasAssignee": true,
      "hasCustomer": false,
      "hasNoActiveSubtickets": false
    }
  }
}

Blocker-Info

GET /api/v1/boards/{boardId}/tickets/{ticketId}/blocker

Gibt Informationen darüber zurück, was dieses Ticket blockiert.

Beispiel-Response

{
  "data": {
    "isBlocked": true,
    "reason": "Warte auf API-Änderungen",
    "reasonText": "Warte auf API-Änderungen",
    "blockingTickets": [
      {
        "id": "tkt_other123",
        "ticketNumber": "API-15",
        "title": "Auth-Modul refactoren",
        "status": { "id": "sts_1", "name": "In Bearbeitung", "color": "#3B82F6" },
        "createdAt": "2025-03-01T10:00:00Z"
      }
    ],
    "blockerCount": 1
  }
}

Pull Requests

GET /api/v1/boards/{boardId}/tickets/{ticketId}/pull-requests

Gibt Pull Requests zurück, die über Branch-Name oder PR-Titel mit einem Ticket verknüpft sind.

Beispiel-Response

{
  "data": [
    {
      "id": "pr_abc123",
      "prNumber": 42,
      "title": "Login-Styling fixen",
      "url": "https://github.com/org/repo/pull/42",
      "branchName": "fix/WEB-42-login-styling",
      "state": "open",
      "authorName": "alex",
      "provider": "github",
      "repoFullName": "org/repo",
      "createdAt": "2025-03-20T10:00:00Z",
      "updatedAt": "2025-03-20T14:00:00Z"
    }
  ]
}