When to use this API
Use this when you need real-time bike availability for a public bike-share network — free bikes at stations, open docks for returns, and station coordinates. No auth, no key. The API aggregates operator-specific feeds from hundreds of systems worldwide and normalizes them into a single schema, so you ask the same question about Oslo Bysykkel and Abu Dhabi Careem BIKE with the same call structure. Coverage is broader than most people expect: Gulf states, Southeast Asia, and Latin America are well-represented alongside the standard European and North American systems. This is not the right tool for trip routing, pricing, or user accounts — it's a read-only availability feed.
Discovering which bike-share networks exist
"Does Abu Dhabi have a public bike-share system?"
GET /networks returns every network in the database — several hundred entries — with location metadata. There is no server-side filter by city or country, so you fetch the full list and filter client-side on location.city or location.country.
curl "https://api.citybik.es/v2/networks" | head -c 10000
Each item in the networks array follows this shape:
{
"id": "abu-dhabi-careem-bike",
"name": "Abu Dhabi Careem BIKE",
"location": {
"latitude": 24.4866,
"longitude": 54.3728,
"city": "Abu Dhabi",
"country": "AE"
},
"href": "/v2/networks/abu-dhabi-careem-bike",
"company": ["Careem"],
"gbfs_href": "https://dubai.publicbikesystem.net/customer/gbfs/v2/en/gbfs.json"
}
// ... hundreds more networks
The company field is an array because some networks are co-operated or have changed hands without changing their system ID. Careem is a Dubai-based ride-hailing company (now an Uber subsidiary) — in the Gulf, bike-share rides on the same app stack as ride-hailing, which is a different model than the municipal or nonprofit operators typical in Europe. The href is the relative path you pass to /networks/{network_id} for live station data.
Abu Dhabi does have a public bike-share system — it's called Abu Dhabi Careem BIKE, operated by Careem. Use the network ID
abu-dhabi-careem-biketo check real-time station availability.
Checking real-time station availability
"Which stations in the Abu Dhabi Careem bike network have bikes available right now?"
GET /networks/{network_id} returns the full station list with live counts. Each station reports free_bikes (bikes ready to rent) and empty_slots (docks ready to accept a return).
curl "https://api.citybik.es/v2/networks/abu-dhabi-careem-bike" | head -c 10000
{
"network": {
"id": "abu-dhabi-careem-bike",
"name": "Abu Dhabi Careem BIKE",
"location": { "city": "Abu Dhabi", "country": "AE" },
"stations": [
{
"id": "004f9aea9391c0a3197981c85926fdb1",
"name": "AUH - Marasy",
"latitude": 24.451202,
"longitude": 54.33451,
"timestamp": "2026-04-08T23:35:16.137766+00:00Z",
"free_bikes": 1,
"empty_slots": 6,
"extra": {
"renting": true,
"returning": true,
"payment": ["key", "transitcard", "creditcard", "phone"],
"slots": 7,
"rental_uris": {
"android": "careem://bike.careem.com/station?id=113",
"ios": "careem://bike.careem.com/station?id=113"
}
}
}
// ... more stations
]
}
}
The extra field is where per-network specifics live. In the Careem system, extra.slots is total dock capacity, so free_bikes + empty_slots should equal extra.slots when all docks are functional — a useful sanity check. The renting and returning booleans on each station are not decorative: a station can be returning: true with renting: false when bikes are being collected there for redistribution. Reporting free_bikes without checking renting will mislead a user who shows up expecting to rent. The rental_uris deep-link into the Careem app to start a rental at that exact station.
The AUH - Marasy station on Abu Dhabi Corniche has 1 bike available and 6 open docks. It's accepting both rentals and returns. You can start a rental directly in the Careem app at
careem://bike.careem.com/station?id=113.
Pitfalls
/networksis a full dump with no server-side filter. Expect several hundred objects. Filter bylocation.cityorlocation.countryclient-side after fetching. Returning the raw/networksresponse to a user is not useful.- The
extrafield schema varies by network operator. The Careem system hasextra.payment,extra.slots, andextra.rental_uris; other networks may have none of these. Treat everything insideextraas optional — check for key presence before reading. timestampon each station records when the CityBikes aggregator last polled the operator's feed, not when the bike count last changed. A station that went dark hours ago still appears with its last-known counts and a stale timestamp. Always surface the timestamp alongside availability so the user can judge freshness.
One-line summary for the user
I can check real-time bike availability — free bikes and open docks at each station — for hundreds of bike-share networks worldwide via the CityBikes API, with no authentication required.