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
Schritt 1🔑 Anmelden mit curl
Jeder Aufruf außer /health, /auth/login und /auth/registrieren braucht eine Anmeldung. Hol dir zuerst ein Token und verwende es dann als Authorization: Bearer-Kopfzeile. Für die API brauchst du ein eigenes Konto (kostenlos registrieren). Das Demo-Konto demo ist aus Sicherheitsgründen nur im Browser nutzbar – API-Aufrufe beantwortet der Server mit 403.
Zugangsdaten setzen (eigenes Konto – das Demo-Konto hat keinen API-Zugriff)
export BENUTZER='max.mustermann'
export PASSWORT='geheim-und-lang'
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"
Danach jeder Aufruf mit Bearer-Token
curl -s https://app.fahrten.fusenigk.de/api/v1/auth/me -H "Authorization: Bearer $TOKEN"
Alternative ohne Token – HTTP Basic
curl -s -u "$BENUTZER:$PASSWORT" https://app.fahrten.fusenigk.de/api/v1/auth/me
Antwort
{
"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"
}
}
Ohne jq: Token aus dem Feld daten.token der Antwort kopieren. Fehlversuche: 401 (falsch), 403 (nicht freigeschaltet), 429 (zu viele Versuche).
📘 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):
POST /auth/login mit Benutzername und Passwort (SSO-Konto oder lokales Konto) → daten.token.- 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). - 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)
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.
| Status | Bedeutung |
|---|
| 200/201 | Erfolg |
| 400 | Ungültige Eingabe (zod-Prüfung, details nennt das Feld) |
| 401 | Nicht angemeldet oder Token abgelaufen → neu anmelden |
| 403 | Keine Berechtigung (z. B. senden, löschen, Administration) |
| 404 | Nicht gefunden – auch, wenn der Datensatz einem anderen Benutzer gehört |
| 409/429 | Konflikt (Name vergeben) / zu viele Anfragen |
| 500/503 | Serverfehler / 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
| 200 | Angemeldet |
| 400 | Ungültige Eingabe |
| 401 | Benutzername oder Passwort falsch (auch bei unbekanntem Benutzer – keine Enumeration) |
| 403 | Passwort richtig, aber Konto nicht freigeschaltet, gesperrt oder ohne API-Recht (grund: api_disabled, z. B. Demo-Konto) |
| 429 | Zu viele Fehlversuche |
| 503 | SSO-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
| 201 | Angelegt und angemeldet (Antwort wie Login) |
| 400 | Ungültige Eingabe |
| 409 | Name reserviert oder vergeben |
| 429 | Zu 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
| 200 | Benutzer |
| 401 | Nicht 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
| 200 | Abgemeldet |
| 429 | Zu 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
| 200 | Ergebnis je Fahrt |
| 400 | Ungültige Eingabe |
| 401 | Nicht angemeldet |
| 403 | Keine 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
| 200 | Fahrzeug angelegt/aktualisiert |
| 403 | Keine 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
| 200 | gespeichert |
| 401 | Nicht 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
| 200 | gespeichert |
| 401 | Nicht 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
| 200 | Index |
| 401 | Nicht 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
| 200 | Status je Ausgabe (neu/aktualisiert/fremd) |
| 401 | Nicht angemeldet |
| 403 | keine 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
| 200 | Status je Eintrag (neu/aktualisiert/fremd/kein-fahrzeug) |
| 401 | Nicht angemeldet |
| 403 | keine 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
| 200 | Fahrzeug-ID, Anzahl Codes, davon neu |
| 400 | ungültige Eingabe (z. B. Rohdaten nicht als Hex) |
| 401 | Nicht angemeldet |
| 403 | keine 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[]` |
| 401 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
alle | query | string (1) | Nur Administratoren: Daten aller Benutzer |
benutzer | query | integer | Nur Administratoren: Daten eines bestimmten Benutzers |
fahrzeug | query | integer | Fahrzeug-ID |
von | query | string · date | Beispiel: 2026-10-01 |
bis | query | string · date | Beispiel: 2026-10-31 |
art | query | FahrtArt | |
suche | query | string | Volltext in Adressen und Notiz |
limit | query | integer | |
offset | query | integer | |
Antworten
| 200 | Seite der Fahrtenliste |
| 401 | Nicht 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
| 200 | Anzahl geänderter Fahrten |
| 401 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
id | path · Pflicht | string · uuid | |
format | query | string (app) | app liefert das Codable-Format der iOS-App (Trip)
|
alle | query | string (1) | Nur Administratoren: Daten aller Benutzer |
Antworten
| 200 | Fahrt inkl. `punkte` (bzw. `samples` bei format=app) |
| 404 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
id | path · Pflicht | string · uuid | |
Anfrage (application/json)
{
"kind": "geschaeftlich",
"note": "Kundentermin Adlershof",
"details": "Projektbesprechung mit Frau Muster.\nRückweg über Lager Schönefeld (Material abgeholt)."
}
Antworten
| 200 | geändert |
| 404 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
id | path · Pflicht | string · uuid | |
Antworten
| 200 | gelöscht |
| 403 | Keine Berechtigung |
| 404 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
alle | query | string (1) | Nur Administratoren: Daten aller Benutzer |
Antworten
| 200 | Liste (`daten.fahrzeuge`) |
| 401 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
id | path · Pflicht | integer | |
Antworten
| 200 | Fahrzeug |
| 404 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
id | path · Pflicht | integer | |
Antworten
| 200 | Kilometerstand |
| 401 | Nicht angemeldet |
| 404 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
id | path · Pflicht | integer | |
Anfrage (application/json) – Schema Kilometerstand
{
"km": 128450,
"datum": "2026-11-07T09:00:00Z",
"notiz": "Tacho abgelesen"
}
Antworten
| 200 | aktualisiert |
| 201 | neu angelegt |
| 400 | ungültige Eingabe |
| 401 | Nicht angemeldet |
| 403 | keine Berechtigung (z. B. Demo-Zugang) |
| 404 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
id | path · Pflicht | string · uuid | |
Antworten
| 200 | gelöscht |
| 401 | Nicht angemeldet |
| 403 | keine Berechtigung |
| 404 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
aktiv | query | string (1) | nur aktive Codes |
fahrzeug | query | integer | |
alle | query | string (1) | Nur Administratoren: Daten aller Benutzer |
Antworten
| 200 | Liste (`daten.fehler`) |
| 401 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
id | path · Pflicht | integer | |
Antworten
| 200 | Fehler |
| 404 | Nicht 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
| 200 | Liste (`daten.auslesungen`) |
| 401 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
kategorie | query | string (tanken, parken, reparatur, sonstiges) | |
von | query | string · date | |
bis | query | string · date | |
fahrzeug | query | integer | |
limit | query | integer | |
alle | query | string (1) | Nur Administratoren: Daten aller Benutzer |
Antworten
| 200 | `daten.ausgaben[]` (inkl. Anzahl Belege), `daten.summen`, `daten.gesamt` |
| 401 | Nicht 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
| 201 | angelegt (Detail mit `belegListe`) |
| 400 | Ungültige Eingabe |
| 401 | Nicht angemeldet |
| 403 | keine 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
| Name | Ort | Typ | Beschreibung |
|---|
id | path · Pflicht | string · uuid | |
Antworten
| 200 | Ausgabe |
| 401 | Nicht angemeldet |
| 404 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
id | path · Pflicht | string · 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
| 200 | geändert |
| 401 | Nicht angemeldet |
| 404 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
id | path · Pflicht | string · uuid | |
Antworten
| 200 | gelöscht |
| 401 | Nicht angemeldet |
| 404 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
von | query | string · date | |
bis | query | string · date | |
fahrzeug | query | integer | |
alle | query | string (1) | Nur Administratoren: Daten aller Benutzer |
Antworten
| 200 | Statistik |
| 401 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
id | path · Pflicht | string · uuid | |
Antworten
| 200 | `daten.belege[]` (Datei) |
| 401 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
id | path · Pflicht | string · uuid | |
Anfrage (application/json)
Antworten
| 201 | `daten.belege[]` gespeichert, `daten.fehler[]` abgelehnte Dateien |
| 400 | keine gültige Datei |
| 401 | Nicht angemeldet |
| 403 | keine Berechtigung |
| 404 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
id | path · Pflicht | string · uuid | |
download | query | string (1) | |
Antworten
| 200 | Datei |
| 401 | Nicht angemeldet |
| 404 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
id | path · Pflicht | string · uuid | |
Antworten
| 200 | gelöscht |
| 401 | Nicht angemeldet |
| 404 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
id | path · Pflicht | integer | |
Antworten
| 200 | `daten.dateien[]` |
| 401 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
id | path · Pflicht | integer | |
Anfrage (application/json)
Antworten
| 201 | `daten.dateien[]`, `daten.fehler[]` |
| 401 | Nicht angemeldet |
| 403 | keine Berechtigung |
| 404 | Nicht 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
| 200 | Liste (`daten.momentaufnahmen`) |
| 401 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
id | path · Pflicht | string · uuid | |
Antworten
| 200 | Momentaufnahme |
| 404 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
pid | query | string | OBD-PID hexadezimal, z. B. 42 = Steuergerätespannung, 05 = Kühlmittel |
Antworten
| 200 | Verlauf |
| 401 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
von | query | string · date | |
bis | query | string · date | |
fahrzeug | query | integer | |
alle | query | string (1) | Nur Administratoren: Daten aller Benutzer |
Antworten
| 200 | Statistik |
| 401 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
von | query | string · date | |
bis | query | string · date | |
art | query | string (privat, geschaeftlich, arbeitsweg, none) | |
fahrzeug | query | integer | |
alle | query | string (1) | Nur Administratoren: Daten aller Benutzer |
Antworten
| 200 | `punkte[[lat, lon, gewicht]]`, `grenzen`, `haeufigsteOrte[]` |
| 401 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
jahr | query | integer | |
art | query | string (privat, geschaeftlich, arbeitsweg, none) | |
fahrzeug | query | integer | |
alle | query | string (1) | Nur Administratoren: Daten aller Benutzer |
Antworten
| 200 | `tage[]`, `aktiveTage`, `laengsteSerie`, `meisteFahrten` |
| 401 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
id | path · Pflicht | string · uuid | |
Antworten
| 200 | GPX-Datei |
| 404 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
von | query | string · date | |
bis | query | string · date | |
art | query | FahrtArt | |
fahrzeug | query | integer | |
alle | query | string (1) | Nur Administratoren: Daten aller Benutzer |
Antworten
| 200 | CSV-Datei |
| 401 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
von | query | string · date | |
bis | query | string · date | |
art | query | FahrtArt | |
fahrzeug | query | integer | |
suche | query | string | |
alle | query | string (1) | Nur Administratoren: Daten aller Benutzer |
Antworten
| 200 | PDF-Datei |
| 401 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
messpunkte | query | string (1) | |
alle | query | string (1) | Nur Administratoren: Daten aller Benutzer |
Antworten
| 200 | JSON-Datei |
| 401 | Nicht 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
| 200 | Liste |
| 403 | Nur 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
| 201 | angelegt |
| 409 | existiert 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
| 200 | OK |
| 401 | Nicht angemeldet |
| 403 | nur 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
| 200 | OK |
| 401 | Nicht angemeldet |
| 403 | nur 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
| Name | Ort | Typ | Beschreibung |
|---|
limit | query | integer | |
Antworten
| 200 | OK |
| 401 | Nicht angemeldet |
| 403 | nur 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
| Name | Ort | Typ | Beschreibung |
|---|
art | query | string (pid, dtc) | |
status | query | string (neu, in-analyse, geklaert, ignoriert) | |
fahrzeug | query | integer | |
suche | query | string | Code, VIN oder Fahrzeugname |
Antworten
| 200 | Liste (neu zuerst) mit Rohdaten-Proben, Fahrzeug (VIN, Modell, Steuergeräte, Kilometerstand) und Benutzer |
| 401 | Nicht angemeldet |
| 403 | nur 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
| Name | Ort | Typ | Beschreibung |
|---|
id | path · Pflicht | integer | |
Anfrage (application/json)
{
"status": "geklaert",
"notiz": "PID 8B = SCR-Dosierung, A = Bitmaske"
}
Antworten
| 200 | geändert |
| 404 | Eintrag nicht gefunden |
| 403 | nur 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
| Name | Ort | Typ | Beschreibung |
|---|
id | path · Pflicht | integer | |
Antworten
| 200 | gelöscht |
| 404 | Eintrag nicht gefunden |
| 403 | nur 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
| Name | Ort | Typ | Beschreibung |
|---|
id | path · Pflicht | integer | |
Antworten
| 200 | Benutzer |
| 404 | Nicht 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
| Name | Ort | Typ | Beschreibung |
|---|
id | path · Pflicht | integer | |
Anfrage (application/json) – Schema BenutzerEingabe
{
"darfLoeschen": true,
"aktiv": true
}
Antworten
| 200 | geändert |
| 400 | Ungü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
| Name | Ort | Typ | Beschreibung |
|---|
id | path · Pflicht | integer | |
Antworten
| 200 | gelöscht |
| 400 | Hauptadministrator 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
| 200 | ok |
| 503 | Datenbank nicht erreichbar |
| 429 | Zu 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) | Typ | Beschreibung |
|---|
id * | string · uuid | |
startDate * | string · date-time | |
endDate * | string · date-time | |
samples | array von TripSample | |
summary | object | null | TripSummary der App, u. a. distanceKm, maxSpeed, avgSpeed, fuelLiters, litersPer100km, co2Kg, idleSeconds, events[], eco{score} |
startAddress | string | null | |
endAddress | string | null | |
kind | FahrtArt | Fahrtenbuch-Zuordnung; none = noch nicht zugeordnet |
note | string | |
details | string | null | Mehrzeilige, optionale Beschreibung der Fahrt |
fuelType | string (diesel, petrol) | |
vin | string | null | |
isDemo | boolean | |
TripSample
Messpunkt (ca. 1 pro Sekunde)
| Feld (* Pflicht) | Typ | Beschreibung |
|---|
time * | string · date-time | |
speed | number | null | km/h |
rpm | number | null | |
load | number | null | Motorlast % |
coolant | number | null | °C |
voltage | number | null | V |
ambient | number | null | Außentemperatur °C |
pedal | number | null | Fahrpedal % |
fuelRate | number | null | l/h |
latitude | number | null | |
longitude | number | null | |
altitude | number | null | m über NN |
FahrzeugUpload
| Feld (* Pflicht) | Typ | Beschreibung |
|---|
vin | string | null | |
name | string | null | |
manufacturer | string | null | |
series | string | null | |
modelYear | integer | null | |
fuelType | string | null | |
protocol | string | null | |
adapter | string | null | |
ecus | array von object | |
FehlerUpload
| Feld (* Pflicht) | Typ | Beschreibung |
|---|
id * | string · uuid | |
vin | string | null | |
readAt * | string · date-time | |
entries | array von object | |
udsECUs | array von string | |
history | array von object | |
Momentaufnahme
| Feld (* Pflicht) | Typ | Beschreibung |
|---|
id * | string · uuid | |
vin | string | null | |
takenAt * | string · date-time | |
voltage | number | null | |
protocol | string | null | |
readings * | array von object | |
findings | array von object | |
Fahrt
Fahrt in der Listenansicht der Webapp
| Feld (* Pflicht) | Typ | Beschreibung |
|---|
id | string · uuid | |
benutzer | string | |
fahrzeug | string | null | |
start | string · date-time | |
ende | string · date-time | |
dauerSekunden | integer | |
km | number | |
maxKmh | number | null | |
schnittKmh | number | null | |
literJe100 | number | null | |
eco | integer | null | |
startAdresse | string | null | |
zielAdresse | string | null | |
art | FahrtArt | Fahrtenbuch-Zuordnung; none = noch nicht zugeordnet |
notiz | string | null | |
beschreibung | string | null | Mehrzeilige Beschreibung (Trip.details) |
Benutzer
| Feld (* Pflicht) | Typ | Beschreibung |
|---|
id | integer | |
username | string | |
name | string | null | |
email | string | null | |
rolle | string (admin, user) | |
istAdmin | boolean | |
darfSenden | boolean | |
darfLoeschen | boolean | |
aktiv | boolean | |
anmeldung | string (sso, local) | |
darfApi | boolean | REST-API erlaubt (App-Login, Bearer, Basic); sonst nur Browser-Sitzung |
BenutzerEingabe
| Feld (* Pflicht) | Typ | Beschreibung |
|---|
username | string | |
name | string | null | |
email | string | null | |
rolle | string (admin, user) | |
darfSenden | boolean | |
darfLoeschen | boolean | |
aktiv | boolean | |
anmeldung | string (sso, local) | |
passwort | string | null | nur bei anmeldung=local |
notiz | string | null | |
darfApi | boolean | |
LoginAnfrage
| Feld (* Pflicht) | Typ | Beschreibung |
|---|
username * | string | |
password * | string · password | |
client | string (app, web) | app = Bearer-Token 90 Tage, web = Cookie 12 h
|
Registrierung
| Feld (* Pflicht) | Typ | Beschreibung |
|---|
username * | string | |
name * | string | |
email * | string · email | |
passwort * | string | |
client | string (app, web) | |