openapi: 3.0.0
info:
title: Optibus Operations Driver Absences Vehicles API
version: 2.8.17
description: '**Welcome to the Optibus Operations API documentation!**
Optibus Operations is a cloud-based software solution that enables public transport providers to optimize their operations, planning, and scheduling. Our API provides programmatic access to Optibus Operations'' functionality, allowing you to integrate it with your own applications and systems.
'
license:
name: Optibus Ltd, All rights reserved
contact: {}
servers:
- url: https://YOUR-OPTIBUS-ACCOUNT.api.ops.optibus.co
description: Contact your Optibus Customer Success Manager for the actual baseURL and API credentials to use.
tags:
- name: Vehicles
description: API endpoints for managing vehicles.
paths:
/v1/vehicles:
get:
operationId: GetVehiclesInfoV1
responses:
'200':
description: Vehicles fetched successfully
content:
application/json:
schema:
$ref: '#/components/schemas/GetVehiclesV1SuccessfulResponse'
'400':
description: 'Possible error types: `Invalid request schema` (schema of your request does not match the specification)'
content:
application/json:
schema:
$ref: '#/components/schemas/SchemaValidationErrorResponse'
'404':
description: 'Possible error types: `pageNotFound` (requested page number is out of range; details.totalPages indicates the number of pages available)'
content:
application/json:
schema:
$ref: '#/components/schemas/GetVehiclesV1ErrorResponse'
description: 'List existing vehicles in the system, with optional filtering capability.
Notes:
- The result is paginated. Check the `pagination` property in the response to see the total number of pages and the current page number.'
summary: List vehicles
tags:
- Vehicles
security:
- api_key: []
parameters:
- description: '- Comma-separated list of vehicle IDs to filter for'
in: query
name: vehicleIds
required: false
schema:
type: string
- description: '- Date string formatted as `YYYY-MM-dd` for which we want data returned. If not provided, today''s date will be used. The date specified here affects the data returned for certain properties such as `mainRegionPeriod`, `loanedRegionPeriods`, `decommissioned`, and `customAttributes`, and also the behaviour of the `isDecommissioned` and `regionNames` query parameters.'
in: query
name: onDate
required: false
schema:
type: string
- description: '- Comma-separated list of region names to filter on. Vehicles belonging to any of the regions (either main or loaned) on the date specified by `onDate` (or today''s date if not provided) will be returned.'
in: query
name: regionNames
required: false
schema:
type: string
- description: '- Whether to filter for decommissioned vehicles on the date specified by `onDate` (or today''s date if not provided). Set to `true` to filter for decommissioned vehicles, and `false` to filter for active vehicles. Leave unspecified to return all vehicles.'
in: query
name: isDecommissioned
required: false
schema:
type: boolean
- description: '- 1-indexed integer indicating which page of results to pull'
in: query
name: page
required: false
schema:
$ref: '#/components/schemas/PageNumber'
post:
operationId: PostVehicles
responses:
'201':
description: Vehicles created successfully
content:
application/json:
schema:
$ref: '#/components/schemas/PostVehiclesSuccessResponse'
'400':
description: 'Possible error types: `Invalid request schema` (schema of your request does not match the specification), `tooManyItems` (you specified >1000 items in your request), `noItems` (you specified 0 items in your request), `invalidFieldContent` (the content of one or more fields in your request is invalid)'
content:
application/json:
schema:
anyOf:
- $ref: '#/components/schemas/PostVehiclesErrorResponse'
- $ref: '#/components/schemas/SchemaValidationErrorResponse'
'409':
description: 'Possible error types: `conflictProcessingRequest` (temporary concurrency conflict, retry shortly), `vehicleAlreadyExists` (one or more vehicle IDs specified in the request already exist in the system)'
content:
application/json:
schema:
$ref: '#/components/schemas/PostVehiclesErrorResponse'
description: "Add new vehicles to the system.\n\nNotes:\n- This API endpoint does not support modifying existing vehicles. If you need to update an existing vehicle, use the `PUT /v1/vehicles` API endpoint instead.\n- Each request is atomic - either all vehicles listed in the request are created successfully, or none are created.\n- No more than 1000 vehicles can be created in a single request - please break your request into multiple smaller chunks if you need to create more than 1000 vehicles.\n- The specification of expected values for the `customAttributes` field and whether they are mandatory or not is determined by the attribute definitions in the \"Vehicle attributes\" preference in your Ops instance.\n - Attributes with type `STRING` expect a string to be set for `customAttributes[attributeId]`.\n - Attributes with type `NUMBER` expect a number to be set for `customAttributes[attributeId]`.\n - Attributes with type `BOOLEAN` expect a boolean to be set for `customAttributes[attributeId]`.\n - Attributes with type `DATE` expect a date string formatted as `YYYY-MM-dd` to be set for `customAttributes[attributeId]`.\n - Attributes with type `SINGLE_SELECT` expect the `value` of one of the available select options to be set for `customAttributes[attributeId]`.\n - Attributes with type `MULTI_SELECT` expect an array of strings (each one being the `value` of one of the available select options) to be set for `customAttributes[attributeId]`.\n - Attributes with type `DURATION` expect a duration string formatted as `HH:mm` (where `HH` is an integer between 0 and 999, and `mm` is an integer between 0 and 59) to be set for `customAttributes[attributeId]`."
summary: Create vehicles
tags:
- Vehicles
security:
- api_key: []
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PostVehiclesRequest'
put:
operationId: PutVehicles
responses:
'200':
description: Vehicles updated successfully
content:
application/json:
schema:
$ref: '#/components/schemas/PutVehiclesSuccessResponse'
'400':
description: 'Possible error types: `Invalid request schema` (schema of your request does not match the specification), `tooManyItems` (you specified >1000 items in your request), `noItems` (you specified 0 items in your request), `invalidFieldContent` (the content of one or more fields in your request is invalid)'
content:
application/json:
schema:
anyOf:
- $ref: '#/components/schemas/PutVehiclesErrorResponse'
- $ref: '#/components/schemas/SchemaValidationErrorResponse'
'409':
description: 'Possible error types: `conflictProcessingRequest` (temporary concurrency conflict, retry shortly)'
content:
application/json:
schema:
$ref: '#/components/schemas/PutVehiclesErrorResponse'
'422':
description: 'Possible error types: `vehiclesNotFound` (one or more vehicle IDs specified in the request do not exist in the system)'
content:
application/json:
schema:
$ref: '#/components/schemas/PutVehiclesErrorResponse'
description: "Update existing vehicles in the system.\n\nNotes:\n- This API endpoint expects a full representation of the vehicle. Omitting an optional field will clear the field, with one exception: `mainRegionPeriod` (see below).\n- This API endpoint does not support creating new vehicles. If you need to create a new vehicle, use the `POST /v1/vehicles` API endpoint instead.\n- Each request is atomic - either all vehicles listed in the request are updated successfully, or none are updated.\n- No more than 1000 vehicles can be updated in a single request - please break your request into multiple smaller chunks if you need to update more than 1000 vehicles.\n- The specification of expected values for the `customAttributes` field and whether they are mandatory or not is determined by the attribute definitions in the \"Vehicle attributes\" preference in your Ops instance.\n - Attributes with type `STRING` expect a string to be set for `customAttributes[attributeId]`.\n - Attributes with type `NUMBER` expect a number to be set for `customAttributes[attributeId]`.\n - Attributes with type `BOOLEAN` expect a boolean to be set for `customAttributes[attributeId]`.\n - Attributes with type `DATE` expect a date string formatted as `YYYY-MM-dd` to be set for `customAttributes[attributeId]`.\n - Attributes with type `SINGLE_SELECT` expect the `value` of one of the available select options to be set for `customAttributes[attributeId]`.\n - Attributes with type `MULTI_SELECT` expect an array of strings (each one being the `value` of one of the available select options) to be set for `customAttributes[attributeId]`.\n - Attributes with type `DURATION` expect a duration string formatted as `HH:mm` (where `HH` is an integer between 0 and 999, and `mm` is an integer between 0 and 59) to be set for `customAttributes[attributeId]`.\n- If the value of any custom attribute is updated compared to the existing value, a new entry will be added to the history of that attribute starting from the current date. If an entry for that attribute already exists starting today, it will be overwritten instead, and an `overwriteCustomAttributeEntry` warning will be returned in the response.\n- `mainRegionPeriod` is the **only optional field whose omission does not clear the value**. Every vehicle must always belong to a region, so there is no way to remove a region assignment - you can only change it to a different region. Omitting `mainRegionPeriod` (or sending the same value currently returned by `GET /v1/vehicles`) leaves the vehicle's region assignment untouched. Sending a different region/depot creates a new region period starting today; if a region period already starts today it is overwritten in place and an `overwriteMainRegionPeriodEntry` warning is returned in the response.\n- When there are non-fatal side effects (for example, today's entries being overwritten), the response includes a `warnings` array describing them. The property is omitted when there are no warnings. The request is still considered successful when warnings are returned."
summary: Update vehicles
tags:
- Vehicles
security:
- api_key: []
parameters: []
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PutVehiclesRequest'
/vehicles/depot-period:
get:
operationId: GetVehiclesDepotPeriods
responses:
'200':
description: Vehicles depot periods
content:
application/json:
schema:
$ref: '#/components/schemas/GetVehiclesDepotPeriodsResponse'
'414':
description: The request URI exceeds 10240 bytes which is not supported. This probably results from trying to query more than a thousand vehicles at the same time. Please consider chunking your request.
description: Returns the information about the vehicles depot periods by vehicle ID.
summary: Fetch vehicle region periods
tags:
- Vehicles
security:
- api_key: []
parameters:
- description: '- Returns the depot periods for the given vehicle IDs'
in: query
name: vehicleId
required: false
schema:
type: array
items:
type: string
components:
schemas:
TypedApiErrorResponse_Invalidrequestschema_:
properties:
error:
$ref: '#/components/schemas/TypedErrorResponse_Invalidrequestschema_'
required:
- error
type: object
BaseDepotPeriod:
properties:
opUnitId:
type: string
endTime:
$ref: '#/components/schemas/Integer'
startTime:
$ref: '#/components/schemas/Integer'
endDate:
$ref: '#/components/schemas/StringifyDate'
startDate:
$ref: '#/components/schemas/StringifyDate'
depotId:
type: string
type:
$ref: '#/components/schemas/DepotPeriodType'
periodId:
type: string
required:
- startDate
- depotId
- type
- periodId
type: object
NewVehicle:
properties:
customAttributes:
properties: {}
additionalProperties:
$ref: '#/components/schemas/AttributeValue'
type: object
description: 'Custom attributes for the vehicle. Note that some custom attributes may be mandatory, according to the ''Vehicle attributes'' preference in your Ops instance.
Should be a mapping of the ''attributeId'' (configured in your Ops instance) to the initial value for that custom attribute. The value will be validated according
to the attribute definition configured in your Ops instance.'
decommissionedOnDate:
$ref: '#/components/schemas/StringifyDate'
description: When the vehicle was decommissioned, if decommissioned is true.
decommissioned:
type: boolean
description: Whether the vehicle is decommissioned.
model:
type: string
description: The model of the vehicle, cannot exceed 36 characters.
type:
type: string
description: The type of the vehicle. Depending on the 'Vehicle types' preference in your Ops instance, this may be mandatory. If specified, must be one of the vehicle types configured in your Ops instance.
description:
type: string
description: A description of the vehicle, cannot exceed 65535 characters.
depotName:
type: string
description: The name of the depot the vehicle is assigned to. If specified, should correspond to the 'unit' name returned by `GET /v1/regions`, and be a depot/unit belonging to the region.
regionName:
type: string
description: The name of the region the vehicle is assigned to. Should correspond to the region name returned by `GET /v1/regions`.
parkingLocation:
type: string
description: The parking location of the vehicle, cannot exceed 255 characters.
licensePlate:
type: string
description: The license plate of the vehicle, cannot exceed 36 characters.
id:
type: string
description: 'Unique identifier for the vehicle, cannot exceed 36 characters.
Ideally corresponds to the ID for the vehicle in the external system that you are synchronizing with.'
required:
- regionName
- id
type: object
UUID:
type: string
description: Stringified ID for a resource. Cannot exceed 36 characters.
TypedErrorResponse_PutVehiclesErrorTypes_:
properties:
details: {}
message:
type: string
type:
$ref: '#/components/schemas/PutVehiclesErrorTypes'
required:
- message
- type
type: object
VehicleDepotPeriod:
allOf:
- $ref: '#/components/schemas/BaseDepotPeriod'
- properties:
vehicleId:
type: string
required:
- vehicleId
type: object
TypedErrorResponse_Invalidrequestschema_:
properties:
details: {}
message:
type: string
type:
type: string
enum:
- Invalid request schema
nullable: false
required:
- message
- type
type: object
PutVehiclesErrorTypes:
type: string
enum:
- tooManyItems
- noItems
- invalidFieldContent
- vehiclesNotFound
- conflictProcessingRequest
Pagination:
properties:
totalPages:
$ref: '#/components/schemas/Integer'
description: Total number of pages.
nextPage:
$ref: '#/components/schemas/PageNumber'
description: Next page number (1-indexed). If undefined, there is no next page.
currentPage:
$ref: '#/components/schemas/PageNumber'
description: Current page number (1-indexed).
required:
- totalPages
- currentPage
type: object
description: 'Metadata about the pagination of a list of items. When a list of items is too large to be returned in a single response, it is split into multiple pages.
This object informs you about the current page, the next page, and the total number of pages.'
GetVehiclesV1ErrorResponse:
$ref: '#/components/schemas/TypedApiErrorResponse_GetVehiclesV1ErrorTypes_'
GetVehiclesDepotPeriodsResponse:
properties: {}
additionalProperties:
items:
$ref: '#/components/schemas/VehicleDepotPeriod'
type: array
type: object
PageNumber:
$ref: '#/components/schemas/Integer'
description: Page number (1-indexed). Defaults to 1.
minimum: 1
PutVehiclesWarning:
anyOf:
- properties:
details:
items:
properties:
vehicleId:
type: string
required:
- vehicleId
type: object
type: array
description: IDs of the vehicles whose existing region period starting today was overwritten.
message:
type: string
description: Human-readable description of the warning.
type:
type: string
enum:
- overwriteMainRegionPeriodEntry
nullable: false
required:
- details
- message
- type
type: object
- properties:
details:
items:
properties:
attributeIds:
items:
type: string
type: array
vehicleId:
type: string
required:
- attributeIds
- vehicleId
type: object
type: array
description: Per-vehicle breakdown of which custom attribute IDs had their entry starting today overwritten.
message:
type: string
description: Human-readable description of the warning.
type:
type: string
enum:
- overwriteCustomAttributeEntry
nullable: false
required:
- details
- message
- type
type: object
PostVehiclesErrorResponse:
$ref: '#/components/schemas/TypedApiErrorResponse_PostVehiclesErrorTypes_'
TypedErrorResponse_GetVehiclesV1ErrorTypes_:
properties:
details: {}
message:
type: string
type:
$ref: '#/components/schemas/GetVehiclesV1ErrorTypes'
required:
- message
- type
type: object
PostVehiclesRequest:
properties:
vehicles:
items:
$ref: '#/components/schemas/NewVehicle'
type: array
required:
- vehicles
type: object
example:
vehicles:
- id: abc-123
regionName: North
depotName: Main
licensePlate: XYZ 999
parkingLocation: Bay 30
description: A note about the vehicle
type: Double Decker
model: Routemaster
decommissioned: false
customAttributes:
color: red
capacity: 42
- id: def-456
regionName: South
depotName: Substation
licensePlate: XYZ 999
parkingLocation: Bay 31
description: Another note about a vehicle
type: Single Deck
model: Metrodecker
decommissioned: true
decommissionedOnDate: '2024-01-01'
customAttributes:
color: blue
capacity: 36
PostVehiclesSuccessResponse:
properties:
createdVehicleIds:
$ref: '#/components/schemas/IdList'
description: List of vehicle IDs that were created.
required:
- createdVehicleIds
type: object
GetVehiclesV1ErrorTypes:
type: string
enum:
- pageNotFound
nullable: false
PostVehiclesErrorTypes:
type: string
enum:
- tooManyItems
- noItems
- invalidFieldContent
- vehicleAlreadyExists
- conflictProcessingRequest
PutVehiclesRequest:
properties:
vehicles:
items:
$ref: '#/components/schemas/EditedVehicle'
type: array
required:
- vehicles
type: object
example:
vehicles:
- id: abc-123
licensePlate: XYZ 999
parkingLocation: Bay 30
description: A note about the vehicle
type: Double Decker
model: Routemaster
decommissioned: false
customAttributes:
color: red
capacity: 42
- id: def-456
licensePlate: XYZ 999
parkingLocation: Bay 31
description: Another note about a vehicle
type: Single Deck
model: Metrodecker
decommissioned: true
decommissionedOnDate: '2024-01-01'
customAttributes:
color: blue
capacity: 36
EditedVehicle:
properties:
customAttributes:
properties: {}
additionalProperties:
$ref: '#/components/schemas/AttributeValue'
type: object
description: 'Custom attributes for the vehicle. Note that some custom attributes may be mandatory, according to the ''Vehicle attributes'' preference in your Ops instance.
Should be a mapping of the ''attributeId'' (configured in your Ops instance) to the initial value for that custom attribute. The value will be validated according
to the attribute definition configured in your Ops instance.'
decommissionedOnDate:
$ref: '#/components/schemas/StringifyDate'
description: When the vehicle was decommissioned, if decommissioned is true.
decommissioned:
type: boolean
description: Whether the vehicle is decommissioned.
model:
type: string
description: The model of the vehicle, cannot exceed 36 characters.
type:
type: string
description: The type of the vehicle. Depending on the 'Vehicle types' preference in your Ops instance, this may be mandatory. If specified, must be one of the vehicle types configured in your Ops instance.
description:
type: string
description: A description of the vehicle, cannot exceed 65535 characters.
mainRegionPeriod:
properties:
depotName:
type: string
description: The name of the depot the vehicle is assigned to. If specified, should correspond to the 'unit' name returned by `GET /v1/regions`, and be a depot/unit belonging to the region.
regionName:
type: string
description: The name of the region the vehicle is assigned to. Should correspond to the region name returned by `GET /v1/regions`.
required:
- regionName
type: object
description: "The main region (and, optionally, depot) that the vehicle is assigned to from today onwards.\nShape matches the `mainRegionPeriod` returned by `GET /v1/vehicles`.\n\nThis field is optional for backwards-compatibility: existing integrations that do not send it\nwill continue to work unchanged.\n\nNote: unlike other optional fields on this endpoint, omitting `mainRegionPeriod` does NOT clear\nthe vehicle's current region assignment. Every vehicle must always belong to a region, so there\nis no way to remove a region assignment - you can only change it to a different region. If you\nwant to leave the current region and depot untouched, you have two equivalent options:\n 1. Omit this field entirely from the request item, or\n 2. Send the same `mainRegionPeriod` value currently returned by `GET /v1/vehicles` for the\n vehicle (when the requested value matches the vehicle's current assignment, no change is\n made and no warning is emitted).\n\nWhen specified:\n- If the region and depot match the vehicle's current assignment, nothing changes.\n- Otherwise, a new region period is created starting from today (in the customer's timezone).\n- If a region period already exists starting today, it is overwritten in place and an\n `overwriteMainRegionPeriodEntry` warning is returned in the response."
parkingLocation:
type: string
description: The parking location of the vehicle, cannot exceed 255 characters.
licensePlate:
type: string
description: The license plate of the vehicle, cannot exceed 36 characters.
id:
type: string
description: Unique identifier for the vehicle - should match a vehicle already created in Ops (either via the API, import process, or the Ops user interface)
required:
- id
type: object
DepotPeriodType:
enum:
- MAIN
- LOAN
- FIRST
type: string
PutVehiclesErrorResponse:
$ref: '#/components/schemas/TypedApiErrorResponse_PutVehiclesErrorTypes_'
TypedApiErrorResponse_PutVehiclesErrorTypes_:
properties:
error:
$ref: '#/components/schemas/TypedErrorResponse_PutVehiclesErrorTypes_'
required:
- error
type: object
Integer:
type: integer
format: int32
AttributeValue:
anyOf:
- items:
anyOf:
- type: number
format: double
- type: string
type: array
- type: string
- type: boolean
- type: number
format: double
TypedApiErrorResponse_GetVehiclesV1ErrorTypes_:
properties:
error:
$ref: '#/components/schemas/TypedErrorResponse_GetVehiclesV1ErrorTypes_'
required:
- error
type: object
GetVehiclesV1SuccessfulResponse:
properties:
pagination:
$ref: '#/components/schemas/Pagination'
vehicles:
items:
$ref: '#/components/schemas/VehicleV1'
type: array
required:
- pagination
- vehicles
type: object
VehicleV1:
properties:
customAttributes:
properties: {}
additionalProperties:
$ref: '#/components/schemas/AttributeValue'
type: object
description: Custom attributes for the vehicle, according to the 'Vehicle attributes' preference in your Ops instance. Returns the values for all custom attributes for the vehicle on the given date (either the date specified in the `onDate` query parameter, or today's date otherwise).
decommissionedOnDate:
$ref: '#/components/schemas/StringifyDate'
description: The date the vehicle was/will be decommissioned on
decommissioned:
type: boolean
description: Whether the vehicle is decommissioned on the given date (either the date specified in the `onDate` query parameter, or today's date otherwise)
model:
type: string
description: The model of the vehicle
type:
type: string
description: The type of the vehicle
note:
type: string
description: A description of or note about the vehicle
loanedRegionPeriods:
items:
properties:
depotName:
type: string
regionName:
type: string
required:
- regionName
type: object
type: array
description: The loaned regions and depots that the vehicle is assigned to on the given date (either the date specified in the `onDate` query parameter, or today's date otherwise)
mainRegionPeriod:
properties:
depotName:
type: string
regionName:
type: string
required:
- regionName
type: object
description: The main region and depot that the vehicle is assigned to on the given date (either the date specified in the `onDate` query parameter, or today's date otherwise)
parkingLocation:
type: string
description: The parking location of the vehicle
licensePlate:
type: string
description: The license plate of the vehicle
id:
type: string
description: Unique identifier for the vehicle
required:
- customAttributes
- decommissioned
- loanedRegionPeriods
- mainRegionPeriod
- id
type: object
IdList:
items:
$ref: '#/components/schemas/UUID'
type: array
example:
- item-123
- item-456
- item-789
description: A list of IDs.
TypedApiErrorResponse_PostVehiclesErrorTypes_:
properties:
error:
$ref: '#/components/schemas/TypedErrorResponse_PostVehiclesErrorTypes_'
required:
- error
type: object
StringifyDate:
type: string
format: date
description: Stringified ISO8601 date in the form of `YYYY-MM-dd`, for example `2017-07-21`
SchemaValidationErrorResponse:
$ref: '#/components/schemas/TypedApiErrorResponse_Invalidrequestschema_'
TypedErrorResponse_PostVehiclesErrorTypes_:
properties:
details: {}
message:
type: string
type:
$ref: '#/components/schemas/PostVehiclesErrorTypes'
required:
- message
- type
type: object
PutVehiclesSuccessResponse:
properties:
warnings:
items:
$ref: '#/components/schemas/PutVehiclesWarning'
type: array
description: 'Non-fatal warnings about side effects of the request (for example, entries starting today being overwritten).
Omitted when there are no warnings.'
updatedVehicleIds:
$ref: '#/components/schemas/IdList'
description: List of vehicle IDs that were updated.
required:
- updatedVehicleIds
type: object
securitySchemes:
api_key:
type: apiKey
name: Authorization
in: header
x-tagGroups:
- name: General API Info
tags:
- Authentication
- Versioning
- name: Use case guides
tags:
- HR System Integration Guides
- Fleet Management System Integration Guides
- Operational Plan Query Guides
- Custom Driver App Notification Action Guide
- name: Client preferences
tags:
- Preferences
- name: Resource Management
tags:
- Regions
- Drivers
- Driver Absences
- Driver Employment Periods
- Driver Custom Attributes
- Driver Groups
- Vehicles
- Vehicle Downtimes
- Vehicle Custom Attributes
- name: Operations Management
tags:
- Roster
- Operational Plan
- Tasks
- Stops
- Signing Times
- name: Work & Payroll
tags:
- Work Entities
- Payroll
- Statistics
- name: Private Hires
tags:
- Private Hires
- name: Driver App Integration
tags:
- Driver App Notifications
- name: Event Webhooks
tags:
- Event Webhooks
- name: Data Ingestion
tags:
- Tacho Ingestion
- name: Deprecated API Endpoints
tags:
- Drivers (Deprecated)
- Vehicles (Deprecated)
- Operational
# --- truncated at 32 KB (32 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/optibus/refs/heads/main/openapi/optibus-vehicles-api-openapi.yml