← Back to map

How to use the GoBike alerts feed

Drop one URL into your mapping tool — points appear on your map, refreshed every 15 minutes.

Pick the URL you want

Each link returns a GeoJSON FeatureCollection. Pick the smallest scope you need; smaller files are faster.

All London

https://alerts.blossomedge.ai/london.geojson
Every alert across the 33 boroughs.

Single borough

https://alerts.blossomedge.ai/london/<borough>.geojson
e.g. /london/camden.geojson, /london/hackney.geojson. The full list is on the map page.

Other cities

https://alerts.blossomedge.ai/<city>.geojson
e.g. /munich.geojson, /amsterdam.geojson, /cambridge.geojson, /san_francisco.geojson, /tokyo.geojson.

Manifest of everything

https://alerts.blossomedge.ai/index.json
Lists every published URL with its current record count and bounding box. Useful for automated tooling.

ArcGIS Online no code

  1. Open Map Viewer.
  2. Click AddAdd Layer from Web.
  3. For type, choose A GeoJSON file.
  4. Paste the URL (e.g. https://alerts.blossomedge.ai/london.geojson) and click Add Layer.
  5. Style points by the label field if you want to colour verified vs unverified separately.

QGIS no code

  1. Layer menu → Add LayerAdd Vector Layer…
  2. Source type: Protocol: HTTP(S), cloud, etc.
  3. Type: GeoJSON.
  4. Paste the URL and click Add.
  5. QGIS picks up the geometry automatically. Right-click the layer → Properties → Symbology to colour by label.

kepler.gl no code

  1. Open kepler.gl/demo.
  2. Click Add DataLoad FilesLoad from URL.
  3. Paste the URL and click Fetch.

Mapbox GL JS code

map.addSource('gobike-alerts', {
  type: 'geojson',
  data: 'https://alerts.blossomedge.ai/london.geojson'
});
map.addLayer({
  id: 'gobike-alerts-layer',
  type: 'circle',
  source: 'gobike-alerts',
  paint: {
    'circle-radius': 4,
    'circle-color': [
      'case', ['==', ['get', 'label'], 'p'], '#16a34a', '#94a3b8'
    ],
    'circle-opacity': 0.7
  }
});

Leaflet code

fetch('https://alerts.blossomedge.ai/london.geojson')
  .then(r => r.json())
  .then(data => {
    L.geoJSON(data, {
      pointToLayer: (f, latlng) => L.circleMarker(latlng, {
        radius: 4,
        color: f.properties.label === 'p' ? '#16a34a' : '#94a3b8',
        fillOpacity: 0.7
      })
    }).addTo(map);
  });

Python (geopandas) code

import geopandas as gpd

gdf = gpd.read_file('https://alerts.blossomedge.ai/london.geojson')
verified = gdf[gdf['label'] == 'p']
print(f'{len(verified)} verified out of {len(gdf)}')
gdf.plot(column='label', markersize=2, legend=True)

Google My Maps no code

  1. Create a new map at mymaps.google.com.
  2. On a layer, click Import.
  3. Choose the Upload tab and drop a GeoJSON file you've downloaded from one of the URLs (My Maps doesn't fetch live URLs).
My Maps doesn't auto-refresh. If you want the live feed, use ArcGIS, QGIS, or kepler.gl instead.

Refresh behaviour

The data file is regenerated every 15 minutes server-side. CloudFront caches for 60 seconds, so a polite tool that polls hourly will always be at most ~16 minutes behind real time. Tools that auto-refresh (ArcGIS, QGIS, Mapbox) will pick up new alerts on their own polling schedule.

Schema

{
  "type": "Feature",
  "geometry": { "type": "Point", "coordinates": [lng, lat] },
  "properties": {
    "timestamp": 1745234567000,   // Unix ms, UTC
    "label": "p"                  // "p" = verified TP; anything else = unverified
  }
}

Coordinate system is WGS84 (EPSG:4326). Coordinates are in [longitude, latitude] order — the GeoJSON convention.

Licence and attribution

Free to use with attribution: "GoBike hazard alerts, BlossomEdge". All records are anonymised — no userId, no runId, no rider information of any kind. Please don't attempt to re-identify riders.

Need a custom slice?

If you'd like a per-client URL scoped to specific boroughs or cities (so it's "your" feed and won't change scope without notice), email contact@blossomedge.ai.