Public API - Belege Admin

📕 Für Administratoren und Entwickler

Über die spiritflow Public API können Belege (eingehende Rechnungen, Kassenbelege, Reisekostenabrechnungen) programmatisch verwaltet und durch den Genehmigungs-Workflow gesteuert werden. Alle Endpunkte sind unter dem Basis-Pfad /api/v1/receipts erreichbar und erfordern einen gültigen API-Key mit dem entsprechenden Scope.


Referenzwerte

Beleg-Status-Werte

StatusBedeutung
UPLOADEDHochgeladen (noch nicht eingereicht)
SUBMITTEDEingereicht
IN_REVIEWIn Prüfung
APPROVEDGenehmigt
REJECTEDAbgelehnt
SETTLEDAbgerechnet
WITHDRAWNZurückgezogen
VOIDEDEntwertet

Zahlungsstatus-Werte

StatusBedeutung
OPENOffen
PAIDBezahlt
OVERDUEÜberfällig

Beleg-Typen

TypBedeutung
INVOICEEingangsrechnung
RECEIPTKassenbeleg
CREDIT_NOTEGutschrift
TRAVEL_EXPENSEReisekostenabrechnung
OTHERSonstiger Beleg

Belege auflisten

GET /api/v1/receipts

Erforderlicher Scope: receipts:read

Query-Parameter:

ParameterTypPflichtBeschreibung
statusStringNeinFiltert nach Belegstatus (z.B. APPROVED)
paymentStatusStringNeinFiltert nach Zahlungsstatus (OPEN, PAID, OVERDUE)
categoryIdLongNeinFiltert nach Kategorie-ID
receiptDateAfterStringNeinBelegdatum ab (YYYY-MM-DD)
receiptDateBeforeStringNeinBelegdatum bis (YYYY-MM-DD)
supplierNameStringNeinTextsuche im Lieferantennamen
activeBooleanNeintrue = nur aktive Belege (UPLOADED bis SETTLED), false = nur inaktive (WITHDRAWN/REJECTED/VOIDED), nicht gesetzt = alle
pageIntegerNeinSeitennummer (Standard: 0)
sizeIntegerNeinEinträge pro Seite, max. 100 (Standard: 20)
sortStringNeinSortierung (Standard: createdAt,desc). Erlaubte Felder: createdAt, updatedAt, receiptDate, dueDate, grossAmount, status, receiptNumber, supplierName

Antwort (200 OK):

{
  "data": [
    {
      "id": 42,
      "receiptNumber": "BLG-2025-0001",
      "externalInvoiceNumber": "RE-2025-00123",
      "type": "INVOICE",
      "status": "APPROVED",
      "isActive": true,
      "supplierName": "Bürobedarfs GmbH",
      "receiptDate": "2025-03-01",
      "dueDate": "2025-03-31",
      "netAmount": 84.03,
      "vatRate": 19.00,
      "vatAmount": 15.97,
      "grossAmount": 100.00,
      "currency": "EUR",
      "paymentStatus": "OPEN",
      "paymentMethod": null,
      "paymentDate": null,
      "categoryId": 3,
      "categoryName": "Bürobedarf",
      "projectId": null,
      "projectName": null,
      "submittedById": 5,
      "submittedByName": "Lisa Schmidt",
      "notes": null,
      "attachmentCount": 1,
      "createdAt": "2025-03-01T09:00:00Z",
      "updatedAt": "2025-03-05T14:30:00Z"
    }
  ],
  "pagination": {
    "page": 0,
    "size": 20,
    "totalElements": 1,
    "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/receipts?status=APPROVED&sort=receiptDate,desc" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Einzelnen Beleg abrufen

GET /api/v1/receipts/{id}

Erforderlicher Scope: receipts:read

Pfad-Parameter:

ParameterTypBeschreibung
idLongID des Belegs

Antwort (200 OK): Einzelnes Belegobjekt (gleiche Struktur wie in der Liste)

Fehler-Codes:

HTTP-StatusCodeBeschreibung
404NOT_FOUNDBeleg nicht gefunden

cURL-Beispiel:

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

Beleg erstellen

POST /api/v1/receipts

Erstellt einen neuen Beleg. Neue Belege erhalten automatisch eine Belegnummer und den Status SUBMITTED.

Erforderlicher Scope: receipts:write

Request-Body:

FeldTypPflichtStandardBeschreibung
receiptDateStringJa-Belegdatum (YYYY-MM-DD)
grossAmountnumberJa-Bruttobetrag (>= 0)
externalInvoiceNumberStringNeinnullExterne Rechnungsnummer (max. 255 Zeichen)
typeStringNeinINVOICEBelegtyp (siehe Beleg-Typen oben)
supplierNameStringNeinnullLieferantenname (max. 255 Zeichen)
dueDateStringNeinnullFälligkeitsdatum (YYYY-MM-DD)
netAmountnumberNeinnullNettobetrag
vatRatenumberNeinnullMehrwertsteuersatz in Prozent (z.B. 19.0)
currencyStringNeinEURWährungscode (ISO 4217, z.B. EUR)
categoryIdLongNeinnullID der Belegkategorie
projectIdLongNeinnullID des zugehörigen Projekts
notesStringNeinnullNotizen (max. 500 Zeichen)

Beispiel-Request:

{
  "receiptDate": "2025-03-01",
  "grossAmount": 100.00,
  "supplierName": "Bürobedarfs GmbH",
  "externalInvoiceNumber": "RE-2025-00123",
  "netAmount": 84.03,
  "vatRate": 19.0,
  "type": "INVOICE",
  "categoryId": 3
}

Antwort (201 Created): Erstelltes Belegobjekt

Fehler-Codes:

HTTP-StatusCodeBeschreibung
400VALIDATION_ERRORPflichtfeld fehlt oder Feldwert ungültig

cURL-Beispiel:

curl -X POST "https://app.spiritflow.team/api/v1/receipts" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "receiptDate": "2025-03-01",
    "grossAmount": 100.00,
    "supplierName": "Bürobedarfs GmbH",
    "externalInvoiceNumber": "RE-2025-00123"
  }'

Beleg aktualisieren

PATCH /api/v1/receipts/{id}

Aktualisiert einen vorhandenen Beleg (PATCH-Semantik). Nur angegebene Felder werden geändert.

Erforderlicher Scope: receipts:write

Pfad-Parameter:

ParameterTypBeschreibung
idLongID des Belegs

Request-Body: Gleiche Felder wie beim Erstellen, alle optional.

Antwort (200 OK): Aktualisiertes Belegobjekt

Fehler-Codes:

HTTP-StatusCodeBeschreibung
400VALIDATION_ERRORValidierungsfehler
404NOT_FOUNDBeleg nicht gefunden

cURL-Beispiel:

curl -X PATCH "https://app.spiritflow.team/api/v1/receipts/42" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "supplierName": "Neue Bürobedarfs GmbH",
    "categoryId": 5
  }'

Beleg-Status ändern

PATCH /api/v1/receipts/{id}/status

Ändert den Workflow-Status eines Belegs für reguläre Vorwärts-Übergänge.

Erlaubte Übergänge:

  • UPLOADEDSUBMITTED
  • SUBMITTEDIN_REVIEW
  • IN_REVIEWAPPROVED
  • APPROVEDSETTLED

Für Zurückziehen, Ablehnen und Entwerten stehen dedizierte Endpoints zur Verfügung (über die spiritflow-Anwendung).

Erforderlicher Scope: receipts:write

Pfad-Parameter:

ParameterTypBeschreibung
idLongID des Belegs

Request-Body:

FeldTypPflichtBeschreibung
statusStringJaZielstatus

Antwort (200 OK): Aktualisiertes Belegobjekt

Fehler-Codes:

HTTP-StatusCodeBeschreibung
400VALIDATION_ERRORUngültiger oder nicht erlaubter Statusübergang
404NOT_FOUNDBeleg nicht gefunden

cURL-Beispiel:

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

Anhänge eines Belegs

Anhänge auflisten

GET /api/v1/receipts/{id}/attachments

Erforderlicher Scope: receipts:read

Pfad-Parameter:

ParameterTypBeschreibung
idLongID des Belegs

Antwort-Felder:

FeldTypBeschreibung
idnumberID des Anhangs
displayFilenameStringDateiname
contentTypeString?MIME-Typ
sizeBytesnumberDateigröße in Bytes
isPrimarybooleanIst dieser Anhang der Hauptbeleg
attachedByNameStringName des Hochladers
attachedAtStringHochladezeitpunkt (ISO 8601, UTC)

cURL-Beispiel:

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

Anhang herunterladen

GET /api/v1/receipts/{id}/attachments/{attachmentId}/download

Lädt eine Anhang-Datei herunter.

Erforderlicher Scope: receipts:read

Pfad-Parameter:

ParameterTypBeschreibung
idLongID des Belegs
attachmentIdLongID des Anhangs

Antwort: Binäre Datei mit entsprechendem Content-Type-Header

Fehler-Codes:

HTTP-StatusCodeBeschreibung
404NOT_FOUNDBeleg oder Anhang nicht gefunden

Anhang hochladen

POST /api/v1/receipts/{id}/attachments

Lädt eine Datei als Anhang für einen Beleg hoch. Die Datei wird auf Viren gescannt und in MinIO gespeichert.

Erforderlicher Scope: receipts:write

Pfad-Parameter:

ParameterTypBeschreibung
idLongID des Belegs

Request: Multipart Form-Data

ParameterTypPflichtStandardBeschreibung
filemultipartJa-Hochzuladende Datei
isPrimarybooleanNeinfalseOb dieser Anhang der Hauptbeleg ist

Antwort (201 Created): Erstelltes Anhang-Objekt (gleiche Felder wie bei der Anhang-Liste)

Fehler-Codes:

HTTP-StatusCodeBeschreibung
400VALIDATION_ERRORDatei ungültig, zu groß oder infiziert
404NOT_FOUNDBeleg nicht gefunden
422VIRUS_DETECTEDHochgeladene Datei als Schadsoftware erkannt

cURL-Beispiel:

curl -X POST "https://app.spiritflow.team/api/v1/receipts/42/attachments" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
  -F "file=@/pfad/zur/rechnung.pdf" \
  -F "isPrimary=true"

Belegkategorien auflisten

GET /api/v1/receipt-categories

Gibt alle Belegkategorien des Mandanten zurück, sortiert nach sort_order. Kategorien können in spiritflow unter Einstellungen > Belege > Kategorien verwaltet werden.

Erforderlicher Scope: receipts:read

Antwort-Felder:

FeldTypBeschreibung
idnumberID der Kategorie
nameStringName der Kategorie
datevAccountNumberString?DATEV-Kontonummer für Steuerexport
colorString?Farbe der Kategorie (#RRGGBB)
sortOrdernumberSortierposition

Antwort (200 OK):

{
  "data": [
    {
      "id": 1,
      "name": "Bürobedarf",
      "datevAccountNumber": "4930",
      "color": "#2196F3",
      "sortOrder": 1
    },
    {
      "id": 2,
      "name": "Reisekosten",
      "datevAccountNumber": "4670",
      "color": "#FF9800",
      "sortOrder": 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/receipt-categories" \
  -H "X-API-Key: sf_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"