Definiciones de GBFS

Antes de continuar con esta sección, si aún no lo hiciste, verifica los sistemas de micromovilidad admitidos para los que estás creando el feed.

En las siguientes secciones, cada encabezado tiene el siguiente formato: Required|Optional|Conditionally required: Feed name (System supported). Se admiten los siguientes sistemas:

  • Sistema asegurado
  • Sistema sin estaciones
  • Sistema con y sin estación de carga

Para lograr una integración exitosa con Google, proporciona solo los archivos necesarios para el sistema que describe tu feed y especifica los campos obligatorios incluidos en las secciones pertinentes. En el caso de los campos obligatorios de forma condicional, consulta la descripción del campo para obtener orientación. También puedes especificar campos opcionales que agreguen información y brinden una mejor experiencia del usuario.

Encabezado obligatorio para los feeds de micromovilidad

Los feeds de micromovilidad son feeds que contienen datos estructurados de micromovilidad con o sin estaciones, como se define en este artículo.

Todos los feeds siempre deben especificar los campos incluidos en la siguiente tabla en el nivel superior del objeto JSON, que se conoce colectivamente como el encabezado común de GBFS.

Nombre del campo Tipo Requisito Descripción
last_updated Marca de tiempo Obligatorio Es una marca de tiempo POSIX que especifica una cantidad de segundos desde el 1 de enero de 1970 a las 00:00:00 UTC.

Se establece en la última vez que se actualizaron los datos del feed.

ttl Número entero no negativo Obligatorio Es un número entero no negativo que representa la cantidad de segundos que quedan hasta que sea hora de actualizar el feed.

Si los datos deben actualizarse a una velocidad constante, establece este valor en 0.

data JSON Obligatorio Es el JSON que contiene los campos de datos del feed individual.

Por ejemplo, un feed free_bike_status.json agregado que especifica el encabezado común de GBFS podría ser el siguiente:

{
    "ttl": 30,
    "last_updated": 1576123774,
    "data": {
        "bikes": [ ... ]  // GBFS free bike status objects.
    }
}

Obligatorio: system_information.json (sistema con base y sin base)

Consulta la especificación de GBFS según sea necesario.

Este feed proporciona detalles sobre el operador del sistema.

Nombre del campo Tipo Requisito Descripción
system_id ID Obligatorio Es un identificador único a nivel global para el sistema de uso compartido de vehículos. Este valor debe permanecer igual durante la vida útil del sistema. Cada sistema o área geográfica distintos en los que se operan los vehículos DEBE tener su propio system_id. Los IDs de los sistemas DEBEN ser reconocibles como pertenecientes a un sistema en particular, a diferencia de las cadenas aleatorias; por ejemplo, bcycle_austin o biketown_pdx.
name String Obligatorio Es el nombre del sistema que se muestra a los clientes.
rental_apps Objeto Obligatorio Es un objeto JSON que contiene la información de la app de alquiler para Android y iOS en sus respectivos campos.
rental_apps.android Objeto Condicionalmente obligatorio Contiene información sobre la descarga y el descubrimiento de la app de alquileres para la plataforma de Android en los campos store_uri y discovery_uri. Si el proveedor del sistema tiene una app de alquiler para Android, este campo es obligatorio.
rental_apps.android.store_uri URI Obligatorio Es el URI desde el que se puede descargar la app para Android de alquiler. Por lo general, se trata de un URI a una tienda de aplicaciones, como Google Play. Si el URI apunta a una tienda de aplicaciones, como Google Play, recomendamos que siga las prácticas recomendadas de Android para que la app de visualización pueda abrir directamente el URI a la app nativa de la tienda de aplicaciones en lugar de a un sitio web.
rental_apps.android.discovery_uri URI Obligatorio Es el URI que tiene el formato your_custom_scheme://your/path/here. PackageManager.queryIntentActivities() puede usar el URI para descubrir si la app para Android de alquiler está instalada en el dispositivo.
rental_apps.ios Objeto Condicionalmente obligatorio Contiene información sobre la descarga y el descubrimiento de la app de alquileres para la plataforma de iOS en los campos store_uri y discovery_uri. Este campo es obligatorio si el proveedor del sistema tiene una app de alquiler para iOS.
rental_apps.ios.store_uri URI Obligatorio Es el URI desde el que se puede descargar la app para iOS de alquiler. Por lo general, es un URI a una tienda de aplicaciones, como App Store de Apple. Si el URI apunta a una tienda de aplicaciones, como Apple App Store, te recomendamos que siga las prácticas recomendadas de iOS para que la app de visualización pueda abrir directamente el URI a la app nativa de la tienda de aplicaciones en lugar de a un sitio web.
rental_apps.ios.discovery_uri URI Obligatorio Es el URI que tiene el formato your_custom_scheme://. UIApplication canOpenURL: puede usar el URI para descubrir si la app para iOS de alquiler está instalada en el dispositivo.

Obligatorio: free_bike_status.json (sistema sin estaciones)

Consulta la especificación de GBFS según sea necesario.

En este feed, se definen las ubicaciones y los atributos de los vehículos independientes disponibles. Por motivos de privacidad, los vehículos que forman parte de un alquiler activo no deben aparecer en este feed.

Nombre del campo Tipo Requisito Descripción
bikes Array Obligatorio Es un array de bicicletas detenidas y disponibles actualmente, en el que cada bicicleta es un objeto.
bikes[].bike_id ID Obligatorio Es el identificador de una bicicleta.

Para proteger la privacidad, el ID se puede cambiar a una cadena aleatoria después de cada viaje.

bikes[].lat Latitud Obligatorio Latitud WGS 84 de la bicicleta, en formato de grados decimales.
bikes[].lon Longitud Obligatorio Longitud WGS 84 de la bicicleta, en formato de grados decimales.
bikes[].is_reserved Booleano Obligatorio Indica si la bicicleta está reservada actualmente, de la siguiente manera:
  • Si la bicicleta está reservada, se establece en true.
  • Si la bicicleta no está reservada, se establece en false.
bikes[].is_disabled Booleano Obligatorio Indica si la bicicleta está inhabilitada o dañada actualmente, de la siguiente manera:
  • Si la bicicleta está inhabilitada, se establece en true.
  • Si la bicicleta no está inhabilitada, se establece en false.
bikes[].rental_uris Objeto Obligatorio Es un objeto JSON que contiene los URIs de alquiler para Android, iOS y la Web en sus respectivos campos.
bikes[].rental_uris.android URI Condicionalmente obligatorio Es un URI que se puede pasar a una app para Android con un intent de Android android.intent.action.VIEW para admitir vínculos directos de Android. El rental_uris proporcionado debe ser un Android App Link para que la app de visualización no necesite administrar manualmente el redireccionamiento del usuario a Play Store en caso de que el usuario no tenga instalada la app del proveedor.

Este URI debe ser un vínculo directo específico para la bicicleta individual, no una página de alquiler general que incluya información de más de una bicicleta. El vínculo directo debe llevar al usuario directamente a la bicicleta sin avisos, páginas intersticiales ni registros. Asegúrate de que los usuarios puedan ver la bicicleta incluso si nunca abrieron la aplicación.

No es necesario que los URIs incluyan el bike_id de la bicicleta, siempre y cuando el socio tenga otros medios para identificar la bicicleta correspondiente. Por ejemplo, la app de alquiler puede usar otros identificadores dentro del URI para identificar de forma única la bicicleta.

Este campo es obligatorio si el socio tiene una app de alquiler para Android.

Ejemplo de Android App Link:

https://www.example.com/app?sid=1234567890&platform=android

bikes[].rental_uris.ios URI Condicionalmente obligatorio Es un URI que se puede usar en iOS para iniciar la app de alquiler de bicicletas. Para obtener más información, consulta el artículo de Apple sobre los esquemas de URL personalizados de iOS. El rental_uris proporcionado debe ser un vínculo universal de iOS para que la app de visualización no necesite administrar manualmente el redireccionamiento del usuario a la App Store en caso de que el usuario no tenga instalada la app del proveedor.

Este URI debe ser un vínculo directo específico para la bicicleta individual, no una página de alquiler general que incluya información de más de una bicicleta. El vínculo directo debe llevar al usuario directamente a la bicicleta sin avisos, páginas intersticiales ni registros. Asegúrate de que los usuarios puedan ver la bicicleta incluso si nunca abrieron la aplicación.

No es necesario que los URIs incluyan el bike_id de la bicicleta, siempre y cuando el socio tenga otros medios para identificar la bicicleta correspondiente. Por ejemplo, la app de alquiler puede usar otros identificadores dentro del URI para identificar de forma única la bicicleta.

Este campo es obligatorio si el socio tiene una app de alquiler para iOS.

Ejemplo de vínculo universal de iOS:

https://www.example.com/app?sid=1234567890&platform=ios

bikes[].rental_uris.web URL Opcional

Es una URL que puede usar un navegador web para mostrar más información sobre el alquiler de un vehículo en esta ubicación.

Esta URL debe ser un vínculo directo específico para la bicicleta individual, no una página de alquiler general que incluya información de más de una bicicleta. El vínculo directo debe llevar al usuario directamente a la bicicleta sin avisos, páginas intersticiales ni registros. Asegúrate de que los usuarios puedan ver la bicicleta incluso si nunca abrieron la aplicación.

No es necesario que las URLs incluyan bike_id para la bicicleta ni que sigan las convenciones semánticas de las URLs de alquiler para Android o iOS. La app de alquiler puede usar otros identificadores dentro de la URL que identifiquen de forma única la bicicleta.

Si este campo no está configurado, significa que el navegador web no admite vínculos directos.

Ejemplo de valor:

https://www.example.com/app?sid=1234567890

bikes[].vehicle_type_id ID Obligatorio El vehicle_type_id del vehículo, como se describe en la sección vehicle_types.json.
bikes[].pricing_plan_id ID Obligatorio Es el identificador del plan de precios que se aplica cuando se alquila este tipo de vehículo, como se describe en la sección system_pricing_plans.json.
bikes[].current_range_meters Punto flotante no negativo Condicionalmente obligatorio Si la definición de vehicle_type que corresponde al vehículo tiene un motor, este campo es obligatorio.

Se establece en la distancia más lejana en metros que el vehículo puede recorrer sin necesidad de recargarse o reabastecerse de combustible, dado el nivel actual de carga o combustible del vehículo.

bikes[].last_reported Marca de tiempo Opcional Se establece en la última vez que el vehículo informó su estado al backend del operador.

A continuación, se muestra un ejemplo de free_bike_status.json:

"bikes": [{
    "bike_id": "xyz123",
    "lat": 12.34,
    "lon": 56.78,
    "is_reserved": true,
    "is_disabled": false,
    "rental_uris":{
      "android": "https://www.example.com/app?sid=1234567890&platform=android",
      "ios": "https://www.example.com/app?sid=1234567890&platform=ios",
      "web": "https://www.example.com/app?sid=1234567890"
    },
    "vehicle_type_id": "scooter_electric",
    "pricing_plan_id": "sydneyPlan1",
    "current_range_meters": 4500,
    "last_reported": 1434054678
},
{
    "bike_id": "abc123",
    "lat": 1.34,
    "lon": 146.78,
    "is_reserved": false,
    "is_disabled": true,
    "rental_uris":{
      "android": "https://www.example.com/app?sid=1234567890&platform=android",
      "ios": "https://www.example.com/app?sid=1234567890&platform=ios",
      "web": "https://www.example.com/app?sid=1234567890"
    },
    "vehicle_type_id": "bike_manual",
    "pricing_plan_id": "sydneyPlan1",
    "last_reported": 1434054241
}
]

Obligatorio: vehicle_types.json (sistema con estaciones y sin estaciones)

Consulta la especificación de GBFS según sea necesario.

Este feed define los detalles de los tipos de vehículos individuales, como se menciona en la sección free_bike_status.json.

Nombre del campo Tipo Requisito Descripción
vehicle_types Array Obligatorio Es un array de objetos, en el que cada objeto define un tipo de vehículo distinto en el catálogo del proveedor. Solo puede haber un objeto para un tipo de vehículo determinado.
vehicle_types[].vehicle_type_id ID Obligatorio Es un identificador único para un tipo de vehículo determinado.
vehicle_types[].form_factor Enum Obligatorio Es una enumeración que representa el factor de forma general del vehículo, según la siguiente lista de valores válidos actualmente:
  • bicycle
  • scooter
  • other
vehicle_types[].propulsion_type Enum Obligatorio Es una enumeración que representa el tipo de propulsión principal del vehículo, según la siguiente lista de valores válidos actualmente:
  • human: Propulsión con pedal o pie
  • electric_assist: Proporciona energía solo junto con la propulsión humana
  • electric: Contiene el modo de aceleración con un motor que funciona con batería.
  • combustion: Contiene el modo de aceleración con un motor a gas.
vehicle_types[].max_range_meters Punto flotante no negativo Condicionalmente obligatorio Si propulsion_type no está establecido en human, el vehículo tiene un motor y, por lo tanto, este campo es obligatorio.

Se establece en la distancia más lejana en metros que el vehículo puede recorrer sin necesidad de recargarse o reabastecerse de combustible, cuando el vehículo está completamente cargado o con el tanque lleno.

A continuación, se muestra un ejemplo de vehicle_types.json:

"vehicle_types": [
  {
    "vehicle_type_id": "bike_manual",
    "form_factor": "bicycle",
    "propulsion_type": "human"
  },
  {
    "vehicle_type_id": "scooter_electric",
    "form_factor": "scooter",
    "propulsion_type": "electric",
    "max_range_meters": 10000
  }
]

Obligatorio: system_pricing_plans.json (sistema sin estaciones)

Consulta la especificación de GBFS según sea necesario.

Este feed define los planes de precios para los vehículos independientes. Exigimos que los proveedores muestren información de precios para los vehículos independientes.

Nombre del campo Tipo Requisito Descripción
plans Array Obligatorio Es un array de objetos en el que cada objeto define un plan de precios determinado.
plans[].plan_id ID Obligatorio Es una cadena que representa un identificador único para el plan de precios determinado que ofrece el proveedor.
plans[].url URL Opcional Es la URL que dirige a los usuarios finales a más información sobre el plan de precios.
plans[].currency String Obligatorio Estándar ISO 4217 para el plan de precios.
plans[].price Punto flotante no negativo Obligatorio

El plan de precios debe definirse como un plan de precios sin tarifa o como un plan de precios con tarifa:

Plan de precios sin clasificación

Este plan tiene una tarifa única y fija.

Configura el siguiente campo:

  • price: Es el precio fijo de todo el viaje.
Plan de precios calificado

Este plan es un precio de tarifa lineal por tramos.

Configura el siguiente campo:

  • price: Es el precio base, que se cobra exactamente una vez por viaje.

Configura uno o ambos de los siguientes campos:

  • per_km_pricing: Es el precio del viaje especificado en la tarifa por kilómetro.
  • per_min_pricing: Es el precio del viaje especificado en la tarifa por minuto.
plans[].per_km_pricing Array Condicionalmente obligatorio

Si el precio es una función de la distancia recorrida, que se muestra en kilómetros, este campo es obligatorio.

Es un array de objetos en el que cada objeto define un segmento dividido por una distancia determinada. El valor de start de cada segmento debe ser menor o igual que el valor de start del segmento siguiente.

Para determinar el precio total del plan determinado, agrega el valor plans[].price del plan determinado a los precios acumulados de los segmentos en plans[].per_km_pricing y plans[].per_min_pricing.

Si no se configura este campo, no habrá precios variables según la distancia y, por lo tanto, no se incluirán en el precio total.

plans[].per_km_pricing[].start Número entero no negativo Obligatorio Es la cantidad de kilómetros a partir de la cual se comienza a cobrar la tarifa del tramo. Este campo se establece en el valor inclusivo que inicia el rango del segmento. Por lo tanto, una vez que se hayan recorrido los kilómetros, se cobrará el rate una vez.
plans[].per_km_pricing[].rate Número de punto flotante Obligatorio Es la tarifa que se cobra por cada interval, que comienza en el start inclusivo del segmento. Si este campo se establece en un número negativo, el viajero recibe un descuento.
plans[].per_km_pricing[].interval Número entero no negativo Obligatorio

Es el intervalo en kilómetros en el que se vuelve a aplicar el rate del segmento de forma indefinida, a menos que el end del segmento se establezca en cualquier número entero no negativo.

El rate se vuelve a aplicar una vez al inicio de cada interval, y no se tiene en cuenta el redondeo de la distancia.

Si el end del segmento se establece en cualquier número entero no negativo, el rate del segmento se vuelve a aplicar hasta el valor end del segmento, sin incluirlo.

Si este campo se establece en 0, el rate se cobra exactamente una vez en el start del segmento.

plans[].per_km_pricing[].end Número entero no negativo Opcional

Es la cantidad de kilómetros en la que ya no se aplica el rate para el segmento. Este campo se establece en el valor exclusivo que finaliza el rango del segmento. Por ejemplo, si end se configura como 40, el rate ya no se aplica a los 40 kilómetros.

Si este campo no se configura o está vacío, se cobra el rate del segmento hasta que finaliza el viaje, además de los segmentos adicionales que lo siguen.

plans[].per_min_pricing Array Condicionalmente obligatorio

Si el precio es una función del tiempo transcurrido, que se muestra en minutos, este campo es obligatorio.

Es un array de objetos en el que cada objeto define un segmento dividido por un período determinado. El valor de start de cada segmento debe ser menor o igual que el valor de start del segmento siguiente.

Para determinar el precio total del plan determinado, agrega el valor plans[].price del plan determinado a los precios acumulados de los segmentos en plans[].per_km_pricing y plans[].per_min_pricing.

Si este campo no está configurado, no hay precios variables basados en el tiempo y, por lo tanto, no se incluyen como parte del precio total.

plans[].per_min_pricing[].start Número de punto flotante Obligatorio Cantidad de minutos a partir de los cuales se comienza a cobrar la tarifa del segmento. Este campo se establece en el valor inclusivo que inicia el rango del segmento. Por lo tanto, una vez que transcurre la cantidad de minutos establecida, se cobra el rate una vez.
plans[].per_min_pricing[].rate Número de punto flotante Obligatorio Es la tarifa que se cobra por cada interval. La tarifa comienza en el start inclusivo del segmento. Si este campo se establece en un número negativo, el viajero recibe un descuento.
plans[].per_min_pricing[].interval Número entero no negativo Obligatorio

Intervalo en minutos en el que se vuelve a aplicar el rate del segmento de forma indefinida, a menos que el end del segmento se establezca en cualquier número entero no negativo.

El rate se vuelve a aplicar una vez al inicio de cada interval, y no se tiene en cuenta el redondeo del tiempo de viaje.

Si el end del segmento se establece en cualquier número entero no negativo, el rate del segmento se vuelve a aplicar hasta el valor end del segmento, sin incluirlo.

Si este campo se establece en 0, el rate se cobra exactamente una vez en el start del segmento.

plans[].per_min_pricing[].end Número entero no negativo Opcional

Es la cantidad de minutos en la que ya no se aplica el rate para el segmento. Este campo se establece en el valor exclusivo que finaliza el rango del segmento. Por ejemplo, si end se establece en 20, rate ya no se aplica a los 20 minutos.

Si este campo no se configura o está vacío, se cobra el rate del tramo hasta que finaliza el viaje, además de los tramos adicionales que lo siguen.

Ejemplos de system_pricing_plans.json

En esta sección, se proporcionan muestras de código system_pricing_plans.json informativas. También se proporcionan los detalles y los resultados pertinentes de cada ejemplo.

Ejemplo 1 de system_pricing_plans.json

En el siguiente ejemplo de código del plan de precios, se muestran los cargos según el tiempo de viaje para los siguientes intervalos:

  • [0,1): USD 2
    • Si el viaje dura menos de un minuto, el usuario paga USD 2.
    • Ejemplo: Viaje de 59 s
  • [1,2): USD 3
    • Si el viaje dura un minuto o más, pero menos de dos, el usuario paga USD 2 + USD 1 = USD 3.
    • Ejemplos: Viaje de 1 minuto; viaje de 1 minuto y 45 segundos
  • Cantidad de minutos x, donde x es mayor o igual a 2: USD 3 + ((USD 2 + USD 1) * (x - 2 + 1)) USD
    • Si el viaje dura dos minutos o más, el usuario paga USD 3 por la parte del viaje que dura menos de dos minutos y (USD 1 [continuando desde la primera entrada de la lista de per_min_pricing] + USD 2 [la segunda entrada de la lista de per_min_pricing]) por cada minuto posterior a los dos minutos inclusive.
    • Ejemplos:
      • El viaje de 2 minutos cuesta USD 3 + (USD 2 + USD 1) = USD 6.
      • El viaje de 2 minutos y 30 segundos cuesta USD 3 + (USD 2 + USD 1) = USD 6.
      • El viaje de 3 minutos cuesta USD 3 + ((USD 2 + USD 1) * 2) = USD 9.
      • El costo de un viaje de 10 minutos es de USD 3 + ((USD 2 + USD 1) * 9) = USD 30.
{
  "plans": {
    "plan_id": "plan1",
    "currency": "USD",
    "price": 2,
    "per_min_pricing": [
      {
          "interval": 1,
          "rate": 1,
          "start": 1
      },
      {
          "interval": 1,
          "rate": 2,
          "start": 2
      }
    ],
  }
}

Ejemplo 2 de system_pricing_plans.json

En este ejemplo, mostramos una muestra de código para un plan de precios que se cobra a una tarifa por minutos y kilómetros:

  • Específicamente, al usuario final se le cobra USD 0.25 por km y USD 0.50 por minuto.
  • Ambas tasas ocurren de forma simultánea y no dependen una de la otra.
  • Por lo tanto, un viaje de un kilómetro que dura 10 minutos cuesta USD 9. El desglose del costo es el siguiente:
    • USD 3, precio base
    • USD 0.25 * 2, que se cobra una vez al inicio del viaje y otra vez en la marca de 1 km.
    • USD 0.5 * 11, que se cobra una vez al comienzo de cada minuto. Los cargos comienzan a los 0 segundos y el último intervalo se cobra a los 10 minutos.
{
  "plans": {
    "plan_id": "plan2",
    "currency": "CAD",
    "price": 3,
    "per_km_pricing": [{
      "start": 0,
      "rate": 0.25,
      "interval": 1
    }],
    "per_min_pricing": [{
      "start": 0,
      "rate": 0.50,
      "interval": 1
    }]
  }
}

Obligatorio de forma condicional: geofencing_zones.json (sistema con y sin estaciones de carga)

Consulta la especificación de GBFS según sea necesario.

Este feed define los datos de la delimitación geográfica para los vehículos independientes. Los datos de perímetro virtual incluyen los límites geográficos que especifican dónde se permite que los vehículos comiencen y finalicen el viaje, junto con la velocidad a la que pueden circular. Esta velocidad es la velocidad máxima del vehículo o el límite de velocidad de la ruta por la que circula el vehículo, la que sea menor. Los conductores deben cumplir con las leyes y ordenanzas locales.

Usamos estos datos para que, cuando un usuario busque una ruta determinada, si el final del viaje se encuentra fuera de las geocercas específicas, se filtre el resultado de micromovilidad. Si no se proporcionan geocercas, Google considera que el servicio no tiene restricciones de límites.

Nombre del campo Tipo Requisito Descripción
geofencing_zones Objeto Obligatorio Un objeto FeatureCollection, según lo describe la RFC 7946 de IETF, es un objeto que tiene un campo llamado features. El valor de features es un array JSON. Cada elemento del array JSON es un objeto Feature.

Cada zona delimitada geográficamente, sus reglas y atributos asociados, y las definiciones de FeatureCollection se especifican aquí como parte de las definiciones del feed de geofencing_zones.json.

geofencing_zones.type String Obligatorio Se establece en FeatureCollection, como se describe en IETF RFC 7946.
geofencing_zones.features Array Obligatorio Es un array JSON, en el que cada elemento es un objeto Feature.
geofencing_zones.features[].type String Obligatorio Se establece en Feature, como se describe en IETF RFC 7946.
geofencing_zones.features[].geometry Multipolígono de GeoJSON Obligatorio Es un objeto Multipolígono de GeoJSON que describe dónde no se pueden iniciar, finalizar ni realizar viajes, además de otras limitaciones. Una disposición de puntos en el sentido de las agujas del reloj define el área encerrada por el polígono, mientras que un orden en el sentido contrario a las agujas del reloj define el área fuera del polígono. Para obtener más información, consulta la regla de la mano derecha.
geofencing_zones.features[].properties Objeto Obligatorio Es un objeto que define las asignaciones y limitaciones de viaje.
geofencing_zones.features[].properties.rules Array Opcional Es un array de objetos, en el que cada objeto define una sola regla. Si dos o más reglas se superponen, chocan o entran en conflicto de alguna otra manera, prevalece la regla definida más temprano en el orden del archivo JSON.
geofencing_zones.features[].properties.rules[].vehicle_type_id Array Opcional Es un array de IDs de tipo de vehículo, en el que cada elemento es un vehicle_type_id, para el que se deben aplicar restricciones. Si no se especifica ningún vehicle_type_id, las restricciones se aplican a todos los tipos de vehículos.
geofencing_zones.features[].properties.rules[].ride_allowed Booleano Obligatorio Indica si el viaje en bicicleta independiente "sin anclaje" puede comenzar y finalizar en la zona, de la siguiente manera:
  • Si el viaje en bicicleta sin candado puede comenzar y finalizar en la zona, se debe establecer en true.
  • Si el viaje en bicicleta sin candado no puede comenzar ni finalizar en la zona, se establece en false.

A continuación, se muestra un ejemplo de geofencing_zones.json:

"geofencing_zones":{
  "type":"FeatureCollection",
  "features":[{
    "type":"Feature",
    "properties":{
      "rules":[{
        "vehicle_type_id":"scooter",
        "ride_allowed": false
      }]
    },
    "geometry":{
      "type":"MultiPolygon",
      "coordinates":[[[
        [-122.66780376434326, 45.49896266763551],
        [-122.66810417175292, 45.49824825558575],
        [-122.66830801963805, 45.49632305799116],
        [-122.66780376434326, 45.49896266763551]
      ]]]
    }
  }]
}

Obligatorio: station_information.json (sistema con estaciones de carga)

Consulta la especificación de GBFS según sea necesario.

Este feed define la información general sobre las estaciones de bicicletas públicas.

Nombre del campo Tipo Requisito Descripción
stations Array Obligatorio Es un array de objetos en el que cada objeto define una sola estación.
stations[].station_id String Obligatorio Es el identificador de la estación.
stations[].name String Obligatorio Nombre público de la estación en el idioma local de la ciudad en la que se encuentra. El campo name debe cumplir con lo que se usa en la señalización de la estación, cuando esté disponible, o debe reflejar la ubicación de la estación a través del uso de una intersección o un punto de referencia local. No uses abreviaturas como "Av." para "Avenida", a menos que se use de forma explícita en la señalización, y el name debe estar en mayúsculas y minúsculas, según las convenciones locales para el uso de mayúsculas en nombres de lugares, y no en mayúsculas sostenidas.
stations[].lat Latitud Obligatorio Latitud WGS 84 de la estación, en formato de grados decimales.
stations[].lon Longitud Obligatorio Longitud WGS 84 de la estación, en formato de grados decimales.
stations[].capacity Número entero no negativo Opcional Es un número entero no negativo que representa la cantidad total de puntos de anclaje instalados en la estación, tanto disponibles como no disponibles.
stations[].rental_uris Objeto Obligatorio

Un objeto JSON que contiene los URIs de alquiler para Android, iOS y la Web en sus respectivos campos.

Si se especifican estos URIs, se anularán los vínculos directos predeterminados que se establecieron cuando se incorporó el proveedor.

stations[].rental_uris.android URI Condicionalmente obligatorio

Es un URI que se puede pasar a una app para Android con un intent de Android android.intent.action.VIEW para admitir vínculos directos de Android. El rental_uris proporcionado debe ser un vínculo de aplicación para Android, de modo que la app de visualización no necesite administrar manualmente el redireccionamiento del usuario a Play Store en caso de que el usuario no tenga instalada la app del proveedor.

Este URI debe ser un vínculo directo específico de la estación individual, no una página de alquiler general que incluya información de más de una estación. El vínculo directo debe llevar al usuario directamente a la estación sin avisos, páginas intersticiales ni registros. Asegúrate de que los usuarios puedan ver la estación incluso si nunca abrieron la aplicación.

No es necesario que los URIs incluyan el station_id de la estación, siempre y cuando el socio tenga otros medios para identificar la estación correspondiente. Por ejemplo, la app de alquiler puede usar otros identificadores dentro del URI para identificar de forma única la estación.

Este campo es obligatorio si el socio tiene una app de alquiler para Android.

Ejemplo de Android App Link:

https://www.example.com/app?sid=1234567890&platform=android

stations[].rental_uris.ios URI Condicionalmente obligatorio

Es un URI que se puede usar en iOS para iniciar la app de alquiler de la estación. Para obtener más información, consulta el artículo de Apple sobre los esquemas de URL personalizados de iOS. El rental_uris proporcionado debe ser un vínculo universal de iOS para que la app de visualización no necesite administrar manualmente el redireccionamiento del usuario a la App Store en caso de que el usuario no tenga instalada la app del proveedor.

Este URI debe ser un vínculo directo específico de la estación individual, no una página de alquiler general que incluya información de más de una estación. El vínculo directo debe llevar al usuario directamente a la estación sin avisos, páginas intersticiales ni registros. Asegúrate de que los usuarios puedan ver la estación incluso si nunca abrieron la aplicación.

No es necesario que los URIs incluyan el station_id de la estación. La app de alquiler puede usar otros identificadores dentro del URI para identificar de forma única la estación.

Este campo es obligatorio si el socio tiene una app de alquiler para iOS.

Ejemplo de vínculo universal de iOS:

https://www.example.com/app?sid=1234567890&platform=ios

stations[].rental_uris.web URL Opcional

Es una URL que puede usar un navegador web para mostrar más información sobre cómo alquilar un vehículo en esta estación.

Esta URL debe ser un vínculo directo específico para la estación individual, no una página de alquiler general que incluya información de más de una estación. El vínculo directo debe llevar al usuario directamente a la estación sin avisos, páginas intersticiales ni registros. Asegúrate de que los usuarios puedan ver la estación incluso si nunca abrieron la aplicación.

No es necesario que las URLs incluyan station_id para la estación ni que sigan las convenciones semánticas de las URLs de alquiler para Android o iOS. La app de alquiler puede usar otros identificadores dentro de la URL que identifiquen de forma única la estación.

Si este campo no está configurado, significa que el navegador web no admite vínculos directos.

Ejemplo de valor:

https://www.example.com/app?sid=1234567890

A continuación, se muestra un ejemplo de station_information.json:

"stations": [
  {
    "station_id": "597",
    "name": "Silverthorne Road, Battersea",
    "lat": 51.472865,
    "lon": -0.148059,
    "capacity": 10,
    "rental_uris": {
        "android": "https://www.example.com/app?sid=1234567890&platform=android",
        "ios": "https://www.exampleexample.com/app?sid=1234567890&platform=ios",
        "web": "https://www.example.com/app?sid=1234567890&platform=web"
    }
  },
]

Obligatorio: station_status.json (sistema con estaciones)

Consulta la especificación de GBFS según sea necesario.

Este feed define el estado actual y actualizado de las estaciones de bicicletas públicas compartidas.

Nombre del campo Tipo Requisito Descripción
stations Array Obligatorio Es un array de objetos, en el que cada objeto define una sola estación.
stations[].station_id String Obligatorio Es el identificador de la estación.
stations[].num_bikes_available Número entero no negativo Obligatorio

Es un número entero no negativo que representa la cantidad de bicicletas funcionales que se encuentran físicamente en la estación y que se pueden ofrecer para alquiler.

Para determinar si la estación alquila bicicletas actualmente, debes inspeccionar el campo is_renting de la estación y buscar un valor booleano verdadero.

stations[].vehicle_types_available Array Opcional

Es un array de objetos que define la cantidad total de vehículos, categorizados por el tipo de vehículo individual disponible en una estación. Cada objeto modela la cantidad total de vehículos para el tipo de vehículo asociado. La cantidad total de vehículos de cada uno de estos objetos debe coincidir con el valor especificado en el campo num_bikes_available.

stations[].vehicle_types_available[].vehicle_type_id ID Obligatorio

El vehicle_type_id de cada tipo de vehículo disponible en la estación, como se describe en vehicle_types.json.

stations[].vehicle_types_available[].count Número entero no negativo Obligatorio

Es la cantidad total de vehículos disponibles para el vehicle_type_id correspondiente en la estación, según se define en vehicle_types.json.

stations[].num_docks_available Número entero no negativo Condicionalmente obligatorio

El campo es obligatorio, a menos que la estación tenga capacidad de acoplamiento ilimitada. Por ejemplo, las estaciones virtuales tienen capacidades de acoplamiento ilimitadas y el campo no es obligatorio.

Es un número entero no negativo que representa la cantidad total de estaciones de acoplamiento funcionales disponibles físicamente en la estación que pueden aceptar la devolución de vehículos.

Para determinar si la estación acepta devoluciones de bicicletas en este momento, debes inspeccionar el campo is_returning de la estación y buscar un valor booleano true.

stations[].is_installed Booleano Obligatorio

Es un valor booleano que indica si la estación está actualmente en la calle y está instalada.

Si la estación está instalada en la calle, configúrala en true.

Si la estación no está instalada en la calle, se establece en false.

stations[].is_renting Booleano Obligatorio

Es un valor booleano que indica si es verdadero que la estación actualmente alquila bicicletas.

Si la estación actualmente alquila bicicletas, se establece en true. Incluso si la estación está vacía, si está configurada para permitir alquileres, is_renting se establece en true.

Si la estación no alquila bicicletas en este momento, se debe establecer en false.

stations[].is_returning Booleano Obligatorio

Es un valor booleano que indica si es verdadero que la estación actualmente acepta devoluciones de bicicletas.

Si la estación acepta devoluciones de bicicletas, se establece en true. Incluso si la estación está llena, pero permitiría una devolución si no lo estuviera, is_returning se establece en true.

Si la estación no acepta devoluciones de bicicletas en este momento, se debe establecer en false.

A continuación, se muestra un ejemplo de station_status.json:

"stations": [
        {
          "station_id": "2",
          "num_bikes_available": 6,
          "vehicle_types_available": [
            {
              "vehicle_type_id" : "scooter_electric",
              "count" : 2
            },
            {
              "vehicle_type_id" : "bike_manual",
              "count" : 4
            }
          ],
          "num_docks_available": 30,
          "is_installed": true,
          "is_renting": true,
          "is_returning": true,
          "last_reported": 1576119631
        },
]