LiveRoad Works Data API

UK street works and road closures (DfT Street Manager for England, the Scottish Road Works Register, TrafficwatchNI and National Highways), searchable by your own site list and downloadable as GeoJSON, CSV, Excel or JSON. Built for scheduled pulls into a GIS.

Base URL: https://liveroad.app

Authentication

Every request carries your API key:

Authorization: Bearer lr_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

(x-api-key: lr_live_… also works.) The limit is 60 requests per minute per key. A weekly pull uses two or three requests.

Getting a key

  1. Sign in at liveroad.app/works with the account that has data access. The first time, we email a link to confirm your address: click it (signing in with Google confirms it straight away).
  2. In the API keys panel, give the key a name (for example "ArcGIS weekly pull") and click Create API key.
  3. Copy it straight into your system's secret store. It's shown once; we only keep a fingerprint, so a lost key can't be recovered. Revoke it and create a new one instead.

A key acts as your login, with the same data access and end date. Keep it server-side, don't email or commit it, and revoke it on the same page if it leaks or a system is retired. You can have up to 5 active keys.

1. Load your sites

One list per asset set (you can have up to 20). Each site needs a reference and a location. The cordon radius is per site, or the list default (500 m if not given; 10 m to 20 km allowed).

CSV (headers are flexible: Site ID, Latitude, Buffer (m) etc. are recognised):

site_ref,name,easting,northing,radius_m
A-0001,Bankside depot,532350,180350,250
A-0002,Leeds yard,,,

Location can be any one of:

curl -X POST "https://liveroad.app/api/works/sites?name=Client%20assets&default_radius_m=500" \
  -H "Authorization: Bearer $KEY" -H "Content-Type: text/csv" --data-binary @sites.csv

JSON:

curl -X POST https://liveroad.app/api/works/sites \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{"name":"Client assets","default_radius_m":500,
       "sites":[{"site_ref":"A-0001","name":"Bankside depot","lat":51.5045,"lng":-0.0972,"radius_m":250}]}'

The response gives the list id and any rows that were skipped and why (for example swapped lat/lng, a duplicate reference, or a site outside the UK).

Method Path
GET /api/works/sites Your lists
POST /api/works/sites Create a list
GET /api/works/sites/{id} A list with its sites
PUT /api/works/sites/{id} Replace a list's sites (same body as POST)
DELETE /api/works/sites/{id} Delete a list

2. Pull works

GET /api/works/export?site_list={id}&format=geojson&status=planned,in_progress

You get one feature per (work, site) pair. A work near two sites appears twice, once for each site, with that site's distance. Each site's results are sorted nearest first.

Formats

format=
geojson FeatureCollection (WGS84). Geometry is the permit's real shape (line or polygon) where Street Manager gives one, otherwise a point. Loads straight into QGIS or ArcGIS.
csv Spreadsheet-friendly. Site columns come first.
xlsx Excel, with a filterable header and an About sheet.
json { rows, count, truncated }

Filters (all optional, combine freely)

Param Example
site_list 12 Your site list id
status planned,in_progress planned, in_progress, completed, cancelled. Cancelled permits are excluded unless asked for.
from, to 2026-10-19, 2026-11-30 Works active in this window
updated_since 2026-10-12 Only works whose record changed on or after this date. Use it for weekly deltas.
promoter Thames Water,Openreach Operator (partial match, comma = OR)
authority Southwark Highway authority
work_type New service connection
tm road_closure,multi_way_signals Traffic management type
category major,standard Permit size: major, standard, minor, immediate
major 1 Major disruption only: road/lane closures, contraflows or Major permits, never Minor permits
min_days, max_days 14 Planned duration
permit_ref TW123
archive 0 Leave out past (archived) works

Fields

site_ref, site_name, distance_m, site_radius_m, permit_ref, promoter, authority, work_type, road, start_date, end_date (planned), duration_days, actual_start, actual_end (as reported by the promoter), status, overrunning, cancel_reason, traffic_management, permit_category (Major / Standard / Minor / Immediate), lat, lng, easting, northing (British National Grid, EPSG:27700), works_length_m (line geometries only), record (live / archive), last_updated, map_link. CSV, Excel and JSON also carry geometry_bng: the permit's shape as WKT in BNG, so a spreadsheet extract can be drawn as lines in GIS.

Response headers

X-Row-Count gives the number of rows. X-Truncated: 1 means the export hit its 50,000 row cap, so narrow the filters (for example by date window).

Suggested weekly job

  1. Once: POST the site list and note its id. PUT whenever sites change.
  2. Each week: pull everything planned or underway near your sites: GET /api/works/export?site_list=ID&format=geojson&status=planned,in_progress
  3. Optionally, also pull what changed since last week: …&updated_since=YYYY-MM-DD

Email alerts for a site list

Switch on a daily email for any of your site lists. Each morning (about 07:15 UK time) we check every site's cordon and email the list owner if works are new or have changed: planned start or end date, traffic management or permit category. Section 58 notices are listed first. Works already near your sites when you switch alerts on are recorded, not sent.

curl -X POST https://liveroad.app/api/works/sites/12/alerts \
  -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{"enabled": true}'

Send {"enabled": false} to switch them off. GET /api/works/sites shows alerts_enabled and alerts_last_sent for each list. You can also tick "Email me when works change near these sites" on the /works page.

Coverage and caveats

Open works data → · What the data covers