← Zurück zu Billbook

Fernbuchhaltungs-API

Zuletzt aktualisiert: 10. Mai 2026

Erfasse Einträge per cURL, iOS-Kurzbefehlen oder Automatisierungsskripten mit einem persönlichen API-Token. Der Token ist nur zum Schreiben vorgesehen: Er kann Transaktionen einfügen und die Kategorie-/Tag-Liste lesen, aber keine Transaktionsdaten lesen oder löschen.

1. Token erhalten

Melde dich als Admin an, öffne Einstellungen → 🔑 Fernbuchhaltungs-API und klicke auf „Token erzeugen".

Der Klartext-Token wird genau einmal angezeigt — kopiere ihn sofort. Der Server speichert nur den SHA-256-Hash, ein verlorener Token kann nur durch Rotieren ersetzt werden (was den alten ungültig macht).

Token-Format: bb_<userId>_<secret>. Sende ihn bei jeder Anfrage als Authorization: Bearer <token>.

2. POST /api/ingest — eine Transaktion einfügen

Der Anfragerumpf ist ein JSON-Objekt mit folgenden Feldern:

  • title (string, erforderlich) — Name der Transaktion
  • amount (number, erforderlich) — muss positiv sein
  • type (string, optional, Standard expense) — eines von expense / income / prepaid_expense / pending_income
  • category (string, optional) — Kategoriename
  • note (string, optional) — freie Notiz
  • created_at (string, optional) — ISO 8601; Standard ist jetzt
curl -X POST https://billbook.me/api/ingest \
  -H "Authorization: Bearer bb_<userId>_<secret>" \
  -H "Content-Type: application/json" \
  -d '{"title":"Coffee","amount":120,"type":"expense","category":"Food"}'

# response: 201
{ "id": "...", "created_at": "..." }

3. GET /api/ingest/categories — Kategorien auflisten

Gibt die Kategorienamen des Admins in der Reihenfolge des Dashboard-Dropdowns zurück. Die Antwort enthält nur Namen — keine IDs, User-IDs oder Transaktionsdaten.

curl https://billbook.me/api/ingest/categories \
  -H "Authorization: Bearer bb_<userId>_<secret>"

# response: 200
{ "categories": ["Food", "Rent", "..."] }

4. GET /api/ingest/tags — kürzlich verwendete Tags

Gibt die zuletzt aktualisierten Tag-Präfixe zurück (die in Titeln eingebetteten #XXX-Markierungen). Standard 20; mit ?limit= änderbar (max. 100).

Gibt ein leeres Array statt einen Fehler zurück, falls die Tabelle tag_prefixes noch nicht existiert.

curl "https://billbook.me/api/ingest/tags?limit=20" \
  -H "Authorization: Bearer bb_<userId>_<secret>"

# response: 200
{ "tags": ["#management-fee", "#travel", "..."] }

5. Fehlercodes

Alle Fehler sind JSON: { "error": "Nachricht" }.

  • 401 — fehlende Autorisierung, ungültiges Token-Format, widerrufen oder abweichend
  • 402 — Abo abgelaufen; Verlängerung zum Schreiben erforderlich
  • 405 — Methode nicht unterstützt (z. B. GET auf /api/ingest)
  • 501 — Server hat kein SUPABASE_SERVICE_ROLE_KEY
  • 500 — sonstiger interner Fehler

6. Sicherheit und Limits

Vom Design her kann der Token nur in der eigenen Organisation schreiben — keine Org-Übergriffe und kein Lesen bestehender Daten:

  • user_id ist immer der Token-Besitzer; nicht fälschbar
  • org_id ist immer die Org des Besitzers; orgübergreifende Schreibvorgänge unmöglich
  • Tokens werden nur an die Rolle Admin ausgegeben (manager / staff erhalten 403)
  • Antworten geben keine fremden Zeilen preis — nur { id, created_at } wird zurückgegeben
  • Widerruf wirkt sofort; jederzeit aus den Einstellungen rotierbar

7. iOS-Kurzbefehl-Beispiel

Füge die Aktion „URL-Inhalte abrufen" hinzu, setze URL auf https://billbook.me/api/ingest, Methode POST, Header Authorization: Bearer bb_... und Content-Type: application/json, Anfrage-Body als JSON: {"title":"Kaffee","amount":120,"type":"expense"}. Verbinde title und amount mit der Kurzbefehl-Eingabe oder „Jedes Mal fragen"-Variablen.

Dieses Dokument ist eine Schnellreferenz; maßgeblich für das tatsächliche Verhalten ist der Backend-Code.