Entwickler
REST-API für Ihre eigenen Systeme
Version 1.2.0 · Spezifikation (OpenAPI 3.1, JSON) · In allen Paketen inklusive
Lesender Zugriff auf Fahrzeuge, Fahrer, Aufträge, Aufgaben, Dokumente, Bußgelder, Kostenstellen und Rechnungen Ihrer Firma — per OAuth2, in allen Paketen inklusive.
Überblick
Die REST-API v1 von fleetfeat gibt Ihren eigenen Systemen — ERP, HR, Buchhaltung — lesenden Zugriff auf die Daten Ihrer Firma. Sie legen in fleetfeat einen Zugang an, wählen, welche Daten er lesen darf, und holen sich damit per OAuth2 ein Zugriffstoken. Die API ist in allen Paketen inklusive.
- Nur lesend: Außer dem Token-Endpunkt ist jeder Endpunkt ein
GET; über die API ändern Sie keine Daten in fleetfeat. - Ein Zugang gehört genau einer Firma und sieht nur deren Daten — immer die ganze Firma.
- JSON, Feldnamen in snake_case, alle Zeitangaben in UTC nach ISO 8601, Beträge in Cent.
- Listen mit Cursor-Paginierung und Filtern nach Zeitraum, Kennzeichen oder FIN.
- Höchstens 300 Aufrufe pro Minute je Zugang.
Schnellstart
Drei Schritte bis zur ersten Antwort. Die Beispiele nutzen curl; jede andere HTTP-Bibliothek funktioniert genauso.
1. Zugang anlegen
Melden Sie sich in fleetfeat an und öffnen Sie Einstellungen → API-Zugang. Den Bereich sieht nur, wer Zugriff auf die ganze Firma und das Recht „Berichte erstellen & exportieren“ hat — in der Regel der Super Admin.
Geben Sie dem Zugang eine Bezeichnung (z. B. „SAP Produktiv“) und wählen Sie unter „Freigegebene Daten“ nur die Scopes, die Ihre Anbindung braucht.
Nach dem Anlegen zeigt fleetfeat die Client-ID und das Client-Secret. Das Secret erscheint genau einmal; wir speichern es nur als Prüfsumme. Geht es verloren, erneuern Sie es an derselben Stelle („Secret erneuern“). „Entziehen“ sperrt den Zugang samt aller Tokens sofort.
2. Token holen
Ihr System tauscht Client-ID und Secret gegen ein Zugriffstoken (OAuth2 Client Credentials). Das Token gilt 60 Minuten; danach holen Sie einfach ein neues.
curl -s -X POST https://fleetfeat.de/api/v1/oauth/token \
-u "$CLIENT_ID:$CLIENT_SECRET" \
-d grant_type=client_credentialsAntwort:
{
"access_token": "ffat_…",
"token_type": "Bearer",
"expires_in": 3600,
"scope": "vehicles:read service-orders:read"
}3. Erste Abfrage
Mit dem Token im Header Authorization: Bearer … fragen Sie die Fahrzeuge Ihrer Firma ab:
curl -s "https://fleetfeat.de/api/v1/vehicles?limit=50" \
-H "Authorization: Bearer $ACCESS_TOKEN"Antwort (gekürzt):
{
"data": [
{
"id": "…",
"fin": "…",
"license_plate": "…",
"make": "…",
"model": "…",
"mileage_km": …,
"updated_at": "…"
}
],
"next_cursor": "…"
}Steht in der Antwort ein next_cursor, holen Sie die nächste Seite mit ?cursor=<Wert>. Auf der letzten Seite ist next_cursor null.
Scopes und Rechte
Ein Scope ist eine Datenart, die ein Zugang lesen darf. Beim Anlegen wählen Sie die Scopes; beim Token-Abruf kann Ihr System mit scope eine Teilmenge anfordern. Ohne Scope antwortet ein Endpunkt mit 403 insufficient_scope.
| Scope | Was der Zugang liest | Zusätzliches Recht beim Anlegen |
|---|---|---|
vehicles:read | Fahrzeuge lesen FIN, Kennzeichen, Stammdaten, Kilometerstand, Erstzulassung, Eigentum und Leasingende, Ausflottung; der aktuelle Fahrer nur zusammen mit drivers:read. | — |
drivers:read | Fahrer und Zuweisungsverlauf lesen (personenbezogene Daten) Fahrerzuweisungen: Name, Profil-ID, Art und Zeitraum der Zuweisung, Fahrzeug. Personenbezogene Daten. | — |
service-orders:read | Service-Aufträge lesen Status, Leistung, Termin und Fahrzeug je Service-Auftrag. | — |
tasks:read | Fuhrpark-Aufgaben lesen Titel, Beschreibung, Fälligkeit, Priorität, Status, Fahrzeug und zuständige Person; der Fahrer nur zusammen mit drivers:read. | „Fristen & Führerscheinkontrolle verwalten“ |
documents:read | Metadaten der Fahrzeugdokumente lesen und Download-Links ausstellen Unterlagen der Fahrzeugakte: Kategorie, Titel, Belegdatum, Betrag, SHA-256, Größe, Dateityp; die Datei nur über einen signierten Link. | — |
fines:read | Bußgelder lesen (Fahrerzuordnung nur mit drivers:read) Aktenzeichen, Tatzeit, Tatvorwurf, Ort, Behörde, Betrag, Fristen, Status; die Fahrerzuordnung nur zusammen mit drivers:read. Keine Führerscheindaten. | — |
cost-centers:read | Stammdaten der Kostenstellen lesen Nummer, Name, übergeordnete Kostenstelle, Gesellschaft, verantwortliche Person, Gültigkeit. | „Kosten & TCO sehen“ |
invoices:read | Rechnungen von fleetfeat lesen und Download-Links ausstellen Alle Belege von fleetfeat an Ihre Firma (Service, Abo, Storno, Korrektur): Nummer, Status, Beträge, Daten; PDF und E-Rechnung nur über signierte Links. | „Rechnungen & Belege sehen“ |
Ein Zugang gibt nie mehr heraus, als sein Anleger in der Oberfläche sieht. Deshalb verlangen einige Scopes beim Anlegen zusätzlich den passenden Rechteschalter aus der Teamverwaltung:
tasks:read→ „Fristen & Führerscheinkontrolle verwalten“cost-centers:read→ „Kosten & TCO sehen“invoices:read→ „Rechnungen & Belege sehen“
Ohne diesen Schalter lässt fleetfeat den Scope beim Anlegen nicht zu.
Limits und Paginierung
- Rate-Limit: 300 Aufrufe pro Minute je Zugang. Jede Antwort der Daten-Endpunkte auf einen gültigen Token trägt
X-RateLimit-LimitundX-RateLimit-Remaining; beim Überschreiten kommt 429 mitRetry-After(Sekunden). - Auch abgelehnte Aufrufe (403, 400) zählen gegen das Limit.
- Seitengröße:
limitvon 1 bis 200, ohne Angabe 50 Einträge. - Download-Links für Dokumente, Rechnungs-PDFs und E-Rechnungen sind 5 Minuten gültig und werden ohne Bearer-Token abgerufen.
- Unbekannte Parameter lehnt die API mit 400 ab, statt sie still zu übergehen.
Fehlerformat
Jeder Fehler der Daten-Endpunkte hat dasselbe Format: ein Objekt error mit maschinenlesbarem code, einer englischen message und — bei Parameterfehlern — dem Feld field.
{
"error": {
"code": "insufficient_scope",
"message": "This endpoint requires the scope \"drivers:read\"."
}
}| Code | HTTP | Bedeutung |
|---|---|---|
invalid_token | 401 | Token fehlt, ist abgelaufen oder wurde mit dem Zugang entzogen. Neues Token holen. |
insufficient_scope | 403 | Dem Token fehlt der Scope dieses Endpunkts. |
module_not_available | 403 | Die Daten gehören zu einem Softwaremodul, das Ihre Firma nicht gebucht oder in den Einstellungen ausgeblendet hat. |
invalid_parameter | 400 | Unbekannter oder ungültiger Parameter; field nennt ihn. |
not_found | 404 | Unbekannte ID — oder eine ID, die nicht zu Ihrer Firma gehört. |
file_unavailable | 404 | Zu diesem Datensatz ist keine Datei abgelegt. |
rate_limited | 429 | Rate-Limit überschritten; nach Retry-After Sekunden erneut versuchen. |
internal_error | 500 | Unerwarteter Fehler auf unserer Seite, ohne Details. Später erneut versuchen. |
Der Token-Endpunkt antwortet nach OAuth2-Standard (RFC 6749 §5.2) mit error und error_description, z. B. invalid_client bei falscher Client-ID oder falschem Secret.
Datenschutz
Über einen Zugang gelangen Daten Ihrer Firma in ein anderes System, je nach Scope auch personenbezogene Daten Ihrer Beschäftigten. Für dieses System und seinen Betreiber sind Sie verantwortlich: Es gehört in Ihr Verzeichnis der Verarbeitungstätigkeiten, und mit seinem Betreiber braucht es einen Auftragsverarbeitungsvertrag (AVV).
Fahrerdaten — Fahrerzuweisungen, der aktuelle Fahrer am Fahrzeug, Fahrer an Aufgaben, die Fahrerzuordnung bei Bußgeldern — gibt die API nur mit dem Scope drivers:read heraus.
Nie über die API: Führerscheindaten, Anhörungen zum Bußgeld, Notizen, Mailadressen.
Jeder authentifizierte Aufruf wird mit Zugang, Endpunkt (ohne Suchparameter), Status und Zeit protokolliert und nach 12 Monaten automatisch gelöscht.
Stabilitätszusage und Changelog
Unsere Zusage für Ihre Anbindung:
/v1 bleibt rückwärtskompatibel; neue Felder kommen ohne Vorwarnung, Entfernen/Umbenennen nur mit neuer Hauptversion und mindestens 6 Monaten Ankündigung.Changelog
- Ergänzung ohne neue Version · — 403
driver_data_not_availablean Fahrer-Endpunkten (/drivers,/fines), wenn die Person, die den Zugang angelegt hat, keine Fahrerdaten sehen darf oder nicht mehr zur Firma gehört; Fahrerfelder an den übrigen Endpunkten fehlen dann. - Ergänzung ohne neue Version · — 403
module_not_availableauch dann, wenn die Firma das Modul in ihren Einstellungen ausgeblendet hat (Bußgelder, Kostenstellen). - Ergänzung ohne neue Version · — Neuer Aufgabenstatus
erledigt_ausstehend(gemeldet, Freigabe durch die Fuhrparkleitung steht aus). - Ergänzung ohne neue Version · — Neue Fahrzeugfelder
max_speed_kmhundwork_machine_kind. - Ergänzung ohne neue Version · — Neue Fahrzeugfelder für Nutzfahrzeuge (z. B.
gross_weight_kg,axle_count) und E-Fahrzeuge (z. B.battery_capacity_kwh,wltp_range_km). - 1.2.0 · — Belegarten:
/api/v1/invoicesliefert neben Service-Rechnungen auch Abo-Rechnungen, Storno- und Korrekturbelege, mitkindund dem Verweiscorrects_invoice_id. - 1.1.0 · — Aufgaben, Dokumente der Fahrzeugakte (mit Download-Link), Bußgelder, Kostenstellen und Rechnungen (mit PDF und E-Rechnung), jeweils mit eigenem Scope.
- 1.0.0 · — Erste Fassung: Token-Endpunkt (OAuth2 Client Credentials), Fahrzeuge, Fahrerzuweisungen und Service-Aufträge.
Endpunkte
Alle Endpunkte der Version, erzeugt aus derselben Spezifikation, die der Server unter /api/v1/openapi.json ausliefert.
Zugriffstoken ausstellen (Client Credentials)
POST /api/v1/oauth/token
RFC 6749 §4.4. Anmeldung per HTTP Basic (client_id:client_secret) oder mit client_id/client_secret im Rumpf. Fehler kommen im Format nach RFC 6749 §5.2 { error, error_description } (zusätzlich code/message).
| Status | Beschreibung |
|---|---|
200 | Zugriffstoken Schema: TokenResponse |
400 | invalid_request, unsupported_grant_type oder invalid_scope |
401 | invalid_client |
429 | Zu viele Token-Anfragen (30 pro Minute je Zugang) |
Fahrzeuge auflisten
GET /api/v1/vehicles
Fahrzeuge der Firma, auch ausgeflottete (archived_at). from/to filtern auf updated_at. current_driver ist nur mit dem Scope drivers:read enthalten.
| Name | Ort | Typ | Beschreibung |
|---|---|---|---|
limit | Query | integer · 1–200 · Standard 50 | |
cursor | Query | string | Cursor aus next_cursor, unverändert weitergeben |
license_plate | Query | string | Exakter Treffer; Leerzeichen und Bindestriche werden ignoriert, Groß-/Kleinschreibung egal |
fin | Query | string · max. 17 | Exakte FIN, Groß-/Kleinschreibung egal |
from | Query | string | Datum nach ISO 8601 (00:00 UTC) oder Zeitpunkt mit Zeitzone |
to | Query | string | Datum nach ISO 8601 (00:00 UTC) oder Zeitpunkt mit Zeitzone |
| Status | Beschreibung |
|---|---|
200 | Eine Seite mit Ergebnissendata: array<Vehicle>next_cursor: string · kann null sein — Als cursor mitgeben, um die nächste Seite zu holen; auf der letzten Seite null.Header: X-RateLimit-Limit, X-RateLimit-Remaining |
400 | Ungültiger Parameter Schema: Error |
401 | Token fehlt, ist abgelaufen oder entzogen Schema: Error |
403 | Dem Token fehlt der nötige Scope (insufficient_scope), oder die Daten gehören zu den Softwaremodulen und die Firma hat sie nicht gebucht oder das Modul in ihren Einstellungen ausgeblendet (module_not_available), oder der Endpunkt liefert personenbezogene Fahrerdaten und die Person, die den Zugang angelegt hat, darf keine Fahrerdaten sehen oder gehört nicht mehr zur Firma (driver_data_not_available)Schema: Error |
429 | Rate-Limit überschritten (300 Aufrufe pro Minute je Zugang) Schema: ErrorHeader: Retry-After (Sekunden, bis das Zeitfenster neu beginnt) |
Fahrerzuweisungen auflisten (Verlauf)
GET /api/v1/drivers
Zeiträume der Fahrerzuweisung je Fahrzeug, halboffen [valid_from, valid_to). valid_to = null ist die aktuelle Zuweisung. from/to liefern Zeiträume, die den Bereich überschneiden.
| Name | Ort | Typ | Beschreibung |
|---|---|---|---|
limit | Query | integer · 1–200 · Standard 50 | |
cursor | Query | string | Cursor aus next_cursor, unverändert weitergeben |
license_plate | Query | string | Exakter Treffer; Leerzeichen und Bindestriche werden ignoriert, Groß-/Kleinschreibung egal |
fin | Query | string · max. 17 | Exakte FIN, Groß-/Kleinschreibung egal |
from | Query | string | Datum nach ISO 8601 (00:00 UTC) oder Zeitpunkt mit Zeitzone |
to | Query | string | Datum nach ISO 8601 (00:00 UTC) oder Zeitpunkt mit Zeitzone |
| Status | Beschreibung |
|---|---|
200 | Eine Seite mit Ergebnissendata: array<DriverAssignment>next_cursor: string · kann null sein — Als cursor mitgeben, um die nächste Seite zu holen; auf der letzten Seite null.Header: X-RateLimit-Limit, X-RateLimit-Remaining |
400 | Ungültiger Parameter Schema: Error |
401 | Token fehlt, ist abgelaufen oder entzogen Schema: Error |
403 | Dem Token fehlt der nötige Scope (insufficient_scope), oder die Daten gehören zu den Softwaremodulen und die Firma hat sie nicht gebucht oder das Modul in ihren Einstellungen ausgeblendet (module_not_available), oder der Endpunkt liefert personenbezogene Fahrerdaten und die Person, die den Zugang angelegt hat, darf keine Fahrerdaten sehen oder gehört nicht mehr zur Firma (driver_data_not_available)Schema: Error |
429 | Rate-Limit überschritten (300 Aufrufe pro Minute je Zugang) Schema: ErrorHeader: Retry-After (Sekunden, bis das Zeitfenster neu beginnt) |
Service-Aufträge auflisten
GET /api/v1/service-orders
Service-Aufträge (Buchungen) der Firma. from/to filtern auf den geplanten Beginn, ohne Termin auf den Zeitpunkt der Anlage.
| Name | Ort | Typ | Beschreibung |
|---|---|---|---|
limit | Query | integer · 1–200 · Standard 50 | |
cursor | Query | string | Cursor aus next_cursor, unverändert weitergeben |
license_plate | Query | string | Exakter Treffer; Leerzeichen und Bindestriche werden ignoriert, Groß-/Kleinschreibung egal |
fin | Query | string · max. 17 | Exakte FIN, Groß-/Kleinschreibung egal |
from | Query | string | Datum nach ISO 8601 (00:00 UTC) oder Zeitpunkt mit Zeitzone |
to | Query | string | Datum nach ISO 8601 (00:00 UTC) oder Zeitpunkt mit Zeitzone |
| Status | Beschreibung |
|---|---|
200 | Eine Seite mit Ergebnissendata: array<ServiceOrder>next_cursor: string · kann null sein — Als cursor mitgeben, um die nächste Seite zu holen; auf der letzten Seite null.Header: X-RateLimit-Limit, X-RateLimit-Remaining |
400 | Ungültiger Parameter Schema: Error |
401 | Token fehlt, ist abgelaufen oder entzogen Schema: Error |
403 | Dem Token fehlt der nötige Scope (insufficient_scope), oder die Daten gehören zu den Softwaremodulen und die Firma hat sie nicht gebucht oder das Modul in ihren Einstellungen ausgeblendet (module_not_available), oder der Endpunkt liefert personenbezogene Fahrerdaten und die Person, die den Zugang angelegt hat, darf keine Fahrerdaten sehen oder gehört nicht mehr zur Firma (driver_data_not_available)Schema: Error |
429 | Rate-Limit überschritten (300 Aufrufe pro Minute je Zugang) Schema: ErrorHeader: Retry-After (Sekunden, bis das Zeitfenster neu beginnt) |
Aufgaben auflisten
GET /api/v1/tasks
Fuhrpark-Aufgaben der Firma in jedem Status. from/to filtern auf das Fälligkeitsdatum (Kalendertag). driver ist nur mit dem Scope drivers:read enthalten. 403 module_not_available ohne die Softwaremodule.
| Name | Ort | Typ | Beschreibung |
|---|---|---|---|
limit | Query | integer · 1–200 · Standard 50 | |
cursor | Query | string | Cursor aus next_cursor, unverändert weitergeben |
license_plate | Query | string | Exakter Treffer; Leerzeichen und Bindestriche werden ignoriert, Groß-/Kleinschreibung egal |
fin | Query | string · max. 17 | Exakte FIN, Groß-/Kleinschreibung egal |
from | Query | string | Datum nach ISO 8601 (00:00 UTC) oder Zeitpunkt mit Zeitzone |
to | Query | string | Datum nach ISO 8601 (00:00 UTC) oder Zeitpunkt mit Zeitzone |
| Status | Beschreibung |
|---|---|
200 | Eine Seite mit Ergebnissendata: array<Task>next_cursor: string · kann null sein — Als cursor mitgeben, um die nächste Seite zu holen; auf der letzten Seite null.Header: X-RateLimit-Limit, X-RateLimit-Remaining |
400 | Ungültiger Parameter Schema: Error |
401 | Token fehlt, ist abgelaufen oder entzogen Schema: Error |
403 | Dem Token fehlt der nötige Scope (insufficient_scope), oder die Daten gehören zu den Softwaremodulen und die Firma hat sie nicht gebucht oder das Modul in ihren Einstellungen ausgeblendet (module_not_available), oder der Endpunkt liefert personenbezogene Fahrerdaten und die Person, die den Zugang angelegt hat, darf keine Fahrerdaten sehen oder gehört nicht mehr zur Firma (driver_data_not_available)Schema: Error |
429 | Rate-Limit überschritten (300 Aufrufe pro Minute je Zugang) Schema: ErrorHeader: Retry-After (Sekunden, bis das Zeitfenster neu beginnt) |
Dokumente der Fahrzeugakte auflisten (Metadaten)
GET /api/v1/documents
Unterlagen der Fahrzeugakten: Metadaten und SHA-256-Prüfsumme (null bei Dateien, die vor dem 08.09.2026 abgelegt wurden). Kein Dateiinhalt und kein Link — dafür download_path verwenden. from/to filtern auf den Zeitpunkt des Hochladens. 403 module_not_available ohne die Softwaremodule.
| Name | Ort | Typ | Beschreibung |
|---|---|---|---|
limit | Query | integer · 1–200 · Standard 50 | |
cursor | Query | string | Cursor aus next_cursor, unverändert weitergeben |
license_plate | Query | string | Exakter Treffer; Leerzeichen und Bindestriche werden ignoriert, Groß-/Kleinschreibung egal |
fin | Query | string · max. 17 | Exakte FIN, Groß-/Kleinschreibung egal |
from | Query | string | Datum nach ISO 8601 (00:00 UTC) oder Zeitpunkt mit Zeitzone |
to | Query | string | Datum nach ISO 8601 (00:00 UTC) oder Zeitpunkt mit Zeitzone |
| Status | Beschreibung |
|---|---|
200 | Eine Seite mit Ergebnissendata: array<Document>next_cursor: string · kann null sein — Als cursor mitgeben, um die nächste Seite zu holen; auf der letzten Seite null.Header: X-RateLimit-Limit, X-RateLimit-Remaining |
400 | Ungültiger Parameter Schema: Error |
401 | Token fehlt, ist abgelaufen oder entzogen Schema: Error |
403 | Dem Token fehlt der nötige Scope (insufficient_scope), oder die Daten gehören zu den Softwaremodulen und die Firma hat sie nicht gebucht oder das Modul in ihren Einstellungen ausgeblendet (module_not_available), oder der Endpunkt liefert personenbezogene Fahrerdaten und die Person, die den Zugang angelegt hat, darf keine Fahrerdaten sehen oder gehört nicht mehr zur Firma (driver_data_not_available)Schema: Error |
429 | Rate-Limit überschritten (300 Aufrufe pro Minute je Zugang) Schema: ErrorHeader: Retry-After (Sekunden, bis das Zeitfenster neu beginnt) |
Download-Link für ein Dokument der Fahrzeugakte abrufen
GET /api/v1/documents/{id}/download
Stellt einen signierten Link für ein Dokument der Firma aus. Die URL ist ein signierter Speicher-Link, 300 Sekunden gültig; direkt und ohne Bearer-Token abrufen. Die Datei gegen sha256 prüfen, wo angegeben.
| Name | Ort | Typ | Beschreibung |
|---|---|---|---|
id Pflicht | Pfad | string (uuid) |
| Status | Beschreibung |
|---|---|
200 | Ein kurz gültiger Download-Link Schema: DownloadLink |
400 | Ungültiger Parameter Schema: Error |
401 | Token fehlt, ist abgelaufen oder entzogen Schema: Error |
403 | Dem Token fehlt der nötige Scope (insufficient_scope), oder die Daten gehören zu den Softwaremodulen und die Firma hat sie nicht gebucht oder das Modul in ihren Einstellungen ausgeblendet (module_not_available), oder der Endpunkt liefert personenbezogene Fahrerdaten und die Person, die den Zugang angelegt hat, darf keine Fahrerdaten sehen oder gehört nicht mehr zur Firma (driver_data_not_available)Schema: Error |
404 | not_found: unbekannte ID oder ID einer anderen Firma · file_unavailable: keine Datei abgelegtSchema: Error |
429 | Rate-Limit überschritten (300 Aufrufe pro Minute je Zugang) Schema: ErrorHeader: Retry-After (Sekunden, bis das Zeitfenster neu beginnt) |
Bußgelder auflisten
GET /api/v1/fines
Bußgeldvorgänge der Firma. from/to filtern auf die Tatzeit. driver_assignment ist nur mit dem Scope drivers:read enthalten; confirmed: false ist ein Vorschlag des Systems, keine bestätigte Zuordnung. Keine Führerscheindaten. 403 module_not_available ohne die Softwaremodule oder wenn die Firma das Modul Bußgelder ausgeblendet hat.
| Name | Ort | Typ | Beschreibung |
|---|---|---|---|
limit | Query | integer · 1–200 · Standard 50 | |
cursor | Query | string | Cursor aus next_cursor, unverändert weitergeben |
license_plate | Query | string | Exakter Treffer; Leerzeichen und Bindestriche werden ignoriert, Groß-/Kleinschreibung egal |
fin | Query | string · max. 17 | Exakte FIN, Groß-/Kleinschreibung egal |
from | Query | string | Datum nach ISO 8601 (00:00 UTC) oder Zeitpunkt mit Zeitzone |
to | Query | string | Datum nach ISO 8601 (00:00 UTC) oder Zeitpunkt mit Zeitzone |
| Status | Beschreibung |
|---|---|
200 | Eine Seite mit Ergebnissendata: array<Fine>next_cursor: string · kann null sein — Als cursor mitgeben, um die nächste Seite zu holen; auf der letzten Seite null.Header: X-RateLimit-Limit, X-RateLimit-Remaining |
400 | Ungültiger Parameter Schema: Error |
401 | Token fehlt, ist abgelaufen oder entzogen Schema: Error |
403 | Dem Token fehlt der nötige Scope (insufficient_scope), oder die Daten gehören zu den Softwaremodulen und die Firma hat sie nicht gebucht oder das Modul in ihren Einstellungen ausgeblendet (module_not_available), oder der Endpunkt liefert personenbezogene Fahrerdaten und die Person, die den Zugang angelegt hat, darf keine Fahrerdaten sehen oder gehört nicht mehr zur Firma (driver_data_not_available)Schema: Error |
429 | Rate-Limit überschritten (300 Aufrufe pro Minute je Zugang) Schema: ErrorHeader: Retry-After (Sekunden, bis das Zeitfenster neu beginnt) |
Kostenstellen auflisten
GET /api/v1/cost-centers
Stammdaten der Kostenstellen. from/to filtern auf updated_at. 403 module_not_available ohne die Softwaremodule oder wenn die Firma das Modul Kostenstellen ausgeblendet hat.
| Name | Ort | Typ | Beschreibung |
|---|---|---|---|
limit | Query | integer · 1–200 · Standard 50 | |
cursor | Query | string | Cursor aus next_cursor, unverändert weitergeben |
from | Query | string | Datum nach ISO 8601 (00:00 UTC) oder Zeitpunkt mit Zeitzone |
to | Query | string | Datum nach ISO 8601 (00:00 UTC) oder Zeitpunkt mit Zeitzone |
| Status | Beschreibung |
|---|---|
200 | Eine Seite mit Ergebnissendata: array<CostCenter>next_cursor: string · kann null sein — Als cursor mitgeben, um die nächste Seite zu holen; auf der letzten Seite null.Header: X-RateLimit-Limit, X-RateLimit-Remaining |
400 | Ungültiger Parameter Schema: Error |
401 | Token fehlt, ist abgelaufen oder entzogen Schema: Error |
403 | Dem Token fehlt der nötige Scope (insufficient_scope), oder die Daten gehören zu den Softwaremodulen und die Firma hat sie nicht gebucht oder das Modul in ihren Einstellungen ausgeblendet (module_not_available), oder der Endpunkt liefert personenbezogene Fahrerdaten und die Person, die den Zugang angelegt hat, darf keine Fahrerdaten sehen oder gehört nicht mehr zur Firma (driver_data_not_available)Schema: Error |
429 | Rate-Limit überschritten (300 Aufrufe pro Minute je Zugang) Schema: ErrorHeader: Retry-After (Sekunden, bis das Zeitfenster neu beginnt) |
Rechnungen von fleetfeat auflisten
GET /api/v1/invoices
Alle Belege, die fleetfeat an die Firma ausgestellt hat: Service-Rechnungen (kind: service), Abo-Rechnungen (subscription), Stornobelege (cancellation) und Korrekturbelege einschließlich Minderungsbelegen (correction); die beiden letzten verweisen über corrects_invoice_id auf das Original. from/to filtern auf das Rechnungsdatum (Kalendertag). Dateien über pdf.download_path und e_invoice.download_path.
| Name | Ort | Typ | Beschreibung |
|---|---|---|---|
limit | Query | integer · 1–200 · Standard 50 | |
cursor | Query | string | Cursor aus next_cursor, unverändert weitergeben |
from | Query | string | Datum nach ISO 8601 (00:00 UTC) oder Zeitpunkt mit Zeitzone |
to | Query | string | Datum nach ISO 8601 (00:00 UTC) oder Zeitpunkt mit Zeitzone |
| Status | Beschreibung |
|---|---|
200 | Eine Seite mit Ergebnissendata: array<Invoice>next_cursor: string · kann null sein — Als cursor mitgeben, um die nächste Seite zu holen; auf der letzten Seite null.Header: X-RateLimit-Limit, X-RateLimit-Remaining |
400 | Ungültiger Parameter Schema: Error |
401 | Token fehlt, ist abgelaufen oder entzogen Schema: Error |
403 | Dem Token fehlt der nötige Scope (insufficient_scope), oder die Daten gehören zu den Softwaremodulen und die Firma hat sie nicht gebucht oder das Modul in ihren Einstellungen ausgeblendet (module_not_available), oder der Endpunkt liefert personenbezogene Fahrerdaten und die Person, die den Zugang angelegt hat, darf keine Fahrerdaten sehen oder gehört nicht mehr zur Firma (driver_data_not_available)Schema: Error |
429 | Rate-Limit überschritten (300 Aufrufe pro Minute je Zugang) Schema: ErrorHeader: Retry-After (Sekunden, bis das Zeitfenster neu beginnt) |
Download-Link für das Rechnungs-PDF abrufen
GET /api/v1/invoices/{id}/pdf
Stellt einen signierten Link für das abgelegte Rechnungs-PDF aus. 404 file_unavailable, wenn kein PDF abgelegt ist. Die URL ist ein signierter Speicher-Link, 300 Sekunden gültig; direkt und ohne Bearer-Token abrufen. Die Datei gegen sha256 prüfen, wo angegeben.
| Name | Ort | Typ | Beschreibung |
|---|---|---|---|
id Pflicht | Pfad | string (uuid) |
| Status | Beschreibung |
|---|---|
200 | Ein kurz gültiger Download-Link Schema: DownloadLink |
400 | Ungültiger Parameter Schema: Error |
401 | Token fehlt, ist abgelaufen oder entzogen Schema: Error |
403 | Dem Token fehlt der nötige Scope (insufficient_scope), oder die Daten gehören zu den Softwaremodulen und die Firma hat sie nicht gebucht oder das Modul in ihren Einstellungen ausgeblendet (module_not_available), oder der Endpunkt liefert personenbezogene Fahrerdaten und die Person, die den Zugang angelegt hat, darf keine Fahrerdaten sehen oder gehört nicht mehr zur Firma (driver_data_not_available)Schema: Error |
404 | not_found: unbekannte ID oder ID einer anderen Firma · file_unavailable: keine Datei abgelegtSchema: Error |
429 | Rate-Limit überschritten (300 Aufrufe pro Minute je Zugang) Schema: ErrorHeader: Retry-After (Sekunden, bis das Zeitfenster neu beginnt) |
Download-Link für die E-Rechnung (XML) abrufen
GET /api/v1/invoices/{id}/e-invoice
Stellt einen signierten Link für die zuletzt abgelegte E-Rechnung aus (ZUGFeRD/Factur-X oder XRechnung-XML). valid: false heißt: Die Datei hat die Prüfung nicht bestanden; sie wird trotzdem ausgeliefert. Die URL ist ein signierter Speicher-Link, 300 Sekunden gültig; direkt und ohne Bearer-Token abrufen. Die Datei gegen sha256 prüfen, wo angegeben.
| Name | Ort | Typ | Beschreibung |
|---|---|---|---|
id Pflicht | Pfad | string (uuid) |
| Status | Beschreibung |
|---|---|
200 | Ein kurz gültiger Download-Link Schema: DownloadLink |
400 | Ungültiger Parameter Schema: Error |
401 | Token fehlt, ist abgelaufen oder entzogen Schema: Error |
403 | Dem Token fehlt der nötige Scope (insufficient_scope), oder die Daten gehören zu den Softwaremodulen und die Firma hat sie nicht gebucht oder das Modul in ihren Einstellungen ausgeblendet (module_not_available), oder der Endpunkt liefert personenbezogene Fahrerdaten und die Person, die den Zugang angelegt hat, darf keine Fahrerdaten sehen oder gehört nicht mehr zur Firma (driver_data_not_available)Schema: Error |
404 | not_found: unbekannte ID oder ID einer anderen Firma · file_unavailable: keine Datei abgelegtSchema: Error |
429 | Rate-Limit überschritten (300 Aufrufe pro Minute je Zugang) Schema: ErrorHeader: Retry-After (Sekunden, bis das Zeitfenster neu beginnt) |
Datenmodelle
Error
| Feld | Typ | Beschreibung |
|---|---|---|
error Pflicht | object | |
error.code Pflicht | string · einer von invalid_token, insufficient_scope, module_not_available, invalid_parameter, not_found, file_unavailable, rate_limited, internal_error | |
error.message Pflicht | string | |
error.field | string | Der beanstandete Parameter, falls einer |
TokenRequest
| Feld | Typ | Beschreibung |
|---|---|---|
grant_type Pflicht | string · = client_credentials | |
scope | string | Durch Leerzeichen getrennte Teilmenge der Scopes des Zugangs; ohne Angabe alle |
client_id | string | |
client_secret | string |
TokenResponse
| Feld | Typ | Beschreibung |
|---|---|---|
access_token Pflicht | string | |
token_type Pflicht | string · = Bearer | |
expires_in Pflicht | integer | |
scope Pflicht | string |
Vehicle
| Feld | Typ | Beschreibung |
|---|---|---|
id | string (uuid) | |
fin | string | |
license_plate | string · kann null sein | |
make | string · kann null sein | |
model | string · kann null sein | |
year | integer · kann null sein | |
vehicle_type | string · kann null sein | |
fuel_type | string · kann null sein | |
usage_type | string · kann null sein | |
mileage_km | integer · kann null sein | |
first_registration | string (date) · kann null sein | |
ownership | string · kann null sein | |
leasing_end | string (date) · kann null sein | |
gross_weight_kg | integer · kann null sein | Stammdaten für Nutzfahrzeuge. Null, wenn das Feld nicht zu vehicle_type passt (Lkw, Anhänger; Transporter: nur zulässige Gesamtmasse). |
empty_weight_kg | integer · kann null sein | Stammdaten für Nutzfahrzeuge. Null, wenn das Feld nicht zu vehicle_type passt (Lkw, Anhänger; Transporter: nur zulässige Gesamtmasse). |
length_mm | integer · kann null sein | Stammdaten für Nutzfahrzeuge. Null, wenn das Feld nicht zu vehicle_type passt (Lkw, Anhänger; Transporter: nur zulässige Gesamtmasse). |
width_mm | integer · kann null sein | Stammdaten für Nutzfahrzeuge. Null, wenn das Feld nicht zu vehicle_type passt (Lkw, Anhänger; Transporter: nur zulässige Gesamtmasse). |
height_mm | integer · kann null sein | Stammdaten für Nutzfahrzeuge. Null, wenn das Feld nicht zu vehicle_type passt (Lkw, Anhänger; Transporter: nur zulässige Gesamtmasse). |
axle_count | integer · kann null sein | Stammdaten für Nutzfahrzeuge. Null, wenn das Feld nicht zu vehicle_type passt (Lkw, Anhänger; Transporter: nur zulässige Gesamtmasse). |
brake_system | string · einer von ungebremst, auflauf, druckluft · kann null sein | Stammdaten für Nutzfahrzeuge. Null, wenn das Feld nicht zu vehicle_type passt (Lkw, Anhänger; Transporter: nur zulässige Gesamtmasse). |
trailer_kind | string · einer von tandem_kasten, kipper, tieflader, bauwagen, tankanhaenger, sattelauflieger, sonstiges · kann null sein | Stammdaten für Nutzfahrzeuge. Null, wenn das Feld nicht zu vehicle_type passt (Lkw, Anhänger; Transporter: nur zulässige Gesamtmasse). |
coupling_type | string · einer von kugelkopf, bolzen, sattelkupplung · kann null sein | Stammdaten für Nutzfahrzeuge. Null, wenn das Feld nicht zu vehicle_type passt (Lkw, Anhänger; Transporter: nur zulässige Gesamtmasse). |
truck_body | string · einer von pritsche, kipper, koffer, sattelzugmaschine, kran, sonstiges · kann null sein | Stammdaten für Nutzfahrzeuge. Null, wenn das Feld nicht zu vehicle_type passt (Lkw, Anhänger; Transporter: nur zulässige Gesamtmasse). |
towing_capacity_kg | integer · kann null sein | Stammdaten für Nutzfahrzeuge. Null, wenn das Feld nicht zu vehicle_type passt (Lkw, Anhänger; Transporter: nur zulässige Gesamtmasse). |
has_tachograph | boolean · kann null sein | Stammdaten für Nutzfahrzeuge. Null, wenn das Feld nicht zu vehicle_type passt (Lkw, Anhänger; Transporter: nur zulässige Gesamtmasse). |
adr_equipped | boolean · kann null sein | Stammdaten für Nutzfahrzeuge. Null, wenn das Feld nicht zu vehicle_type passt (Lkw, Anhänger; Transporter: nur zulässige Gesamtmasse). |
max_speed_kmh | integer · kann null sein | Stammdaten für Nutzfahrzeuge. Null, wenn das Feld nicht zu vehicle_type passt (Lkw, Anhänger; Transporter: nur zulässige Gesamtmasse). |
work_machine_kind | string · einer von erdbau, walze, sonstige · kann null sein | Stammdaten für Nutzfahrzeuge. Null, wenn das Feld nicht zu vehicle_type passt (Lkw, Anhänger; Transporter: nur zulässige Gesamtmasse). |
battery_capacity_kwh | number · kann null sein | Daten für E-Fahrzeuge. Null, wenn das Feld nicht zu fuel_type passt. |
wltp_range_km | integer · kann null sein | Daten für E-Fahrzeuge. Null, wenn das Feld nicht zu fuel_type passt. |
electric_range_km | integer · kann null sein | Daten für E-Fahrzeuge. Null, wenn das Feld nicht zu fuel_type passt. |
co2_g_km | integer · kann null sein | Daten für E-Fahrzeuge. Null, wenn das Feld nicht zu fuel_type passt. |
charging_power_ac_kw | number · kann null sein | Daten für E-Fahrzeuge. Null, wenn das Feld nicht zu fuel_type passt. |
charging_power_dc_kw | number · kann null sein | Daten für E-Fahrzeuge. Null, wenn das Feld nicht zu fuel_type passt. |
high_voltage_system | boolean · kann null sein | Daten für E-Fahrzeuge. Null, wenn das Feld nicht zu fuel_type passt. |
archived_at | string (date-time) · kann null sein | |
archive_reason | string · kann null sein | |
current_driver | object · kann null sein | Nur mit dem Scope drivers:read |
current_driver.name | string · kann null sein | |
current_driver.profile_id | string · kann null sein | |
created_at | string (date-time) | |
updated_at | string (date-time) |
DriverAssignment
| Feld | Typ | Beschreibung |
|---|---|---|
id | string (uuid) | |
driver | object | |
driver.name | string | |
driver.profile_id | string · kann null sein | |
vehicle | object | |
vehicle.id | string (uuid) | |
vehicle.license_plate | string · kann null sein | |
vehicle.fin | string · kann null sein | |
assignment_type | string · einer von dauerhaft, temporaer, pool | |
valid_from | string (date-time) | |
valid_to | string (date-time) · kann null sein | |
created_at | string (date-time) |
ServiceOrder
| Feld | Typ | Beschreibung |
|---|---|---|
id | string (uuid) | |
status | string · einer von awaiting_payment, requested, offered, accepted, scheduled, in_progress, awaiting_acceptance, done, cancelled, expired | |
service | object | |
service.slug | string | |
service.name_de | string | |
service.name_en | string | |
vehicle | object · kann null sein | |
vehicle.id | string (uuid) | |
vehicle.license_plate | string · kann null sein | |
vehicle.fin | string · kann null sein | |
scheduled_start | string (date-time) · kann null sein | |
scheduled_end | string (date-time) · kann null sein | |
created_at | string (date-time) | |
updated_at | string (date-time) |
Task
| Feld | Typ | Beschreibung |
|---|---|---|
id | string (uuid) | |
title | string | |
description | string · kann null sein | |
due_on | string (date) | |
priority | string · einer von niedrig, mittel, hoch | |
status | string · einer von offen, erledigt_ausstehend, erledigt, storniert | |
done_by | string · einer von fahrer, fuhrpark, service · kann null sein | |
vehicle | object · kann null sein | |
vehicle.id | string (uuid) | |
vehicle.license_plate | string · kann null sein | |
vehicle.fin | string · kann null sein | |
assignee | object · kann null sein | |
assignee.profile_id | string (uuid) | |
assignee.name | string · kann null sein | |
driver | object · kann null sein | Nur mit dem Scope drivers:read |
driver.profile_id | string (uuid) | |
driver.name | string · kann null sein | |
completed_via_service_order_id | string (uuid) · kann null sein | |
completed_at | string (date-time) · kann null sein | |
cancel_reason | string · kann null sein | |
created_at | string (date-time) | |
updated_at | string (date-time) |
Document
| Feld | Typ | Beschreibung |
|---|---|---|
id | string (uuid) | |
vehicle | object · kann null sein | |
vehicle.id | string (uuid) | |
vehicle.license_plate | string · kann null sein | |
vehicle.fin | string · kann null sein | |
category | string | |
title | string | |
issued_on | string (date) · kann null sein | |
amount_cents | integer · kann null sein | |
file | object | |
file.sha256 | string · kann null sein | SHA-256 als Hex in Kleinbuchstaben; null bei Dateien vor dem 08.09.2026 |
file.byte_size | integer · kann null sein | |
file.media_type | string · kann null sein | |
superseded | boolean | Eine ältere Fassung eines ersetzten Kostenbelegs |
after_decommission | boolean | |
download_path | string | |
created_at | string (date-time) |
Fine
| Feld | Typ | Beschreibung |
|---|---|---|
id | string (uuid) | |
vehicle | object · kann null sein | |
vehicle.id | string (uuid) | |
vehicle.license_plate | string · kann null sein | |
vehicle.fin | string · kann null sein | |
file_number | string · kann null sein | |
offense_at | string (date-time) | |
offense_type | string | |
location | string · kann null sein | |
authority | string · kann null sein | |
amount_cents | integer | |
due_on | string (date) · kann null sein | |
hearing_due_on | string (date) · kann null sein | |
status | string | |
paid_at | string (date-time) · kann null sein | |
has_document | boolean | |
driver_assignment | object · kann null sein | Nur mit dem Scope drivers:read |
driver_assignment.name | string · kann null sein | |
driver_assignment.profile_id | string (uuid) · kann null sein | |
driver_assignment.source | string | |
driver_assignment.confirmed | boolean | |
created_at | string (date-time) | |
updated_at | string (date-time) |
CostCenter
| Feld | Typ | Beschreibung |
|---|---|---|
id | string (uuid) | |
number | string | |
name | string | |
parent_id | string (uuid) · kann null sein | |
company | object · kann null sein | |
company.id | string (uuid) | |
company.name | string | |
responsible | object · kann null sein | |
responsible.profile_id | string (uuid) | |
responsible.name | string · kann null sein | |
valid_from | string (date) | |
valid_to | string (date) · kann null sein | |
active | boolean | |
created_at | string (date-time) | |
updated_at | string (date-time) |
Invoice
| Feld | Typ | Beschreibung |
|---|---|---|
id | string (uuid) | |
kind | string · einer von service, subscription, cancellation, correction | |
number | string | |
status | string · einer von open, collecting, paid, cancelled, issued | collecting = Lastschrift läuft (nur Abo-Rechnungen); issued = Storno- und Korrekturbelege, die keinen Zahlungsstatus haben |
corrects_invoice_id | string (uuid) · kann null sein | Nur bei Storno/Korrektur: der Originalbeleg (eine id aus dieser Liste) |
corrects_invoice_number | string · kann null sein | |
service_label | string · kann null sein | null bei Abo-Rechnungen |
service_date | string (date) · kann null sein | |
service_period | object · kann null sein | Nur bei Abo-Rechnungen: der abgerechnete Zeitraum |
service_period.start | string (date) | |
service_period.end | string (date) | |
service_order_ids | array<string (uuid)> | |
currency | string · = EUR | |
net_cents | integer | |
vat_rate_bp | integer | Umsatzsteuersatz in Basispunkten (1900 = 19 %) |
vat_cents | integer | |
gross_cents | integer | |
issued_on | string (date) | |
due_on | string (date) · kann null sein | |
paid_at | string (date-time) · kann null sein | |
cancelled_at | string (date-time) · kann null sein | |
pdf | object | |
pdf.sha256 | string · kann null sein | |
pdf.byte_size | integer · kann null sein | |
pdf.download_path | string | |
e_invoice | object · kann null sein | |
e_invoice.format | string · einer von zugferd, xrechnung | |
e_invoice.sha256 | string | |
e_invoice.byte_size | integer · kann null sein | |
e_invoice.valid | boolean · kann null sein | |
e_invoice.download_path | string | |
created_at | string (date-time) |
DownloadLink
| Feld | Typ | Beschreibung |
|---|---|---|
id Pflicht | string (uuid) | |
number | string | Nur bei Rechnungen |
format | string | Nur bei E-Rechnungen |
valid | boolean | Nur bei E-Rechnungen |
url Pflicht | string (uri) | |
expires_at Pflicht | string (date-time) | |
sha256 | string · kann null sein | |
byte_size | integer · kann null sein | |
media_type | string · kann null sein |
Fragen zur Anbindung? Schreiben Sie an info@fleetfeat.de.