{"openapi":"3.1.0","info":{"title":"fleetfeat API","version":"1.2.0","description":"Read-only REST API v1 for fleetfeat customers. OAuth2 client credentials, scopes per resource, cursor pagination, all timestamps UTC ISO 8601. Each client belongs to exactly one customer organisation and sees only its data. Rate limit: 300 requests per minute per client (429 + Retry-After). Every authenticated call is logged with client, endpoint, status and time."},"servers":[{"url":"/"}],"tags":[{"name":"auth"},{"name":"fleet"}],"paths":{"/api/v1/oauth/token":{"post":{"tags":["auth"],"operationId":"issueToken","summary":"Issue an access token (client credentials)","description":"RFC 6749 §4.4. Authenticate with HTTP Basic (client_id:client_secret) or with client_id/client_secret in the body. Errors use the RFC 6749 §5.2 format `{ error, error_description }` (plus `code`/`message`).","security":[],"requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/TokenRequest"}},"application/json":{"schema":{"$ref":"#/components/schemas/TokenRequest"}}}},"responses":{"200":{"description":"Access token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"400":{"description":"invalid_request, unsupported_grant_type or invalid_scope"},"401":{"description":"invalid_client"},"429":{"description":"Too many token requests (30 per minute per client)"}}}},"/api/v1/vehicles":{"get":{"operationId":"listVehicles","summary":"List vehicles","description":"Vehicles of the organisation, including archived ones (`archived_at`). `from`/`to` filter on `updated_at`. `current_driver` is only present with the scope `drivers:read`.","security":[{"oauth2":["vehicles:read"]}],"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/cursor"},{"$ref":"#/components/parameters/license_plate"},{"$ref":"#/components/parameters/fin"},{"$ref":"#/components/parameters/from"},{"$ref":"#/components/parameters/to"}],"responses":{"200":{"description":"One page of results","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["data","next_cursor"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Vehicle"}},"next_cursor":{"type":["string","null"],"description":"Pass as `cursor` to fetch the next page; null on the last page."}}}}}},"400":{"description":"Invalid parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, expired or revoked token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Token lacks the required scope (`insufficient_scope`), or the data belongs to the software modules and the organisation has not ordered them or has hidden the module in its settings (`module_not_available`), or the endpoint returns personal driver data and the client's creator may not see driver data or no longer belongs to the organisation (`driver_data_not_available`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (300 requests per minute per client)","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the window resets"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/drivers":{"get":{"operationId":"listDriverAssignments","summary":"List driver assignments (history)","description":"Driver assignment periods per vehicle, half-open [valid_from, valid_to). `valid_to = null` is the current assignment. `from`/`to` return periods overlapping the range.","security":[{"oauth2":["drivers:read"]}],"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/cursor"},{"$ref":"#/components/parameters/license_plate"},{"$ref":"#/components/parameters/fin"},{"$ref":"#/components/parameters/from"},{"$ref":"#/components/parameters/to"}],"responses":{"200":{"description":"One page of results","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["data","next_cursor"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/DriverAssignment"}},"next_cursor":{"type":["string","null"],"description":"Pass as `cursor` to fetch the next page; null on the last page."}}}}}},"400":{"description":"Invalid parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, expired or revoked token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Token lacks the required scope (`insufficient_scope`), or the data belongs to the software modules and the organisation has not ordered them or has hidden the module in its settings (`module_not_available`), or the endpoint returns personal driver data and the client's creator may not see driver data or no longer belongs to the organisation (`driver_data_not_available`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (300 requests per minute per client)","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the window resets"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/service-orders":{"get":{"operationId":"listServiceOrders","summary":"List service orders","description":"Service orders (bookings) of the organisation. `from`/`to` filter on the scheduled start, or the creation time when no appointment is set.","security":[{"oauth2":["service-orders:read"]}],"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/cursor"},{"$ref":"#/components/parameters/license_plate"},{"$ref":"#/components/parameters/fin"},{"$ref":"#/components/parameters/from"},{"$ref":"#/components/parameters/to"}],"responses":{"200":{"description":"One page of results","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["data","next_cursor"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ServiceOrder"}},"next_cursor":{"type":["string","null"],"description":"Pass as `cursor` to fetch the next page; null on the last page."}}}}}},"400":{"description":"Invalid parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, expired or revoked token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Token lacks the required scope (`insufficient_scope`), or the data belongs to the software modules and the organisation has not ordered them or has hidden the module in its settings (`module_not_available`), or the endpoint returns personal driver data and the client's creator may not see driver data or no longer belongs to the organisation (`driver_data_not_available`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (300 requests per minute per client)","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the window resets"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/tasks":{"get":{"operationId":"listTasks","summary":"List tasks","description":"Fleet tasks of the organisation, all statuses. `from`/`to` filter on the due date (calendar day). `driver` is only present with the scope `drivers:read`. 403 `module_not_available` without the software modules.","security":[{"oauth2":["tasks:read"]}],"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/cursor"},{"$ref":"#/components/parameters/license_plate"},{"$ref":"#/components/parameters/fin"},{"$ref":"#/components/parameters/from"},{"$ref":"#/components/parameters/to"}],"responses":{"200":{"description":"One page of results","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["data","next_cursor"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Task"}},"next_cursor":{"type":["string","null"],"description":"Pass as `cursor` to fetch the next page; null on the last page."}}}}}},"400":{"description":"Invalid parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, expired or revoked token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Token lacks the required scope (`insufficient_scope`), or the data belongs to the software modules and the organisation has not ordered them or has hidden the module in its settings (`module_not_available`), or the endpoint returns personal driver data and the client's creator may not see driver data or no longer belongs to the organisation (`driver_data_not_available`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (300 requests per minute per client)","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the window resets"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/documents":{"get":{"operationId":"listDocuments","summary":"List vehicle documents (metadata)","description":"Documents in the vehicle files: metadata and SHA-256 checksum (null for files stored before 2026-09-08). No file content and no link — use `download_path`. `from`/`to` filter on the upload time. 403 `module_not_available` without the software modules.","security":[{"oauth2":["documents:read"]}],"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/cursor"},{"$ref":"#/components/parameters/license_plate"},{"$ref":"#/components/parameters/fin"},{"$ref":"#/components/parameters/from"},{"$ref":"#/components/parameters/to"}],"responses":{"200":{"description":"One page of results","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["data","next_cursor"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Document"}},"next_cursor":{"type":["string","null"],"description":"Pass as `cursor` to fetch the next page; null on the last page."}}}}}},"400":{"description":"Invalid parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, expired or revoked token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Token lacks the required scope (`insufficient_scope`), or the data belongs to the software modules and the organisation has not ordered them or has hidden the module in its settings (`module_not_available`), or the endpoint returns personal driver data and the client's creator may not see driver data or no longer belongs to the organisation (`driver_data_not_available`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (300 requests per minute per client)","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the window resets"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/documents/{id}/download":{"get":{"operationId":"getDocumentDownloadLink","summary":"Get a download link for a vehicle document","description":"Issues a signed link for one document of the organisation. The URL is a signed storage link valid for 300 seconds; fetch it directly without the bearer token. Verify the file against `sha256` where given.","security":[{"oauth2":["documents:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"A short-lived download link","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DownloadLink"}}}},"400":{"description":"Invalid parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, expired or revoked token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Token lacks the required scope (`insufficient_scope`), or the data belongs to the software modules and the organisation has not ordered them or has hidden the module in its settings (`module_not_available`), or the endpoint returns personal driver data and the client's creator may not see driver data or no longer belongs to the organisation (`driver_data_not_available`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: unknown id or id of another organisation · `file_unavailable`: no stored file","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (300 requests per minute per client)","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the window resets"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/fines":{"get":{"operationId":"listFines","summary":"List traffic fines","description":"Traffic fine cases of the organisation. `from`/`to` filter on the offence time. `driver_assignment` is only present with the scope `drivers:read`; `confirmed: false` is a system suggestion, not a confirmed assignment. No driving licence data. 403 `module_not_available` without the software modules or when the organisation has hidden the traffic fines module.","security":[{"oauth2":["fines:read"]}],"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/cursor"},{"$ref":"#/components/parameters/license_plate"},{"$ref":"#/components/parameters/fin"},{"$ref":"#/components/parameters/from"},{"$ref":"#/components/parameters/to"}],"responses":{"200":{"description":"One page of results","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["data","next_cursor"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Fine"}},"next_cursor":{"type":["string","null"],"description":"Pass as `cursor` to fetch the next page; null on the last page."}}}}}},"400":{"description":"Invalid parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, expired or revoked token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Token lacks the required scope (`insufficient_scope`), or the data belongs to the software modules and the organisation has not ordered them or has hidden the module in its settings (`module_not_available`), or the endpoint returns personal driver data and the client's creator may not see driver data or no longer belongs to the organisation (`driver_data_not_available`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (300 requests per minute per client)","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the window resets"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/cost-centers":{"get":{"operationId":"listCostCenters","summary":"List cost centres","description":"Cost centre master data. `from`/`to` filter on `updated_at`. 403 `module_not_available` without the software modules or when the organisation has hidden the cost centres module.","security":[{"oauth2":["cost-centers:read"]}],"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/cursor"},{"$ref":"#/components/parameters/from"},{"$ref":"#/components/parameters/to"}],"responses":{"200":{"description":"One page of results","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["data","next_cursor"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CostCenter"}},"next_cursor":{"type":["string","null"],"description":"Pass as `cursor` to fetch the next page; null on the last page."}}}}}},"400":{"description":"Invalid parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, expired or revoked token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Token lacks the required scope (`insufficient_scope`), or the data belongs to the software modules and the organisation has not ordered them or has hidden the module in its settings (`module_not_available`), or the endpoint returns personal driver data and the client's creator may not see driver data or no longer belongs to the organisation (`driver_data_not_available`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (300 requests per minute per client)","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the window resets"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/invoices":{"get":{"operationId":"listInvoices","summary":"List invoices from fleetfeat","description":"All documents fleetfeat issued to the organisation: service invoices (`kind: service`), subscription invoices (`subscription`), cancellations (`cancellation`) and corrections incl. reduction documents (`correction`); the latter two reference the original via `corrects_invoice_id`. `from`/`to` filter on the invoice date (calendar day). Files via `pdf.download_path` and `e_invoice.download_path`.","security":[{"oauth2":["invoices:read"]}],"parameters":[{"$ref":"#/components/parameters/limit"},{"$ref":"#/components/parameters/cursor"},{"$ref":"#/components/parameters/from"},{"$ref":"#/components/parameters/to"}],"responses":{"200":{"description":"One page of results","headers":{"X-RateLimit-Limit":{"schema":{"type":"integer"}},"X-RateLimit-Remaining":{"schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"type":"object","required":["data","next_cursor"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Invoice"}},"next_cursor":{"type":["string","null"],"description":"Pass as `cursor` to fetch the next page; null on the last page."}}}}}},"400":{"description":"Invalid parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, expired or revoked token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Token lacks the required scope (`insufficient_scope`), or the data belongs to the software modules and the organisation has not ordered them or has hidden the module in its settings (`module_not_available`), or the endpoint returns personal driver data and the client's creator may not see driver data or no longer belongs to the organisation (`driver_data_not_available`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (300 requests per minute per client)","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the window resets"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/invoices/{id}/pdf":{"get":{"operationId":"getInvoicePdfLink","summary":"Get a download link for the invoice PDF","description":"Issues a signed link for the stored invoice PDF. 404 `file_unavailable` if no stored PDF exists. The URL is a signed storage link valid for 300 seconds; fetch it directly without the bearer token. Verify the file against `sha256` where given.","security":[{"oauth2":["invoices:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"A short-lived download link","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DownloadLink"}}}},"400":{"description":"Invalid parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, expired or revoked token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Token lacks the required scope (`insufficient_scope`), or the data belongs to the software modules and the organisation has not ordered them or has hidden the module in its settings (`module_not_available`), or the endpoint returns personal driver data and the client's creator may not see driver data or no longer belongs to the organisation (`driver_data_not_available`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: unknown id or id of another organisation · `file_unavailable`: no stored file","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (300 requests per minute per client)","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the window resets"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/invoices/{id}/e-invoice":{"get":{"operationId":"getInvoiceEInvoiceLink","summary":"Get a download link for the e-invoice XML","description":"Issues a signed link for the latest stored e-invoice (ZUGFeRD/Factur-X or XRechnung XML). `valid: false` means the file failed validation; it is delivered anyway. The URL is a signed storage link valid for 300 seconds; fetch it directly without the bearer token. Verify the file against `sha256` where given.","security":[{"oauth2":["invoices:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"A short-lived download link","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DownloadLink"}}}},"400":{"description":"Invalid parameter","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing, expired or revoked token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Token lacks the required scope (`insufficient_scope`), or the data belongs to the software modules and the organisation has not ordered them or has hidden the module in its settings (`module_not_available`), or the endpoint returns personal driver data and the client's creator may not see driver data or no longer belongs to the organisation (`driver_data_not_available`)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"`not_found`: unknown id or id of another organisation · `file_unavailable`: no stored file","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (300 requests per minute per client)","headers":{"Retry-After":{"schema":{"type":"integer"},"description":"Seconds until the window resets"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"oauth2":{"type":"oauth2","flows":{"clientCredentials":{"tokenUrl":"/api/v1/oauth/token","scopes":{"vehicles:read":"Read vehicles","drivers:read":"Read drivers and assignment history (personal data)","service-orders:read":"Read service orders","tasks:read":"Read fleet tasks","documents:read":"Read vehicle document metadata and issue download links","fines:read":"Read traffic fines (driver assignment only with drivers:read)","cost-centers:read":"Read cost centre master data","invoices:read":"Read invoices from fleetfeat and issue download links"}}}}},"parameters":{"limit":{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":200,"default":50}},"cursor":{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque cursor from `next_cursor`"},"license_plate":{"name":"license_plate","in":"query","schema":{"type":"string"},"description":"Exact match; spaces and hyphens are ignored, case-insensitive"},"fin":{"name":"fin","in":"query","schema":{"type":"string","maxLength":17},"description":"Exact VIN, case-insensitive"},"from":{"name":"from","in":"query","schema":{"type":"string"},"description":"ISO 8601 date (00:00 UTC) or date-time with time zone"},"to":{"name":"to","in":"query","schema":{"type":"string"},"description":"ISO 8601 date (00:00 UTC) or date-time with time zone"}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["invalid_token","insufficient_scope","module_not_available","invalid_parameter","not_found","file_unavailable","rate_limited","internal_error"]},"message":{"type":"string"},"field":{"type":"string","description":"The offending parameter, if any"}}}}},"TokenRequest":{"type":"object","required":["grant_type"],"properties":{"grant_type":{"type":"string","const":"client_credentials"},"scope":{"type":"string","description":"Space-separated subset of the client's scopes; default all"},"client_id":{"type":"string"},"client_secret":{"type":"string"}}},"TokenResponse":{"type":"object","required":["access_token","token_type","expires_in","scope"],"properties":{"access_token":{"type":"string"},"token_type":{"type":"string","const":"Bearer"},"expires_in":{"type":"integer","example":3600},"scope":{"type":"string"}}},"Vehicle":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"fin":{"type":"string"},"license_plate":{"type":["string","null"]},"make":{"type":["string","null"]},"model":{"type":["string","null"]},"year":{"type":["integer","null"]},"vehicle_type":{"type":["string","null"]},"fuel_type":{"type":["string","null"]},"usage_type":{"type":["string","null"]},"mileage_km":{"type":["integer","null"]},"first_registration":{"type":["string","null"],"format":"date"},"ownership":{"type":["string","null"]},"leasing_end":{"type":["string","null"],"format":"date"},"gross_weight_kg":{"type":["integer","null"],"description":"Commercial-vehicle master data. Null unless it applies to vehicle_type (trucks, trailers; vans: gross weight only)."},"empty_weight_kg":{"type":["integer","null"],"description":"Commercial-vehicle master data. Null unless it applies to vehicle_type (trucks, trailers; vans: gross weight only)."},"length_mm":{"type":["integer","null"],"description":"Commercial-vehicle master data. Null unless it applies to vehicle_type (trucks, trailers; vans: gross weight only)."},"width_mm":{"type":["integer","null"],"description":"Commercial-vehicle master data. Null unless it applies to vehicle_type (trucks, trailers; vans: gross weight only)."},"height_mm":{"type":["integer","null"],"description":"Commercial-vehicle master data. Null unless it applies to vehicle_type (trucks, trailers; vans: gross weight only)."},"axle_count":{"type":["integer","null"],"description":"Commercial-vehicle master data. Null unless it applies to vehicle_type (trucks, trailers; vans: gross weight only)."},"brake_system":{"type":["string","null"],"enum":["ungebremst","auflauf","druckluft",null],"description":"Commercial-vehicle master data. Null unless it applies to vehicle_type (trucks, trailers; vans: gross weight only)."},"trailer_kind":{"type":["string","null"],"enum":["tandem_kasten","kipper","tieflader","bauwagen","tankanhaenger","sattelauflieger","sonstiges",null],"description":"Commercial-vehicle master data. Null unless it applies to vehicle_type (trucks, trailers; vans: gross weight only)."},"coupling_type":{"type":["string","null"],"enum":["kugelkopf","bolzen","sattelkupplung",null],"description":"Commercial-vehicle master data. Null unless it applies to vehicle_type (trucks, trailers; vans: gross weight only)."},"truck_body":{"type":["string","null"],"enum":["pritsche","kipper","koffer","sattelzugmaschine","kran","sonstiges",null],"description":"Commercial-vehicle master data. Null unless it applies to vehicle_type (trucks, trailers; vans: gross weight only)."},"towing_capacity_kg":{"type":["integer","null"],"description":"Commercial-vehicle master data. Null unless it applies to vehicle_type (trucks, trailers; vans: gross weight only)."},"has_tachograph":{"type":["boolean","null"],"description":"Commercial-vehicle master data. Null unless it applies to vehicle_type (trucks, trailers; vans: gross weight only)."},"adr_equipped":{"type":["boolean","null"],"description":"Commercial-vehicle master data. Null unless it applies to vehicle_type (trucks, trailers; vans: gross weight only)."},"max_speed_kmh":{"type":["integer","null"],"description":"Commercial-vehicle master data. Null unless it applies to vehicle_type (trucks, trailers; vans: gross weight only)."},"work_machine_kind":{"type":["string","null"],"enum":["erdbau","walze","sonstige",null],"description":"Commercial-vehicle master data. Null unless it applies to vehicle_type (trucks, trailers; vans: gross weight only)."},"battery_capacity_kwh":{"type":["number","null"],"description":"Electric-vehicle data. Null unless it applies to fuel_type."},"wltp_range_km":{"type":["integer","null"],"description":"Electric-vehicle data. Null unless it applies to fuel_type."},"electric_range_km":{"type":["integer","null"],"description":"Electric-vehicle data. Null unless it applies to fuel_type."},"co2_g_km":{"type":["integer","null"],"description":"Electric-vehicle data. Null unless it applies to fuel_type."},"charging_power_ac_kw":{"type":["number","null"],"description":"Electric-vehicle data. Null unless it applies to fuel_type."},"charging_power_dc_kw":{"type":["number","null"],"description":"Electric-vehicle data. Null unless it applies to fuel_type."},"high_voltage_system":{"type":["boolean","null"],"description":"Electric-vehicle data. Null unless it applies to fuel_type."},"archived_at":{"type":["string","null"],"format":"date-time"},"archive_reason":{"type":["string","null"]},"current_driver":{"type":["object","null"],"description":"Only with scope drivers:read","properties":{"name":{"type":["string","null"]},"profile_id":{"type":["string","null"]}}},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"DriverAssignment":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"driver":{"type":"object","properties":{"name":{"type":"string"},"profile_id":{"type":["string","null"]}}},"vehicle":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"license_plate":{"type":["string","null"]},"fin":{"type":["string","null"]}}},"assignment_type":{"type":"string","enum":["dauerhaft","temporaer","pool"]},"valid_from":{"type":"string","format":"date-time"},"valid_to":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"}}},"ServiceOrder":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"status":{"type":"string","enum":["awaiting_payment","requested","offered","accepted","scheduled","in_progress","awaiting_acceptance","done","cancelled","expired"]},"service":{"type":"object","properties":{"slug":{"type":"string"},"name_de":{"type":"string"},"name_en":{"type":"string"}}},"vehicle":{"type":["object","null"],"properties":{"id":{"type":"string","format":"uuid"},"license_plate":{"type":["string","null"]},"fin":{"type":["string","null"]}}},"scheduled_start":{"type":["string","null"],"format":"date-time"},"scheduled_end":{"type":["string","null"],"format":"date-time"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"Task":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string"},"description":{"type":["string","null"]},"due_on":{"type":"string","format":"date"},"priority":{"type":"string","enum":["niedrig","mittel","hoch"]},"status":{"type":"string","enum":["offen","erledigt_ausstehend","erledigt","storniert"]},"done_by":{"type":["string","null"],"enum":["fahrer","fuhrpark","service",null]},"vehicle":{"type":["object","null"],"properties":{"id":{"type":"string","format":"uuid"},"license_plate":{"type":["string","null"]},"fin":{"type":["string","null"]}}},"assignee":{"type":["object","null"],"properties":{"profile_id":{"type":"string","format":"uuid"},"name":{"type":["string","null"]}}},"driver":{"type":["object","null"],"properties":{"profile_id":{"type":"string","format":"uuid"},"name":{"type":["string","null"]}},"description":"Only with scope drivers:read"},"completed_via_service_order_id":{"type":["string","null"],"format":"uuid"},"completed_at":{"type":["string","null"],"format":"date-time"},"cancel_reason":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"Document":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"vehicle":{"type":["object","null"],"properties":{"id":{"type":"string","format":"uuid"},"license_plate":{"type":["string","null"]},"fin":{"type":["string","null"]}}},"category":{"type":"string"},"title":{"type":"string"},"issued_on":{"type":["string","null"],"format":"date"},"amount_cents":{"type":["integer","null"]},"file":{"type":"object","properties":{"sha256":{"type":["string","null"],"description":"Lowercase hex SHA-256; null for files before 2026-09-08"},"byte_size":{"type":["integer","null"]},"media_type":{"type":["string","null"]}}},"superseded":{"type":"boolean","description":"An older version of a replaced cost receipt"},"after_decommission":{"type":"boolean"},"download_path":{"type":"string"},"created_at":{"type":"string","format":"date-time"}}},"Fine":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"vehicle":{"type":["object","null"],"properties":{"id":{"type":"string","format":"uuid"},"license_plate":{"type":["string","null"]},"fin":{"type":["string","null"]}}},"file_number":{"type":["string","null"]},"offense_at":{"type":"string","format":"date-time"},"offense_type":{"type":"string"},"location":{"type":["string","null"]},"authority":{"type":["string","null"]},"amount_cents":{"type":"integer"},"due_on":{"type":["string","null"],"format":"date"},"hearing_due_on":{"type":["string","null"],"format":"date"},"status":{"type":"string"},"paid_at":{"type":["string","null"],"format":"date-time"},"has_document":{"type":"boolean"},"driver_assignment":{"type":["object","null"],"description":"Only with scope drivers:read","properties":{"name":{"type":["string","null"]},"profile_id":{"type":["string","null"],"format":"uuid"},"source":{"type":"string"},"confirmed":{"type":"boolean"}}},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"CostCenter":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"number":{"type":"string"},"name":{"type":"string"},"parent_id":{"type":["string","null"],"format":"uuid"},"company":{"type":["object","null"],"properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"}}},"responsible":{"type":["object","null"],"properties":{"profile_id":{"type":"string","format":"uuid"},"name":{"type":["string","null"]}}},"valid_from":{"type":"string","format":"date"},"valid_to":{"type":["string","null"],"format":"date"},"active":{"type":"boolean"},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"}}},"Invoice":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"kind":{"type":"string","enum":["service","subscription","cancellation","correction"]},"number":{"type":"string"},"status":{"type":"string","enum":["open","collecting","paid","cancelled","issued"],"description":"`collecting` = direct debit in progress (subscription only); `issued` = cancellations and corrections, which carry no payment status"},"corrects_invoice_id":{"type":["string","null"],"format":"uuid","description":"Cancellation/correction only: the original invoice (an `id` from this list)"},"corrects_invoice_number":{"type":["string","null"]},"service_label":{"type":["string","null"],"description":"null for subscription invoices"},"service_date":{"type":["string","null"],"format":"date"},"service_period":{"type":["object","null"],"description":"Subscription invoices only: the billed period","properties":{"start":{"type":"string","format":"date"},"end":{"type":"string","format":"date"}}},"service_order_ids":{"type":"array","items":{"type":"string","format":"uuid"}},"currency":{"type":"string","const":"EUR"},"net_cents":{"type":"integer"},"vat_rate_bp":{"type":"integer","description":"VAT rate in basis points (1900 = 19 %)"},"vat_cents":{"type":"integer"},"gross_cents":{"type":"integer"},"issued_on":{"type":"string","format":"date"},"due_on":{"type":["string","null"],"format":"date"},"paid_at":{"type":["string","null"],"format":"date-time"},"cancelled_at":{"type":["string","null"],"format":"date-time"},"pdf":{"type":"object","properties":{"sha256":{"type":["string","null"]},"byte_size":{"type":["integer","null"]},"download_path":{"type":"string"}}},"e_invoice":{"type":["object","null"],"properties":{"format":{"type":"string","enum":["zugferd","xrechnung"]},"sha256":{"type":"string"},"byte_size":{"type":["integer","null"]},"valid":{"type":["boolean","null"]},"download_path":{"type":"string"}}},"created_at":{"type":"string","format":"date-time"}}},"DownloadLink":{"type":"object","required":["id","url","expires_at"],"properties":{"id":{"type":"string","format":"uuid"},"number":{"type":"string","description":"Invoices only"},"format":{"type":"string","description":"E-invoices only"},"valid":{"type":"boolean","description":"E-invoices only"},"url":{"type":"string","format":"uri"},"expires_at":{"type":"string","format":"date-time"},"sha256":{"type":["string","null"]},"byte_size":{"type":["integer","null"]},"media_type":{"type":["string","null"]}}}}}}