From 212386e2d3c432f9ceaefced37fd75e0ab3b0dce Mon Sep 17 00:00:00 2001 From: Fabien Richard-Allouard Date: Thu, 4 Jan 2024 16:41:04 +0100 Subject: [PATCH] Explicit field hierarchy and array sub-types (#583) * Improve readability (#582) * Improve readability * replace < and > with < and > for display. * all fields have a definition --------- Co-authored-by: Tom <1955774+tdelmas@users.noreply.github.com> * Minor rephrasings * Remove duplicate of Object definition * Make field hierarchy explicit * Adds missing array sub-types * Fix type Array * Update fiedl descriptions for Array * Maintain field types alphabetical order --------- Co-authored-by: Tom <1955774+tdelmas@users.noreply.github.com> --- gbfs.md | 341 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 170 insertions(+), 171 deletions(-) diff --git a/gbfs.md b/gbfs.md index 6b2b2b94..d9c66b81 100644 --- a/gbfs.md +++ b/gbfs.md @@ -54,7 +54,7 @@ This section defines terms that are used throughout this document. * JSON - (JavaScript Object Notation) is a lightweight format for storing and transporting data. This document uses many terms defined by the JSON standard, including field, array, and object. (https://www.w3schools.com/js/js_json_datatypes.asp) * Field - In JSON, a name/value pair consists of a field name (in double quotes), followed by a colon, followed by a value. (https://www.w3schools.com/js/js_json_syntax.asp) * GeoJSON - GeoJSON is a format for encoding a variety of geographic data structures. (https://geojson.org/) -* REQUIRED - The field MUST be included in the dataset, and a value MUST be provided in that field for each record. +* REQUIRED - The field MUST be included in the dataset, and a value MUST be provided in that field for each record. (A required field inside an OPTIONAL Object is only required when the Object is present.) * OPTIONAL - The field MAY be omitted from the dataset. If an OPTIONAL column is included, some of the entries in that field MAY be empty strings. An omitted field is equivalent to a field that is empty. * Conditionally REQUIRED - The field or file is REQUIRED under certain conditions, which are outlined in the field or file description. Outside of these conditions, this field or file is OPTIONAL. @@ -188,7 +188,6 @@ The data returned by the near-realtime endpoints `station_status.json` and `vehi It is RECOMMENDED that all GBFS data sets be offered under an open data license. Open data licenses allow consumers to freely use, modify, and share GBFS data for any purpose in perpetuity. Licensing of GBFS data provides certainty to GBFS consumers, allowing them to integrate GBFS data into their work. All GBFS data sets SHOULD specify a license using the `license_id` field with an [SPDX identifier](https://spdx.org/licenses/) or by using the `license_url` field with a URL pointing to a custom license in `system_information.json`. See the GBFS repo for a [comparison of a subset of standard licenses](https://github.com/MobilityData/gbfs/blob/master/data-licenses.md). ## Field Types - * Array - A JSON element consisting of an ordered sequence of zero or more values. * Array<Type> - A JSON element consisting of an ordered sequence of zero or more values of the specified sub-type. * Boolean - One of two possible values, `true` or `false`. Boolean values MUST be JSON booleans, not strings (meaning `true` or `false`, not `"true"` or `"false"`). *(as of v2.0)* @@ -287,9 +286,9 @@ The `gbfs.json` discovery file SHOULD represent a single system or geographic ar Field Name | REQUIRED | Type | Defines ---|---|---|--- -`feeds` | Yes | Array | An array of all of the feeds that are published by this auto-discovery file. Each element in the array is an object with the keys below. -\-  `name` | Yes | String | Key identifying the type of feed this is. The key MUST be the base file name defined in the spec for the corresponding feed type ( `system_information` for `system_information.json` file, `station_information` for `station_information.json` file). -\-  `url` | Yes | URL | URL for the feed. Note that the actual feed endpoints (urls) may not be defined in the `file_name.json` format. For example, a valid feed endpoint could end with `station_info` instead of `station_information.json`. +`feeds` | Yes | Array<Object> | An array of all of the feeds that are published by this auto-discovery file. +`feeds[].name` | Yes | String | Key identifying the type of feed this is. The key MUST be the base file name defined in the spec for the corresponding feed type ( `system_information` for `system_information.json` file, `station_information` for `station_information.json` file). +`feeds[].url` | Yes | URL | URL for the feed. Note that the actual feed endpoints (urls) may not be defined in the `file_name.json` format. For example, a valid feed endpoint could end with `station_info` instead of `station_information.json`. **Example:** @@ -322,11 +321,11 @@ The following fields are all attributes within the main `data` object for this f Field Name | REQUIRED | Type | Defines ---|---|---|--- -`datasets` | Yes | Array | An array of objects, each containing the keys below. -\- `system_id` | Yes | ID | The `system_id` from `system_information.json` for the corresponding data set(s). -\- `versions` | Yes | Array | Contains one object, as defined below, for each of the available versions of a feed. The array MUST be sorted by increasing MAJOR and MINOR version number. -  \-`version` | Yes | String | The semantic version of the feed in the form `X.Y`. -  \-`url` | Yes | URL | URL of the corresponding `gbfs.json` endpoint. +`datasets` | Yes | Array<Object> | An array of `datasets` produced by a publisher. +`datasets[].system_id` | Yes | ID | The `system_id` from `system_information.json` for the corresponding data set(s). +`datasets[].versions` | Yes | Array<Object> | Contains one object for each of the available versions of a feed. The array MUST be sorted by increasing MAJOR and MINOR version number. +`datasets[].versions[].version` | Yes | String | The semantic version of the feed in the form `X.Y`. +`datasets[].versions[].url` | Yes | URL | URL of the corresponding `gbfs.json` endpoint. **Example:** ```json @@ -374,9 +373,9 @@ The following fields are all attributes within the main `data` object for this f Field Name | REQUIRED | Type | Defines ---|---|---|--- -`versions` | Yes | Array | Contains one object, as defined below, for each of the available versions of a feed. The array MUST be sorted by increasing MAJOR and MINOR version number. -\-  `version` | Yes | String | The semantic version of the feed in the form `X.Y`. -\-  `url` | Yes | URL | URL of the corresponding gbfs.json endpoint. +`versions` | Yes | Array<Object> | Contains one object for each of the available versions of a feed. The array MUST be sorted by increasing MAJOR and MINOR version number. +`versions[].version` | Yes | String | The semantic version of the feed in the form `X.Y`. +`versions[].url` | Yes | URL | URL of the corresponding gbfs.json endpoint. **Example:** @@ -407,7 +406,7 @@ The following fields are all attributes within the main `data` object for this f Field Name | REQUIRED | Type | Defines ---|---|---|--- `system_id` | Yes | ID | This is a globally unique identifier for the vehicle share system. Each distinct system or geographic area in which vehicles are operated MUST have its own unique `system_id`. It is up to the publisher of the feed to guarantee uniqueness and MUST be checked against existing `system_id` fields in [systems.csv](https://github.com/MobilityData/gbfs/blob/master/systems.csv) to ensure this. This value is intended to remain the same over the life of the system.

System IDs SHOULD be recognizable as belonging to a particular system as opposed to random strings - for example, `bcycle_austin` or `biketown_pdx`. -`languages`
*(added of v3.0-RC)* | Yes | Array | List of languages used in translated strings. Each element in the list must be of type Language. +`languages`
*(added of v3.0-RC)* | Yes | Array<Language> | List of languages used in translated strings. `name`
*(as of v3.0-RC)* | Yes | Array<Localized String> | Name of the system to be displayed to customers. `opening_hours`
*(added in v3.0-RC)*| Yes | String | Hours and dates of operation for the system in [OSM opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) format. *(added in v3.0-RC)* `short_name` *(as of v3.0-RC)* | OPTIONAL | Array<Localized String> | Abbreviation for a system. @@ -425,23 +424,23 @@ Field Name | REQUIRED | Type | Defines `license_url` | Conditionally REQUIRED
*(as of v3.0-RC)* | URL | REQUIRED if the dataset is provided under a customized license. A fully qualified URL of a page that defines the license terms for the GBFS data for this system. Do not specify a `license_url` if `license_id` is specified. If the `license_id` and `license_url` fields are blank or omitted, this indicates that the feed is provided under the [Creative Commons Universal Public Domain Dedication](https://creativecommons.org/publicdomain/zero/1.0/legalcode). *(as of v3.0-RC)* `attribution_organization_name`
*(added in v3.0-RC)* | OPTIONAL | Array<Localized String> | If the feed license requires attribution, name of the organization to which attribution should be provided. `attribution_url`
*(added in v3.0-RC)* | OPTIONAL | URL | URL of the organization to which attribution should be provided. -`brand_assets`
*(added in v2.3)* | OPTIONAL | Object | An object where each key defines one of the items listed below. -\- `brand_last_modified`
*(added in v2.3)* | Conditionally REQUIRED | Date | REQUIRED if `brand_assets` object is defined. Date that indicates the last time any included brand assets were updated or modified. -\- `brand_terms_url`
*(added in v2.3)* | OPTIONAL | URL | A fully qualified URL pointing to the location of a page that defines the license terms of brand icons, colors, or other trademark information. This field MUST NOT take the place of `license_url` or `license_id`. -\- `brand_image_url`
*(added in v2.3)* | Conditionally REQUIRED | URL | REQUIRED if `brand_assets` object is defined. A fully qualified URL pointing to the location of a graphic file representing the brand for the service. File MUST be in SVG V1.1 format and MUST be either square or round. -\- `brand_image_url_dark`
*(added in v2.3)* | OPTIONAL | URL | A fully qualified URL pointing to the location of a graphic file representing the brand for the service for use in dark mode applications. File MUST be in SVG V1.1 format and MUST be either square or round. -\- `color`
*(added in v2.3)* | OPTIONAL | String | Color used to represent the brand for the service expressed as a 6 digit hexadecimal color code in the form #000000. -`terms_url`
*(as of v3.0-RC)* | OPTIONAL | Array<Localized URL> | A fully qualified URL pointing to the terms of service (also often called "terms of use" or "terms and conditions") for the service. -`terms_last_updated`
*(added in v2.3)* |Conditionally REQUIRED | Date | REQUIRED if `terms_url` is defined. The date that the terms of service provided at `terms_url` were last updated. -`privacy_url`
*(as of v3.0-RC)*| OPTIONAL | Array<Localized URL> | A fully qualified URL pointing to the privacy policy for the service. -`privacy_last_updated`
*(added in v2.3)* |Conditionally REQUIRED | Date | REQUIRED if `privacy_url` is defined. The date that the privacy policy provided at `privacy_url` was last updated. +`brand_assets`
*(added in v2.3)* | OPTIONAL | Object | Object containing branding information about the system. +`brand_assets.brand_last_modified`
*(added in v2.3)* | REQUIRED | Date | Date that indicates the last time any included brand assets were updated or modified. +`brand_assets.brand_terms_url`
*(added in v2.3)* | OPTIONAL | URL | A fully qualified URL pointing to the location of a page that defines the license terms of brand icons, colors, or other trademark information. This field MUST NOT take the place of `license_url` or `license_id`. +`brand_assets.brand_image_url`
*(added in v2.3)* | REQUIRED | URL | A fully qualified URL pointing to the location of a graphic file representing the brand for the service. File MUST be in SVG V1.1 format and MUST be either square or round. +`brand_assets.brand_image_url_dark`
*(added in v2.3)* | OPTIONAL | URL | A fully qualified URL pointing to the location of a graphic file representing the brand for the service for use in dark mode applications. File MUST be in SVG V1.1 format and MUST be either square or round. +`brand_assets.color`
*(added in v2.3)* | OPTIONAL | String | Color used to represent the brand for the service expressed as a 6 digit hexadecimal color code in the form #000000. +`terms_url`
*(as of v3.0-RC)* | OPTIONAL | Array<Localized String> | A fully qualified URL pointing to the terms of service (also often called "terms of use" or "terms and conditions") for the service. +`terms_last_updated`
*(added in v2.3)* | REQUIRED | Date | The date that the terms of service provided at `terms_url` were last updated. +`privacy_url`
*(as of v3.0-RC)*| OPTIONAL | Array<Localized String> | A fully qualified URL pointing to the privacy policy for the service. +`privacy_last_updated`
*(added in v2.3)* | REQUIRED | Date | The date that the privacy policy provided at `privacy_url` was last updated. `rental_apps` | OPTIONAL | Object | Contains rental app information in the `android` and `ios` JSON objects. -\- `android` | OPTIONAL | Object | Contains rental app download and app discovery information for the Android platform in the `store_uri` and `discovery_uri` fields. See [examples](#deep-links-examples) of how to use these fields and [supported analytics](#analytics). - - `store_uri` | Conditionally REQUIRED | URI | URI where the rental Android app can be downloaded from. Typically this will be a URI to an app store, such as Google Play. If the URI points to an app store, the URI SHOULD follow Android best practices so the viewing app can directly open the URI to the native app store app instead of a website.

If a `rental_uris`.`android` field is populated, then this field is REQUIRED.

See the [Analytics](#analytics) section for how viewing apps can report the origin of the deep link to rental apps.

Example value: `https://play.google.com/store/apps/details?id=com.example.android` - - `discovery_uri` | Conditionally REQUIRED | URI | URI that can be used to discover if the rental Android app is installed on the device (for example, using [`PackageManager.queryIntentActivities()`](https://developer.android.com/reference/android/content/pm/PackageManager.html#queryIntentActivities)). This intent is used by viewing apps to prioritize rental apps for a particular user based on whether they already have a particular rental app installed.

REQUIRED if a `rental_uris`.`android` field is populated.

Example value: `com.example.android://` -\- `ios` | OPTIONAL | Object | Contains rental information for the iOS platform in the `store_uri` and `discovery_uri` fields. See [examples](#deep-links-examples) of how to use these fields and [supported analytics](#analytics). - - `store_uri` | Conditionally REQUIRED | URI | URI where the rental iOS app can be downloaded from. Typically this will be a URI to an app store, such as the Apple App Store. If the URI points to an app store, the URI SHOULD follow iOS best practices so the viewing app can directly open the URI to the native app store app instead of a website.

If a `rental_uris`.`ios` field is populated, then this field is REQUIRED.

See the [Analytics](#analytics) section for how viewing apps can report the origin of the deep link to rental apps.

Example value: `https://apps.apple.com/app/apple-store/id123456789` - - `discovery_uri` | Conditionally REQUIRED | URI | URI that can be used to discover if the rental iOS app is installed on the device (for example, using [`UIApplication canOpenURL:`](https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl?language=objc)). This intent is used by viewing apps to prioritize rental apps for a particular user based on whether they already have a particular rental app installed.

REQUIRED if a `rental_uris`.`ios` field is populated.

Example value: `com.example.ios://` +`rental_apps.android` | OPTIONAL | Object | Contains rental app download and app discovery information for the Android platform in the `store_uri` and `discovery_uri` fields. See [examples](#deep-links-examples) of how to use these fields and [supported analytics](#analytics). +`rental_apps.android.store_uri` | REQUIRED | URI | URI where the rental Android app can be downloaded from. Typically this will be a URI to an app store, such as Google Play. If the URI points to an app store, the URI SHOULD follow Android best practices so the viewing app can directly open the URI to the native app store app instead of a website.

See the [Analytics](#analytics) section for how viewing apps can report the origin of the deep link to rental apps.

Example value: `https://play.google.com/store/apps/details?id=com.example.android` +`rental_apps.android.discovery_uri` | REQUIRED | URI | URI that can be used to discover if the rental Android app is installed on the device (for example, using [`PackageManager.queryIntentActivities()`](https://developer.android.com/reference/android/content/pm/PackageManager.html#queryIntentActivities)). This intent is used by viewing apps to prioritize rental apps for a particular user based on whether they already have a particular rental app installed.

Example value: `com.example.android://` +`rental_apps.ios` | OPTIONAL | Object | Contains rental information for the iOS platform in the `store_uri` and `discovery_uri` fields. See [examples](#deep-links-examples) of how to use these fields and [supported analytics](#analytics). +`rental_apps.ios.store_uri` | REQUIRED | URI | URI where the rental iOS app can be downloaded from. Typically this will be a URI to an app store, such as the Apple App Store. If the URI points to an app store, the URI SHOULD follow iOS best practices so the viewing app can directly open the URI to the native app store app instead of a website.

See the [Analytics](#analytics) section for how viewing apps can report the origin of the deep link to rental apps.

Example value: `https://apps.apple.com/app/apple-store/id123456789` +`rental_apps.ios.discovery_uri` | REQUIRED | URI | URI that can be used to discover if the rental iOS app is installed on the device (for example, using [`UIApplication canOpenURL:`](https://developer.apple.com/documentation/uikit/uiapplication/1622952-canopenurl?language=objc)). This intent is used by viewing apps to prioritize rental apps for a particular user based on whether they already have a particular rental app installed.

Example value: `com.example.ios://` **Example:** @@ -524,36 +523,36 @@ REQUIRED of systems that include information about vehicle types in the `vehicle 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` *(added in v2.3)*
  • `car`
  • `moped`
  • `scooter_standing` *(standing kick scooter, added in v2.3)*
  • `scooter_seated` *(this is a kick scooter with a seat, not to be confused with `moped`, added in v2.3)*
  • `other`
-\- `rider_capacity`
*(added in v2.3)* | OPTIONAL | Non-negative integer | The number of riders (driver included) the vehicle can legally accommodate. -\- `cargo_volume_capacity`
*(added in v2.3)* | 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 v2.3)* | OPTIONAL | Non-negative integer | The capacity of the vehicle cargo space (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 electric motor assist only in combination with human propulsion - no throttle mode)_
  • `electric` _(Powered by battery-powered electric motor with throttle mode)_
  • `combustion` _(Powered by gasoline combustion engine)_
  • `combustion_diesel` _(Powered by diesel combustion engine, added in v2.3)_
  • `hybrid` _(Powered by combined combustion engine and battery-powered motor, added in v2.3)_
  • `plug_in_hybrid` _(Powered by combined combustion engine and battery-powered motor with plug-in charging, added in v2.3)_
  • `hydrogen_fuel_cell` _(Powered by hydrogen fuel cell powered electric motor, added in v2.3)_
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/main/general-information.md#propulsion-types). -\- `eco_labels`
*(as of v3.0-RC2)* | 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 v2.3)*| Conditionally REQUIRED | Country code | REQUIRED if `eco_labels` is defined. Country where the `eco_sticker` applies. - \-  `eco_sticker`
*(added in v2.3)* | Conditionally REQUIRED | String | REQUIRED if `eco_labels` is defined. 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 (Austria)
    • euro_1
    • euro_2
    • euro_3
    • euro_4
    • euro_5
  • Reg_certificates (Belgium)
    • reg_certificates
  • Distintivo_ambiental (Spain)
    • 0
    • eco
    • b
    • c
-\- `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`
*(as of v3.0-RC)* | OPTIONAL | Array<Localized String> | The public name of this vehicle type. -\- `vehicle_accessories`
*(added in v2.3)* | 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 conditioning)_
  • `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 v2.3)* | 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 v2.3)* | OPTIONAL | URL | URL to an image that would assist the user in identifying the vehicle (for example, an image of the vehicle or a logo).
Allowed formats: JPEG, PNG. -| \- `make`
*(as of v3.0-RC)* | OPTIONAL| Array<Localized String> | The name of the vehicle manufacturer.

Example:
  • CUBE Bikes
  • Renault
-| \- `model`
*(as of v3.0-RC)* | OPTIONAL| Array<Localized String> | The name of the vehicle model.

Example
  • Giulia
  • MX50
-| \- `color`
*(added in v2.3)*| OPTIONAL| String| The color of the vehicle.

All words must be in lower case, without special characters, quotation marks, hyphens, underscores, commas, or dots. Spaces are allowed in case of a compound name.

Example
  • green
  • dark blue
-| \- `description`
*(added in v3.0-RC)*| OPTIONAL | Array<Localized String> | Customer-readable description of the vehicle type outlining special features or how-tos. -\- `wheel_count`
*(added in v2.3)* | OPTIONAL | Non-negative Integer | Number of wheels this vehicle type has. -\- `max_permitted_speed`
*(added in v2.3)* | 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`
*(added in v2.3)* | OPTIONAL | Non-negative Integer | The rated power of the motor for this vehicle type in watts. -\- `default_reserve_time`
*(added in v2.3)* | Conditionally REQUIRED
*(as of v3.0-RC)* | Non-negative Integer | REQUIRED if `reservation_price_per_min` or `reservation_price_flat_rate` are defined. Maximum time in minutes that a vehicle can be reserved before a rental begins. When a vehicle is reserved by a user, the vehicle remains locked until the rental begins. During this time the vehicle is unavailable and cannot be reserved or rented by other users. The vehicle status in `vehicle_status.json` MUST be set to `is_reserved = true`. If the value of `default_reserve_time` elapses without a rental beginning, the vehicle status MUST change to `is_reserved = false`. If `default_reserve_time` is set to `0`, the vehicle type cannot be reserved. -\- `return_constraint`
*(as of v2.3)*| OPTIONAL | Enum | The conditions for returning the vehicle at the end of the rental.

Current valid values are:
  • `free_floating` _(The vehicle can be returned anywhere permitted within the service area. Note that the vehicle is subject to rules in `geofencing_zones.json` if defined.)_
  • `roundtrip_station` _(The vehicle has to be returned to the same station from which it was initially rented. Note that a specific station can be assigned to the vehicle in `free_bike_status.json` using `home_station`.)_
  • `any_station` _(The vehicle has to be returned to any station within the service area.)_
  • `hybrid` (The vehicle can be returned to any station, or anywhere else permitted within the service area. Note that the vehicle is subject to rules in `geofencing_zones.json` if defined.)
  • -\- `vehicle_assets`
    *(added in v2.3)*| OPTIONAL | Object | An object where each key defines one of the items listed below. -  \- `icon_url`
    *(added in v2.3)*| Conditionally REQUIRED | URL | REQUIRED if `vehicle_assets` is defined. A fully qualified URL pointing to the location of a graphic icon file that MAY be used to represent this vehicle type on maps and in other applications. File MUST be in SVG V1.1 format and MUST be either square or round. -  \- `icon_url_dark`
    *(added in v2.3)*| OPTIONAL | URL | A fully qualified URL pointing to the location of a graphic icon file to be used to represent this vehicle type when in dark mode on maps and in other applications. File MUST be in SVG V1.1 format and MUST be either square or round. -  \- `icon_last_modified`
    *(added in v2.3)*| Conditionally REQUIRED | Date | REQUIRED if `vehicle_assets` is defined. Date that indicates the last time any included vehicle icon images were modified or updated. -\- `default_pricing_plan_id`
    *(added in v2.3)*| Conditionally REQUIRED | ID | REQUIRED if `system_pricing_plans.json` is defined. A `plan_id`, as defined in `system_pricing_plans.json`, that identifies a default pricing plan for this vehicle to be used by trip planning applications for purposes of calculating the cost of a single trip using this vehicle type. This default pricing plan is superseded by `pricing_plan_id` when `pricing_plan_id` is defined in `vehicle_status.json` Publishers SHOULD define `default_pricing_plan_id` first and then override it using `pricing_plan_id` in `vehicle_status.json` when necessary. -\- `pricing_plan_ids`
    *(added in v2.3)* | OPTIONAL | Array | Array of all pricing plan IDs, as defined in `system_pricing_plans.json`, that are applied to this vehicle type.

    This array SHOULD be published when there are multiple pricing plans defined in `system_pricing_plans.json` that apply to a single vehicle type. +`vehicle_types` | Yes | Array<Object> | Contains one object per vehicle type. +`vehicle_types[].vehicle_type_id` | Yes | ID | Unique identifier of a vehicle type. See [Field Types](#field-types) above for ID field requirements. +`vehicle_types[].form_factor` | Yes | Enum | The vehicle's general form factor.

    Current valid values are:
    • `bicycle`
    • `cargo_bicycle` *(added in v2.3)*
    • `car`
    • `moped`
    • `scooter_standing` *(standing kick scooter, added in v2.3)*
    • `scooter_seated` *(this is a kick scooter with a seat, not to be confused with `moped`, added in v2.3)*
    • `other`
    +`vehicle_types[].rider_capacity`
    *(added in v2.3)* | OPTIONAL | Non-negative integer | The number of riders (driver included) the vehicle can legally accommodate. +`vehicle_types[].cargo_volume_capacity`
    *(added in v2.3)* | 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. +`vehicle_types[].cargo_load_capacity`
    *(added in v2.3)* | OPTIONAL | Non-negative integer | The capacity of the vehicle cargo space (excluding passengers), expressed in kilograms. +`vehicle_types[].propulsion_type` | Yes | Enum | The primary propulsion type of the vehicle.

    Current valid values are:
    • `human` _(Pedal or foot propulsion)_
    • `electric_assist` _(Provides electric motor assist only in combination with human propulsion - no throttle mode)_
    • `electric` _(Powered by battery-powered electric motor with throttle mode)_
    • `combustion` _(Powered by gasoline combustion engine)_
    • `combustion_diesel` _(Powered by diesel combustion engine, added in v2.3)_
    • `hybrid` _(Powered by combined combustion engine and battery-powered motor, added in v2.3)_
    • `plug_in_hybrid` _(Powered by combined combustion engine and battery-powered motor with plug-in charging, added in v2.3)_
    • `hydrogen_fuel_cell` _(Powered by hydrogen fuel cell powered electric motor, added in v2.3)_
    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/main/general-information.md#propulsion-types). +`vehicle_types[].eco_labels`
    *(as of v3.0-RC2)* | OPTIONAL | Array<Object> | 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. +`vehicle_types[].eco_labels[].country_code`
    *(added in v2.3)*| REQUIRED | Country code | Country where the `eco_sticker` applies. +`vehicle_types[].eco_labels[].eco_sticker`
    *(added in v2.3)* | REQUIRED | 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 (Austria)
      • euro_1
      • euro_2
      • euro_3
      • euro_4
      • euro_5
    • Reg_certificates (Belgium)
      • reg_certificates
    • Distintivo_ambiental (Spain)
      • 0
      • eco
      • b
      • c
    +`vehicle_types[].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). +`vehicle_types[].name`
    *(as of v3.0-RC)* | OPTIONAL | Array<Localized String> | The public name of this vehicle type. +`vehicle_types[].vehicle_accessories`
    *(added in v2.3)* | OPTIONAL | Array<String> | 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 conditioning)_
    • `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)_
    +`vehicle_types[].g_CO2_km`
    *(added in v2.3)* | 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_types[].vehicle_image`
    *(added in v2.3)* | OPTIONAL | URL | URL to an image that would assist the user in identifying the vehicle (for example, an image of the vehicle or a logo).
    Allowed formats: JPEG, PNG. +`vehicle_types[].make`
    *(as of v3.0-RC)* | OPTIONAL| Array<Localized String> | The name of the vehicle manufacturer.

    Example:
    • CUBE Bikes
    • Renault
    +`vehicle_types[].model`
    *(as of v3.0-RC)* | OPTIONAL| Array<Localized String> | The name of the vehicle model.

    Example
    • Giulia
    • MX50
    +`vehicle_types[].color`
    *(added in v2.3)*| OPTIONAL| String| The color of the vehicle.

    All words must be in lower case, without special characters, quotation marks, hyphens, underscores, commas, or dots. Spaces are allowed in case of a compound name.

    Example
    • green
    • dark blue
    +`vehicle_types[].description`
    *(added in v3.0-RC)*| OPTIONAL | Array<Localized String> | Customer-readable description of the vehicle type outlining special features or how-tos. +`vehicle_types[].wheel_count`
    *(added in v2.3)* | OPTIONAL | Non-negative Integer | Number of wheels this vehicle type has. +`vehicle_types[].max_permitted_speed`
    *(added in v2.3)* | OPTIONAL | Non-negative Integer | The maximum speed in kilometers per hour this vehicle is permitted to reach in accordance with local permit and regulations. +`vehicle_types[].rated_power`
    *(added in v2.3)* | OPTIONAL | Non-negative Integer | The rated power of the motor for this vehicle type in watts. +`vehicle_types[].default_reserve_time`
    *(added in v2.3)* | Conditionally REQUIRED
    *(as of v3.0-RC)* | Non-negative Integer | REQUIRED if `reservation_price_per_min` or `reservation_price_flat_rate` are defined. Maximum time in minutes that a vehicle can be reserved before a rental begins. When a vehicle is reserved by a user, the vehicle remains locked until the rental begins. During this time the vehicle is unavailable and cannot be reserved or rented by other users. The vehicle status in `vehicle_status.json` MUST be set to `is_reserved = true`. If the value of `default_reserve_time` elapses without a rental beginning, the vehicle status MUST change to `is_reserved = false`. If `default_reserve_time` is set to `0`, the vehicle type cannot be reserved. +`vehicle_types[].return_constraint`
    *(as of v2.3)*| OPTIONAL | Enum | The conditions for returning the vehicle at the end of the rental.

    Current valid values are:
    • `free_floating` _(The vehicle can be returned anywhere permitted within the service area. Note that the vehicle is subject to rules in `geofencing_zones.json` if defined.)_
    • `roundtrip_station` _(The vehicle has to be returned to the same station from which it was initially rented. Note that a specific station can be assigned to the vehicle in `free_bike_status.json` using `home_station`.)_
    • `any_station` _(The vehicle has to be returned to any station within the service area.)_
    • `hybrid` (The vehicle can be returned to any station, or anywhere else permitted within the service area. Note that the vehicle is subject to rules in `geofencing_zones.json` if defined.)
    • +`vehicle_types[].vehicle_assets`
      *(added in v2.3)*| OPTIONAL | Object | Object containing the branding information for this vehicle type. +`vehicle_types[].vehicle_assets.icon_url`
      *(added in v2.3)*| REQUIRED | URL | A fully qualified URL pointing to the location of a graphic icon file that MAY be used to represent this vehicle type on maps and in other applications. File MUST be in SVG V1.1 format and MUST be either square or round. +`vehicle_types[].vehicle_assets.icon_url_dark`
      *(added in v2.3)*| OPTIONAL | URL | A fully qualified URL pointing to the location of a graphic icon file to be used to represent this vehicle type when in dark mode on maps and in other applications. File MUST be in SVG V1.1 format and MUST be either square or round. +`vehicle_types[].vehicle_assets.icon_last_modified`
      *(added in v2.3)*| REQUIRED | Date | Date that indicates the last time any included vehicle icon images were modified or updated. +`vehicle_types[].default_pricing_plan_id`
      *(added in v2.3)*| Conditionally REQUIRED | ID | REQUIRED if `system_pricing_plans.json` is defined. A `plan_id`, as defined in `system_pricing_plans.json`, that identifies a default pricing plan for this vehicle to be used by trip planning applications for purposes of calculating the cost of a single trip using this vehicle type. This default pricing plan is superseded by `pricing_plan_id` when `pricing_plan_id` is defined in `vehicle_status.json` Publishers SHOULD define `default_pricing_plan_id` first and then override it using `pricing_plan_id` in `vehicle_status.json` when necessary. +`vehicle_types[].pricing_plan_ids`
      *(added in v2.3)* | OPTIONAL | Array<ID> | An array of `pricing_plan_ids`, as defined in `system_pricing_plans.json`, that are applied to this vehicle type.

      This array SHOULD be published when there are multiple pricing plans defined in `system_pricing_plans.json` that apply to a single vehicle type. **Example:** @@ -707,36 +706,36 @@ All stations included in `station_information.json` are considered public (meani Field Name | REQUIRED | Type | Defines ---|---|---|--- -`stations` | Yes | Array | Array that contains one object per station as defined below. -\-  `station_id` | Yes | ID | Identifier of a station. -\-  `name`
      *(as of v3.0-RC)* | Yes | Array<Localized String> | The public name of the station for display in maps, digital signage, and other text applications. Names SHOULD reflect the station location through the use of a cross street or local landmark. Abbreviations SHOULD NOT be used for names and other text (for example, "St." for "Street") unless a location is called by its abbreviated name (for example, “JFK Airport”). See [Text Fields and Naming](#text-fields-and-naming).
      Examples:
      • Broadway and East 22nd Street
      • Convention Center
      • Central Park South
      . -\-  `short_name`
      *(as of v3.0-RC)* | OPTIONAL | Array<Localized String> | Short name or other type of identifier. -\- `lat` | Yes | Latitude | Latitude of the station in decimal degrees. This field SHOULD have a precision of 6 decimal places (0.000001). See [Coordinate Precision](#coordinate-precision). -\- `lon` | Yes | Longitude | Longitude of the station in decimal degrees. This field SHOULD have a precision of 6 decimal places (0.000001). See [Coordinate Precision](#coordinate-precision). -\- `address` | OPTIONAL | String | Address (street number and name) where station is located. This MUST be a valid address, not a free-form text description. Example: 1234 Main Street -\- `cross_street` | OPTIONAL | String | Cross street or landmark where the station is located. -\- `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. -\- `station_opening_hours`
      *(added in v3.0-RC)* | OPTIONAL | String | Hours of operation for the station in [OSM opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) format. If `station_opening_hours` is defined it overrides any `opening_hours` defined in `system_information.json` for the station for which it is defined. -\- `rental_methods` | OPTIONAL | Array | Payment methods accepted at this station.
      Current valid values are:
      • `key` (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 smart dock technology?

      `true` - The station is a location without smart docking infrastructure. the station may be defined by a point (lat/lon) and/or `station_area` (below).

      `false` - The station consists of smart docking infrastructure (docks).

      This field SHOULD be published by mobility 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 (for example, parking facility or valet drop-off and pick up point). The `station_area` takes precedence over any `ride_start_allowed` and `ride_end_allowed` rules in overlapping `geofencing_zones`. -\- `parking_type`
      *(added in v2.3)* | 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 v2.3)* | OPTIONAL | Boolean | Are parking hoops present at this station?

      `true` - Parking hoops are present at this station.
      `false` - Parking hoops are not present at this station.

      Parking hoops are lockable devices that are used to secure a parking space to prevent parking of unauthorized vehicles. -\- `contact_phone`
      *(added in v2.3)* | 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_types_capacity`
      *(as of v3.0-RC2)* | OPTIONAL | Array | This field's value is an array of objects containing the keys `vehicle_type_ids` and `count` defined below. These objects are used to model the parking capacity of virtual stations (defined using the `is_virtual_station` field) for each vehicle type that can be returned to this station. The total number of vehicles from each of these objects SHOULD add up to match the value specified in the `capacity` field. -  \- `vehicle_type_ids`
      *(as of v3.0-RC2)* | Conditionally REQUIRED | Array | REQUIRED if `vehicle_types_capacity` is defined. The `vehicle_type_ids`, as defined in `vehicle_types.json`, that may park at the virtual station. -  \- `count`| Conditionally REQUIRED | Non-negative integer | REQUIRED if `vehicle_types_capacity` is defined. A number representing the total number of vehicles of the specified `vehicle_type_ids` 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_docks_capacity`
      *(as of v3.0-RC2)* | OPTIONAL | Array | This field's value is an array of objects containing the keys `vehicle_type_ids` and `count` defined below. These objects are used to model the total docking capacity of a station, both available and unavailable, for each type of vehicle that may dock at this station. The total number of docks from each of these objects SHOULD add up to match the value specified in the `capacity` field. -  \- `vehicle_type_ids`
      *(as of v3.0-RC2)* | Conditionally REQUIRED | Array | REQUIRED if `vehicle_docks_capacity` is defined. An array of strings where each string represents a `vehicle_type_id` that is able to use a particular type of dock at the station. -  \- `count`| Conditionally REQUIRED | Non-negative integer | REQUIRED if `vehicle_docks_capacity` is defined. A number representing the total number of docks at the station, both available and unavailable, that may accept the vehicle types specified by `vehicle_type_ids`. -\- `is_valet_station`
      *(added in v2.1)* | OPTIONAL | Boolean | Are valet services provided at this station?

      `true` - Valet services are provided at this station.
      `false` - Valet services are not provided at this station.

      If this field is empty, it is assumed that valet services are not provided at this station.

      This field’s boolean SHOULD be set to `true` during the hours which valet service is provided at the station. Valet service is defined as providing unlimited capacity at a station. -\- `is_charging_station`
      *(added in v2.3)* | OPTIONAL | Boolean | Does the station support charging of electric vehicles?

      `true` - Electric vehicle charging is available at this station.
      `false` - Electric vehicle charging is not available at this station. -\- `rental_uris` | OPTIONAL | Object | Contains rental URIs for Android, iOS, and web in the `android`, `ios`, and `web` fields. See [examples](#deep-links-examples) of how to use these fields and [supported analytics](#analytics). - \- `android` | OPTIONAL | URI | URI that can be passed to an Android app with an `android.intent.action.VIEW` Android intent to support Android Deep Links (https://developer.android.com/training/app-links/deep-linking). Please use Android App Links (https://developer.android.com/training/app-links) if possible so viewing apps do not need to manually manage the redirect of the user to the app store if the user does not have the application installed.

      This URI SHOULD be a deep link specific to this station, and SHOULD NOT be a general rental page that includes information for more than one station. The deep link SHOULD take users directly to this station, without any prompts, interstitial pages, or logins. Make sure that users can see this station even if they never previously opened the application.

      If this field is empty, it means deep linking is not supported in the native Android rental app.

      Note that the URI does not necessarily include the `station_id` for this station - other identifiers can be used by the rental app within the URI to uniquely identify this station.

      See the [Analytics](#analytics) section for how viewing apps can report the origin of the deep link to rental apps.

      Android App Links example value: `https://www.example.com/app?sid=1234567890&platform=android`

      Deep Link (without App Links) example value: `com.example.android://open.example.app/app?sid=1234567890` - \- `ios` | OPTIONAL | URI | URI that can be used on iOS to launch the rental app for this station. More information on this iOS feature can be found [here](https://developer.apple.com/documentation/uikit/core_app/allowing_apps_and_websites_to_link_to_your_content/communicating_with_other_apps_using_custom_urls?language=objc). Please use iOS Universal Links (https://developer.apple.com/ios/universal-links/) if possible so viewing apps do not need to manually manage the redirect of the user to the app store if the user does not have the application installed.

      This URI SHOULD be a deep link specific to this station, and SHOULD NOT be a general rental page that includes information for more than one station. The deep link SHOULD take users directly to this station, without any prompts, interstitial pages, or logins. Make sure that users can see this station even if they never previously opened the application.

      If this field is empty, it means deep linking is not supported in the native iOS rental app.

      Note that the URI does not necessarily include the `station_id` for this station - other identifiers can be used by the rental app within the URI to uniquely identify this station.

      See the [Analytics](#analytics) section for how viewing apps can report the origin of the deep link to rental apps.

      iOS Universal Links example value: `https://www.example.com/app?sid=1234567890&platform=ios`

      Deep Link (without Universal Links) example value: `com.example.ios://open.example.app/app?sid=1234567890` - \- `web` | OPTIONAL | URL | URL that can be used by a web browser to show more information about renting a vehicle at this station.

      This URL SHOULD be a deep link specific to this station, and SHOULD NOT be a general rental page that includes information for more than one station. The deep link SHOULD take users directly to this station, without any prompts, interstitial pages, or logins. Make sure that users can see this station even if they never previously opened the application.

      If this field is empty, it means deep linking is not supported for web browsers.

      Example value: `https://www.example.com/app?sid=1234567890` +`stations` | Yes | Array<Object> | Contains one object per station. +`stations[].station_id` | Yes | ID | Identifier of a station. +`stations[].name`
      *(as of v3.0-RC)* | Yes | Array<Localized String> | The public name of the station for display in maps, digital signage, and other text applications. Names SHOULD reflect the station location through the use of a cross street or local landmark. Abbreviations SHOULD NOT be used for names and other text (for example, "St." for "Street") unless a location is called by its abbreviated name (for example, “JFK Airport”). See [Text Fields and Naming](#text-fields-and-naming).
      Examples:
      • Broadway and East 22nd Street
      • Convention Center
      • Central Park South
      . +`stations[].short_name`
      *(as of v3.0-RC)* | OPTIONAL | Array<Localized String> | Short name or other type of identifier. +`stations[].lat` | Yes | Latitude | Latitude of the station in decimal degrees. This field SHOULD have a precision of 6 decimal places (0.000001). See [Coordinate Precision](#coordinate-precision). +`stations[].lon` | Yes | Longitude | Longitude of the station in decimal degrees. This field SHOULD have a precision of 6 decimal places (0.000001). See [Coordinate Precision](#coordinate-precision). +`stations[].address` | OPTIONAL | String | Address (street number and name) where station is located. This MUST be a valid address, not a free-form text description. Example: 1234 Main Street +`stations[].cross_street` | OPTIONAL | String | Cross street or landmark where the station is located. +`stations[].region_id` | OPTIONAL | ID | Identifier of the region where station is located. See [system_regions.json](#system_regionsjson). +`stations[].post_code` | OPTIONAL | String | Postal code where station is located. +`stations[].station_opening_hours`
      *(added in v3.0-RC)* | OPTIONAL | String | Hours of operation for the station in [OSM opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) format. If `station_opening_hours` is defined it overrides any `opening_hours` defined in `system_information.json` for the station for which it is defined. +`stations[].rental_methods` | OPTIONAL | Array<String> | Payment methods accepted at this station.
      Current valid values are:
      • `key` (operator issued vehicle key / fob / card)
      • `creditcard`
      • `paypass`
      • `applepay`
      • `androidpay`
      • `transitcard`
      • `accountnumber`
      • `phone`
      +`stations[].is_virtual_station`
      *(added in v2.1)* | OPTIONAL | Boolean | Is this station a location with or without smart dock technology?

      `true` - The station is a location without smart docking infrastructure. the station may be defined by a point (lat/lon) and/or `station_area` (below).

      `false` - The station consists of smart docking infrastructure (docks).

      This field SHOULD be published by mobility 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`. +`stations[].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 (for example, parking facility or valet drop-off and pick up point). The `station_area` takes precedence over any `ride_start_allowed` and `ride_end_allowed` rules in overlapping `geofencing_zones`. +`stations[].parking_type`
      *(added in v2.3)* | 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`
      +`stations[].parking_hoop`
      *(added in v2.3)* | OPTIONAL | Boolean | Are parking hoops present at this station?

      `true` - Parking hoops are present at this station.
      `false` - Parking hoops are not present at this station.

      Parking hoops are lockable devices that are used to secure a parking space to prevent parking of unauthorized vehicles. +`stations[].contact_phone`
      *(added in v2.3)* | OPTIONAL | Phone number | Contact phone of the station. +`stations[].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. +`stations[].vehicle_types_capacity`
      *(as of v3.0-RC2)* | OPTIONAL | Array<Object> | These objects are used to model the parking capacity of virtual stations (defined using the `is_virtual_station` field) for each vehicle type that can be returned to this station. The total number of vehicles from each of these objects SHOULD add up to match the value specified in the `capacity` field. +`stations[].vehicle_types_capacity[].vehicle_type_ids`
      *(as of v3.0-RC2)* | REQUIRED | Array<ID> | An array of `vehicle_type_ids`, as defined in `vehicle_types.json`, that may park at the virtual station. +`stations[].vehicle_types_capacity[].count`| REQUIRED | Non-negative integer | A number representing the total number of vehicles of the specified `vehicle_type_ids` 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. +`stations[].vehicle_docks_capacity`
      *(as of v3.0-RC2)* | OPTIONAL | Array<Object> | These objects are used to model the total docking capacity of a station, both available and unavailable, for each type of vehicle that may dock at this station. The total number of docks from each of these objects SHOULD add up to match the value specified in the `capacity` field. +`stations[].vehicle_docks_capacity[].vehicle_type_ids`
      *(as of v3.0-RC2)* | REQUIRED | Array<ID> | An array of `vehicle_type_ids` that are able to use a particular type of dock at the station. +`stations[].vehicle_docks_capacity[].count`| REQUIRED | Non-negative integer | A number representing the total number of docks at the station, both available and unavailable, that may accept the vehicle types specified by `vehicle_type_ids`. +`stations[].is_valet_station`
      *(added in v2.1)* | OPTIONAL | Boolean | Are valet services provided at this station?

      `true` - Valet services are provided at this station.
      `false` - Valet services are not provided at this station.

      If this field is empty, it is assumed that valet services are not provided at this station.

      This field’s boolean SHOULD be set to `true` during the hours which valet service is provided at the station. Valet service is defined as providing unlimited capacity at a station. +`stations[].is_charging_station`
      *(added in v2.3)* | OPTIONAL | Boolean | Does the station support charging of electric vehicles?

      `true` - Electric vehicle charging is available at this station.
      `false` - Electric vehicle charging is not available at this station. +`stations[].rental_uris` | OPTIONAL | Object | Contains rental URIs for Android, iOS, and web in the `android`, `ios`, and `web` fields. See [examples](#deep-links-examples) of how to use these fields and [supported analytics](#analytics). +`stations[].rental_uris.android` | OPTIONAL | URI | URI that can be passed to an Android app with an `android.intent.action.VIEW` Android intent to support Android Deep Links (https://developer.android.com/training/app-links/deep-linking). Please use Android App Links (https://developer.android.com/training/app-links) if possible so viewing apps do not need to manually manage the redirect of the user to the app store if the user does not have the application installed.

      This URI SHOULD be a deep link specific to this station, and SHOULD NOT be a general rental page that includes information for more than one station. The deep link SHOULD take users directly to this station, without any prompts, interstitial pages, or logins. Make sure that users can see this station even if they never previously opened the application.

      If this field is empty, it means deep linking is not supported in the native Android rental app.

      Note that the URI does not necessarily include the `station_id` for this station - other identifiers can be used by the rental app within the URI to uniquely identify this station.

      See the [Analytics](#analytics) section for how viewing apps can report the origin of the deep link to rental apps.

      Android App Links example value: `https://www.example.com/app?sid=1234567890&platform=android`

      Deep Link (without App Links) example value: `com.example.android://open.example.app/app?sid=1234567890` +`stations[].rental_uris.ios` | OPTIONAL | URI | URI that can be used on iOS to launch the rental app for this station. More information on this iOS feature can be found [here](https://developer.apple.com/documentation/uikit/core_app/allowing_apps_and_websites_to_link_to_your_content/communicating_with_other_apps_using_custom_urls?language=objc). Please use iOS Universal Links (https://developer.apple.com/ios/universal-links/) if possible so viewing apps do not need to manually manage the redirect of the user to the app store if the user does not have the application installed.

      This URI SHOULD be a deep link specific to this station, and SHOULD NOT be a general rental page that includes information for more than one station. The deep link SHOULD take users directly to this station, without any prompts, interstitial pages, or logins. Make sure that users can see this station even if they never previously opened the application.

      If this field is empty, it means deep linking is not supported in the native iOS rental app.

      Note that the URI does not necessarily include the `station_id` for this station - other identifiers can be used by the rental app within the URI to uniquely identify this station.

      See the [Analytics](#analytics) section for how viewing apps can report the origin of the deep link to rental apps.

      iOS Universal Links example value: `https://www.example.com/app?sid=1234567890&platform=ios`

      Deep Link (without Universal Links) example value: `com.example.ios://open.example.app/app?sid=1234567890` +`stations[].rental_uris.web` | OPTIONAL | URL | URL that can be used by a web browser to show more information about renting a vehicle at this station.

      This URL SHOULD be a deep link specific to this station, and SHOULD NOT be a general rental page that includes information for more than one station. The deep link SHOULD take users directly to this station, without any prompts, interstitial pages, or logins. Make sure that users can see this station even if they never previously opened the application.

      If this field is empty, it means deep linking is not supported for web browsers.

      Example value: `https://www.example.com/app?sid=1234567890` **Example 1: Physical station with limited hours of operation** @@ -849,22 +848,22 @@ Describes the capacity and rental availability of a station. Data returned SHOUL Field Name | REQUIRED | Type | Defines ---|---|---|--- -`stations` | Yes | Array | Array that contains one object per station in the system as defined below. -\- `station_id` | Yes | ID | Identifier of a station. See [station_information.json](#station_informationjson). -\- `num_vehicles_available` | Yes | Non-negative integer | Number of functional vehicles physically at the station that may be offered for rental. To know if the vehicles are available for rental, see `is_renting`.

      If `is_renting` = `true` this is the number of vehicles that are currently available for rent. If `is_renting` =`false` this is the number of vehicles that would be available for rent if the station were set to allow rentals. -\- `vehicle_types_available`
      *(added in v2.1)* | Conditionally REQUIRED | Array | REQUIRED if the [vehicle_types.json](#vehicle_typesjson) file has been defined. This field's value is an array of objects. Each of these objects is used to model the total number of each defined vehicle type available at a station. The total number of vehicles from each of these objects SHOULD add up to match the value specified in the `num_vehicles_available` field. - \- `vehicle_type_id`
      *(added in v2.1)* | Yes | ID | The `vehicle_type_id` of each vehicle type at the station as described in [vehicle_types.json](#vehicle_typesjson). A vehicle type not available at the station can be omitted from the list or specified with `count` = `0`. - \- `count`
      *(added in v2.1)* | Yes | Non-negative integer | A number representing the total number of available vehicles of the corresponding `vehicle_type_id` as defined in [vehicle_types.json](#vehicle_typesjson) at the station. -\- `num_vehicles_disabled` | OPTIONAL | Non-negative integer | Number of disabled vehicles of any type at the station. Vendors who do not want to publicize the number of disabled vehicles or docks in their system can opt to omit station `capacity` (in [station_information.json](#station_informationjson), `num_vehicles_disabled`, and `num_docks_disabled` *(as of v2.0)*. If station `capacity` is published, then broken docks/vehicles can be inferred (though not specifically whether the decreased capacity is a broken vehicle or dock). -\- `num_docks_available` | Conditionally REQUIRED
      *(as of v2.0)* | Non-negative integer | REQUIRED except for stations that have unlimited docking capacity (e.g. virtual stations) *(as of v2.0)*. Number of functional docks physically at the station that are able to accept vehicles for return. To know if the docks are accepting vehicle returns, see `is_returning`.

      If `is_returning` = `true` this is the number of docks that are currently available to accept vehicle returns. If `is_returning` = `false` this is the number of docks that would be available if the station were set to allow returns. -\- `vehicle_docks_available`
      *(added in v2.1)* | Conditionally REQUIRED | Array | This field is REQUIRED in feeds where the [vehicle_types.json](#vehicle_typesjson) is defined and where certain docks are only able to accept certain vehicle types. If every dock at the station is able to accept any vehicle type, then this field is not REQUIRED. This field's value is an array of objects. Each of these objects is used to model the number of docks available for certain vehicle types. The total number of docks from each of these objects SHOULD add up to match the value specified in the `num_docks_available` field. - \- `vehicle_type_ids`
      *(added in v2.1)* | Conditionally REQUIRED | Array | REQUIRED if `vehicle_docks_available` is defined. An array of strings where each string represents a `vehicle_type_id` that is able to use a particular type of dock at the station - \- `count`
      *(added in v2.1)* | Conditionally REQUIRED | Non-negative integer | REQUIRED if `vehicle_docks_available` is defined. A number representing the total number of available vehicles of the corresponding vehicle type as defined in the `vehicle_types` array at the station that can accept vehicles of the specified types in the `vehicle_types` array. -\- `num_docks_disabled` | OPTIONAL | Non-negative integer | Number of disabled dock points at the station. -\- `is_installed` | Yes | Boolean | Is the station currently on the street?

      `true` - Station is installed on the street.
      `false` - Station is not installed on the street.

      Boolean SHOULD be set to `true` when equipment is present on the street. In seasonal systems where equipment is removed during winter, boolean SHOULD be set to `false` during the off season. May also be set to false to indicate planned (future) stations which have not yet been installed. -\- `is_renting` | Yes | Boolean | Is the station currently renting vehicles?

      `true` - Station is renting vehicles. Even if the station is empty, if it would otherwise allow rentals, this value MUST be `true`.
      `false` - Station is not renting vehicles.

      If the station is temporarily taken out of service and not allowing rentals, this field MUST be set to `false`.

      If a station becomes inaccessible to users due to road construction or other factors this field SHOULD be set to `false`. Field SHOULD be set to `false` during hours or days when the system is not offering vehicles for rent. -\- `is_returning` | Yes | Boolean | Is the station accepting vehicle returns?

      `true` - Station is accepting vehicle returns. Even if the station is full, if it would otherwise allow vehicle returns, this value MUST be `true`.
      `false` - Station is not accepting vehicle returns.

      If the station is temporarily taken out of service and not allowing vehicle returns, this field MUST be set to `false`.

      If a station becomes inaccessible to users due to road construction or other factors, this field SHOULD be set to `false`. -\- `last_reported` | Yes | Timestamp | The last time this station reported its status to the operator's backend. +`stations` | Yes | Array<Object> | Contains one object per station. +`stations[].station_id` | Yes | ID | Identifier of a station. See [station_information.json](#station_informationjson). +`stations[].num_vehicles_available` | Yes | Non-negative integer | Number of functional vehicles physically at the station that may be offered for rental. To know if the vehicles are available for rental, see `is_renting`.

      If `is_renting` = `true` this is the number of vehicles that are currently available for rent. If `is_renting` =`false` this is the number of vehicles that would be available for rent if the station were set to allow rentals. +`stations[].vehicle_types_available`
      *(added in v2.1)* | Conditionally REQUIRED | Array<Object> | REQUIRED if the [vehicle_types.json](#vehicle_typesjson) file has been defined. This field's value is an array of objects. Each of these objects is used to model the total number of each defined vehicle type available at a station. The total number of vehicles from each of these objects SHOULD add up to match the value specified in the `num_vehicles_available` field. +`stations[].vehicle_types_available[].vehicle_type_id`
      *(added in v2.1)* | Yes | ID | The `vehicle_type_id` of each vehicle type at the station as described in [vehicle_types.json](#vehicle_typesjson). A vehicle type not available at the station can be omitted from the list or specified with `count` = `0`. +`stations[].vehicle_types_available[].count`
      *(added in v2.1)* | Yes | Non-negative integer | A number representing the total number of available vehicles of the corresponding `vehicle_type_id` as defined in [vehicle_types.json](#vehicle_typesjson) at the station. +`stations[].num_vehicles_disabled` | OPTIONAL | Non-negative integer | Number of disabled vehicles of any type at the station. Vendors who do not want to publicize the number of disabled vehicles or docks in their system can opt to omit station `capacity` (in [station_information.json](#station_informationjson), `num_vehicles_disabled`, and `num_docks_disabled` *(as of v2.0)*. If station `capacity` is published, then broken docks/vehicles can be inferred (though not specifically whether the decreased capacity is a broken vehicle or dock). +`stations[].num_docks_available` | Conditionally REQUIRED
      *(as of v2.0)* | Non-negative integer | REQUIRED except for stations that have unlimited docking capacity (e.g. virtual stations) *(as of v2.0)*. Number of functional docks physically at the station that are able to accept vehicles for return. To know if the docks are accepting vehicle returns, see `is_returning`.

      If `is_returning` = `true` this is the number of docks that are currently available to accept vehicle returns. If `is_returning` = `false` this is the number of docks that would be available if the station were set to allow returns. +`stations[].vehicle_docks_available`
      *(added in v2.1)* | Conditionally REQUIRED | Array<Object> | This field is REQUIRED in feeds where the [vehicle_types.json](#vehicle_typesjson) is defined and where certain docks are only able to accept certain vehicle types. If every dock at the station is able to accept any vehicle type, then this field is not REQUIRED. This field's value is an array of objects. Each of these objects is used to model the number of docks available for certain vehicle types. The total number of docks from each of these objects SHOULD add up to match the value specified in the `num_docks_available` field. +`stations[].vehicle_docks_available[].vehicle_type_ids`
      *(added in v2.1)* | REQUIRED | Array<ID> | An array of `vehicle_type_ids` that are able to use a particular type of dock at the station +`stations[].vehicle_docks_available[].count`
      *(added in v2.1)* | REQUIRED | Non-negative integer | A number representing the total number of available vehicles of the corresponding vehicle type as defined in the `vehicle_types` array at the station that can accept vehicles of the specified types in the `vehicle_types` array. +`stations[].num_docks_disabled` | OPTIONAL | Non-negative integer | Number of disabled dock points at the station. +`stations[].is_installed` | Yes | Boolean | Is the station currently on the street?

      `true` - Station is installed on the street.
      `false` - Station is not installed on the street.

      Boolean SHOULD be set to `true` when equipment is present on the street. In seasonal systems where equipment is removed during winter, boolean SHOULD be set to `false` during the off season. May also be set to false to indicate planned (future) stations which have not yet been installed. +`stations[].is_renting` | Yes | Boolean | Is the station currently renting vehicles?

      `true` - Station is renting vehicles. Even if the station is empty, if it would otherwise allow rentals, this value MUST be `true`.
      `false` - Station is not renting vehicles.

      If the station is temporarily taken out of service and not allowing rentals, this field MUST be set to `false`.

      If a station becomes inaccessible to users due to road construction or other factors this field SHOULD be set to `false`. Field SHOULD be set to `false` during hours or days when the system is not offering vehicles for rent. +`stations[].is_returning` | Yes | Boolean | Is the station accepting vehicle returns?

      `true` - Station is accepting vehicle returns. Even if the station is full, if it would otherwise allow vehicle returns, this value MUST be `true`.
      `false` - Station is not accepting vehicle returns.

      If the station is temporarily taken out of service and not allowing vehicle returns, this field MUST be set to `false`.

      If a station becomes inaccessible to users due to road construction or other factors, this field SHOULD be set to `false`. +`stations[].last_reported` | Yes | Timestamp | The last time this station reported its status to the operator's backend. **Example:** @@ -948,25 +947,25 @@ Field Name | REQUIRED | Type | Defines Field Name | REQUIRED | Type | Defines ---|---|---|--- -`vehicles`
      *(as of v3.0-RC)* | Yes | Array | Array that contains one object per vehicle that is currently deployed in the field and not part of an active rental as defined below. -\- `vehicle_id`
      *(as of v3.0-RC)* | Yes | ID | Identifier of a vehicle. The `vehicle_id` identifier MUST be rotated to a random string after each trip to protect user privacy *(as of v2.0)*. Use of persistent vehicle IDs poses a threat to user privacy. The `vehicle_id` identifier SHOULD only be rotated once per trip. -\- `lat` | Conditionally REQUIRED
      *(as of v2.1)* | Latitude | Latitude of the vehicle in decimal degrees. *(as of v2.1)* REQUIRED if `station_id` is not provided for this vehicle (free floating). This field SHOULD have a precision of 6 decimal places (0.000001). See [Coordinate Precision](#coordinate-precision). -\- `lon` | Conditionally REQUIRED
      *(as of v2.1)* | Longitude | Longitude of the vehicle in decimal degrees. *(as of v2.1)* REQUIRED if `station_id` is not provided for this vehicle (free floating). This field SHOULD have a precision of 6 decimal places (0.000001). See [Coordinate Precision](#coordinate-precision). -\- `is_reserved` | Yes | Boolean | Is the vehicle currently reserved?

      `true` - Vehicle is currently reserved.
      `false` - Vehicle is not currently reserved. -\- `is_disabled` | Yes | Boolean | Is the vehicle currently disabled?

      `true` - Vehicle is currently disabled.
      `false` - Vehicle is not currently disabled.

      This field is used to indicate vehicles that are in the field but not available for rental due to a mechanical issue or low battery etc. Publishing this data may prevent users from attempting to rent vehicles that are disabled and not available for rental. This field SHOULD NOT be set to `true` when the system is closed for vehicles that would otherwise be rentable. -\- `rental_uris` | OPTIONAL | Object | JSON object that contains rental URIs for Android, iOS, and web in the `android`, `ios`, and `web` fields. See [examples](#deep-links-examples) of how to use these fields and [supported analytics](#analytics). - \- `android` | OPTIONAL | URI | URI that can be passed to an Android app with an android.intent.action.VIEW Android intent to support Android Deep Links (https://developer.android.com/training/app-links/deep-linking). Please use Android App Links (https://developer.android.com/training/app-links) if possible, so viewing apps do not need to manually manage the redirect of the user to the app store if the user does not have the application installed.

      This URI 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 providers MUST 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 is not supported in the native Android rental app.

      Note that the URI does not necessarily include the `vehicle_id` for this vehicle - other identifiers can be used by the rental app within the URI to uniquely identify this vehicle.

      See the [Analytics](#analytics) section for how viewing apps can report the origin of the deep link to rental apps.

      Android App Links example value: `https://www.example.com/app?sid=1234567890&platform=android`

      Deep Link (without App Links) example value: `com.example.android://open.example.app/app?sid=1234567890` - \- `ios` | OPTIONAL | URI | URI that can be used on iOS to launch the rental app for this vehicle. More information on this iOS feature can be found [here](https://developer.apple.com/documentation/uikit/core_app/allowing_apps_and_websites_to_link_to_your_content/communicating_with_other_apps_using_custom_urls?language=objc). Please use iOS Universal Links (https://developer.apple.com/ios/universal-links/) if possible, so viewing apps do not need to manually manage the redirect of the user to the app store if the user does not have the application installed.

      This URI 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 providers MUST 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 is not supported in the native iOS rental app.

      Note that the URI does not necessarily include the `vehicle_id` - other identifiers can be used by the rental app within the URL to uniquely identify this vehicle.

      See the [Analytics](#analytics) section for how viewing apps can report the origin of the deep link to rental apps.

      iOS Universal Links example value: `https://www.example.com/app?sid=1234567890&platform=ios`

      Deep Link (without Universal Links) example value: `com.example.ios://open.example.app/app?sid=1234567890` - \- `web` | 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 providers MUST 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 is not 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). REQUIRED if the [vehicle_types.json](#vehicle_typesjson) file 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 | REQUIRED if the corresponding `vehicle_type` definition for this vehicle has a motor. This value represents the furthest distance in meters that the vehicle can travel with the vehicle's current charge or fuel (without recharging or refueling). Note that in the case of carsharing, the given range is indicative and can be different from the one displayed on the vehicle's dashboard. -\- `current_fuel_percent`
      *(added in v2.3)*| 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 | REQUIRED if the vehicle is currently at a station and the [vehicle_types.json](#vehicle_typesjson) file has been defined. Identifier referencing the `station_id` field in [station_information.json](#station_informationjson). -\- `home_station_id`
      *(added in v2.3)* | OPTIONAL | ID | The `station_id` of the station this vehicle must be returned to as defined in [station_information.json](#station_informationjson). -\- `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_plansjson). 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 v2.3)* | OPTIONAL | Array | List of vehicle equipment provided by the operator in addition to the accessories already provided in the vehicle (field `vehicle_accessories` of `vehicle_types.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 v2.3)* | OPTIONAL | Datetime | The date and time when any rental of the vehicle must be completed. The vehicle must be returned and made available for the next user by this time. If this field is empty, it indicates that the vehicle is available indefinitely.

      This field SHOULD be published by carsharing or other mobility systems where vehicles can be booked in advance for future travel. +`vehicles`
      *(as of v3.0-RC)* | Yes | Array<Object> | Contains one object per vehicle that is currently deployed in the field and not part of an active rental. +`vehicles[].vehicle_id`
      *(as of v3.0-RC)* | Yes | ID | Identifier of a vehicle. The `vehicle_id` identifier MUST be rotated to a random string after each trip to protect user privacy *(as of v2.0)*. Use of persistent vehicle IDs poses a threat to user privacy. The `vehicle_id` identifier SHOULD only be rotated once per trip. +`vehicles[].lat` | Conditionally REQUIRED
      *(as of v2.1)* | Latitude | Latitude of the vehicle in decimal degrees. *(as of v2.1)* REQUIRED if `station_id` is not provided for this vehicle (free floating). This field SHOULD have a precision of 6 decimal places (0.000001). See [Coordinate Precision](#coordinate-precision). +`vehicles[].lon` | Conditionally REQUIRED
      *(as of v2.1)* | Longitude | Longitude of the vehicle in decimal degrees. *(as of v2.1)* REQUIRED if `station_id` is not provided for this vehicle (free floating). This field SHOULD have a precision of 6 decimal places (0.000001). See [Coordinate Precision](#coordinate-precision). +`vehicles[].is_reserved` | Yes | Boolean | Is the vehicle currently reserved?

      `true` - Vehicle is currently reserved.
      `false` - Vehicle is not currently reserved. +`vehicles[].is_disabled` | Yes | Boolean | Is the vehicle currently disabled?

      `true` - Vehicle is currently disabled.
      `false` - Vehicle is not currently disabled.

      This field is used to indicate vehicles that are in the field but not available for rental due to a mechanical issue or low battery etc. Publishing this data may prevent users from attempting to rent vehicles that are disabled and not available for rental. This field SHOULD NOT be set to `true` when the system is closed for vehicles that would otherwise be rentable. +`vehicles[].rental_uris` | OPTIONAL | Object | JSON object that contains rental URIs for Android, iOS, and web in the `android`, `ios`, and `web` fields. See [examples](#deep-links-examples) of how to use these fields and [supported analytics](#analytics). +`vehicles[].rental_uris.android` | OPTIONAL | URI | URI that can be passed to an Android app with an android.intent.action.VIEW Android intent to support Android Deep Links (https://developer.android.com/training/app-links/deep-linking). Please use Android App Links (https://developer.android.com/training/app-links) if possible, so viewing apps do not need to manually manage the redirect of the user to the app store if the user does not have the application installed.

      This URI 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 providers MUST 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 is not supported in the native Android rental app.

      Note that the URI does not necessarily include the `vehicle_id` for this vehicle - other identifiers can be used by the rental app within the URI to uniquely identify this vehicle.

      See the [Analytics](#analytics) section for how viewing apps can report the origin of the deep link to rental apps.

      Android App Links example value: `https://www.example.com/app?sid=1234567890&platform=android`

      Deep Link (without App Links) example value: `com.example.android://open.example.app/app?sid=1234567890` +`vehicles[].rental_uris.ios` | OPTIONAL | URI | URI that can be used on iOS to launch the rental app for this vehicle. More information on this iOS feature can be found [here](https://developer.apple.com/documentation/uikit/core_app/allowing_apps_and_websites_to_link_to_your_content/communicating_with_other_apps_using_custom_urls?language=objc). Please use iOS Universal Links (https://developer.apple.com/ios/universal-links/) if possible, so viewing apps do not need to manually manage the redirect of the user to the app store if the user does not have the application installed.

      This URI 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 providers MUST 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 is not supported in the native iOS rental app.

      Note that the URI does not necessarily include the `vehicle_id` - other identifiers can be used by the rental app within the URL to uniquely identify this vehicle.

      See the [Analytics](#analytics) section for how viewing apps can report the origin of the deep link to rental apps.

      iOS Universal Links example value: `https://www.example.com/app?sid=1234567890&platform=ios`

      Deep Link (without Universal Links) example value: `com.example.ios://open.example.app/app?sid=1234567890` +`vehicles[].rental_uris.web` | 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 providers MUST 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 is not supported for web browsers.

      Example value: `https://www.example.com/app?sid=1234567890` +`vehicles[].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). REQUIRED if the [vehicle_types.json](#vehicle_typesjson) file is defined. +`vehicles[].last_reported`
      *(added in v2.1)* | OPTIONAL | Timestamp | The last time this vehicle reported its status to the operator's backend. +`vehicles[].current_range_meters`
      *(added in v2.1)* | Conditionally REQUIRED | Non-negative float | REQUIRED if the corresponding `vehicle_type` definition for this vehicle has a motor. This value represents the furthest distance in meters that the vehicle can travel with the vehicle's current charge or fuel (without recharging or refueling). Note that in the case of carsharing, the given range is indicative and can be different from the one displayed on the vehicle's dashboard. +`vehicles[].current_fuel_percent`
      *(added in v2.3)*| OPTIONAL | Non-negative float | This value represents the current percentage, expressed from 0 to 1, of fuel or battery power remaining in the vehicle. +`vehicles[].station_id`
      *(added in v2.1)* | Conditionally REQUIRED | ID | REQUIRED if the vehicle is currently at a station and the [vehicle_types.json](#vehicle_typesjson) file has been defined. Identifier referencing the `station_id` field in [station_information.json](#station_informationjson). +`vehicles[].home_station_id`
      *(added in v2.3)* | OPTIONAL | ID | The `station_id` of the station this vehicle must be returned to as defined in [station_information.json](#station_informationjson). +`vehicles[].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_plansjson). 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. +`vehicles[].vehicle_equipment`
      *(added in v2.3)* | OPTIONAL | Array<String> | List of vehicle equipment provided by the operator in addition to the accessories already provided in the vehicle (field `vehicle_accessories` of `vehicle_types.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`
      +`vehicles[].available_until`
      *(added in v2.3)* | OPTIONAL | Datetime | The date and time when any rental of the vehicle must be completed. The vehicle must be returned and made available for the next user by this time. If this field is empty, it indicates that the vehicle is available indefinitely.

      This field SHOULD be published by carsharing or other mobility systems where vehicles can be booked in advance for future travel. **Example 1: Micromobility** @@ -1066,9 +1065,9 @@ Describes regions for a system. Regions are a subset of a shared mobility system Field Name | REQUIRED | Type | Defines ---|---|---|--- -`regions` | Yes | Array | Array of objects as defined below. -\-  `region_id` | Yes | ID | Identifier for the region. -\-  `name`
      *(as of v3.0-RC)* | Yes | Array<Localized String> | Public name for this region. +`regions` | Yes | Array<Object> | Contains one object per region. +`regions[].region_id` | Yes | ID | Identifier for the region. +`regions[].name`
      *(as of v3.0-RC)* | Yes | Array<Localized String> | Public name for this region. **Example:** @@ -1126,27 +1125,27 @@ Describes pricing for the system.
      The following fields are all attributes w Field Name | REQUIRED | Type | Defines ---|---|---|--- -`plans` | Yes | Array | Array of objects as defined below. -\-  `plan_id` | Yes | ID | Identifier for a pricing plan in the system. -\-  `url` | OPTIONAL | URL | URL where the customer can learn more about this pricing plan. -\-  `name`
      *(as of v3.0-RC)* | Yes | Array<Localized String> | Name of this pricing plan. -\- `currency` | Yes | String | Currency used to pay the fare.

      This pricing is in ISO 4217 code: http://en.wikipedia.org/wiki/ISO_4217
      (for example, `CAD` for Canadian dollars, `EUR` for euros, or `JPY` for Japanese yen.) -\- `price` | Yes | Non-Negative Float | Fare price, in the unit specified by `currency`.
      *(added in v2.2)* In case of non-rate price, this field is the total price. In case of rate price, this field is the base price that is charged only once per trip (typically the price for unlocking) in addition to `per_km_pricing` and/or `per_min_pricing`. -\- `reservation_price_per_min`
      *(added in v3.0-RC)* | OPTIONAL | Non-Negative Float | The cost, described as per minute rate, to reserve the vehicle prior to beginning a rental. This amount is charged for each minute of the vehicle reservation until the rental is initiated, or until the number of minutes defined in `vehicle_types.json#default_reserve_time` elapses, whichever comes first. When using this field, you MUST declare a value in `vehicle_types.json#default_reserve_time`. This field MUST NOT be combined in a single pricing plan with `reservation_price_flat_rate`. -\- `reservation_price_flat_rate`
      *(added in v3.0-RC)* | OPTIONAL | Non-Negative Float | The cost, described as a flat rate, to reserve the vehicle prior to beginning a rental. This amount is charged once to reserve the vehicle for the duration of the time defined by `vehicle_types.json#default_reserve_time`. When using this field, you MUST declare a value in `vehicle_types.json#default_reserve_time`. This field MUST NOT be combined in a single pricing plan with `reservation_price_per_min`. -\- `is_taxable` | Yes | Boolean | Will additional tax be added to the base price?

      `true` - Yes.
      `false` - No.

      `false` MAY be used to indicate that tax is not charged or that tax is included in the base price. -\-  `description`
      *(as of v3.0-RC)* | Yes | Array<Localized String> | Customer-readable description of the pricing plan. This SHOULD include the duration, price, conditions, etc. that the publisher would like users to see. -\- `per_km_pricing`
      *(added in v2.2)* | OPTIONAL | Array | Array of segments when the price is a function of distance traveled, displayed in kilometers.

      Total cost is the addition of `price` and all segments in `per_km_pricing` and `per_min_pricing`. If this array is not provided, there are no variable costs based on distance. -  \- `start`
      *(added in v2.2)* | Conditionally REQUIRED | Non-Negative Integer | REQUIRED if `per_km_pricing` is defined. The kilometer at which this segment rate starts being charged *(inclusive)*. -  \- `rate`
      *(added in v2.2)* | Conditionally REQUIRED | Float | REQUIRED if `per_km_pricing` is defined. Rate that is charged for each kilometer `interval` after the `start`. Can be a negative number, which indicates that the traveler will receive a discount. -  \- `interval`
      *(added in v2.2)* | Conditionally REQUIRED | Non-Negative Float
      *(as of v3.0-RC2)* | REQUIRED if `per_km_pricing` is defined. Interval in kilometers at which the `rate` of this segment is either reapplied indefinitely, or if defined, up until (but not including) `end` kilometer.

      An interval of 0 indicates the rate is only charged once. -  \-  `end`
      *(added in v2.2)* | OPTIONAL | Non-Negative Integer | The kilometer at which the rate will no longer apply *(exclusive)* for example, if `end` is `20` the rate no longer applies at 20.00 km.

      If this field is empty, the price issued for this segment is charged until the trip ends, in addition to the cost of any subsequent segments. -\- `per_min_pricing`
      *(added in v2.2)* | OPTIONAL | Array | Array of segments when the price is a function of time traveled, displayed in minutes.

      Total cost is the addition of `price` and all segments in `per_km_pricing` and `per_min_pricing`. If this array is not provided, there are no variable costs based on time. -  \- `start`
      *(added in v2.2)* | Conditionally REQUIRED | Non-Negative Integer | REQUIRED if `per_min_pricing` is defined. The minute at which this segment rate starts being charged *(inclusive)*. -  \- `rate`
      *(added in v2.2)* | Conditionally REQUIRED | Float | REQUIRED if `per_min_pricing` is defined. Rate that is charged for each minute `interval` after the `start`. Can be a negative number, which indicates that the traveler will receive a discount. -  \- `interval`
      *(added in v2.2)* | Conditionally REQUIRED | Non-Negative Float
      *(as of v3.0-RC2)* | REQUIRED if `per_min_pricing` is defined. Interval in minutes at which the `rate` of this segment is either reapplied indefinitely, or up until (but not including) the `end` minute, if `end` is defined.

      An interval of 0 indicates the rate is only charged once. -  \-  `end`
      *(added in v2.2)* | OPTIONAL | Non-Negative Integer | The minute at which the rate will no longer apply *(exclusive)* for example, if `end` is `20` the rate no longer applies after 19:59.

      If this field is empty, the price issued for this segment is charged until the trip ends, in addition to the cost of any subsequent segments. -\- `surge_pricing`
      *(added in v2.2)* | OPTIONAL | Boolean | Is there currently an increase in price in response to increased demand in this pricing plan? If this field is empty, it means there is no surge pricing in effect.

      `true` - Surge pricing is in effect.
      `false` - Surge pricing is not in effect. +`plans` | Yes | Array<Object> | Contains one object per pricing plan. +`plans[].plan_id` | Yes | ID | Identifier for a pricing plan in the system. +`plans[].url` | OPTIONAL | URL | URL where the customer can learn more about this pricing plan. +`plans[].name`
      *(as of v3.0-RC)* | Yes | Array<Localized String> | Name of this pricing plan. +`plans[].currency` | Yes | String | Currency used to pay the fare.

      This pricing is in ISO 4217 code: http://en.wikipedia.org/wiki/ISO_4217
      (for example, `CAD` for Canadian dollars, `EUR` for euros, or `JPY` for Japanese yen.) +`plans[].price` | Yes | Non-Negative Float | Fare price, in the unit specified by `currency`.
      *(added in v2.2)* In case of non-rate price, this field is the total price. In case of rate price, this field is the base price that is charged only once per trip (typically the price for unlocking) in addition to `per_km_pricing` and/or `per_min_pricing`. +`plans[].reservation_price_per_min`
      *(added in v3.0-RC)* | OPTIONAL | Non-Negative Float | The cost, described as per minute rate, to reserve the vehicle prior to beginning a rental. This amount is charged for each minute of the vehicle reservation until the rental is initiated, or until the number of minutes defined in `vehicle_types.json#default_reserve_time` elapses, whichever comes first. When using this field, you MUST declare a value in `vehicle_types.json#default_reserve_time`. This field MUST NOT be combined in a single pricing plan with `reservation_price_flat_rate`. +`plans[].reservation_price_flat_rate`
      *(added in v3.0-RC)* | OPTIONAL | Non-Negative Float | The cost, described as a flat rate, to reserve the vehicle prior to beginning a rental. This amount is charged once to reserve the vehicle for the duration of the time defined by `vehicle_types.json#default_reserve_time`. When using this field, you MUST declare a value in `vehicle_types.json#default_reserve_time`. This field MUST NOT be combined in a single pricing plan with `reservation_price_per_min`. +`plans[].is_taxable` | Yes | Boolean | Will additional tax be added to the base price?

      `true` - Yes.
      `false` - No.

      `false` MAY be used to indicate that tax is not charged or that tax is included in the base price. +`plans[].description`
      *(as of v3.0-RC)* | Yes | Array<Localized String> | Customer-readable description of the pricing plan. This SHOULD include the duration, price, conditions, etc. that the publisher would like users to see. +`plans[].per_km_pricing`
      *(added in v2.2)* | OPTIONAL | Array<Object> | Array of segments when the price is a function of distance traveled, displayed in kilometers.

      Total cost is the addition of `price` and all segments in `per_km_pricing` and `per_min_pricing`. If this array is not provided, there are no variable costs based on distance. +`plans[].per_km_pricing[].start`
      *(added in v2.2)* | REQUIRED | Non-Negative Integer | The kilometer at which this segment rate starts being charged *(inclusive)*. +`plans[].per_km_pricing[].rate`
      *(added in v2.2)* | REQUIRED | Float | Rate that is charged for each kilometer `interval` after the `start`. Can be a negative number, which indicates that the traveler will receive a discount. +`plans[].per_km_pricing[].interval`
      *(added in v2.2)* | REQUIRED | Non-Negative Float
      *(as of v3.0-RC2)* | Interval in kilometers at which the `rate` of this segment is either reapplied indefinitely, or if defined, up until (but not including) `end` kilometer.

      An interval of 0 indicates the rate is only charged once. +`plans[].per_km_pricing[].end`
      *(added in v2.2)* | OPTIONAL | Non-Negative Integer | The kilometer at which the rate will no longer apply *(exclusive)* for example, if `end` is `20` the rate no longer applies at 20.00 km.

      If this field is empty, the price issued for this segment is charged until the trip ends, in addition to the cost of any subsequent segments. +`plans[].per_min_pricing`
      *(added in v2.2)* | OPTIONAL | Array<Object> | Array of segments when the price is a function of time traveled, displayed in minutes.

      Total cost is the addition of `price` and all segments in `per_km_pricing` and `per_min_pricing`. If this array is not provided, there are no variable costs based on time. +`plans[].per_min_pricing[].start`
      *(added in v2.2)* | REQUIRED | Non-Negative Integer | The minute at which this segment rate starts being charged *(inclusive)*. +`plans[].per_min_pricing[].rate`
      *(added in v2.2)* | REQUIRED | Float | Rate that is charged for each minute `interval` after the `start`. Can be a negative number, which indicates that the traveler will receive a discount. +`plans[].per_min_pricing[].interval`
      *(added in v2.2)* | REQUIRED | Non-Negative Float
      *(as of v3.0-RC2)* | Interval in minutes at which the `rate` of this segment is either reapplied indefinitely, or up until (but not including) the `end` minute, if `end` is defined.

      An interval of 0 indicates the rate is only charged once. +`plans[].per_min_pricing[].end`
      *(added in v2.2)* | OPTIONAL | Non-Negative Integer | The minute at which the rate will no longer apply *(exclusive)* for example, if `end` is `20` the rate no longer applies after 19:59.

      If this field is empty, the price issued for this segment is charged until the trip ends, in addition to the cost of any subsequent segments. +`plans[].surge_pricing`
      *(added in v2.2)* | OPTIONAL | Boolean | Is there currently an increase in price in response to increased demand in this pricing plan? If this field is empty, it means there is no surge pricing in effect.

      `true` - Surge pricing is in effect.
      `false` - Surge pricing is not in effect. **Example 1:** @@ -1256,18 +1255,18 @@ Obsolete alerts SHOULD be removed so the client application can safely present t Field Name | REQUIRED | Type | Defines ---|---|---|--- -`alerts` | Yes | Array | Array of objects each indicating a system alert as defined below. -\- `alert_id` | Yes | ID | Identifier for this alert. -\- `type` | Yes | Enum | Valid values are:

      • `system_closure`
      • `station_closure`
      • `station_move`
      • `other`
      -\- `times` | OPTIONAL | Array | Array of objects with the fields `start` and `end` indicating when the alert is in effect (for example, when the system or station is actually closed, or when a station is scheduled to be moved). - \- `start` | Conditionally REQUIRED | Timestamp | REQUIRED if `times` array is defined. Start time of the alert. - \- `end` | OPTIONAL | Timestamp | End time of the alert. If there is currently no end time planned for the alert, this can be omitted. -\- `station_ids` | OPTIONAL | Array | If this is an alert that affects one or more stations, include their ID(s). Otherwise omit this field. If both `station_ids` and `region_ids` are omitted, this alert affects the entire system. -\- `region_ids` | OPTIONAL | Array | If this system has regions, and if this alert only affects certain regions, include their ID(s). Otherwise, omit this field. If both `station_ids` and `region_ids` are omitted, this alert affects the entire system. -\-  `url`
      *(as of v3.0-RC)* | OPTIONAL | Array<Localized URL> | A fully qualified URL where the customer can learn more information about this alert. -\-  `summary`
      *(as of v3.0-RC)* | Yes | Array<Localized String> | A short summary of this alert to be displayed to the customer. -\-  `description`
      *(as of v3.0-RC)* | OPTIONAL | Array<Localized String> | Detailed description of the alert. -\- `last_updated` | OPTIONAL | Timestamp | Indicates the last time the info for the alert was updated. +`alerts` | Yes | Array<Object> | Contains one object per system alert. +`alerts[].alert_id` | Yes | ID | Identifier for this alert. +`alerts[].type` | Yes | Enum | Valid values are:

      • `system_closure`
      • `station_closure`
      • `station_move`
      • `other`
      +`alerts[].times` | OPTIONAL | Array<Object> | The fields `start` and `end` indicate when the alert is in effect (for example, when the system or station is actually closed, or when a station is scheduled to be moved). +`alerts[].times[].start` | REQUIRED | Timestamp | Start time of the alert. +`alerts[].times[].end` | OPTIONAL | Timestamp | End time of the alert. If there is currently no end time planned for the alert, this can be omitted. +`alerts[].station_ids` | OPTIONAL | Array<ID> | If this is an alert that affects one or more stations, include their ID(s). Otherwise omit this field. If both `station_ids` and `region_ids` are omitted, this alert affects the entire system. +`alerts[].region_ids` | OPTIONAL | Array<ID> | If this system has regions, and if this alert only affects certain regions, include their ID(s). Otherwise, omit this field. If both `station_ids` and `region_ids` are omitted, this alert affects the entire system. +`alerts[].url`
      *(as of v3.0-RC)* | OPTIONAL | Array<Localized URL> | A fully qualified URL where the customer can learn more information about this alert. +`alerts[].summary`
      *(as of v3.0-RC)* | Yes | Array<Localized String> | A short summary of this alert to be displayed to the customer. +`alerts[].description`
      *(as of v3.0-RC)* | OPTIONAL | Array<Localized String> | Detailed description of the alert. +`alerts[].last_updated` | OPTIONAL | Timestamp | Indicates the last time the info for the alert was updated. **Example:** @@ -1332,15 +1331,15 @@ The following fields are all attributes within the main `data` object for this f Field Name | REQUIRED | Type | Defines ---|---|---|--- `geofencing_zones` | Yes | GeoJSON FeatureCollection | Each geofenced zone and its associated rules and attributes is described as an object within the array of features, as follows. -\- `type` | Yes | String | “FeatureCollection” (as per IETF [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.3)). -\- `features` | Yes | Array | Array of objects as defined below. - \- `type` | Yes | String | “Feature” (as per IETF [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.3)). - \- `geometry` | Yes | GeoJSON MultiPolygon | A polygon that describes where rides may or may not be able to start, end, go through, or have other limitations or affordances. Rules may only apply to the interior of a polygon. All geofencing zones contained in this list are public (meaning they can be displayed on a map for public use). - \- `properties` | Yes | Object | Properties: As defined below, describing travel allowances and limitations. -  \-  `name`
      *(as of v3.0-RC)* | OPTIONAL | Array<Localized String> | Public name of the geofencing zone. -  \- `start` | OPTIONAL | Timestamp | Start time of the geofencing zone. If the geofencing zone is always active, this can be omitted. -  \- `end` | OPTIONAL | Timestamp | End time of the geofencing zone. If the geofencing zone is always active, this can be omitted. -  \- `rules` | OPTIONAL | Array<[Rule](#geofencing-rule-object)> | Array of [Rule](#geofencing-rule-object) objects defining restrictions that apply within the area of the polygon. See [Geofencing Rule Precedence](#geofencing-rule-precedence) for details on semantics of overlapping polygons, vehicle types, and other precedence rules. +`geofencing_zones[].type` | Yes | String | “FeatureCollection” (as per IETF [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.3)). +`geofencing_zones[].features` | Yes | Array<Object> | An array of GeoJSON Feature representing the geofenced zone. +`geofencing_zones[].features[].type` | Yes | String | “Feature” (as per IETF [RFC 7946](https://tools.ietf.org/html/rfc7946#section-3.3)). +`geofencing_zones[].features[].geometry` | Yes | GeoJSON MultiPolygon | A polygon that describes where rides may or may not be able to start, end, go through, or have other limitations or affordances. Rules may only apply to the interior of a polygon. All geofencing zones contained in this list are public (meaning they can be displayed on a map for public use). +`geofencing_zones[].features[].properties` | Yes | Object | Travel allowances and limitations. +`geofencing_zones[].features[].properties.name`
      *(as of v3.0-RC)* | OPTIONAL | Array<Localized String> | Public name of the geofencing zone. +`geofencing_zones[].features[].properties.start` | OPTIONAL | Timestamp | Start time of the geofencing zone. If the geofencing zone is always active, this can be omitted. +`geofencing_zones[].features[].properties.end` | OPTIONAL | Timestamp | End time of the geofencing zone. If the geofencing zone is always active, this can be omitted. +`geofencing_zones[].features[].properties.rules` | OPTIONAL | Array<[Rule](#geofencing-rule-object)> | Array of [Rule](#geofencing-rule-object) objects defining restrictions that apply within the area of the polygon. See [Geofencing Rule Precedence](#geofencing-rule-precedence) for details on semantics of overlapping polygons, vehicle types, and other precedence rules. `global_rules` | Yes | Array<[Rule](#geofencing-rule-object)> | Array of [Rule](#geofencing-rule-object) objects defining restrictions that apply globally in all areas as the default restrictions, except where overridden with an explicit geofencing zone. See [Geofencing Rule Precedence](#geofencing-rule-precedence) for more details.
      A rule or list of rules, as appropriate, must be specified in the global rules list covering all vehicle types in the feed. #### Geofencing Rule Object @@ -1349,7 +1348,7 @@ A `Rule` object defines the set of restrictions in place for a particular zone. Field Name | REQUIRED | Type | Defines ---|---|---|--- -`vehicle_type_ids`
      *(as of v3.0-RC2)* | OPTIONAL | Array | Array of IDs of vehicle types for which any restrictions SHOULD be applied (see vehicle type definitions in `vehicle_types.json`). If vehicle type IDs are not specified, then restrictions apply to all vehicle types. +`vehicle_type_ids`
      *(as of v3.0-RC2)* | OPTIONAL | Array<ID> | An array of `vehicle_type_ids` for which any restrictions SHOULD be applied (see vehicle type definitions in `vehicle_types.json`). If `vehicle_type_ids` are not specified, then restrictions apply to all vehicle types. `ride_start_allowed` | REQUIRED | Boolean | Is the ride allowed to start in this zone?

      `true` - Ride can start in this zone.
      `false` - Ride cannot start in this zone. `ride_end_allowed` | REQUIRED | Boolean | Is the ride allowed to end in this zone?

      `true` - Ride can end in this zone.
      `false` - Ride cannot end in this zone. `ride_through_allowed` | REQUIRED | Boolean | Is the ride allowed to travel through this zone?

      `true` - Ride can travel through this zone.
      `false` - Ride cannot travel through this zone.