API

Olvano REST-API — Token-Authentifizierung, Rechnungen, Kontakte und Webhooks. Mit interaktiver Referenz.

Olvano bietet eine REST-API zur Anbindung Ihrer eigenen Systeme — Rechnungen erstellen und auslesen, Kontakte verwalten und über Webhooks auf Ereignisse reagieren. Diese Seite führt Sie vom Token bis zum ersten Aufruf; die vollständige, ausführbare Liste der Endpunkte finden Sie in der interaktiven Referenz.

Bevor Sie beginnen

Sie benötigen zwei Dinge:

  1. Ein Konto im Tarif byznys (der free-Tarif hat keine API).
  2. Einen API-Token, der an dieses Konto gebunden ist (siehe unten).

Tokens werden vom Kontoinhaber erstellt. Ein Token gehört zu genau einem Konto und trägt seine eigenen Berechtigungen (Scopes), sodass Sie pro Integration einen eigenen Token ausstellen können.

Einen API-Token erstellen

Gehen Sie in der App zu Einstellungen → API-Tokens (/app/{slug}/settings/api-tokens), wählen Sie Neuer Token, benennen Sie ihn und legen Sie seine Berechtigungen fest. Der Token im Klartext wird nur einmal angezeigt — kopieren Sie ihn sofort und bewahren Sie ihn sicher auf.

Tokens beginnen mit dem Präfix sg_. Gespeichert wird nur ein HMAC-Digest, sodass der Token nie wieder angezeigt werden kann — geht er verloren, erstellen Sie einen neuen und löschen den alten.

Berechtigungen (Scopes)

Scope Erlaubt
invoices Rechnungen, Zahlungen und Versand erstellen und bearbeiten
expenses Ausgaben erstellen und bearbeiten
reports Berichte und Auswertungen lesen

Das Lesen (GET) gängiger Ressourcen erfordert keine Berechtigung; das Schreiben schon. Operationen, die dem Kontoinhaber vorbehalten sind (Tokens, Webhooks und Bankkonten verwalten), stehen einem API-Token nie zur Verfügung — selbst ein vom Kontoinhaber ausgestellter Token erhält 403.

Authentifizierung und Basis-URL

Authentifizieren Sie jede Anfrage mit dem Token im Authorization-Header:

Authorization: Bearer sg_your_token

Die Basis-URL ist die Domain Ihrer Instanz + /api. Konto-Endpunkte haben die Form /api/accounts/{slug}/…. Die folgenden Beispiele verwenden Umgebungsvariablen:

export STARGATE="https://app.stargate.app"   # durch die Domain Ihrer Instanz ersetzen (lokal http://localhost:3000)
export SLUG="your-account-slug"
export TOKEN="sg_your_token"

Ihre erste Anfrage

Die Rechnungen eines Kontos auflisten:

curl "$STARGATE/api/accounts/$SLUG/invoices" \
  -H "Authorization: Bearer $TOKEN"

Die Antwort ist eine paginierte Liste:

{
  "invoices": [ { "id": "…", "number": "2026-0001", "status": "open", "total": "3630.00" } ],
  "total": 128,
  "page": 1,
  "pageSize": 40
}

Paginierung, Sortierung und Suche

Listen-Endpunkte akzeptieren diese Query-Parameter:

Parameter Bedeutung Standard
page Seitenzahl (ab 1) 1
pageSize Einträge pro Seite (max. 100) 40
sort Sortierspalte (erlaubte Menge je Ressource) je Ressource
dir Sortierrichtung: asc / desc desc
q Volltextsuche (1–200 Zeichen)

Rechnungen lassen sich zusätzlich nach status, documentType und subjectId filtern. Ein ungültiger Parameter unterbricht die Liste nie — stattdessen wird der Standard verwendet (z. B. ?page=abc1). Jede Antwort enthält total, page und pageSize, sodass sich die Seitenanzahl leicht ableiten lässt.

Eine Rechnung erstellen

curl -X POST "$STARGATE/api/accounts/$SLUG/invoices" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "subjectId": "CUSTOMER_ID",
    "lines": [
      { "name": "Consulting", "quantity": 2, "unitPrice": "1500", "vatRate": 21 }
    ]
  }'

subjectId ist die ID des Kunden — Sie erhalten sie aus der Kontaktliste (GET /api/accounts/$SLUG/subjects) oder legen einen Kontakt über POST …/subjects an. Pflichtfelder sind subjectId und mindestens eine Position in lines (jeweils mit name und unitPrice). Optional können Sie documentType, currency, variableSymbol, due, issuedOn und weitere Felder senden — das vollständige Schema finden Sie in der interaktiven Referenz.

Bei Erfolg werden 201 und die erstellte Rechnung zurückgegeben:

{ "invoice": { "id": "…", "number": "2026-0002", "status": "open", "total": "3630.00" } }

Fehler

Fehler verwenden ein einheitliches Format — einen HTTP-Status sowie JSON mit statusMessage und einem data-Feld für die maschinelle Verarbeitung:

{
  "statusCode": 400,
  "statusMessage": "Invalid invoice",
  "data": { "formErrors": [], "fieldErrors": { "subjectId": ["Required"] } }
}
Status Wann data
400 ungültiger Body / ungültige Parameter fieldErrors, formErrors (Aufschlüsselung je Feld)
401 fehlender oder ungültiger Token
403 fehlende Berechtigung / dem Kontoinhaber vorbehaltene Operation / Funktion nicht im Tarif code (bei Tarif: plan_feature_unavailable)
404 Ressource oder Konto nicht gefunden (Existenz des Kontos wird verborgen) code
402 Tariflimit erreicht { "code": "plan_limit_reached", "limit": 10 }
422 Domänenregel (z. B. Rechnung ohne Positionen) code

Bei Domänenfehlern ist data.code ein maschinenlesbarer Code (z. B. subject_not_found), auf den Sie sich eher verlassen können als auf den Meldungstext.

Tariflimits

Der free-Tarif führt keine API-Aufrufe aus (Kontingent 0); byznys verfügt über die API und alle Funktionen. Wird ein Limit überschritten (z. B. die Anzahl der Kontakte), gibt die API 402 mit plan_limit_reached zurück; für eine Funktion außerhalb des Tarifs (Webhooks, Ausgaben …) gibt sie 403 mit plan_feature_unavailable zurück. Die aktuellen Limits und die Nutzung Ihres Kontos lesen Sie über:

curl "$STARGATE/api/accounts/$SLUG/entitlements" -H "Authorization: Bearer $TOKEN"

Webhooks

Ein Webhook benachrichtigt Sie in Echtzeit über Ereignisse, statt dass Sie die API abfragen müssen. Webhooks sind eine Funktion des byznys-Tarifs und werden vom Kontoinhaber verwaltet.

Registrierung über die API (oder in den Kontoeinstellungen):

curl -X POST "$STARGATE/api/accounts/$SLUG/webhooks" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "webhookUrl": "https://your-server.com/hooks/stargate",
    "events": ["invoice_paid", "invoice_sent"],
    "authHeader": "Bearer your-shared-secret"
  }'

Tragen Sie konkrete Namen in events ein oder * für alle. Verfügbare Ereignisse:

invoice_created, invoice_sent, invoice_paid, invoice_overdue, invoice_cancelled, invoice_uncollectible, invoice_viewed, invoice_reminder_sent, recurring_generator_invoice_created.

Olvano sendet ein POST an Ihre URL mit folgendem Body:

{ "event_name": "invoice_paid", "body": { "…": "event data" } }
  • Wenn Sie authHeader setzen, wird er als Authorization-Header gesendet — verwenden Sie ihn, um zu prüfen, dass die Anfrage wirklich von Olvano stammt.
  • Jede Zustellung trägt einen Idempotency-Key-Header (UUID) — nutzen Sie ihn zur Deduplizierung.
  • Die Zustellung wird bis zu mit exponentiellem Backoff wiederholt, bis Sie einen 2xx-Status zurückgeben. Fehlgeschlagene Zustellungen werden über GET …/webhooks/{id}/failed_deliveries aufgelistet.

Interaktive Referenz

Die vollständige, stets aktuelle Liste der Endpunkte — mit Parametern, Schemata und der Möglichkeit, sie direkt aus dem Browser aufzurufen: