OBDRestFAHRTEN
iPhone-App · Webapp · OpenAPI

Dein Fahrtenbuch fährt einfach mit.

OBDRest liest über einen OBD2-Adapter Fahrten, Fehlercodes und Messwerte direkt aus deinem Auto. Fahrten werden automatisch aufgezeichnet, als privat oder geschäftlich eingeordnet und mit deinem Server synchronisiert – dort siehst, verwaltest und exportierst du alles.

Funktioniert auch offlineDaten gehören dirStandardserver oder eigener Server
128OBD2-Messwerte dekodiert
3.074Mercedes-Fehlercodes erklärt
4Fahrtarten im Fahrtenbuch
60dokumentierte API-Operationen
So funktioniert's

Vom Stecker bis zur Auswertung

Kein Kabelsalat, keine Handarbeit: Adapter einstecken, App einmal einrichten – den Rest erledigt OBDRest im Hintergrund.

🔌

Adapter einstecken

Ein ELM327-Bluetooth-LE-Adapter (z. B. Vgate iCar Pro 2S) in die OBD2-Buchse. Die App merkt sich den Adapter.

📱

Losfahren

Zündung an – iOS verbindet automatisch, auch im Hintergrund. Route, Tempo, Verbrauch und Motorwerte werden aufgezeichnet.

☁️

Synchronisieren

Nach der Fahrt gehen Fahrt, Fahrzeugdaten, Fehler und Messwerte an deinen gewählten Server – den Standardserver oder einen eigenen. Offline wartet eine Warteschlange.

📊

Auswerten & exportieren

Im Browser: Fahrtenbuch zuordnen, Statistiken ansehen, Fehler verfolgen, CSV/JSON/GPX exportieren.

Herzstück

Deine Daten auf dem Server – sehen, verwalten, exportieren

Die App speichert alles lokal und funktioniert ohne Netz. Mit Server werden deine Daten zusätzlich gesichert, auf allen Geräten verfügbar und im Browser auswertbar.

👀

Sehen

  • Übersicht mit Kennzahlen, Verbrauch und Eco-Score
  • Jede Fahrt mit Karte, Tempo-, Drehzahl- und Höhenprofil
  • Fahrzeuge mit Steuergeräten, Fehlercodes, Messwerten
  • Statistiken: Wochentage, Uhrzeit, Fahrzeit vs. Parkzeit
  • Heatmap deiner Wege und Jahreskarte der Fahrtage
🗂️

Verwalten

  • Fahrten privat / geschäftlich / Arbeitsweg zuordnen – einzeln oder gesammelt
  • Zweck und mehrzeilige Beschreibung je Fahrt
  • Ausgaben mit Belegen, Fahrzeugschein und Fotos
  • Fahrten löschen (mit Recht), Fahrzeuge getrennt halten
  • Administratoren verwalten Benutzer und Rechte
📤

Exportieren

  • PDF-Fahrtenbuch druckfertig (A4 quer, Monatssummen)
  • CSV-Fahrtenbuch für Excel/Numbers mit Summen je Art
  • JSON-Gesamtexport aller Daten, optional mit Messpunkten
  • GPX je Fahrt für Karten-Apps
  • REST-API für eigene Auswertungen und Skripte
PDF FahrtenbuchCSV FahrtenbuchJSON KomplettexportGPX RouteOpenAPI 3.1 Schnittstellecurl Beispiele
📒 Fahrtenbuch

Privat oder geschäftlich? Ein Tipp genügt.

Jede aufgezeichnete Fahrt bekommt Start- und Zieladresse, Strecke und Dauer. Du ordnest sie zu – in der App per Wischen, im Browser per Klick oder für viele Fahrten auf einmal. Die Zuordnung wird in beide Richtungen synchronisiert.

🏠 Privat Freizeit
💼 Geschäftlich Kunde, Termin
🏢 Arbeitsweg Pendeln
❔ Nicht zugeordnet offen
  • Summen je Art und Monat als Diagramm
  • Filter nach Zeitraum, Art, Fahrzeug und Volltext
  • CSV-Export mit Datum, Uhrzeit, Adressen, km, Zweck
  • Widget „Fahrtenbuch“ auf dem iPhone-Home-Bildschirm

ℹ️ OBDRest liefert die Daten für dein Fahrtenbuch. Ob ein elektronisches Fahrtenbuch steuerlich anerkannt wird, hängt von weiteren Anforderungen ab (z. B. Unveränderbarkeit) – bitte mit der Steuerberatung abstimmen.

Fahrtenliste mit Zuordnung Privat, Geschäftlich und Arbeitsweg
Ausgaben: Spritpreis, Verbrauch aus Tankbelegen und Kosten je Monat
💶 Ausgaben & Belege

Tanken, Parken, Reparaturen – alle Kosten im Blick.

Erfasse jede Ausgabe in Sekunden – im Browser oder in der App, auf Wunsch direkt mit Foto der Quittung. OBDRest rechnet daraus Spritpreis, echten Verbrauch zwischen zwei Volltankungen und deine Kosten je Kilometer.

⛽ Tanken Liter, €/l, Verbrauch
🅿️ Parken Dauer, Orte
🔧 Reparatur & Wartung Inspektion, Reifen, HU
🧾 Sonstiges Maut, AdBlue, Zubehör
  • Belege als Foto oder PDF – mehrere je Ausgabe, in der App direkt mit der Kamera
  • PDF-Belege werden im Browser mit pdf.js angezeigt – mit Zoom und Download
  • Fahrzeugschein, Fotos, Versicherung beim Fahrzeug hinterlegen
  • Ausgaben je Monat, Kategorie und Fahrzeug – auch in den Statistiken
  • Datenschutz: Jede Datei sieht nur ihr Eigentümer – auch bei manipulierter URL
Funktionen

Alles, was dein Auto verrät

Die iPhone-App liest nur – sie verändert nichts am Fahrzeug (einzige Ausnahme: Fehlerspeicher löschen nach Rückfrage).

🎛️

Cockpit & Live-Daten

Alle vom Fahrzeug unterstützten Messwerte aller Steuergeräte in 10 Gruppen – Drehzahl bis DPF-Differenzdruck.

🛣️

Automatische Fahrten

Beginn und Ende werden erkannt, auch im Hintergrund. Karte, Verbrauch, CO₂, Eco-Score, Fahrereignisse.

⚠️

Fehlerspeicher

Aktuelle und alte Fehler (OBD 03/07/0A und Herstellerdiagnose UDS), Freeze-Frame, Verlauf.

📚

3.074 Codes erklärt

Nachschlagewerk für Mercedes-Fehlercodes, durchsuchbar und mit Markierung der gefundenen Codes.

🩺

Analyse

Regeln für Batterie, Kühlmittel, Thermostat, Katalysator, Partikelfilter und Bereitschaftstests.

🅿️

Bewegung & Parken

Wie lange fährt das Auto, wie lange steht es? Verhältnis, Parkpausen und Monatsverlauf.

🔐

Konten & Rechte

SSO oder lokales Konto, jeder sieht nur seine Daten, Administratoren zusätzlich alle.

🔥

Heatmap & Jahreskarte

Wo bist du oft? Heatmap aller Wege und Parkorte, dazu eine Jahreskarte wie bei GitHub mit allen Fahrtagen.

💶

Ausgaben

Tanken, Parken, Reparatur und Sonstiges mit Diagrammen, Spritpreis, Verbrauch und Kosten je km.

📎

Belege & Dokumente

Fotos und PDFs zu Ausgaben und Fahrzeugen – Kamera in der App, pdf.js-Ansicht im Browser.

📝

Beschreibung & PDF

Mehrzeilige Beschreibung je Fahrt, Fahrtenbuch als druckfertiges PDF, CSV oder JSON.

🚗

Wo steht mein Auto?

Parkplatz am Ende der letzten Fahrt mit aktueller Adresse – ein Tippen startet die Navigation zu Fuß, in der App und im Browser.

🧮

Kilometerstand

Tachostand je Fahrzeug eingeben (App, Web, MCP), optional auch bei Tanken, Parken und Werkstatt. Der Stand von heute wird aus den Fahrten seitdem hochgerechnet.

🤖

MCP-Agent

Fahrten, Ausgaben und Statistiken in natürlicher Sprache abfragen – mit Claude und anderen MCP-Clients. Alle Befehle →

📶

Offline zuerst

Alles wird lokal gespeichert; eine Warteschlange sendet nach, sobald Netz da ist. Ohne Server voll nutzbar.

Screenshots

So sieht es aus

Mit Testdaten: ein Mercedes GLC 220 d und ein VW Golf, Fahrten in Berlin und an die Ostsee. Klick vergrößert.

Cockpit
Cockpit
Live-Daten
Live-Daten
Laufende Fahrt
Laufende Fahrt
Fahrt mit Karte
Fahrt mit Karte
Fehlerspeicher
Fehlerspeicher
Server-Dialog
Server-Dialog
Unterstützte Adapter

Der richtige Stecker für die OBD2-Buchse

OBDRest spricht mit ELM327-kompatiblen Adaptern über Bluetooth Low Energy. Die OBD2-Buchse sitzt meist unter dem Lenkrad; Pflicht bei Benzinern ab 2001 und Dieseln ab 2004 (EU).

✅ Mein Adapter · getestet

Vgate iCar Pro 2S

Illustration des Vgate iCar Pro 2S mit Leuchtring und OBD2-Stecker

Kompakter OBD2-Adapter mit Bluetooth 5.2, ELM327-Befehlssatz v2.3 und Leuchtring. Er schläft automatisch (Ruhestrom ca. 3 mA) und wacht beim Starten auf – auch bei Hybrid- und Elektrofahrzeugen – und kann daher dauerhaft stecken bleiben. Am iPhone erscheint er als IOS-Vlink.

  • Verbindung direkt in der App per BLE – nicht in den iOS-Einstellungen koppeln
  • Automatische Verbindung im Hintergrund, sobald die Zündung an ist
  • Getestet mit Mercedes-Benz GLC (X253, 2015), CAN 11 bit / 500 kbit/s

Kompatibilität

Adapter / SchnittstelleBLE-DienstStatus
Vgate iCar Pro 2S18F0✅ getestet
Vgate iCar Pro (BLE 4.0)18F0🟢 gleiche Schnittstelle
ELM327-BLE-Adapter (viele Klone)FFF0🟢 unterstützt
HM-10-basierte AdapterFFE0🟢 unterstützt
Adapter mit Dienst E7810A71…E7810A71🟢 unterstützt
Klassisches Bluetooth (SPP) am iPhone–❌ von iOS nicht erlaubt
WLAN-Adapter–⏳ derzeit nicht

ℹ️ „Unterstützt“ heißt: Die App erkennt den BLE-Dienst und spricht ELM327. Billige Klone melden oft eine falsche Firmware-Version und können Mehrfachabfragen oder Herstellerdiagnose (UDS) nicht – die App weicht dann automatisch auf Einzelabfragen aus.

Betrieb

Wohin gehen deine Daten? Du entscheidest.

Die App funktioniert ohne Server. Willst du synchronisieren, nutzt du entweder den Standardserver – oder deinen eigenen Server. Umschalten jederzeit in der App: Verbindungsknopf oben rechts → „Adapter & Server“ → Server.

Variante A · Standard

☁️ Standardserver

Voreingestellt, nichts einzurichten. Konto registrieren, in der App anmelden – fertig.

Adresse:  https://app.fahrten.fusenigk.de
Benutzer: dein Konto (SSO oder registriert)
Variante B · eigener Server

🏠 Dein eigener Server

Unsere Webapp selbst betreiben (Docker) oder eine eigene Implementierung der dokumentierten REST-API. In der App nur die Adresse ändern.

Adresse:  https://fahrten.meine-firma.de
Benutzer: Konto auf deinem Server

🔒 Die App sendet ausschließlich an die Adresse, die im Server-Dialog steht. Ohne Server bleiben alle Daten nur auf dem iPhone. Ein Wechsel ist jederzeit möglich – „Abgleich zurücksetzen“ sendet dann alle Fahrten an den neuen Server.

Empfohlen

☁️ Gehostet

Sofort startklar unter app.fahrten.fusenigk.de: TLS, tägliche Pflege, SSO-Anmeldung, Registrierung in einer Minute.

Jetzt registrieren
On-Premises

🏠 Im eigenen Netz

Die komplette Webapp läuft als Docker Compose-Stack (Next.js + MariaDB) auf deinem Server oder NAS. Anmeldung per Keycloak/SSO oder lokalen Konten.

# Webapp-Verzeichnis kopieren, .env anlegen
cp .env.example .env    # DB-Passwörter, SESSION_SECRET
docker compose up -d --build
curl http://localhost:3330/api/v1/health
Für Entwickler

🧩 Eigener Server

Die App spricht eine offene, als OpenAPI 3.1 dokumentierte REST-Schnittstelle. Implementiere die Sync-Endpunkte selbst – z. B. für dein Flottenmanagement – und trage die Adresse in der App ein.

API-Dokumentation openapi.yaml 🤖 MCP-Agent
Fragen

Häufige Fragen

Welchen Adapter brauche ich?

Siehe Unterstützte Adapter.

Einen ELM327-kompatiblen Adapter mit Bluetooth Low Energy, getestet mit dem Vgate iCar Pro 2S (meldet sich als „IOS-Vlink“). Nicht in den iOS-Bluetooth-Einstellungen koppeln – die App verbindet direkt.

Muss ich euren Server benutzen?

Nein. Standard ist app.fahrten.fusenigk.de, du kannst aber jederzeit einen eigenen Server eintragen – unsere Webapp per Docker Compose oder eine eigene Implementierung der REST-API. Oder ganz ohne Server arbeiten.

Funktioniert die App ohne Server?

Ja. Fahrten, Fehler und Messwerte werden immer auf dem iPhone gespeichert. Der Server ist eine Ergänzung: Sicherung, Auswertung im Browser, Export und mehrere Geräte.

Wer sieht meine Daten?

Nur du. Jede Abfrage ist auf dein Konto begrenzt. Administratoren deiner Installation können zur Verwaltung alle Daten einsehen – bei On-Prem bist das du selbst.

Wie exportiere ich mein Fahrtenbuch?

In der Webapp unter „Fahrten“ → „Fahrtenbuch (CSV)“ (Filter werden übernommen) oder per GET /api/v1/export/fahrten.csv. Alle Daten gibt es als JSON, jede Route als GPX.

Kann ich die Demo ausprobieren?

Ja – auf der Anmeldeseite „Demo ansehen“ wählen (Benutzer demo, Passwort demo). Die Demo enthält Testfahrten, Fehlercodes und Messwerte, ist schreibgeschützt und aus Sicherheitsgründen nur im Browser nutzbar – für die App und die REST-API brauchst du ein eigenes Konto.

Wird das Fahrzeug verändert?

Nein. OBDRest nutzt nur lesende Diagnosedienste. Einzige Ausnahme ist das Löschen des Fehlerspeichers – nur nach ausdrücklicher Bestätigung.

Bereit für die erste Fahrt?

Konto anlegen, Server in der App eintragen, losfahren.

MCP-Agent mcp-fahrten v1.0.0

Frag deine Fahrtdaten in natürlicher Sprache – in Claude Code, Claude Desktop oder jedem anderen Client mit Model Context Protocol (MCP). Der Agent nutzt die dokumentierte REST-API: mit dem Standardserver oder deinem eigenen Server.

🔍 21 lesende Werkzeuge

Fahrten, Fahrtenbuch, Statistiken, Heatmap, Fahrzeuge, Fehler, Messwerte, Ausgaben, Parkplatz

✏️ 5 schreibende Werkzeuge

Fahrten zuordnen und beschreiben, Ausgaben erfassen, Belege hochladen – als „verändert Daten“ markiert

📤 Exporte

Fahrtenbuch als PDF oder CSV, alle Daten als JSON, Routen als GPX, Belege herunterladen

💬 Beispieldialog

Du: Wie viele Kilometer bin ich im Oktober geschäftlich gefahren, was hat mich das Auto gekostet und wo steht es gerade?
→ fahrtenbuch_auswertung(von 2026-10-01, bis 2026-10-31) · ausgaben_statistik(…) · parkplatz()
Claude: Im Oktober bist du 246 km geschäftlich gefahren (14 % aller Kilometer). Die Ausgaben lagen bei rund 1.180 € – vor allem die Inspektion (489,60 €) und die DPF-Reinigung (378 €). Dein GLC steht seit gestern 14:36 Uhr Unter den Linden 10 – zu Fuß: [Google-Maps-Link]. Drei Fahrten sind noch nicht zugeordnet – soll ich sie als „Arbeitsweg“ eintragen?

Schreibende Werkzeuge (✏️) führt der Client nur nach deiner Bestätigung aus.

Allgemein

LIESTfahrten_statusStatus und Anmeldung

Prüft Server und Datenbank und zeigt den angemeldeten Benutzer mit seinen Rechten (senden, löschen, API, Administrator).

Keine Parameter.

Beispiel-Prompts
Ist der Fahrten-Server erreichbar und mit welchem Konto bin ich angemeldet?
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "fahrten_status", "arguments": {}}}

Fahrten & Fahrtenbuch

LIESTfahrten_listeFahrten auflisten

Listet Fahrten mit Datum, Strecke, km, Art (Privat/Geschäftlich/Arbeitsweg), Verbrauch und Eco-Score. Filter nach Zeitraum, Art, Fahrzeug und Volltext.

Parameter (* Pflicht)
NameTypBeschreibung
vonstringStartdatum JJJJ-MM-TT (optional)
bisstringEnddatum JJJJ-MM-TT, einschließlich (optional)
artprivat | geschaeftlich | arbeitsweg | noneFahrtart (none = nicht zugeordnet)
fahrzeugnumberFahrzeug-ID (siehe fahrzeuge_liste)
suchestringVolltext in Adressen, Etikett und Beschreibung
limitnumberAnzahl (Standard 50, max. 1000)
allebooleanNur Administratoren: Daten aller Benutzer
Beispiel-Prompts
Zeig mir alle geschäftlichen Fahrten im Oktober 2026.Welche Fahrten gingen nach Potsdam?
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "fahrten_liste", "arguments": {}}}
LIESTfahrt_detailFahrt im Detail

Alle Kennzahlen einer Fahrt (Strecke, Dauer, Tempo, Verbrauch, CO₂, Eco-Score mit Faktoren, Fahrereignisse, Beschreibung). Optional eine ausgedünnte Messpunkt-Tabelle.

Parameter (* Pflicht)
NameTypBeschreibung
id *stringFahrt-ID (UUID)
messpunktenumberAnzahl Messpunkte in der Ausgabe (0 = keine, Standard 0)
allebooleanNur Administratoren: Daten aller Benutzer
Beispiel-Prompts
Wie sparsam war meine letzte Fahrt und was kann ich besser machen?
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "fahrt_detail", "arguments": {"id": "…"}}}
LIESTfahrtenbuch_auswertungFahrtenbuch auswerten

Kilometer je Fahrtart und Monat, Anteile Privat/Geschäftlich/Arbeitsweg und die Liste der noch nicht zugeordneten Fahrten.

Parameter (* Pflicht)
NameTypBeschreibung
vonstringStartdatum JJJJ-MM-TT (optional)
bisstringEnddatum JJJJ-MM-TT, einschließlich (optional)
fahrzeugnumberFahrzeug-ID (siehe fahrzeuge_liste)
allebooleanNur Administratoren: Daten aller Benutzer
Beispiel-Prompts
Wie viele Kilometer bin ich 2026 geschäftlich gefahren, und welche Fahrten sind noch nicht zugeordnet?
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "fahrtenbuch_auswertung", "arguments": {}}}
SCHREIBTfahrt_zuordnenFahrten zuordnen

✏️ Verändert Daten: ordnet eine oder mehrere Fahrten Privat, Geschäftlich oder Arbeitsweg zu.

Parameter (* Pflicht)
NameTypBeschreibung
ids *string[]Fahrt-IDs
art *privat | geschaeftlich | arbeitsweg | noneFahrtart (none = nicht zugeordnet)
Beispiel-Prompts
Ordne die Fahrten 6f1b2c3d-… und 7a2c… als geschäftlich ein.
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "fahrt_zuordnen", "arguments": {"ids": "…", "art": "…"}}}
SCHREIBTfahrt_bearbeitenFahrt bearbeiten

✏️ Verändert Daten: setzt Art, Etikett (kurz, z. B. Kunde) und/oder die mehrzeilige Beschreibung einer Fahrt.

Parameter (* Pflicht)
NameTypBeschreibung
id *stringFahrt-ID
artprivat | geschaeftlich | arbeitsweg | noneFahrtart (none = nicht zugeordnet)
etikettstringKurzes Etikett / Zweck
beschreibungstringMehrzeilige Beschreibung (leer = entfernen)
Beispiel-Prompts
Trage bei meiner Fahrt nach Adlershof als Zweck „Kundentermin Muster GmbH“ ein.
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "fahrt_bearbeiten", "arguments": {"id": "…"}}}

Statistiken & Auswertungen

LIESTstatistikStatistik

Kennzahlen eines Zeitraums: Fahrten, km, Stunden, Liter, Ø Verbrauch, CO₂, Eco-Score, Leerlauf, Fahrereignisse, km je Monat, Wochentage, Uhrzeiten und Streckenlängen.

Parameter (* Pflicht)
NameTypBeschreibung
vonstringStartdatum JJJJ-MM-TT (optional)
bisstringEnddatum JJJJ-MM-TT, einschließlich (optional)
fahrzeugnumberFahrzeug-ID (siehe fahrzeuge_liste)
allebooleanNur Administratoren: Daten aller Benutzer
Beispiel-Prompts
Gib mir eine Statistik meiner Fahrten im letzten Quartal.An welchem Wochentag fahre ich am meisten?
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "statistik", "arguments": {}}}
LIESTbewegung_parkenBewegung & Parken

Wie lange werden die Fahrzeuge bewegt und wie lange parken sie? Fahrzeit, Leerlauf, Parkzeit, Anteil Fahren, Verhältnis und Parkpausen.

Parameter (* Pflicht)
NameTypBeschreibung
vonstringStartdatum JJJJ-MM-TT (optional)
bisstringEnddatum JJJJ-MM-TT, einschließlich (optional)
fahrzeugnumberFahrzeug-ID (siehe fahrzeuge_liste)
allebooleanNur Administratoren: Daten aller Benutzer
Beispiel-Prompts
Wie viel Prozent der Zeit steht mein Auto nur herum?
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "bewegung_parken", "arguments": {}}}
LIESTheatmap_orteHäufigste Orte (Heatmap)

Die häufigsten Start-/Zielorte (Parkorte) und die Ausdehnung aller Fahrten – Grundlage der Heatmap.

Parameter (* Pflicht)
NameTypBeschreibung
vonstringStartdatum JJJJ-MM-TT (optional)
bisstringEnddatum JJJJ-MM-TT, einschließlich (optional)
artprivat | geschaeftlich | arbeitsweg | noneFahrtart (none = nicht zugeordnet)
fahrzeugnumberFahrzeug-ID (siehe fahrzeuge_liste)
allebooleanNur Administratoren: Daten aller Benutzer
Beispiel-Prompts
Wo parke ich am häufigsten?
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "heatmap_orte", "arguments": {}}}
LIESTjahreskarteJahreskarte (Fahrten je Tag)

Fahrten und km je Kalendertag eines Jahres (wie die GitHub-Aktivitätsanzeige): aktive Tage, längste Serie, Tag mit den meisten Fahrten.

Parameter (* Pflicht)
NameTypBeschreibung
jahrnumberJahr (Standard: aktuelles Jahr)
artprivat | geschaeftlich | arbeitsweg | noneFahrtart (none = nicht zugeordnet)
allebooleanNur Administratoren: Daten aller Benutzer
Beispiel-Prompts
An wie vielen Tagen bin ich 2026 gefahren und was war meine längste Serie?
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "jahreskarte", "arguments": {}}}
LIESTmonatsberichtMonatsbericht

Kompakter Bericht für einen Monat: Fahrten, km, Fahrtenbuch-Aufteilung, Verbrauch, Eco-Score, Ausgaben je Kategorie, Kosten je km und aktive Fehler.

Parameter (* Pflicht)
NameTypBeschreibung
monat *stringMonat JJJJ-MM
allebooleanNur Administratoren: Daten aller Benutzer
Beispiel-Prompts
Erstelle mir einen Monatsbericht für Oktober 2026.
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "monatsbericht", "arguments": {"monat": "…"}}}

Fahrzeuge & Diagnose

LIESTfahrzeuge_listeFahrzeuge

Alle Fahrzeuge mit VIN, Fahrten, km, Kraftstoff, aktiven Fehlern und letzter Fahrt.

Parameter (* Pflicht)
NameTypBeschreibung
allebooleanNur Administratoren: Daten aller Benutzer
Beispiel-Prompts
Welche Fahrzeuge habe ich und wie viele km sind sie gefahren?
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "fahrzeuge_liste", "arguments": {}}}
LIESTfahrzeug_zustandFahrzeugzustand

Zustand eines Fahrzeugs: Kennzahlen, aktive und alte Fehlercodes, Steuergeräte und die letzten Messwerte mit Befunden der Analyse.

Parameter (* Pflicht)
NameTypBeschreibung
id *numberFahrzeug-ID
allebooleanNur Administratoren: Daten aller Benutzer
Beispiel-Prompts
Ist mit meinem GLC alles in Ordnung?Welche Fehler hat Fahrzeug 4?
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "fahrzeug_zustand", "arguments": {"id": 1}}}
LIESTfehler_listeFehlercodes

Fehlercodes (DTC) aller oder eines Fahrzeugs mit Beschreibung, System, Status (aktiv/alt), erstmals/zuletzt gesehen und Anzahl.

Parameter (* Pflicht)
NameTypBeschreibung
aktivbooleannur aktive Fehler
fahrzeugnumberFahrzeug-ID (siehe fahrzeuge_liste)
allebooleanNur Administratoren: Daten aller Benutzer
Beispiel-Prompts
Welche Fehlercodes sind gerade aktiv?
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "fehler_liste", "arguments": {}}}
LIESTmesswert_verlaufMesswert-Verlauf

Verlauf eines OBD-Messwerts über alle Momentaufnahmen (z. B. 42 = Steuergerätespannung, 05 = Kühlmittel, 2F = Tankfüllstand) mit Minimum, Maximum und Mittel.

Parameter (* Pflicht)
NameTypBeschreibung
pid *stringOBD-PID hexadezimal
allebooleanNur Administratoren: Daten aller Benutzer
Beispiel-Prompts
Wie hat sich die Bordspannung entwickelt? Ist die Batterie schwach?
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "messwert_verlauf", "arguments": {"pid": "…"}}}
LIESTparkplatzWo steht mein Auto?

Parkplatz je Fahrzeug (Ende der letzten Fahrt) mit Adresse, Zeitpunkt und Links für die Navigation zu Fuß (Google Maps, Apple Karten).

Parameter (* Pflicht)
NameTypBeschreibung
allebooleanNur Administratoren: Daten aller Benutzer
Beispiel-Prompts
Wo habe ich mein Auto geparkt?
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "parkplatz", "arguments": {}}}
LIESTkilometerstandKilometerstand

Letzter erfasster Kilometerstand eines Fahrzeugs (manuell oder aus Tank-/Werkstattbelegen), geschätzter Stand heute (+ seither gefahrene km) und Verlauf.

Parameter (* Pflicht)
NameTypBeschreibung
fahrzeug *numberFahrzeug-ID (siehe fahrzeuge_liste)
allebooleanNur Administratoren: Daten aller Benutzer
Beispiel-Prompts
Wie ist der aktuelle Kilometerstand meines GLC?Wann ist die nächste Inspektion fällig, wenn sie alle 25.000 km ansteht?
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "kilometerstand", "arguments": {"fahrzeug": 1}}}
SCHREIBTkilometerstand_erfassenKilometerstand erfassen

✏️ Verändert Daten: speichert einen abgelesenen Kilometerstand für ein eigenes Fahrzeug.

Parameter (* Pflicht)
NameTypBeschreibung
fahrzeug *numberFahrzeug-ID (siehe fahrzeuge_liste)
km *numberKilometerstand (ganze km)
datumstringISO-Datum (Standard: jetzt)
notizstringNotiz
Beispiel-Prompts
Mein GLC hat heute 128.450 km auf dem Tacho – trag das ein.
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "kilometerstand_erfassen", "arguments": {"fahrzeug": 1, "km": 1}}}

Ausgaben & Belege

LIESTausgaben_listeAusgaben auflisten

Ausgaben (Tanken, Parken, Reparatur, Sonstiges) mit Summen je Kategorie, Anbieter, Details und Anzahl der Belege.

Parameter (* Pflicht)
NameTypBeschreibung
kategorietanken | parken | reparatur | sonstigesKategorie
vonstringStartdatum JJJJ-MM-TT (optional)
bisstringEnddatum JJJJ-MM-TT, einschließlich (optional)
fahrzeugnumberFahrzeug-ID (siehe fahrzeuge_liste)
allebooleanNur Administratoren: Daten aller Benutzer
Beispiel-Prompts
Was habe ich im Oktober fürs Tanken ausgegeben?Liste alle Reparaturen mit Rechnungen.
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "ausgaben_liste", "arguments": {}}}
LIESTausgaben_statistikAusgaben auswerten

Kosten je Monat und Kategorie, Kosten je Kilometer, Ø Spritpreis, Verbrauch aus Volltankungen, teuerste Parkorte, Reparaturen nach Art, Ausgaben je Fahrzeug.

Parameter (* Pflicht)
NameTypBeschreibung
vonstringStartdatum JJJJ-MM-TT (optional)
bisstringEnddatum JJJJ-MM-TT, einschließlich (optional)
fahrzeugnumberFahrzeug-ID (siehe fahrzeuge_liste)
allebooleanNur Administratoren: Daten aller Benutzer
Beispiel-Prompts
Was kostet mich mein Auto pro Kilometer?Wie hat sich der Spritpreis entwickelt?
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "ausgaben_statistik", "arguments": {}}}
SCHREIBTausgabe_anlegenAusgabe erfassen

✏️ Verändert Daten: legt eine Ausgabe an (Tanken mit Liter/Preis/vollgetankt, Parken mit Dauer, Reparatur mit Art/Rechnungsnummer, Sonstiges). Belege danach mit beleg_hochladen.

Parameter (* Pflicht)
NameTypBeschreibung
kategorie *tanken | parken | reparatur | sonstigesKategorie
betrag *numberBetrag in Euro
datumstringZeitpunkt ISO 8601 (Standard: jetzt)
fahrzeugnumberFahrzeug-ID (siehe fahrzeuge_liste)
anbieterstringTankstelle, Parkhaus, Werkstatt
ortstringOrt/Adresse
km_standnumberKilometerstand
notizstringNotiz
liternumberTanken: Liter
preis_je_liternumberTanken: €/l
vollgetanktbooleanTanken: vollgetankt
kraftstoffstringTanken: z. B. Diesel
dauer_minnumberParken: Minuten
reparatur_artstringReparatur: Inspektion, Ölwechsel, Reifen, HU/AU, …
rechnungs_nrstringReparatur: Rechnungsnummer
Beispiel-Prompts
Ich habe gerade bei Aral 48,6 l Diesel für 82,45 € vollgetankt, km-Stand 129980.Erfasse 6,50 € Parken im Parkhaus Adlershof für 2 Stunden.
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "ausgabe_anlegen", "arguments": {"kategorie": "…", "betrag": 1}}}
LIESTbelege_listeBelege und Fahrzeugdokumente

Belege (Fotos/PDFs) einer Ausgabe oder Dokumente eines Fahrzeugs (Fahrzeugschein, Fotos, Versicherung) mit ID, Typ und Größe.

Parameter (* Pflicht)
NameTypBeschreibung
ausgabe_idstringAusgabe-ID
fahrzeug_idnumberFahrzeug-ID (statt ausgabe_id)
allebooleanNur Administratoren: Daten aller Benutzer
Beispiel-Prompts
Welche Belege hängen an der Inspektion vom 5. Oktober?Zeig mir die Dokumente meines GLC.
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "belege_liste", "arguments": {}}}
LIESTbeleg_herunterladenBeleg herunterladen

Speichert einen Beleg bzw. ein Fahrzeugdokument (Foto/PDF) lokal. Nur eigene Dateien.

Parameter (* Pflicht)
NameTypBeschreibung
id *stringDatei-ID (siehe belege_liste)
ziel_pfadstringLokaler Zielpfad der Datei (Standard: aktuelles Verzeichnis)
allebooleanNur Administratoren: Daten aller Benutzer
Beispiel-Prompts
Lade die Rechnung der Inspektion herunter.
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "beleg_herunterladen", "arguments": {"id": "…"}}}
SCHREIBTbeleg_hochladenBeleg hochladen

✏️ Verändert Daten: lädt lokale Fotos/PDFs (JPEG, PNG, WebP, HEIC, PDF; max. 15 MB) zu einer Ausgabe oder als Fahrzeugdokument hoch.

Parameter (* Pflicht)
NameTypBeschreibung
pfade *string[]Lokale Dateipfade
ausgabe_idstringAusgabe-ID
fahrzeug_idnumberFahrzeug-ID (statt ausgabe_id)
dokumentartfahrzeugschein | foto | versicherung | sonstigesnur bei fahrzeug_id (Standard foto)
Beispiel-Prompts
Lade ~/Downloads/rechnung.pdf als Beleg zur Reparatur 3c1e… hoch.Hinterlege ~/Scans/fahrzeugschein.pdf beim Fahrzeug 4 als Fahrzeugschein.
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "beleg_hochladen", "arguments": {"pfade": "…"}}}

Export

LIESTexport_fahrtenbuchFahrtenbuch exportieren

Speichert das Fahrtenbuch als PDF (A4 quer, Monatssummen), CSV (Excel, Summen je Art) oder alle Daten als JSON lokal.

Parameter (* Pflicht)
NameTypBeschreibung
format *pdf | csv | jsonFormat
vonstringStartdatum JJJJ-MM-TT (optional)
bisstringEnddatum JJJJ-MM-TT, einschließlich (optional)
artprivat | geschaeftlich | arbeitsweg | noneFahrtart (none = nicht zugeordnet)
fahrzeugnumberFahrzeug-ID (siehe fahrzeuge_liste)
ziel_pfadstringLokaler Zielpfad der Datei (Standard: aktuelles Verzeichnis)
allebooleanNur Administratoren: Daten aller Benutzer
Beispiel-Prompts
Exportiere mein geschäftliches Fahrtenbuch 2026 als PDF.Sichere alle meine Daten als JSON.
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "export_fahrtenbuch", "arguments": {"format": "…"}}}
LIESTexport_gpxRoute als GPX

Speichert die GPS-Route einer Fahrt als GPX 1.1 (Höhe, Zeit, Tempo) – z. B. für Karten-Apps.

Parameter (* Pflicht)
NameTypBeschreibung
id *stringFahrt-ID
ziel_pfadstringLokaler Zielpfad der Datei (Standard: aktuelles Verzeichnis)
allebooleanNur Administratoren: Daten aller Benutzer
Beispiel-Prompts
Speichere die Route meiner Ostseefahrt als GPX.
Aufruf (JSON-RPC)
{"method": "tools/call", "params": {"name": "export_gpx", "arguments": {"id": "…"}}}

📋 Prompts (Vorlagen)

PromptBeschreibungArgumente
monatsberichtBericht für einen Monat (Fahrten, Fahrtenbuch, Ausgaben, Fehler) mit Einschätzung.monat: Monat JJJJ-MM
fahrtenbuch_vervollstaendigenNicht zugeordnete Fahrten finden und Vorschläge zur Zuordnung machen.von: Startdatum JJJJ-MM-TT
fahrzeug_checkZustand aller Fahrzeuge prüfen (Fehler, Batterie, Wartung).–

Ressource: fahrten://openapi.yaml – die OpenAPI-Spezifikation der REST-API.

API-Dokumentation v1.4.0

REST-Schnittstelle für Fahrten, Fahrzeuge, Fehlercodes und Messwerte der iOS-App OBDRest · OpenAPI 3.1.0 · openapi.yaml herunterladen

📘 Grundlagen

Die iOS-App OBDRest liest per OBD2-Adapter (ELM327, Bluetooth LE) Fahrzeugdaten aus, zeichnet Fahrten auf und sendet sie an diesen Server. Über dieselbe Schnittstelle lassen sich alle Daten lesen, verwalten und exportieren – oder ein eigener Server implementieren, an den die App ihre Daten schickt (Server-Dialog in der App: Adresse, Benutzer, Passwort).

Antwortformat: Alle JSON-Antworten haben den Umschlag { "ok": true, "daten": … } bzw. { "ok": false, "fehler": "Klartext", "details": … }. Zeiten sind ISO 8601 in UTC.

Anmeldung (zuerst lesen):

  1. POST /auth/login mit Benutzername und Passwort (SSO-Konto oder lokales Konto) → daten.token.
  2. Jeder weitere Aufruf mit Kopfzeile Authorization: Bearer <token>. Tokens für client: "app" gelten 90 Tage, für client: "web" 12 Stunden (dann zusätzlich als httpOnly-Cookie fahrten_session).
  3. Alternativ für Skripte: HTTP Basic (curl -u benutzer:passwort).

Rechte: Normale Benutzer sehen und ändern nur eigene Daten. Administratoren sehen mit ?alle=1 die Daten aller Benutzer bzw. mit ?benutzer=<id> die eines Benutzers und verwalten Benutzer unter /admin/benutzer.

Uploads sind idempotent: Fahrten, Fehlerauslesungen und Momentaufnahmen tragen eine UUID der App, Fahrzeuge werden über Benutzer + Fahrgestellnummer (VIN) erkannt. Ein erneutes Senden erzeugt keine Dubletten.

Server
https://app.fahrten.fusenigk.de/api/v1 – Produktion (gehostet)
https://fahrten.fusenigk.de/api/v1 – Weiterleitung für ältere App-Installationen
http://localhost:3330/api/v1 – On-Premises / eigene Installation (Docker Compose)

📦 Antwortformat und Fehler

Jede JSON-Antwort ist ein Umschlag: {"ok": true, "daten": …} bei Erfolg, {"ok": false, "fehler": "Klartext", "details": …} bei Fehlern. Exporte (CSV, JSON-Datei, GPX) liefern die Datei direkt.

StatusBedeutung
200/201Erfolg
400Ungültige Eingabe (zod-Prüfung, details nennt das Feld)
401Nicht angemeldet oder Token abgelaufen → neu anmelden
403Keine Berechtigung (z. B. senden, löschen, Administration)
404Nicht gefunden – auch, wenn der Datensatz einem anderen Benutzer gehört
409/429Konflikt (Name vergeben) / zu viele Anfragen
500/503Serverfehler / SSO oder Datenbank nicht erreichbar

Anmeldung

Login, Registrierung, Abmelden, eigener Benutzer

POST/auth/login🌐 öffentlich

Anmelden und Token holen

Prüft das Passwort über SSO (Keycloak, Realm fusenigk) oder – bei lokalen Konten – gegen den gespeicherten scrypt-Hash. Nur Benutzer, die in der App freigeschaltet sind (Tabelle users), erhalten ein Token. Der Aufruf schreibt nichts in die Datenbank. Nach 10 Fehlversuchen je IP in 15 Minuten antwortet der Server mit 429.

API-Recht: Konten ohne Recht darfApi (z. B. das Demo-Konto demo) erhalten mit client: "app" die Antwort 403 (grund: api_disabled) – erst nach geprüftem Passwort. Solche Konten können sich nur im Browser anmelden; Bearer-Token und HTTP Basic werden für sie ebenfalls mit 403 abgelehnt.

Anfrage (application/json) – Schema LoginAnfrage
{
  "username": "max.mustermann",
  "password": "geheim-und-lang",
  "client": "app"
}
Antworten
200Angemeldet
400Ungültige Eingabe
401Benutzername oder Passwort falsch (auch bei unbekanntem Benutzer – keine Enumeration)
403Passwort richtig, aber Konto nicht freigeschaltet, gesperrt oder ohne API-Recht (grund: api_disabled, z. B. Demo-Konto)
429Zu viele Fehlversuche
503SSO-Server nicht erreichbar
Beispielantwort
{
  "ok": true,
  "daten": {
    "benutzer": {
      "id": 7,
      "username": "max.mustermann",
      "name": "Max Mustermann",
      "email": "max@example.org",
      "rolle": "user",
      "istAdmin": false,
      "darfSenden": true,
      "darfLoeschen": true,
      "darfApi": true,
      "aktiv": true,
      "anmeldung": "local"
    },
    "methode": "local",
    "token": "eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoiRGVtby1CZW51dHplciIsImFydCI6ImFwcCJ9.…",
    "ablauf": "2027-02-05T09:20:00.000Z"
  }
}
curl – Zugangsdaten setzen (eigenes Konto – das Demo-Konto hat keinen API-Zugriff)
export BENUTZER='max.mustermann'
export PASSWORT='geheim-und-lang'
curl – Login und Token in Variable speichern
TOKEN=$(curl -s https://app.fahrten.fusenigk.de/api/v1/auth/login \
  -H 'Content-Type: application/json' \
  -d "{\"username\":\"$BENUTZER\",\"password\":\"$PASSWORT\",\"client\":\"app\"}" | jq -r .daten.token)
echo "$TOKEN"
curl – Danach jeder Aufruf mit Bearer-Token
curl -s https://app.fahrten.fusenigk.de/api/v1/auth/me -H "Authorization: Bearer $TOKEN"
curl – Alternative ohne Token – HTTP Basic
curl -s -u "$BENUTZER:$PASSWORT" https://app.fahrten.fusenigk.de/api/v1/auth/me
POST/auth/registrieren🌐 öffentlich

Lokales Konto anlegen

Legt einen lokalen Benutzer (Rolle user, darf senden und eigene Fahrten löschen) in der Datenbank an und meldet ihn direkt an. Reservierte Namen (admin, demo, …) und vergebene Namen → 409. Höchstens 5 Registrierungen je IP in 15 Minuten.

Anfrage (application/json) – Schema Registrierung
{
  "username": "max.mustermann",
  "name": "Max Mustermann",
  "email": "max@example.org",
  "passwort": "geheim-und-lang",
  "client": "app"
}
Antworten
201Angelegt und angemeldet (Antwort wie Login)
400Ungültige Eingabe
409Name reserviert oder vergeben
429Zu viele Registrierungen
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/auth/registrieren \
  -H 'Content-Type: application/json' \
  -d '{"username":"max.mustermann","name":"Max Mustermann","email":"max@example.org","passwort":"geheim-und-lang","client":"app"}'
GET/auth/me🔒 Anmeldung nötig

Angemeldeter Benutzer mit Rechten

Antworten
200Benutzer
401Nicht angemeldet
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/auth/me -H "Authorization: Bearer $TOKEN"
POST/auth/logout🌐 öffentlich

Sitzungs-Cookie löschen

Bearer-Tokens sind zustandslos (JWT) und laufen ab; das Abmelden betrifft nur das Browser-Cookie.

Antworten
200Abgemeldet
429Zu viele Anfragen
curl
curl -s -X POST https://app.fahrten.fusenigk.de/api/v1/auth/logout

Synchronisierung

Uploads der iOS-App (auch für eigene Server-Implementierungen maßgeblich)

POST/sync/fahrten🔒 Anmeldung nötig

Fahrten inklusive Messpunkte senden

Nimmt 1–50 Fahrten im Codable-Format der App an (Trip). Vorhandene Fahrten derselben UUID werden ersetzt (inkl. aller Messpunkte); eine UUID eines anderen Benutzers wird nie überschrieben (status: fremd). Das Fahrzeug wird über vin zugeordnet bzw. angelegt. Recht darfSenden erforderlich.

Anfrage (application/json)
Antworten
200Ergebnis je Fahrt
400Ungültige Eingabe
401Nicht angemeldet
403Keine Berechtigung zum Senden
Beispielantwort
{
  "ok": true,
  "daten": {
    "fahrten": [
      {
        "id": "6f1b2c3d-4e5f-4a1b-9c2d-0123456789ab",
        "status": "neu",
        "messpunkte": 1834
      }
    ]
  }
}
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/sync/fahrten \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"fahrzeugName":"GLC 220 d","trips":[{"id":"6F1B2C3D-4E5F-4A1B-9C2D-0123456789AB",
       "startDate":"2026-11-07T07:00:00Z","endDate":"2026-11-07T07:24:00Z","kind":"geschaeftlich",
       "note":"Kundentermin","fuelType":"diesel","vin":"WDC2539051F123456","isDemo":false,
       "summary":{"distanceKm":18.4,"litersPer100km":6.1,"eco":{"score":81,"factors":[]}},
       "samples":[{"time":"2026-11-07T07:00:02Z","speed":12.5,"rpm":1100,"latitude":52.52,"longitude":13.405}]}]}'
POST/sync/fahrzeug🔒 Anmeldung nötig

Fahrzeug- und Steuergerätedaten (OBD-Modus 09) senden

Anfrage (application/json) – Schema FahrzeugUpload
Antworten
200Fahrzeug angelegt/aktualisiert
403Keine Berechtigung zum Senden
Beispielantwort
{
  "ok": true,
  "daten": {
    "fahrzeugId": 4
  }
}
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/sync/fahrzeug \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"vin":"WDC2539051F123456","name":"Mercedes-Benz GLC (2015)","fuelType":"diesel",
       "protocol":"ISO 15765-4 CAN (11 Bit, 500 kBaud)","adapter":"IOS-Vlink",
       "ecus":[{"ecu":"7E8","name":"ECM – EngineControl","calibrationIDs":["6519015400"],"calibrationVerificationNumbers":["1A2B3C4D"]}]}'
POST/sync/fehler🔒 Anmeldung nötig

Fehlerspeicher-Auslesung und Fehlerverlauf senden

Speichert die Auslesung roh und führt den Verlauf je Code zusammen (erstmals/zuletzt gesehen, Anzahl, aktiv).

Anfrage (application/json) – Schema FehlerUpload
Antworten
200gespeichert
401Nicht angemeldet
Beispielantwort
{
  "ok": true,
  "daten": {
    "id": "0d6e…",
    "neu": true,
    "codes": 2,
    "aktiv": 1
  }
}
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/sync/fehler \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"id":"0D6E2A11-1C2B-4E7F-9A10-2B3C4D5E6F70","vin":"WDC2539051F123456","readAt":"2026-11-07T07:01:00Z",
       "entries":[{"code":"P2002","kind":"stored","ecu":"7E8","description":"Dieselpartikelfilter – Wirkungsgrad unter Schwellenwert","udsStatus":47}],
       "udsECUs":["7E8"],"history":[]}'
POST/sync/messwerte🔒 Anmeldung nötig

Momentaufnahme aller Live-Messwerte senden

Anfrage (application/json) – Schema Momentaufnahme
Antworten
200gespeichert
401Nicht angemeldet
Beispielantwort
{
  "ok": true,
  "daten": {
    "id": "9a…",
    "neu": true,
    "werte": 42
  }
}
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/sync/messwerte \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"id":"9A1B2C3D-0000-4000-8000-000000000001","vin":"WDC2539051F123456","takenAt":"2026-11-07T07:10:00Z",
       "voltage":14.1,"protocol":"ISO 15765-4 CAN","readings":[{"pid":"0C","ecu":"7E8","name":"Drehzahl","value":1850,"unit":"U/min","group":"Motor"}],
       "findings":[{"title":"Ladespannung in Ordnung","detail":"14,1 V","severity":"ok"}]}'
GET/sync/index🔒 Anmeldung nötig

Eigene Fahrt-IDs mit Änderungsstempel

Grundlage für den Abgleich in der App – fehlende Fahrten werden geladen, im Web geänderte Zuordnungen übernommen.

Antworten
200Index
401Nicht angemeldet
Beispielantwort
{
  "ok": true,
  "daten": {
    "fahrten": [
      {
        "id": "6F1B2C3D-4E5F-4A1B-9C2D-0123456789AB",
        "aktualisiert": "2026-11-07T08:00:00.000Z",
        "messpunkte": 1834
      }
    ]
  }
}
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/sync/index -H "Authorization: Bearer $TOKEN" | jq '.daten.fahrten | length'
POST/sync/ausgaben🔒 Anmeldung nötig

Ausgaben der App senden (1–500, idempotent über die UUID)

Anfrage (application/json)
{
  "ausgaben": [
    {
      "kategorie": "tanken",
      "datum": "2026-11-07T08:15:00Z",
      "betrag": 82.45,
      "fahrzeugId": 4,
      "anbieter": "Aral Unter den Linden",
      "liter": 48.6,
      "preisJeLiter": 1.699,
      "kraftstoff": "Diesel",
      "vollgetankt": true,
      "kmStand": 129980,
      "id": "3c1e5a2b-7d4f-4e8a-9b1c-2d3e4f5a6b7c"
    }
  ]
}
Antworten
200Status je Ausgabe (neu/aktualisiert/fremd)
401Nicht angemeldet
403keine Berechtigung
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/sync/ausgaben -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' -d @ausgaben.json
POST/sync/kilometerstand🔒 Anmeldung nötig

Kilometerstände der App senden (1–500, idempotent über die UUID, Fahrzeug über die VIN)

Anfrage (application/json)
{
  "kilometerstaende": [
    {
      "id": "5b0e7d1c-2a4f-4c3e-8d9a-1f2e3d4c5b6a",
      "vin": "WDC2539091F000000",
      "km": 128450,
      "datum": "2026-11-07T09:00:00Z"
    }
  ]
}
Antworten
200Status je Eintrag (neu/aktualisiert/fremd/kein-fahrzeug)
401Nicht angemeldet
403keine Berechtigung
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/sync/kilometerstand -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' -d @kilometerstaende.json
POST/sync/unbekannt🔒 Anmeldung nötig

Unbekannte Codes der App melden (PIDs ohne Dekoder, Fehlercodes ohne Beschreibung)

Verdichtet je Benutzer + Fahrzeug (VIN) + Art + Code + Steuergerät; die letzten 20 Rohdaten bleiben als Proben erhalten. Administratoren werten die Einträge unter /admin/unbekannt aus.

Anfrage (application/json)
{
  "vin": "WDC2539091F000000",
  "protokoll": "ISO 15765-4 CAN (11 bit, 500 kbaud)",
  "adapter": "Vgate iCar Pro",
  "codes": [
    {
      "art": "pid",
      "code": "8B",
      "ecu": "7E8",
      "modus": "01",
      "roh": "1F 00 2A 10",
      "gesehen": "2026-11-07T18:00:00Z"
    }
  ]
}
Antworten
200Fahrzeug-ID, Anzahl Codes, davon neu
400ungültige Eingabe (z. B. Rohdaten nicht als Hex)
401Nicht angemeldet
403keine Berechtigung zum Senden
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/sync/unbekannt -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' -d @unbekannt.json
GET/sync/ausgaben-index🔒 Anmeldung nötig

Eigene Ausgaben-IDs mit Änderungsstempel

Antworten
200`daten.ausgaben[]`
401Nicht angemeldet
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/sync/ausgaben-index -H "Authorization: Bearer $TOKEN"

Fahrten

Fahrten lesen, Fahrtenbuch zuordnen (Privat/Geschäftlich/Arbeitsweg), löschen

GET/fahrten🔒 Anmeldung nötig

Fahrten auflisten

Parameter
NameOrtTypBeschreibung
allequerystring (1)

Nur Administratoren: Daten aller Benutzer

benutzerqueryinteger

Nur Administratoren: Daten eines bestimmten Benutzers

fahrzeugqueryinteger

Fahrzeug-ID

vonquerystring · dateBeispiel: 2026-10-01
bisquerystring · dateBeispiel: 2026-10-31
artqueryFahrtArt
suchequerystring

Volltext in Adressen und Notiz

limitqueryinteger
offsetqueryinteger
Antworten
200Seite der Fahrtenliste
401Nicht angemeldet
curl – Geschäftliche Fahrten im Oktober
curl -s 'https://app.fahrten.fusenigk.de/api/v1/fahrten?art=geschaeftlich&von=2026-10-01&bis=2026-10-31' \
  -H "Authorization: Bearer $TOKEN" | jq '.daten.fahrten[] | {start, km, startAdresse, zielAdresse, notiz}'
PATCH/fahrten🔒 Anmeldung nötig

Sammelzuweisung Privat / Geschäftlich / Arbeitsweg

Anfrage (application/json)
Antworten
200Anzahl geänderter Fahrten
401Nicht angemeldet
Beispielantwort
{
  "ok": true,
  "daten": {
    "geaendert": 2
  }
}
curl
curl -s -X PATCH https://app.fahrten.fusenigk.de/api/v1/fahrten \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"ids":["6f1b2c3d-4e5f-4a1b-9c2d-0123456789ab","7a2c…"],"kind":"geschaeftlich"}'
GET/fahrten/{id}🔒 Anmeldung nötig

Fahrt mit allen Messpunkten

Parameter
NameOrtTypBeschreibung
idpath · Pflichtstring · uuid
formatquerystring (app)

app liefert das Codable-Format der iOS-App (Trip)

allequerystring (1)

Nur Administratoren: Daten aller Benutzer

Antworten
200Fahrt inkl. `punkte` (bzw. `samples` bei format=app)
404Nicht gefunden (oder nicht sichtbar)
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/fahrten/$ID -H "Authorization: Bearer $TOKEN" | jq '.daten | {km, art, punkte: (.punkte|length)}'
PATCH/fahrten/{id}🔒 Anmeldung nötig

Art, Etikett und Beschreibung einer Fahrt ändern

Parameter
NameOrtTypBeschreibung
idpath · Pflichtstring · uuid
Anfrage (application/json)
{
  "kind": "geschaeftlich",
  "note": "Kundentermin Adlershof",
  "details": "Projektbesprechung mit Frau Muster.\nRückweg über Lager Schönefeld (Material abgeholt)."
}
Antworten
200geändert
404Nicht gefunden (oder nicht sichtbar)
curl
curl -s -X PATCH https://app.fahrten.fusenigk.de/api/v1/fahrten/$ID \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"kind":"geschaeftlich","note":"Kundentermin Adlershof","details":"Projektbesprechung.\nRückweg über Lager Schönefeld."}'
DELETE/fahrten/{id}🔒 Anmeldung nötig

Fahrt löschen (Recht darfLoeschen)

Parameter
NameOrtTypBeschreibung
idpath · Pflichtstring · uuid
Antworten
200gelöscht
403Keine Berechtigung
404Nicht gefunden (oder nicht sichtbar)
curl
curl -s -X DELETE https://app.fahrten.fusenigk.de/api/v1/fahrten/$ID -H "Authorization: Bearer $TOKEN"

Fahrzeuge

Fahrzeuge je Benutzer (erkannt über die Fahrgestellnummer)

GET/fahrzeuge🔒 Anmeldung nötig

Fahrzeuge mit Kennzahlen

Parameter
NameOrtTypBeschreibung
allequerystring (1)

Nur Administratoren: Daten aller Benutzer

Antworten
200Liste (`daten.fahrzeuge`)
401Nicht angemeldet
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/fahrzeuge -H "Authorization: Bearer $TOKEN" | jq '.daten.fahrzeuge[] | {name, vin, fahrten, km, fehlerAktiv}'
GET/fahrzeuge/{id}🔒 Anmeldung nötig

Fahrzeug mit Monatsverlauf, Fehlern, letzten Fahrten und letzten Messwerten

Parameter
NameOrtTypBeschreibung
idpath · Pflichtinteger
Antworten
200Fahrzeug
404Nicht gefunden (oder nicht sichtbar)
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/fahrzeuge/4 -H "Authorization: Bearer $TOKEN"
GET/fahrzeuge/{id}/kilometerstand🔒 Anmeldung nötig

Kilometerstand – letzter und geschätzter Stand, Verlauf (manuell und aus Ausgaben)

aktuell ist der jüngste bekannte Stand – manuell erfasst oder als kmStand einer Ausgabe (Tanken, Parken, Reparatur, Sonstiges). geschaetzt = km + Summe der danach aufgezeichneten Fahrten (seitherKm).

Parameter
NameOrtTypBeschreibung
idpath · Pflichtinteger
Antworten
200Kilometerstand
401Nicht angemeldet
404Nicht gefunden (oder nicht sichtbar)
Beispielantwort
{
  "ok": true,
  "daten": {
    "aktuell": {
      "km": 128450,
      "datum": "2026-11-01T09:00:00Z",
      "geschaetzt": 128712,
      "seitherKm": 262
    },
    "verlauf": [
      {
        "id": "3C1E5A2B-7D4F-4E8A-9B1C-2D3E4F5A6B7C",
        "km": 128450,
        "datum": "2026-11-01T09:00:00Z",
        "quelle": "manuell",
        "notiz": "Tacho abgelesen",
        "ausgabeId": null
      }
    ]
  }
}
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/fahrzeuge/4/kilometerstand -H "Authorization: Bearer $TOKEN"
POST/fahrzeuge/{id}/kilometerstand🔒 Anmeldung nötig

Kilometerstand erfassen (idempotent über optionale UUID)

Parameter
NameOrtTypBeschreibung
idpath · Pflichtinteger
Anfrage (application/json) – Schema Kilometerstand
{
  "km": 128450,
  "datum": "2026-11-07T09:00:00Z",
  "notiz": "Tacho abgelesen"
}
Antworten
200aktualisiert
201neu angelegt
400ungültige Eingabe
401Nicht angemeldet
403keine Berechtigung (z. B. Demo-Zugang)
404Nicht gefunden (oder nicht sichtbar)
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/fahrzeuge/4/kilometerstand \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"km": 128450, "notiz": "Tacho abgelesen"}'
DELETE/kilometerstand/{id}🔒 Anmeldung nötig

Manuell erfassten Kilometerstand löschen (Stände aus Ausgaben über die Ausgabe ändern)

Parameter
NameOrtTypBeschreibung
idpath · Pflichtstring · uuid
Antworten
200gelöscht
401Nicht angemeldet
403keine Berechtigung
404Nicht gefunden (oder nicht sichtbar)
curl
curl -s -X DELETE https://app.fahrten.fusenigk.de/api/v1/kilometerstand/3c1e5a2b-7d4f-4e8a-9b1c-2d3e4f5a6b7c -H "Authorization: Bearer $TOKEN"

Fehler

Fehlercodes (DTC) und Auslesevorgänge

GET/fehler🔒 Anmeldung nötig

Fehlercodes (aktiv und alt)

Parameter
NameOrtTypBeschreibung
aktivquerystring (1)

nur aktive Codes

fahrzeugqueryinteger
allequerystring (1)

Nur Administratoren: Daten aller Benutzer

Antworten
200Liste (`daten.fehler`)
401Nicht angemeldet
curl
curl -s 'https://app.fahrten.fusenigk.de/api/v1/fehler?aktiv=1' -H "Authorization: Bearer $TOKEN" | jq '.daten.fehler[] | {code, beschreibung, fahrzeug}'
GET/fehler/{id}🔒 Anmeldung nötig

Fehlercode mit allen Auslesungen, in denen er vorkam

Parameter
NameOrtTypBeschreibung
idpath · Pflichtinteger
Antworten
200Fehler
404Nicht gefunden (oder nicht sichtbar)
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/fehler/12 -H "Authorization: Bearer $TOKEN"
GET/fehler/auslesungen🔒 Anmeldung nötig

Auslesevorgänge des Fehlerspeichers

Antworten
200Liste (`daten.auslesungen`)
401Nicht angemeldet
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/fehler/auslesungen -H "Authorization: Bearer $TOKEN"

Ausgaben

Tanken, Parken, Reparatur/Wartung, Sonstiges – erfassen, ändern, auswerten

GET/ausgaben🔒 Anmeldung nötig

Ausgaben auflisten (mit Summen je Kategorie)

Parameter
NameOrtTypBeschreibung
kategoriequerystring (tanken, parken, reparatur, sonstiges)
vonquerystring · date
bisquerystring · date
fahrzeugqueryinteger
limitqueryinteger
allequerystring (1)

Nur Administratoren: Daten aller Benutzer

Antworten
200`daten.ausgaben[]` (inkl. Anzahl Belege), `daten.summen`, `daten.gesamt`
401Nicht angemeldet
curl
curl -s 'https://app.fahrten.fusenigk.de/api/v1/ausgaben?kategorie=tanken&von=2026-01-01' -H "Authorization: Bearer $TOKEN" | jq '.daten | {gesamt, summen}'
POST/ausgaben🔒 Anmeldung nötig

Ausgabe erfassen (Recht „senden“)

Anfrage (application/json) – Schema Ausgabe
{
  "kategorie": "tanken",
  "datum": "2026-11-07T08:15:00Z",
  "betrag": 82.45,
  "fahrzeugId": 4,
  "anbieter": "Aral Unter den Linden",
  "liter": 48.6,
  "preisJeLiter": 1.699,
  "kraftstoff": "Diesel",
  "vollgetankt": true,
  "kmStand": 129980
}
Antworten
201angelegt (Detail mit `belegListe`)
400Ungültige Eingabe
401Nicht angemeldet
403keine Berechtigung
curl – Reparatur erfassen
curl -s https://app.fahrten.fusenigk.de/api/v1/ausgaben -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"kategorie":"reparatur","datum":"2026-11-05T09:00:00Z","betrag":489.60,"art":"Inspektion","anbieter":"Mercedes-Benz Niederlassung Berlin","kmStand":129310,"rechnungsNr":"R-2026-48311"}'
curl – Parken erfassen
curl -s https://app.fahrten.fusenigk.de/api/v1/ausgaben -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"kategorie":"parken","datum":"2026-11-06T09:30:00Z","betrag":6.50,"dauerMin":120,"anbieter":"Parkhaus WISTA Adlershof"}'
GET/ausgaben/{id}🔒 Anmeldung nötig

Ausgabe mit Belegliste

Parameter
NameOrtTypBeschreibung
idpath · Pflichtstring · uuid
Antworten
200Ausgabe
401Nicht angemeldet
404Nicht gefunden (oder nicht sichtbar)
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/ausgaben/$AUSGABE -H "Authorization: Bearer $TOKEN"
PUT/ausgaben/{id}🔒 Anmeldung nötig

Ausgabe ändern

Parameter
NameOrtTypBeschreibung
idpath · Pflichtstring · uuid
Anfrage (application/json) – Schema Ausgabe
{
  "kategorie": "tanken",
  "datum": "2026-11-07T08:15:00Z",
  "betrag": 82.45,
  "fahrzeugId": 4,
  "anbieter": "Aral Unter den Linden",
  "liter": 48.6,
  "preisJeLiter": 1.699,
  "kraftstoff": "Diesel",
  "vollgetankt": true,
  "kmStand": 129980
}
Antworten
200geändert
401Nicht angemeldet
404Nicht gefunden (oder nicht sichtbar)
curl
curl -s -X PUT https://app.fahrten.fusenigk.de/api/v1/ausgaben/$AUSGABE -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' -d '{"kategorie":"tanken","datum":"2026-11-07T08:15:00Z","betrag":82.45,"liter":48.6,"vollgetankt":true}'
DELETE/ausgaben/{id}🔒 Anmeldung nötig

Ausgabe samt Belegen (auch Dateien) löschen

Parameter
NameOrtTypBeschreibung
idpath · Pflichtstring · uuid
Antworten
200gelöscht
401Nicht angemeldet
404Nicht gefunden (oder nicht sichtbar)
curl
curl -s -X DELETE https://app.fahrten.fusenigk.de/api/v1/ausgaben/$AUSGABE -H "Authorization: Bearer $TOKEN"
GET/ausgaben/statistik🔒 Anmeldung nötig

Ausgaben je Monat und Kategorie, Spritpreis, Verbrauch aus Tankbelegen, Kosten je km, Parkorte, Reparaturarten

Parameter
NameOrtTypBeschreibung
vonquerystring · date
bisquerystring · date
fahrzeugqueryinteger
allequerystring (1)

Nur Administratoren: Daten aller Benutzer

Antworten
200Statistik
401Nicht angemeldet
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/ausgaben/statistik -H "Authorization: Bearer $TOKEN" | jq '.daten | {gesamt, kostenJeKm, tanken: .tanken.schnittPreis}'

Belege & Dokumente

Fotos und PDFs zu Ausgaben (Belege) und Fahrzeugen (Fahrzeugschein, Fotos, Versicherung) – nur eigene Dateien

GET/ausgaben/{id}/belege🔒 Anmeldung nötig

Belege einer Ausgabe

Parameter
NameOrtTypBeschreibung
idpath · Pflichtstring · uuid
Antworten
200`daten.belege[]` (Datei)
401Nicht angemeldet
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/ausgaben/$AUSGABE/belege -H "Authorization: Bearer $TOKEN" | jq '.daten.belege[] | {dateiname, mime, url}'
POST/ausgaben/{id}/belege🔒 Anmeldung nötig

Fotos/PDFs zu einer Ausgabe hochladen

Der Dateityp wird am Inhalt erkannt (JPEG, PNG, WebP, HEIC, PDF); SVG/HTML werden abgelehnt (415). Gleiche Dateien (SHA-256) werden nicht doppelt gespeichert. Ablage auf dem Server unter uploads/<gruppe>/<untergruppe>/u<benutzer>/<uuid>.

Parameter
NameOrtTypBeschreibung
idpath · Pflichtstring · uuid
Anfrage (application/json)
Antworten
201`daten.belege[]` gespeichert, `daten.fehler[]` abgelehnte Dateien
400keine gültige Datei
401Nicht angemeldet
403keine Berechtigung
404Nicht gefunden (oder nicht sichtbar)
curl – Rechnung und Foto hochladen
curl -s https://app.fahrten.fusenigk.de/api/v1/ausgaben/$AUSGABE/belege -H "Authorization: Bearer $TOKEN" \
  -F datei=@rechnung.pdf -F datei=@foto-quittung.jpg
GET/belege/{id}🔒 Anmeldung nötig

Datei ausliefern (nur eigene Dateien)

Liefert die Datei inline (?download=1 als Anhang). Fremde IDs ergeben 404 – auch bei manuell veränderter URL.

Parameter
NameOrtTypBeschreibung
idpath · Pflichtstring · uuid
downloadquerystring (1)
Antworten
200Datei
401Nicht angemeldet
404Nicht gefunden (oder nicht sichtbar)
curl
curl -s -OJ 'https://app.fahrten.fusenigk.de/api/v1/belege/$BELEG?download=1' -H "Authorization: Bearer $TOKEN"
DELETE/belege/{id}🔒 Anmeldung nötig

Datei löschen

Parameter
NameOrtTypBeschreibung
idpath · Pflichtstring · uuid
Antworten
200gelöscht
401Nicht angemeldet
404Nicht gefunden (oder nicht sichtbar)
curl
curl -s -X DELETE https://app.fahrten.fusenigk.de/api/v1/belege/$BELEG -H "Authorization: Bearer $TOKEN"
GET/fahrzeuge/{id}/dateien🔒 Anmeldung nötig

Fahrzeugschein, Fotos und Dokumente eines Fahrzeugs

Parameter
NameOrtTypBeschreibung
idpath · Pflichtinteger
Antworten
200`daten.dateien[]`
401Nicht angemeldet
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/fahrzeuge/4/dateien -H "Authorization: Bearer $TOKEN"
POST/fahrzeuge/{id}/dateien🔒 Anmeldung nötig

Fahrzeugschein/Foto/Dokument hochladen

Der Dateityp wird am Inhalt erkannt (JPEG, PNG, WebP, HEIC, PDF); SVG/HTML werden abgelehnt (415). Gleiche Dateien (SHA-256) werden nicht doppelt gespeichert. Ablage auf dem Server unter uploads/<gruppe>/<untergruppe>/u<benutzer>/<uuid>.

Parameter
NameOrtTypBeschreibung
idpath · Pflichtinteger
Anfrage (application/json)
Antworten
201`daten.dateien[]`, `daten.fehler[]`
401Nicht angemeldet
403keine Berechtigung
404Nicht gefunden (oder nicht sichtbar)
curl – Fahrzeugschein hochladen
curl -s https://app.fahrten.fusenigk.de/api/v1/fahrzeuge/4/dateien -H "Authorization: Bearer $TOKEN" \
  -F dokumentart=fahrzeugschein -F datei=@fahrzeugschein.pdf

Messwerte

Momentaufnahmen aller Live-Daten

GET/messwerte🔒 Anmeldung nötig

Momentaufnahmen der Live-Daten

Antworten
200Liste (`daten.momentaufnahmen`)
401Nicht angemeldet
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/messwerte -H "Authorization: Bearer $TOKEN"
GET/messwerte/{id}🔒 Anmeldung nötig

Alle Werte und Befunde einer Momentaufnahme

Parameter
NameOrtTypBeschreibung
idpath · Pflichtstring · uuid
Antworten
200Momentaufnahme
404Nicht gefunden (oder nicht sichtbar)
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/messwerte/$SNAP -H "Authorization: Bearer $TOKEN" | jq '.daten.werte[] | "\(.name): \(.value) \(.unit)"'
GET/messwerte/verlauf🔒 Anmeldung nötig

Verlauf eines Messwerts über alle Momentaufnahmen

Parameter
NameOrtTypBeschreibung
pidquerystring

OBD-PID hexadezimal, z. B. 42 = Steuergerätespannung, 05 = Kühlmittel

Antworten
200Verlauf
401Nicht angemeldet
Beispielantwort
{
  "ok": true,
  "daten": {
    "pid": "42",
    "verlauf": [
      {
        "zeit": "2026-10-01T08:12:00.000Z",
        "wert": 14.12,
        "einheit": "V"
      }
    ]
  }
}
curl
curl -s 'https://app.fahrten.fusenigk.de/api/v1/messwerte/verlauf?pid=42' -H "Authorization: Bearer $TOKEN"

Statistik

Kennzahlen und Diagrammdaten

GET/statistik🔒 Anmeldung nötig

Kennzahlen und Diagrammdaten

Summen, Monate, Fahrtenbuch je Art, Wochentage, Uhrzeiten, Eco-Score, Streckenlängen, Verbrauch, Fehler nach System und „Bewegung & Parken“ (Fahrzeit, Parkzeit, Verhältnis, Parkpausen).

Parameter
NameOrtTypBeschreibung
vonquerystring · date
bisquerystring · date
fahrzeugqueryinteger
allequerystring (1)

Nur Administratoren: Daten aller Benutzer

Antworten
200Statistik
401Nicht angemeldet
curl
curl -s 'https://app.fahrten.fusenigk.de/api/v1/statistik?von=2026-01-01' -H "Authorization: Bearer $TOKEN" | jq '.daten | {summe, bewegung: (.bewegung | {anteilFahren, verhaeltnis})}'
GET/karte/heatmap🔒 Anmeldung nötig

Heatmap: Aufenthaltsdichte aller Fahrten (Rasterzellen ≈ 110 m, Parkorte stärker gewichtet)

Parameter
NameOrtTypBeschreibung
vonquerystring · date
bisquerystring · date
artquerystring (privat, geschaeftlich, arbeitsweg, none)
fahrzeugqueryinteger
allequerystring (1)

Nur Administratoren: Daten aller Benutzer

Antworten
200`punkte[[lat, lon, gewicht]]`, `grenzen`, `haeufigsteOrte[]`
401Nicht angemeldet
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/karte/heatmap -H "Authorization: Bearer $TOKEN" | jq '.daten | {zellen, haeufigsteOrte}'
GET/karte/tage🔒 Anmeldung nötig

Jahreskarte: Fahrten und km je Tag (wie die GitHub-Aktivitätsanzeige)

Parameter
NameOrtTypBeschreibung
jahrqueryinteger
artquerystring (privat, geschaeftlich, arbeitsweg, none)
fahrzeugqueryinteger
allequerystring (1)

Nur Administratoren: Daten aller Benutzer

Antworten
200`tage[]`, `aktiveTage`, `laengsteSerie`, `meisteFahrten`
401Nicht angemeldet
curl
curl -s 'https://app.fahrten.fusenigk.de/api/v1/karte/tage?jahr=2026' -H "Authorization: Bearer $TOKEN" | jq '.daten | {aktiveTage, laengsteSerie}'

Export

Fahrtenbuch als CSV oder PDF, alle Daten als JSON, Route als GPX

GET/fahrten/{id}/gpx🔒 Anmeldung nötig

Route einer Fahrt als GPX 1.1

Parameter
NameOrtTypBeschreibung
idpath · Pflichtstring · uuid
Antworten
200GPX-Datei
404Nicht gefunden (oder nicht sichtbar)
curl
curl -s -OJ https://app.fahrten.fusenigk.de/api/v1/fahrten/$ID/gpx -H "Authorization: Bearer $TOKEN"
GET/export/fahrten.csv🔒 Anmeldung nötig

Fahrtenbuch als CSV

Semikolon-getrennt, UTF-8 mit BOM (öffnet direkt in Excel/Numbers), mit Summen je Art. Filter wie /fahrten.

Parameter
NameOrtTypBeschreibung
vonquerystring · date
bisquerystring · date
artqueryFahrtArt
fahrzeugqueryinteger
allequerystring (1)

Nur Administratoren: Daten aller Benutzer

Antworten
200CSV-Datei
401Nicht angemeldet
Beispielantwort
Datum;Beginn;Ende;Dauer (min);Start;Ziel;km;Art;Notiz;…
06.11.2026;09:43;10:01;18;Unter den Linden 10, 10117 Berlin;Rudower Chaussee 17, 12489 Berlin;17,4;Geschäftlich;Projektbesprechung;…
curl – Geschäftliche Fahrten 2026 für die Steuer
curl -s -o fahrtenbuch-2026.csv \
  'https://app.fahrten.fusenigk.de/api/v1/export/fahrten.csv?art=geschaeftlich&von=2026-01-01&bis=2026-12-31' \
  -H "Authorization: Bearer $TOKEN"
GET/export/fahrten.pdf🔒 Anmeldung nötig

Fahrtenbuch als PDF (A4 quer)

Druckfertiges Fahrtenbuch: Kopf mit Benutzer, Zeitraum und Filter, Summen je Fahrtart (Privat, Geschäftlich, Arbeitsweg, offen), Tabelle chronologisch nach Monaten mit Zwischensummen, Gesamtsumme und Seitenzahlen. Unicode-Schrift (DejaVu Sans), daher auch polnische Adressen korrekt. Filter wie /fahrten.

Parameter
NameOrtTypBeschreibung
vonquerystring · date
bisquerystring · date
artqueryFahrtArt
fahrzeugqueryinteger
suchequerystring
allequerystring (1)

Nur Administratoren: Daten aller Benutzer

Antworten
200PDF-Datei
401Nicht angemeldet
curl – Geschäftliche Fahrten Oktober als PDF
curl -s -o fahrtenbuch-oktober.pdf \
  'https://app.fahrten.fusenigk.de/api/v1/export/fahrten.pdf?art=geschaeftlich&von=2026-10-01&bis=2026-10-31' \
  -H "Authorization: Bearer $TOKEN"
GET/export/daten.json🔒 Anmeldung nötig

Alle eigenen Daten als JSON

Fahrzeuge, Fahrten, Fehlercodes, Auslesungen und Momentaufnahmen. Mit messpunkte=1 zusätzlich alle Messpunkte jeder Fahrt.

Parameter
NameOrtTypBeschreibung
messpunktequerystring (1)
allequerystring (1)

Nur Administratoren: Daten aller Benutzer

Antworten
200JSON-Datei
401Nicht angemeldet
Beispielantwort
{
  "benutzer": "max.mustermann",
  "format": "obdrest-fahrten-export",
  "version": 1,
  "fahrzeuge": [],
  "fahrten": [],
  "fehler": [],
  "auslesungen": [],
  "momentaufnahmen": []
}
curl
curl -s -o meine-daten.json 'https://app.fahrten.fusenigk.de/api/v1/export/daten.json?messpunkte=1' -H "Authorization: Bearer $TOKEN"

Administration

Benutzerverwaltung (nur Administratoren)

GET/admin/benutzer🔒 Anmeldung nötig

Alle Benutzer mit Statistik (nur Admin)

Antworten
200Liste
403Nur für Administratoren
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/admin/benutzer -H "Authorization: Bearer $ADMIN_TOKEN"
POST/admin/benutzer🔒 Anmeldung nötig

Benutzer anlegen (SSO oder lokal)

Anfrage (application/json) – Schema BenutzerEingabe
{
  "username": "kasia",
  "name": "Katarzyna",
  "rolle": "user",
  "darfSenden": true,
  "darfLoeschen": false,
  "aktiv": true,
  "anmeldung": "sso"
}
Antworten
201angelegt
409existiert bereits
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/admin/benutzer -H "Authorization: Bearer $ADMIN_TOKEN" \
  -H 'Content-Type: application/json' -d '{"username":"kasia","rolle":"user","anmeldung":"sso"}'
GET/admin/system🔒 Anmeldung nötig

Systemzustand (nur Administratoren)

App- und MariaDB-Version, Laufzeit, Arbeitsspeicher, Zeilen und Größe je Tabelle, Belegspeicher und Demo-Datenbestand.

Antworten
200OK
401Nicht angemeldet
403nur für Administratoren
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/admin/system -H "Authorization: Bearer $TOKEN"
GET/admin/fahrzeuge🔒 Anmeldung nötig

Alle Fahrzeuge mit Adapter und Kennzahlen (nur Administratoren)

Fahrzeuge aller Benutzer mit Protokoll, OBD-Adapter, Anzahl Steuergeräte, Fahrten, km, aktiven Fehlern und unbekannten Codes sowie eine Übersicht je Adapter.

Antworten
200OK
401Nicht angemeldet
403nur für Administratoren
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/admin/fahrzeuge -H "Authorization: Bearer $TOKEN"
GET/admin/aktivitaet🔒 Anmeldung nötig

Letzte Aktivität (nur Administratoren)

Zuletzt hochgeladene Fahrten, Fehlerauslesungen, Messwerte, Ausgaben und unbekannte Codes, Fahrten heute/7 Tage und letzte Synchronisierung je Benutzer.

Parameter
NameOrtTypBeschreibung
limitqueryinteger
Antworten
200OK
401Nicht angemeldet
403nur für Administratoren
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/admin/aktivitaet -H "Authorization: Bearer $TOKEN"
GET/admin/unbekannt🔒 Anmeldung nötig

Unbekannte Codes aller Benutzer mit Fahrzeug-Querverweis (nur Administratoren)

Parameter
NameOrtTypBeschreibung
artquerystring (pid, dtc)
statusquerystring (neu, in-analyse, geklaert, ignoriert)
fahrzeugqueryinteger
suchequerystring

Code, VIN oder Fahrzeugname

Antworten
200Liste (neu zuerst) mit Rohdaten-Proben, Fahrzeug (VIN, Modell, Steuergeräte, Kilometerstand) und Benutzer
401Nicht angemeldet
403nur für Administratoren
curl
curl -s 'https://app.fahrten.fusenigk.de/api/v1/admin/unbekannt?status=neu' -H "Authorization: Bearer $TOKEN"
PUT/admin/unbekannt/{id}🔒 Anmeldung nötig

Analyse-Status und Notiz setzen (nur Administratoren)

Parameter
NameOrtTypBeschreibung
idpath · Pflichtinteger
Anfrage (application/json)
{
  "status": "geklaert",
  "notiz": "PID 8B = SCR-Dosierung, A = Bitmaske"
}
Antworten
200geändert
404Eintrag nicht gefunden
403nur für Administratoren
curl
curl -s -X PUT https://app.fahrten.fusenigk.de/api/v1/admin/unbekannt/1 -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' -d '{"status":"in-analyse"}'
DELETE/admin/unbekannt/{id}🔒 Anmeldung nötig

Eintrag löschen (nur Administratoren)

Parameter
NameOrtTypBeschreibung
idpath · Pflichtinteger
Antworten
200gelöscht
404Eintrag nicht gefunden
403nur für Administratoren
curl
curl -s -X DELETE https://app.fahrten.fusenigk.de/api/v1/admin/unbekannt/1 -H "Authorization: Bearer $TOKEN"
GET/admin/benutzer/{id}🔒 Anmeldung nötig

Einzelnen Benutzer lesen

Parameter
NameOrtTypBeschreibung
idpath · Pflichtinteger
Antworten
200Benutzer
404Nicht gefunden (oder nicht sichtbar)
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/admin/benutzer/2 -H "Authorization: Bearer $ADMIN_TOKEN"
PUT/admin/benutzer/{id}🔒 Anmeldung nötig

Rolle, Rechte, Anmeldeart, Passwort ändern

Parameter
NameOrtTypBeschreibung
idpath · Pflichtinteger
Anfrage (application/json) – Schema BenutzerEingabe
{
  "darfLoeschen": true,
  "aktiv": true
}
Antworten
200geändert
400Ungültige Eingabe
curl
curl -s -X PUT https://app.fahrten.fusenigk.de/api/v1/admin/benutzer/2 -H "Authorization: Bearer $ADMIN_TOKEN" \
  -H 'Content-Type: application/json' -d '{"darfLoeschen":true}'
DELETE/admin/benutzer/{id}🔒 Anmeldung nötig

Benutzer mit allen Daten löschen

Parameter
NameOrtTypBeschreibung
idpath · Pflichtinteger
Antworten
200gelöscht
400Hauptadministrator bzw. eigenes Konto nicht löschbar
curl
curl -s -X DELETE https://app.fahrten.fusenigk.de/api/v1/admin/benutzer/7 -H "Authorization: Bearer $ADMIN_TOKEN"

System

Betriebszustand

GET/health🌐 öffentlich

Lebenszeichen inkl. Datenbank

Antworten
200ok
503Datenbank nicht erreichbar
429Zu viele Anfragen
Beispielantwort
{
  "ok": true,
  "daten": {
    "status": "ok",
    "datenbank": "ok",
    "zeit": "2026-11-07T09:00:00.000Z"
  }
}
curl
curl -s https://app.fahrten.fusenigk.de/api/v1/health

🧱 Datenmodelle

Die Upload-Formate entsprechen den Codable-Typen der iOS-App – wer einen eigenen Server baut, muss genau diese Felder annehmen.

Trip

Fahrt im Codable-Format der iOS-App

Feld (* Pflicht)TypBeschreibung
id *string · uuid
startDate *string · date-time
endDate *string · date-time
samplesarray von TripSample
summaryobject | null

TripSummary der App, u. a. distanceKm, maxSpeed, avgSpeed, fuelLiters, litersPer100km, co2Kg, idleSeconds, events[], eco{score}

startAddressstring | null
endAddressstring | null
kindFahrtArt

Fahrtenbuch-Zuordnung; none = noch nicht zugeordnet

notestring
detailsstring | null

Mehrzeilige, optionale Beschreibung der Fahrt

fuelTypestring (diesel, petrol)
vinstring | null
isDemoboolean
TripSample

Messpunkt (ca. 1 pro Sekunde)

Feld (* Pflicht)TypBeschreibung
time *string · date-time
speednumber | null

km/h

rpmnumber | null
loadnumber | null

Motorlast %

coolantnumber | null

°C

voltagenumber | null

V

ambientnumber | null

Außentemperatur °C

pedalnumber | null

Fahrpedal %

fuelRatenumber | null

l/h

latitudenumber | null
longitudenumber | null
altitudenumber | null

m über NN

FahrzeugUpload
Feld (* Pflicht)TypBeschreibung
vinstring | null
namestring | null
manufacturerstring | null
seriesstring | null
modelYearinteger | null
fuelTypestring | null
protocolstring | null
adapterstring | null
ecusarray von object
FehlerUpload
Feld (* Pflicht)TypBeschreibung
id *string · uuid
vinstring | null
readAt *string · date-time
entriesarray von object
udsECUsarray von string
historyarray von object
Momentaufnahme
Feld (* Pflicht)TypBeschreibung
id *string · uuid
vinstring | null
takenAt *string · date-time
voltagenumber | null
protocolstring | null
readings *array von object
findingsarray von object
Fahrt

Fahrt in der Listenansicht der Webapp

Feld (* Pflicht)TypBeschreibung
idstring · uuid
benutzerstring
fahrzeugstring | null
startstring · date-time
endestring · date-time
dauerSekundeninteger
kmnumber
maxKmhnumber | null
schnittKmhnumber | null
literJe100number | null
ecointeger | null
startAdressestring | null
zielAdressestring | null
artFahrtArt

Fahrtenbuch-Zuordnung; none = noch nicht zugeordnet

notizstring | null
beschreibungstring | null

Mehrzeilige Beschreibung (Trip.details)

Benutzer
Feld (* Pflicht)TypBeschreibung
idinteger
usernamestring
namestring | null
emailstring | null
rollestring (admin, user)
istAdminboolean
darfSendenboolean
darfLoeschenboolean
aktivboolean
anmeldungstring (sso, local)
darfApiboolean

REST-API erlaubt (App-Login, Bearer, Basic); sonst nur Browser-Sitzung

BenutzerEingabe
Feld (* Pflicht)TypBeschreibung
usernamestring
namestring | null
emailstring | null
rollestring (admin, user)
darfSendenboolean
darfLoeschenboolean
aktivboolean
anmeldungstring (sso, local)
passwortstring | null

nur bei anmeldung=local

notizstring | null
darfApiboolean
LoginAnfrage
Feld (* Pflicht)TypBeschreibung
username *string
password *string · password
clientstring (app, web)

app = Bearer-Token 90 Tage, web = Cookie 12 h

Registrierung
Feld (* Pflicht)TypBeschreibung
username *string
name *string
email *string · email
passwort *string
clientstring (app, web)