diff --git a/gbfs.md b/gbfs.md
index 1ab452f3..56d7acd8 100644
--- a/gbfs.md
+++ b/gbfs.md
@@ -200,8 +200,12 @@ Example: The `rental_methods` field contains values `creditcard`, `paypass`, etc
* Timestamp - Timestamp fields MUST be represented as integers in POSIX time. (e.g., the number of seconds since January 1st 1970 00:00:00 UTC)
* Timezone - TZ timezone from the https://www.iana.org/time-zones. Timezone names never contain the space character but MAY contain an underscore. Refer to https://en.wikipedia.org/wiki/List_of_tz_zones for a list of valid values.
Example: `Asia/Tokyo`, `America/Los_Angeles` or `Africa/Cairo`.
+* Country code - Country code following the [ISO 3166-1 alpha-2 notation](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).
* URI *(added in v1.1)* - A fully qualified URI that includes the scheme (e.g., `com.example.android://`), and any special characters in the URI MUST be correctly escaped. See the following https://www.w3.org/Addressing/URL/4_URI_Recommentations.html for a description of how to create fully qualified URI values. Note that URIs MAY be URLs.
* URL - A fully qualified URL that includes `http://` or `https://`, and any special characters in the URL MUST be correctly escaped. See the following https://www.w3.org/Addressing/URL/4_URI_Recommentations.html for a description of how to create fully qualified URL values.
+* Phone number - Phone number in international formatting (specification [E.164](https://en.wikipedia.org/wiki/E.164)). In particular, the phone number MUST start with a "+". The characters after the "+" MUST be numbers and MUST NOT contain any hyphen, space or parenthesis.
+* Datetime - Combination of a date and a time following [ISO 8601 notation](https://www.iso.org/iso-8601-date-and-time-format.html). Attributes : [year](https://docs.python.org/3/library/datetime.html#datetime.datetime.year), [month](https://docs.python.org/3/library/datetime.html#datetime.datetime.month), [day](https://docs.python.org/3/library/datetime.html#datetime.datetime.day), [hour](https://docs.python.org/3/library/datetime.html#datetime.datetime.hour), [minute](https://docs.python.org/3/library/datetime.html#datetime.datetime.minute), [second](https://docs.python.org/3/library/datetime.html#datetime.datetime.second), and timezone.
+
### Extensions Outside of the Specification
@@ -409,9 +413,21 @@ Field Name | REQUIRED | Type | Defines
`vehicle_types` | Yes | Array | Array that contains one object per vehicle type in the system as defined below.
\- `vehicle_type_id` | Yes | ID | Unique identifier of a vehicle type. See [Field Types](#field-types) above for ID field requirements.
\- `form_factor` | Yes | Enum | The vehicle's general form factor.
Current valid values are:
- `bicycle`
- `cargo_bicycle`
- `car`
- `moped`
- `scooter` (will be deprecated in v3.0)
- `scooter_standing` (standing kick scooter)
- `scooted_seated` (this is a kick scooter with a seat, not to be confused with `moped`)
- `other`
-\- `propulsion_type` | Yes | Enum | The primary propulsion type of the vehicle.
Current valid values are:
- `human` _(Pedal or foot propulsion)_
- `electric_assist` _(Provides power only alongside human propulsion)_
- `electric` _(Contains throttle mode with a battery-powered motor)_
- `combustion` _(Contains throttle mode with a gas engine-powered motor)_
This field was inspired by, but differs from the propulsion types field described in the [Open Mobility Foundation Mobility Data Specification](https://github.com/openmobilityfoundation/mobility-data-specification/blob/master/provider/README.md#propulsion-types).
+\- `rider_capacity`
*(added in vXXX)* | OPTIONAL | Non-negative integer | The number of riders (driver included) the vehicle can legally accommodate.
+\- `cargo_volume_capacity`
*(added in vXXX)* | OPTIONAL | Non-negative integer | Cargo volume available in the vehicle, expressed in liters. For cars, it corresponds to the space between the boot floor, including the storage under the hatch, to the rear shelf in the trunk.
+\- `cargo_load_capacity`
*(added in vXXX)* | OPTIONAL | Non-negative integer | Loading capacity allowed in the space dedicated to the loading of materials of the vehicle (excluding passengers), expressed in kilograms.
+\- `propulsion_type` | Yes | Enum | The primary propulsion type of the vehicle.
Current valid values are:
- `human` _(Pedal or foot propulsion)_
- `electric_assist` _(Provides power only alongside human propulsion)_
- `electric` _(Contains throttle mode with a battery-powered motor)_
- `combustion` _(Contains throttle mode with a gas engine-powered motor)_
- `combustion_diesel` _(Contains throttle mode with a diesel engine-powered motor)_
- `hybrid` _(Contains throttle mode with a mixed gas engine-powered and battery-powered motor)_
- `hydrogen_fuel_cell` _(Contains throttle mode with a hydrogen fuel cell powered motor)_
- `plug_in_hybrid` _(Contains throttle mode with a mixed gas engine-powered and battery-powered motor with plug-in)_
This field was inspired by, but differs from the propulsion types field described in the [Open Mobility Foundation Mobility Data Specification](https://github.com/openmobilityfoundation/mobility-data-specification/blob/master/provider/README.md#propulsion-types).
+\- `eco_label`
*(added in vXXX)* | OPTIONAL | Array | Vehicle air quality certificate. Official anti-pollution certificate, based on the information on the vehicle's registration certificate, attesting to its level of pollutant emissions based on a defined standard. In Europe, for example, it is the European emission standard. The aim of this measure is to encourage the use of the least polluting vehicles by allowing them to drive during pollution peaks or in low emission zones.
Each element in the array is an object with the keys below.
+ \- `country_code`
*(added in vXXX)*| Yes| Country code | Country where the eco_sticker applies.
+ \- `eco_sticker`
*(added in vXXX)* | Yes | String | Name of the eco label. The name must be written in lowercase, separated by an underscore.
Example of eco_sticker in Europe :- CritAirLabel (France)
- critair
- critair_1
- critair_2
- critair_3
- critair_4
- critair_5
- UmweltPlakette (Germany)
- euro_2
- euro_3
- euro_4
- euro_5
- euro_6
- euro_6_temp
- euro_E
- UmweltPickerl (Austrich)
- euro_1
- euro_2
- euro_3
- euro_4
- euro_5
- Reg_certificates (Belgium)
- Distintivo_ambiental (Spain)
\- `max_range_meters` | Conditionally REQUIRED | Non-negative float | If the vehicle has a motor (as indicated by having a value other than `human` in the `propulsion_type` field), this field is REQUIRED. This represents the furthest distance in meters that the vehicle can travel without recharging or refueling when it has the maximum amount of energy potential (for example, a full battery or full tank of gas).
\- `name` | OPTIONAL | String | The public name of this vehicle type.
+\- `vehicle_accessories`
*(added in vXXX)* | OPTIONAL | Array | Description of accessories available in the vehicle. These accessories are part of the vehicle and are not supposed to change frequently. Current valid values are:- `air_conditioning` _(Vehicle has air condition)_
- `automatic` _(Automatic gear switch)_
- `manual` _(Manual gear switch)_
- `convertible` _(Vehicle is convertible)_
- `cruise_control` _(Vehicle has a cruise control system ("Tempomat"))_
- `doors_2` _(Vehicle has 2 doors)_
- `doors_3` _(Vehicle has 3 doors)_
- `doors_4` _(Vehicle has 4 doors)_
- `doors_5` _(Vehicle has 5 doors)_
- `navigation` _(Vehicle has a built-in navigation system)_
+\- `g_CO2_km`
*(added in vXXX)* | OPTIONAL | Non-negative integer | Maximum quantity of CO2, in grams, emitted per kilometer, according to the [WLTP](https://en.wikipedia.org/wiki/Worldwide_Harmonised_Light_Vehicles_Test_Procedure).
+\- `vehicle_image`
*(added in vXXX)* | OPTIONAL | URL | URL to an image that would assist the user in identifying the vehicle (e.g. logo, image of vehicle).
Allowed formats: JPEG, PNG.
+| \- `make`
*(added in vXXX)*| OPTIONAL| String| The name of the vehicle manufacturer.
Example:
+| \- `model`
*(added in vXXX)*| OPTIONAL| String| The name of the vehicle model.
Example
+| \- `color`
*(added in vXXX)*| OPTIONAL| String| The color of the vehicle.
All words must be in lower case, without special characters, quotation marks, hyphens, underscores, commas or dot. Spaces are allowed in case of a compound name.
Example
\- `wheel_count` | OPTIONAL | Non-negative Integer | Number of wheels this vehicle type has.
\- `max_permitted_speed` | OPTIONAL | Non-negative Integer | The maximum speed in kilometers per hour this vehicle is permitted to reach in accordance with local permit and regulations.
\- `rated_power` | OPTIONAL | Non-negative Integer | The rated power of the motor for this vehicle type in watts.
@@ -501,7 +517,19 @@ Field Name | REQUIRED | Type | Defines
{
"vehicle_type_id": "car1",
"form_factor": "car",
- "propulsion_type": "combustion",
+ "rider_capacity": 5,
+ "min_cargo_volume_capacity": 200,
+ "propulsion_type": "combustion_diesel",
+ "eco_label": [
+ {
+ "country_code": "FR",
+ "eco_sticker": "critair_1"
+ },
+ {
+ "country_code": "DE",
+ "eco_sticker": "euro_2"
+ }
+ ],
"name": "Four-door Sedan",
"wheel_count": 4,
"default_reserve_time": 0,
@@ -509,6 +537,16 @@ Field Name | REQUIRED | Type | Defines
"return_type": [
"roundtrip_station"
],
+ "vehicle_accessories": [
+ "doors_4",
+ "automatic",
+ "cruise_control"
+ ],
+ "g_CO2_km": 120,
+ "vehicle_image": "https://mediarepository-wired-prod-1-euw1.wrd-aws.com/cri/vehicles/398ab08b-f1d6-8144-e026-b72dc668042c/outside_medium.jpg",
+ "make": "Renault",
+ "model": "Clio",
+ "color": "white",
"vehicle_assets": {
"icon_url": "https://www.example.com/assets/icon_car.svg",
"icon_url_dark": "https://www.example.com/assets/icon_car_dark.svg",
@@ -538,8 +576,11 @@ Field Name | REQUIRED | Type | Defines
\- `region_id` | OPTIONAL | ID | Identifier of the region where station is located. See [system_regions.json](#system_regionsjson).
\- `post_code` | OPTIONAL | String | Postal code where station is located.
\- `rental_methods` | OPTIONAL | Array | Payment methods accepted at this station.
Current valid values are:
- `key` (e.g. operator issued vehicle key / fob / card)
- `creditcard`
- `paypass`
- `applepay`
- `androidpay`
- `transitcard`
- `accountnumber`
- `phone`
-\- `is_virtual_station`
*(added in v2.1)* | OPTIONAL | Boolean | Is this station a location with or without physical infrastructures (docks)?
`true` - The station is a location without physical infrastructure, defined by a point (lat/lon) and/or `station_area` (below).
`false` - The station consists of physical infrastructure (docks).
If this field is empty, it means the station consists of physical infrastructure (docks).
This field SHOULD be published in systems that have station locations without standard, internet connected physical docking infrastructure. These may be racks or geofenced areas designated for rental and/or return of vehicles. Locations that fit within this description SHOULD have the `is_virtual_station` boolean set to `true`.
+\- `is_virtual_station`
*(added in v2.1)* | OPTIONAL | Boolean | Is this station a location with or without physical infrastructures?
`true` - The station is a location without physical infrastructure, defined by a point (lat/lon) and/or `station_area` (below).
`false` - The station consists of physical infrastructure.
If this field is empty, it means the station consists of physical infrastructure.
Physical infrastructures can be docks, charging stations, dropbox, operator branch, gate arm or parking hoops.
This field SHOULD be published in systems that have station locations without standard, internet connected physical docking infrastructure. These may be racks or geofenced areas designated for rental and/or return of vehicles. Locations that fit within this description SHOULD have the `is_virtual_station` boolean set to `true`.
\- `station_area`
*(added in v2.1)* | OPTIONAL | GeoJSON MultiPolygon | A GeoJSON MultiPolygon that describes the area of a virtual station. If `station_area` is supplied then the record describes a virtual station.
If lat/lon and `station_area` are both defined, the lat/lon is the significant coordinate of the station (e.g. dock facility or valet drop-off and pick up point). The `station_area` takes precedence over any `ride_allowed` rules in overlapping `geofencing_zones`.
+\- `parking_type`
*(added in vXXX)* | OPTIONAL | Enum | Type of parking station.
Current valid values are:- `parking_lot` _(Off-street parking lot)_
- `street_parking` _(Curbside parking)_
- `underground_parking` _(Parking that is below street level, station may be non-communicating)_
- `sidewalk_parking` _(Park vehicle on sidewalk, out of the pedestrian right of way)_
- `other`
+\- `parking_hoop`
*(added in vXXX)* | OPTIONAL | Boolean | Are parking hoops present at this station?
Parking hoops are facilities that secure a parking space by being lockable with keys. This limits the abusive parking of unauthorized vehicles.
`true` - This station has parking hoops.
`false` - This station does not have parking hoops.
+\- `contact_phone`
*(added in vXXX)* | OPTIONAL | Phone number | Contact phone of the station.
\- `capacity` | OPTIONAL | Non-negative integer | Number of total docking points installed at this station, both available and unavailable, regardless of what vehicle types are allowed at each dock.
If this is a virtual station defined using the `is_virtual_station` field, this number represents the total number of vehicles of all types that can be parked at the virtual station.
If the virtual station is defined by `station_area`, this is the number that can park within the station area. If `lat`/`lon` are defined, this is the number that can park at those coordinates.
\- `vehicle_capacity`
*(added in v2.1)* | OPTIONAL | Object | An object used to describe the parking capacity of virtual stations (defined using the `is_virtual_station` field), where each key is a `vehicle_type_id` as described in [vehicle_types.json](#vehicle_typesjson-added-in-v21) and the value is a number representing the total number of vehicles of this type that can park within the virtual station.
If the virtual station is defined by `station_area`, this is the number that can park within the station area. If `lat`/`lon` is defined, this is the number that can park at those coordinates.
\- `vehicle_type_capacity`
*(added in v2.1)* | OPTIONAL | Object | An object used to describe the docking capacity of a station where each key is a `vehicle_type_id` as described in [vehicle_types.json](#vehicle_typesjson-added-in-v21) and the value is a number representing the total docking points installed at this station, both available and unavailable for the specified vehicle type.
@@ -564,6 +605,9 @@ Field Name | REQUIRED | Type | Defines
"name": "Parking garage A",
"lat": 12.345678,
"lon": 45.678901,
+ "parking_type": "underground_parking",
+ "parking_hoop": false,
+ "contact_phone": "+33109874321",
"is_charging_station": "true",
"vehicle_type_capacity": {
"abc123": 7,
@@ -747,10 +791,14 @@ Field Name | REQUIRED | Type | Defines
\- `web`
*(added in v1.1)* | OPTIONAL | URL | URL that can be used by a web browser to show more information about renting a vehicle at this vehicle.
This URL SHOULD be a deep link specific to this vehicle, and SHOULD NOT be a general rental page that includes information for more than one vehicle. The deep link SHOULD take users directly to this vehicle, without any prompts, interstitial pages, or logins. Make sure that users can see this vehicle even if they never previously opened the application. Note that as a best practice providers SHOULD rotate identifiers within deep links after each rental to avoid unintentionally exposing private vehicle trip origins and destinations.
If this field is empty, it means deep linking isn’t supported for web browsers.
Example value: `https://www.example.com/app?sid=1234567890`
\- `vehicle_type_id`
*(added in v2.1)* | Conditionally REQUIRED | ID | The `vehicle_type_id` of this vehicle as described in [vehicle_types.json](#vehicle_typesjson-added-in-v21). This field is REQUIRED if the [vehicle_types.json](#vehicle_typesjson-added-in-v21) is defined.
\- `last_reported`
*(added in v2.1)* | OPTIONAL | Timestamp | The last time this vehicle reported its status to the operator's backend.
-\- `current_range_meters`
*(added in v2.1)* | Conditionally REQUIRED | Non-negative float | If the corresponding `vehicle_type` definition for this vehicle has a motor, then this field is REQUIRED. This value represents the furthest distance in meters that the vehicle can travel without recharging or refueling with the vehicle's current charge or fuel.
+\- `current_range_meters`
*(added in v2.1)* | Conditionally REQUIRED | Non-negative float | If the corresponding `vehicle_type` definition for this vehicle has a motor, then this field is REQUIRED. This value represents the furthest distance in meters that the vehicle can travel without recharging or refueling with the vehicle's current charge or fuel. Note that the given range is indicative and can be different from the one displayed on the vehicle's dashboard.
+\- `current_fuel_percent`
*(added in vXXX)*| OPTIONAL | Non-negative float | This value represents the current percentage, expressed from 0 to 1 of fuel or battery power remaining in the vehicle.
\- `station_id`
*(added in v2.1)* | Conditionally REQUIRED | ID | Identifier referencing the `station_id` field in [station_information.json](#station_informationjson). REQUIRED only if the vehicle is currently at a station and the [vehicle_types.json](#vehicle_typesjson) file has been defined.
\- `home_station_id`
*(added in v2.3-RC)* | OPTIONAL | ID | The `station_id` of the station this vehicle must be returned to as defined in [station_information.json](#station_information.json).
\- `pricing_plan_id`
*(added in v2.2)* | OPTIONAL | ID | The `plan_id` of the pricing plan this vehicle is eligible for as described in [system_pricing_plans.json](#system_pricing_plans.json). If this field is defined it supersedes `default_pricing_plan_id` in `vehicle_types.json`. This field SHOULD be used to override `default_pricing_plan_id` in `vehicle_types.json` to define pricing plans for individual vehicles when necessary.
+\- `vehicle_equipment`
*(added in vXXX)* | OPTIONAL | Array | Description of vehicle equipment that can be provided by the operator in addition to the accessories already provided in the vehicle (field `vehicle_accessories` of vehicle_type.json) but subject to more frequent updates.
Current valid values are:- `child_seat_a` _(Baby seat ("0-10kg"))_
- `child_seat_b` _(Seat or seat extension for small children ("9-18 kg"))_
- `child_seat_c` _(Seat or seat extension for older children ("15-36 kg"))_
- `winter_tires` _(Vehicle has tires for winter weather)_
- `snow_chains`
+\- `available_until`
*(added in vXXX)* | Conditionally REQUIRED | Datetime | This field is REQUIRED when the `return_type` defined in [vehicle_type.json](#vehicle_type.json) is set to `roundtrip_station`. Only applies to round trips. Any trip currently started must be finished before the specified Datetime. The vehicle being already booked afterward.
+
##### Example:
@@ -768,7 +816,14 @@ Field Name | REQUIRED | Type | Defines
"lon": 56.789012,
"is_reserved": false,
"is_disabled": false,
- "vehicle_type_id": "abc123"
+ "vehicle_type_id": "abc123",
+ "current_range_meters": 400000,
+ "available_until": "2021-05-17T15:00:00Z",
+ "home_station": "station1",
+ "vehicle_equipment": [
+ "child_seat_a",
+ "winter_tires"
+ ]
},
{
"bike_id": "jkl012",
@@ -776,15 +831,18 @@ Field Name | REQUIRED | Type | Defines
"is_reserved": false,
"is_disabled": false,
"vehicle_type_id": "def456",
+ "current_fuel_percent": 0.7,
"current_range_meters": 6543.0,
"station_id": "86",
"pricing_plan_id": "plan3",
- "home_station_id": "146"
+ "home_station_id": "146",
+ "vehicle_equipment": [
+ "child_seat_a"
+ ]
}
]
}
}
-
```
### system_hours.json