August 3, 2020 5:09 pm

GBFS Now Fully Supports Dockless Systems 🛴👏

**Extra! Extra! Since this article we’ve made a lot of changes! We are thrilled to say that not only have we made v2.1 official, but also v2.2 and v2.3-RC! For more information on more recent versions of GBFS, pop over to our articles on v2.2 and v2.3-RC (along with links to translations!) **

Remember when shared micromobility was synonymous with this? 👇

Photo of Velo Antwerpen Bike Share, source: Heidi Guenin

The General Bikeshare Feed Specification (GBFS), the most common format for sharing micromobility data for mobile apps, was created in those days, and it did a good job of representing information about docked bikeshare.

These days, though, shared micromobility includes more modes and different types of operations, including dockless e-bikes and scooters:

Dockless Lime scooters, source: Heidi Guenin & Dockless Wheels e-bikes, source: The Verge

GBFS v2.1-RC (a “release candidate”, or beta version of v2.1) adds support for sharing information about these new transportation options — including information about the vehicles and where travelers can use and return them. GBFS v2.1-RC includes the improvements that were made with v2.0, which you can read about here.

Vehicle Types 🚲 🛴 🛵

GBFS v2.1-RC allows shared mobility providers to share information about the type of vehicle that’s available — whether it’s a bike, scooter, moped, car, or another mode. v2.1-RC also supports information about how a vehicle is powered — human-powered, electric-assist, electric, or combustion — and how far a vehicle can travel on a full charge or tank of gas.

Google Maps screenshot of trip details using a Lime Electric Scooter with a 20.0 mi range *

Additionally, v2.1-RC supports information about what kinds of vehicles can be docked at specific stations.

These additions allow third-party apps to provide travelers with information about the full range of vehicles available. The representation of different vehicles types and information about how far the vehicle can travel will likely differ from app to app.

See the “Data Examples” section below if you’d like to dig into the details.

Dockless Support

When travelers rent shared scooters and dockless e-bikes, they need to know where they are allowed to use and return the vehicle 🗺️. GBFS v2.1-RC provides a way to represent virtual stations — a bounded area without any physical infrastructure where vehicles can be deposited or retrieved.

Where screenshots show geofencing and vehicle type definitions, applications are using proprietary solutions, which are expected to transition to the standardized v2.1-RC format in the future.

Photo of obike virtual station, source: dcrainmakerblog & photo of scooter parking area, source: Heidi Guenin.

Virtual stations, as well as allowed operating areas, are represented as “geofences” in GBFS v2.1-RC. Geofencing makes use of virtual perimeters to define real-world geographic areas, so in addition to showing virtual stations, geofencing can be used to represent other geographically-bounded information, such as areas with rules for allowed and disallowed travel and speeds.

Screenshot of Lime app map with “No Ride Zone”

See the “Data Examples” section below if you’d like to dig into the details.

Note that the goal of geofences in GBFS v2.1-RC is to provide travelers with information they can use when renting vehicles, not for use in the regulatory process. A different data specification, MDS, was created to fulfill this regulatory role.

What’s Next? 🔜

The next step for GBFS v2.1-RC is for both a producer, such as a bikeshare operator, as well as a consumer, such as a mobile app, to implement these new features. According to the GBFS governance process, as soon as a producer and consumer have implemented these new data fields the v2.1-RC specification can officially exit “beta” status and become v2.1! 💪

Sure, GBFS has “bikeshare” in the name, but the shared mobility community has been asking for GBFS to support other modes since 2017. With the addition of “car” to the available vehicle types, we’ve opened the door to supporting car-sharing information in the future. In addition, we’re working on improving pricing information, representing adaptive bikeshare systems, and identifying the community’s priorities for future vehicle definition improvements (such as vehicle accessories, motor specifications, and form refinements). Join the discussion by following our work in the GBFS GitHub repository or participating in MobilityData’s GBFS slack channel.

Interested in seeing how the features new to GBFS v2.1-RC are added to GBFS feeds? Check out the examples below. ⬇️

Data Examples

Vehicle type definitions

Although GBFS v2.0 technically didn’t have a way to represent scooters, scooter operators published data through GBFS, sometimes just noting “scooter” in the name and providing a separate GBFS feed.

Now, with the introduction of vehicle definitions, one GBFS feed can be used to represent the full array of vehicle types that an operator offers. In the example below, there are four vehicle types defined in vehicle_types.json: a human-powered bicycle, an electric scooter that can travel 12,345 meters on a full charge, an electric moped that can travel 20,891 meters on a full charge, and a combustion-engine car that can travel 523,992 meters on a full tank of gas.

vehicle_types.json

{
  "last_updated": 1434054678,
  "ttl": 0,
  "version": "v2.1-RC",
  "data": {
    "vehicle_types": [
      {
        "vehicle_type_id": "standardbike",
        "form_factor": "bicycle",
        "propulsion_type": "human",
        "name": "Example Basic Bike"
      },
      {
        "vehicle_type_id": "escoot3",
        "form_factor": "scooter",
        "propulsion_type": "electric",
        "name": "Example E-scooter V2",
        "max_range_meters": 12345
      }, 
      {
        "vehicle_type_id": "moped1",
        "form_factor": "moped",
        "propulsion_type": "electric",
        "name": "Electric Moped",
        "max_range_meters": 20891
      },
      {
        "vehicle_type_id": "car1",
        "form_factor": "car",
        "propulsion_type": "combustion",
        "name": "Four-door Sedan",
        "max_range_meters": 523992
      }
    ]
  }
}

To allow operators to specify the vehicle capacity of each station, including by vehicle type, new fields have been added to station_information.json as well.

In the example below, station13, located at SE Stark and SE 12th Ave in Portland, Oregon, is a station with physical infrastructure and valet services. The station has the capacity for 18 total vehicles, including three of the four different vehicle types offered within the system — ten spaces for standard bikes, six spaces for electric scooters, and two spaces for mopeds.

station_information.json

{
  ...
  "stations": [ {
      "station_id": "station13",
      "station_name": "SE Stark & SE 12th",
      "lat": 45.5194,
      "lon": -122.6535,
      "is_virtual_station": false,
      "capacity": 18,
      "is_valet_station": true,
      "vehicle_type_capacity": {
        "standardbike": 10,
        "escoot3": 6,
        "moped1": 2,  
        "car1": 0
      }
    }
   ]
  }

station_status.json has also been updated to include real-time information on vehicle type availability for stations, including:

  • Vehicle docks available by type of vehicle and
  • Type and current range of vehicles at the station and if they’re reserved or disabled.

In the below example, station1 has three available docks. There are two unique vehicles at the station that are available for rental — one standard bike and one electric scooter. The electric scooter, bike_id pqr678, has a range of 5432 meters for its current power level. Finally, this station has two different dock types; currently having two docks available for standard bicycles and one for an electric scooter.

station_status.json

{
  "last_updated": 1434054678,
  "ttl": 0,
  "version": "v2.1-RC",
  "data": {
    "stations": [
      {
        "station_id": "station1",
        "...”,
        "num_docks_available": 3,
        "vehicles": [{
          "bike_id": "mno345",
          "...”,
          "vehicle_type_id": "standardbike"
        }, {
          "bike_id": "pqr678",
          "is_reserved": false,
          "is_disabled": false,
          "vehicle_type_id": "escoot3",
          "current_range_meters": 5432
        }],
        "vehicle_docks_available": [{
          "vehicle_type_ids": ["standardbike"],
          "count": 2
        }, {
          "vehicle_type_ids": ["escoot3"],
          "count": 1
        }]
      },

station2 is has eight operational docks. There are two vehicles at the station available for rental. Both vehicles at station2 have range defined, with the electric moped having a current range of 1,234 meters and the electric scooter having a current range of 4,321 meters. Unlike at station1, all vehicle_types can be returned to any dock at this station because the field vehicle_docks_available isn’t included.

station_status.json (cont)

{
        "station_id": "station2",
        "is_installed": true,
        "is_renting": true,
        "is_returning": true,
        "last_reported": 1434054678,
        "num_docks_available": 8,
        "vehicles": [{
          "bike_id": "stu901",
          "is_reserved": false,
          "is_disabled": false,
          "vehicle_type_id": "moped1",
          "current_range_meters": 1234
        }, {
          "bike_id": "vwx234",
          "is_reserved": false,
          "is_disabled": false,
          "vehicle_type_id": "escoot3",
          "current_range_meters": 4321
        }]
      }
    ]
  }
}

free_bike_status.json has been updated to include real-time information on floating vehicle types:

  • The vehicle type id,
  • When the vehicle last reported its status to the operator’s backend, and
  • The current range in meters.

In this example, two vehicles are available — one standard bike and one electric scooter. The scooter has a current range of 6,543 meters, and both vehicles last reported to the operators’ back-end on Thursday, June 11, 2015 8:31:27 PM, GMT.

free_bike_status.json

{
  "last_updated": 1434054678,
  "ttl": 0,
  "version": "v2.1-RC",
  "data": {
    "bikes": [
      {
        "bike_id": "ghi789",
        "last_reported": 1434054678,
        "lat": 12.3499,
        "lon": 56.7899,
        "is_reserved": false,
        "is_disabled": false,
        "vehicle_type_id": "standardbike"
      }, {
        "bike_id": "jkl012",
        "last_reported": 1434054687,
        "lat": 12.3499,
        "lon": 56.7899,
        "is_reserved": false,
        "is_disabled": false,
        "vehicle_type_id": "escoot3",
        "current_range_meters": 6543
      }
    ]
  }
}

Geofencing and dockless support

Stations in GBFS v1.0 were represented by latitude and longitude, and v2.1-RC adds the representation of virtual stations through new information in station_information.json, including :

  • if a station is virtual,
  • the area of a virtual station, and
  • if a station is a valet station.

In the example below, the station does not include physical infrastructure or valet services. It is a virtual station with space for 16 vehicles — eight standard bikes and eight electric scooters.

station_information.json

{
  ...
  "stations": [
    {
      "station_id": "station12",
      "station_name": "SE Belmont & SE 10th",
      "is_valet_station": false
      "is_virtual_station": true,
      "station_area": {
        "type": "MultiPolygon",
        "coordinates": [ [
          [
            [
              -122.6559,
              45.5163
            ], 
            [
              -122.6557,
              45.5163
            ],
            [
              -122.6557,
              45.5164
            ],
            [
              -122.6559,
              45.5164
            ],
            [
              -122.6559,
              45.5163
            ]
          ]
        ] ]
      },
      "capacity": 16,
      "vehicle_capacity": {
        "standardbike": 8,
        "escoot3": 8,
        "moped1": 0,
        "car1": 0
      }
    }
   ]
 }

The addition of geofencing support in v2.1-RC also allows for the representation of where travelers can use and return vehicles. 📍

geofencing_zones.json is a new file that includes:

  • The name and geography of the geofenced zone (defined as a GeoJSON FeatureCollection),

The limitations of the geofenced zone, defined in the properties field, including:

  • the name and start & end times of limitations,
  • the vehicles types to which a limitation applies,
  • whether a ride is allowed to start and stop in the zone,
  • whether a ride is allowed to pass through the zone, and
  • the maximum speed allowed in the zone.

In the example below, an area named “NE 24th/NE Knott” is defined in which electric mopeds and combustion engine cars are not allowed to begin or end a trip, but they are allowed to travel through at a maximum speed of 10 km/hour. These rules are in place from Saturday, July 4, 2020 4:00:00 PM GMT through Sunday, July 5, 2020 12:01:00 AM GMT.

geofencing_zones.json

{
  "geofencing_zones": [
    {
      "type": "FeatureCollection",
      "features": [
        {
          "type": "Feature",
          "geometry": {
            "type": "MultiPolygon",
            "coordinates": [
              [
                [
                  [
                    -122.578067779541,
                    45.562982266067905
                  ],
                  [
                    -122.66183853149414,
                    45.562741896778604
                  ],
                  [
                    -122.66115188598633,
                    45.50454228987185
                  ],
                  [
                    -122.57892608642578,
                    45.50466259908575
                  ],
                  [
                    -122.578067779541,
                    45.562982266067905
                  ]
                ]
              ],
              [
                [
                  [
                    -122.65068054199219,
                    45.54819764153181
                  ],
                  [
                    -122.65085220336914,
                    45.534731835669675
                  ],
                  [
                    -122.63093948364258,
                    45.53521281284293
                  ],
                  [
                    -122.63042449951172,
                    45.54819764153181
                  ],
                  [
                    -122.65068054199219,
                    45.54819764153181
                  ]
                ]
              ]
            ]
          },
          "properties": {
            "name": "NE 24th/NE Knott",
            "start": 1593878400,
            "end": 1593907260,
            "rules": {
              "vehicle_type_id": [
                "moped1",
                "car1"
              ],
              "ride_allowed": false,
              "ride_through_allowed": true,
              "maximum_speed_kph": 10
            }
          }
        }
      ]
    }
  ]
}