Method & source

Where the data comes from

All figures on this site come from the public live feed that nextbike's own map uses. This site is not official, and it is not affiliated with or endorsed by nextbike.

The site only publishes aggregate statistics like counts, shares, medians and distributions. It doesn't publish individual bikes, their routes, or anything that would let you follow a single ride.

The feed only shows the current state

The feed shows where every bike is right now and nothing about where it has been. There is no endpoint for trips or history, so anything that isn't recorded while it happens is lost. The archive only exists because it has been collected continuously.

Two cities are polled every three minutes. The same endpoint can return all of Europe, but that is 29 MB per request. Limited to two cities, it's 230 KB gzipped.

How rides are detected

A rented bike isn't marked as rented in the feed. It disappears from the feed completely.

For every parked bike, each poll updates the time it was last seen at its position. When a bike disappears, that time stops updating and marks when the ride started. When the bike shows up again somewhere else, the two positions are saved as a ride.

This affects everything on these pages:

Start and end times are estimates. The bike was last seen parked at one poll and found somewhere else at a later poll, so the ride happened somewhere in between. Durations are upper bounds, not measurements.

Round trips aren't visible. A bike that is rented and returned to the same spot looks the same as a bike that never moved. Rides here are changes in position, so the real number of rentals is higher than any number on this site.

Short moves don't count. The GPS position of parked bikes moves around by tens of meters between polls. A bike has to show up more than 250 meters from where it was parked to count as moved, so very short rides are missed too.

What gets left out

Movements faster than 40 km/h are saved but left out of all ride figures. At night, vans collect bikes and redistribute them across the city. That isn't a ride, and there is enough of it to distort distance totals. A bike number that gets assigned to a different physical bike looks the same.

Distances are straight lines between the start and end position. The actual route isn't known, so all distances are shorter than what was really ridden.

Stations and virtual stations

In the feed, a place is either a real station with racks or a virtual station that holds a single free-floating bike and moves with it. Both are the same type of object, and counting them together would make station statistics useless, so they are kept apart and only real stations are shown in station figures.

Times are local

The collector stores times in UTC and the database runs in UTC. Reading the hour directly would give UTC and shift every time by one or two hours depending on daylight saving time, which would move the rush hours to the wrong time. All times are converted to Europe/Berlin first.

Zones

The business, policy and no-return zones come from nextbike's zone service and are fetched again every day. They are stored as raw GeoJSON and drawn in the browser. The site never runs spatial queries on them, so the database doesn't need PostGIS.

The zone data is reduced before it reaches the map, without changing what is stored. Coordinates come with twelve decimal places, which is far more precise than needed, so outlines are simplified to about twenty meters and rounded to about one meter. That is smaller than a pixel at city scale.

Only the service area and the no-return areas inside it are drawn. The zone service also returns policy zones, which in Berlin are almost four thousand individual parking spots. They make up 97% of the data and would be unreadable at this zoom level, so they are stored but not sent to the browser. Together this reduces Berlin's map data from 5.7 MB to 81 KB.

Storage

A position is only saved when a bike shows up somewhere new, so the database grows with how much the bikes actually move and not with how often the feed is polled. A bike parked for a week is a single row no matter how many times it is seen.

Rides are calculated once, when a move is detected, and saved as a row. At that point the collector already has both positions, so nothing needs to be recalculated later.

How the figures are built

The collector, database schema, aggregation and this site live in one repository. The figures are generated by a data loader that queries the database directly whenever the site is built.