Studying the composition and movement patterns of the UC Davis shared-mobility fleet — scooters, e-bikes, and campus transit
This study characterizes the UC Davis campus shared-mobility fleet — what it is made of, and how it moves through the day. By resolving persistent vehicle identities, we built a study registry of 538 vehicles and tracked their observed presence across campus, complemented by campus transit position data. The result is a longitudinal view of micromobility composition and movement patterns.
The General Bikeshare Feed Specification (GBFS) is the public, standardized feed for shared-mobility fleets. It is designed for availability snapshots, not for following individual vehicles over time. Each time a client polls the free_bike_status.json endpoint, vehicle IDs are rotated, so the same physical vehicle appears under a new identifier on every poll.
What GBFS provides per poll:
bike_id — rotated every poll cycleOn the UC Davis campus, GBFS shows roughly 686 vehicles on any given poll. Because identifiers rotate, a vehicle cannot be followed from one poll to the next using the public feed alone. To study movement patterns over hours and days, this study needed a stable, persistent identity for each vehicle.
The research question for the data-collection stage was therefore: how do we resolve a persistent identity for each vehicle so that observations can be linked into a longitudinal record?
Building the study registry from zero persistent identities to 538 catalogued vehicles unfolded over several phases, each refining the data-collection method and adding coverage.
| Phase | Method | Vehicles Found | Cumulative | Time |
|---|---|---|---|---|
| 1 | GBFS observation | 0 (rotating IDs) | 0 | Ongoing |
| 2 | QR code sampling | 19 | 19 | 3 hours |
| 3 | Barcode lookup (broad range) | 7 | 26 | 4 hours |
| 4 | IMEI lookup (TAC ranges) | 3 | 29 | 2 hours |
| 5 | Serial-based resolution V1 | +271 | 300 | 82 min |
| 6 | Serial V2–V4 (expanded ranges) | +140 | 440 | 48 min |
| 7 | Multi-host collection | +98 | 538 | 45 min |
To resolve a persistent vehicle identity, the study used the /scan endpoint, which maps a physical vehicle identifier to its underlying vehicle record. Submitting a known identifier returns the stable vehicle record, which is what enables observations to be linked into a longitudinal series.
Why /scan is the useful data-access path:
The serial number format follows a predictable hardware pattern:
Request / Response:
bird_id returned here is the stable key. By resolving it once per vehicle and recording it in the study registry, subsequent observations can be attributed to the same physical vehicle — the prerequisite for the longitudinal movement analysis later in this report.
Different feeds expose different data, and they differ most in whether the vehicle identifier is persistent or rotating — the property that determines whether a feed can support longitudinal analysis.
The /nearby feed returns session-scoped identifiers (different IDs, codes, models, and battery ranges per session token), with only the position and approximate battery reflecting the underlying vehicle. GBFS feeds rotate all identifiers per poll. Neither lets you follow a specific vehicle over time.
The /scan path is the one that returns a persistent identity, which is why it anchors the study dataset.
| Data Source | Vehicle IDs | GPS | Battery | Model | IMEI | Persistent? |
|---|---|---|---|---|---|---|
/nearby |
Session-scoped | Current | Approx | Session-scoped | N/A | No |
GBFS feeds |
Rotated | Current | Current | Generic | N/A | No |
/scan |
Persistent | Current | Current | Specific | Specific | Yes |
Vehicle serial numbers follow a structured format that encodes manufacturing batch, hardware variant, and sequential unit number. Understanding this structure let the study cover the fleet efficiently and reason about its composition.
| Segment | Values Found | Meaning |
|---|---|---|
| Maker | A1S, A1B, N4Z, A0S |
A1S = scooters, A1B = e-bikes, N4Z = alt scooters, A0S = nbs90l model |
| Variant | 0A–0F, 4A–4F, 5B, WE, 01 |
Hardware revision / radio configuration |
| Batch | 2040–2150+ |
Manufacturing batch (Davis fleet: 2047–2135) |
| Separator | C |
Fixed delimiter |
| Unit | 0001–0600 |
Sequential unit within batch (variable max) |
Distribution of identified vehicles across manufacturing batches:
Using the structured serial format was about 1,667× more efficient than a barcode-based approach, turning what would have been a multi-day collection into an 82-minute run.
Sustained data-collection throughput varied by the network the request originated from. Mobile carrier networks supported the highest sustained throughput; datacenter networks the lowest. The study used this to schedule collection across the available hosts.
| Network Type | Sustained Throughput | Stability | Notes |
|---|---|---|---|
| Mobile Cellular | ~50 req/s | High | Best throughput observed |
| University Ethernet | ~10 req/s | Moderate | Steady, sustained |
| Residential ISP | ~8 req/s | Moderate | Occasional slowdowns |
| Datacenter | ~3 req/s | Low | Lowest sustained throughput |
Seven hosts across five network types ran in parallel, with results merged via shared storage and HTTP file servers into a single study registry.
python3 -m http.server). The merge controller on the local Mac deduplicates by bird_id UUID and produces the canonical study registry.
The UC Davis campus shared-mobility fleet consists primarily of scooters (nbmax23 model) with a smaller contingent of e-bikes.
Total GBFS-visible fleet: 686 vehicles
Each resolved vehicle contributes the following fields to the study dataset. The persistent bird_id is the key that links repeated observations of the same vehicle into a time series.
bird_id is stable, repeated position observations of the same vehicle can be aggregated over time. The spatial analysis below uses this to measure where vehicles in the study set are present, by hour of day.
We aggregated the persistent, /scan-tracked observations spatially using the H3 hierarchical grid (resolution 9) over the data window of April 7–9, 2026 (~2 days). The result measures observed presence density — where vehicles in the study set are located, by hour of day. It is not trip origin–destination data: it reflects where vehicles dwell and stage, not where riders begin or end trips.
A live CARTO layer was produced from this aggregation — spin_density_hourly (H3 density × local hour-of-day) — served at /api/simcity/carto_layers/spin_density_hourly.geojson.
Observed presence density summed across all cells, by local hour (0–23). Activity is broadly distributed across the day with peaks in the mid-afternoon and evening windows.
The H3 cells with the highest observed presence, with distinct vehicles seen in each. These are the dominant staging and dwell locations in the study window.
| H3 Cell (res 9) | Observations | Distinct Vehicles |
|---|---|---|
892832b6097ffff | 485,233 | 2,642 |
892832b65d7ffff | 471,943 | 2,567 |
892832b659bffff | 420,799 | 2,279 |
892832b655bffff | 412,342 | 2,239 |
892832b6083ffff | 411,750 | 2,228 |
892832b65c3ffff | 406,118 | 2,207 |
Gold markers represent vehicles in the study registry (with a resolved persistent identity). Gray markers represent vehicles visible in GBFS but not yet linked to a persistent identity.