Attribution is required on every plan
Trial, Personal, Professional and Enterprise alike: wherever the data appears, show “Data: Live Roads Canada” with a visible link to liveroadscanada.com, and keep the original sources' credits where the response includes them. Ready to paste:
Data: <a href="https://liveroadscanada.com">Live Roads Canada</a>
Get started
Create a trial key with the form below and add it to the request. Open this in a browser, with your key at the end, and you have data:
https://liveroadscanada.com/api/v1/incidents?province=ON&road=ON-401&key=lrc_…
From code, send the key in a header instead:
curl -H "X-API-Key: lrc_…" "https://liveroadscanada.com/api/v1/incidents?province=BC&type=conditions&format=json"
It answers with GeoJSON, ready for a map. For plain JSON, add &format=json. CORS is open, so you can call it from a browser with no server in between.
Your key
Since October 8, 2026 the API is paid, and every request needs a key. The key you create here is a trial key: it works for 5 days from your first request, at 120 requests per hour, so you can see whether the API fits what you are building. To keep going after that, write to [email protected] with your project's name and intended use, and we reply with a plan and an invoice.
We ask for a name, an email and what it is for so we can tell you when an official source goes down, learn what the API is missing, and switch off a runaway loop without switching off everyone.
Plans
Trial
Everyone, to see if it fits
Free
- 5 days from your first request
- 120 requests per hour
- All provinces and filters
- Attribution required
Personal
Personal and small projects with no meaningful revenue
US$16/month
- About 10,000 requests per day
- Canada-wide coverage
- Attribution required
Professional
Commercial apps, ad-supported sites, use inside a company
US$89/month
- About 100,000 requests per day
- Email notice when a source goes down
- Attribution required
Enterprise
Fleets, insurers, media, several countries, an SLA
Talk to us
- Agreed limits and an SLA
- Several countries, through Roadscore
- A contract
Through Roadscore, or write to [email protected].
What a plan pays for: access to the service, meaning the API itself, its limits and support. It does not buy rights to the underlying data, which belongs to the agencies that publish it; their credits travel with every record and must be kept.
How to pay: for now, by email and invoice. Write to [email protected] with what you are building and the plan you want; we reply with an invoice and switch your key over, with no new key to install.
Parameters
One endpoint, GET /api/v1/incidents. Every parameter is optional and they combine: a request with none returns every live event in the country, newest first, up to the limit.
| Parameter | Values | What for |
|---|---|---|
province | ON, BC, british-columbia | One or more provinces or territories, by two-letter code or by the slug in /province/… URLs. Comma-separated. state is read the same way, for code written against Live Roads USA. |
road | ON-401, QEW, A-20, BC-5 | One or more routes, by the code each record carries in road: ON-401 for Highway 401, A-20 for Autoroute 20, BC-5 for the Coquihalla. |
type | accident, incident, roadworks, conditions, weather | Collisions, other unplanned events (stalls, debris, hazards, closures for avalanche control), construction, winter road conditions as each 511 reports them, and weather alerts (Environment and Climate Change Canada, not connected yet: none come back for now). |
status | active, scheduled | What applies now, or planned work that has not started yet. |
closure | any, full, lanes, ramp, connector, shoulder, partial | Only events that close something. full is the road itself shut. |
source | on511, drivebc, ab511, wzdx-qc, ca-cities… | One or more source ids, as in each record's source field. |
bbox | -79.65,43.58,-79.12,43.86 | minLon,minLat,maxLon,maxLat: only events inside this box (the example is Toronto). |
since | 2026-10-08T14:00:00Z | Only events updated at or after this time. |
limit, offset | 1 to 5000 (1000 by default) | Paging. Events come newest update first; meta.total says how many matched. |
format | geojson (default), json | GeoJSON for maps, plain JSON for lists. |
key | lrc_… | Your key, if you can't send the X-API-Key header (for example, pasting the URL in a browser). |
An unknown province, type or a malformed bbox gets a 400 that says what was wrong.
Example
Full closures in Ontario, as GeoJSON, with limit=1 (an example of the shape, not live data):
GET https://liveroadscanada.com/api/v1/incidents?province=ON&closure=full&limit=1
{
"type": "FeatureCollection",
"attribution": {
"text": "Data: Live Roads Canada",
"url": "https://liveroadscanada.com"
},
"meta": {
"count": 1,
"total": 9,
"offset": 0,
"limit": 1,
"generatedAt": "2026-10-11T02:39:25.241Z",
"licence": "Use requires a key (5-day trial, then a paid plan). Attribution is required on every plan: …",
"sources": [
{
"id": "on511",
"name": "511 Ontario",
"attribution": "511 Ontario (Ontario Ministry of Transportation)"
}
]
},
"features": [
{
"type": "Feature",
"id": "on511-…",
"geometry": {
"type": "Point",
"coordinates": [
-79.4862,
43.7224
]
},
"properties": {
"id": "on511-…",
"type": "roadworks",
"severity": "high",
"status": "active",
"title": "Construction, Highway 401 eastbound express lanes from Highway 400 to Keele Street, Toronto",
"description": "Highway 401 eastbound express lanes closed from Highway 400 to Keele Street for bridge work, 10:00 p.m. to 5:00 a.m.",
"road": "ON-401",
"direction": "eastbound",
"location": "Highway 400 to Keele Street",
"state": "ON",
"closure": "full",
"condition": null,
"overnight": true,
"source": "on511",
"sourceUrl": "https://511on.ca/",
"reportedBy": null,
"tz": "America/Toronto",
"startedAt": "2026-10-11T02:00:00.000Z",
"endsAt": "2026-10-11T09:00:00.000Z",
"updatedAt": "2026-10-11T02:28:02.000Z"
}
}
]
}Winter road conditions in British Columbia, as JSON:
GET https://liveroadscanada.com/api/v1/incidents?province=british-columbia&type=conditions&format=json&limit=1
{
"attribution": {
"text": "Data: Live Roads Canada",
"url": "https://liveroadscanada.com"
},
"meta": {
"count": 1,
"total": 14,
"offset": 0,
"limit": 1,
"generatedAt": "2026-10-11T02:39:25.241Z",
"licence": "Use requires a key (5-day trial, then a paid plan). Attribution is required on every plan: …",
"sources": [
{
"id": "drivebc",
"name": "DriveBC",
"attribution": "DriveBC (Government of British Columbia)"
}
]
},
"incidents": [
{
"id": "drivebc-…",
"type": "conditions",
"severity": "medium",
"status": "active",
"lat": 49.6061,
"lon": -121.0939,
"title": "Compact snow: Coquihalla Highway, Hope to Merritt",
"description": "Highway 5, Coquihalla Highway, between Hope and Merritt. Compact snow with slippery sections over the Coquihalla Summit.",
"road": "BC-5",
"direction": "both directions",
"location": "Hope to Merritt",
"state": "BC",
"closure": null,
"condition": "Compact snow",
"overnight": false,
"source": "drivebc",
"sourceUrl": "https://www.drivebc.ca/",
"reportedBy": null,
"tz": "America/Vancouver",
"startedAt": "2026-10-11T01:35:46.000Z",
"endsAt": null,
"updatedAt": "2026-10-11T01:35:46.000Z"
}
]
}What each event carries
id | Stable for the life of the event; also what /api/incident/{id} on the site uses. |
type, severity, status | type as above; severity info, low, medium, high or critical; status active or scheduled. |
lat, lon | Where the event is. In GeoJSON, the Point geometry. |
title, description | A short title, and the source's own wording cleaned of whitespace. |
road, direction, location | Canonical route (ON-401, QEW, A-20, BC-5), direction in words, and the place on the road when the source names them. Null when it doesn't. |
state, tz | The two-letter province or territory code (ON, BC, QC…) from the coordinates, in a field still called state, and the IANA time zone of the place. |
closure | full, lanes, ramp, connector, shoulder or partial, when something is shut. Null otherwise. |
condition | For a winter road report (type conditions), the surface in the source's words: “Compact snow”, “Icy sections”. Null otherwise. |
overnight | Work that runs overnight only. |
source, sourceUrl | Who published it, and where to check. Keep these when you show the data. |
reportedBy | The newsroom, when the event comes from a news report rather than an official source. Null otherwise. |
startedAt, endsAt, updatedAt | ISO times. endsAt is null when the source gives no end. |
Around the events, every response has attribution (the credit to show) and meta: count, total, offset, limit, generatedAt, the licence line, and sources, each source in the response with the credit line it asks for. The same credit goes in the X-Attribution header.
Errors
401no key. Until the end of October 13, 2026 a request without a key still gets an answer, with a notice in theX-API-Noticeheader and inmeta.notice; from October 14 it gets a 401.402the trial is over. The body says when it ended and how to get a paid plan.403the key was revoked. The body says why.429too many requests, with the wait in theretry-afterheader.400a parameter we can't read;503the upstream data could not be reached (try again in a minute).
A trial key's responses carry X-API-Trial-Ends with the end of its trial, so your code can see it coming.
Limits
Trial keys: 120 requests per hour. Personal: about 10,000 a day; Professional: about 100,000 a day; Enterprise: what we agree. Counted per key, not per IP, so an app with many users is not stopped by one of them. Over the limit you get a 429; every response says where you stand in X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. Without a key, during the grace period, 20 per hour.
Responses are cached for 30 seconds and the sources update every few minutes, so asking more than twice a minute brings nothing new.
Terms
Attribution is required on every plan
Trial, Personal, Professional and Enterprise alike: wherever the data appears, show “Data: Live Roads Canada” with a visible link to liveroadscanada.com, and keep the original sources' credits where the response includes them. Ready to paste:
Data: <a href="https://liveroadscanada.com">Live Roads Canada</a>
Building a product on the API without a paid plan, or without the attribution above, is not an authorized use. A plan pays for access to the service (the API, its limits and support); we don't own or license the underlying data, and each record's source and the credit lines in meta.sources must stay with it. The data comes from the provinces' 511 services and ministries of transportation and from cities, through Roadscore; readers have a right to know that an event was posted by an agency and not invented by an algorithm.
Honest about coverage
The API returns what official sources published, not what is happening on the road. A highway with no events in the response is not a clear highway: it may be one nobody published anything about. Coverage grows province by province, and each province page says what is covered there. If you build alerts on this, tell the people who get them. Never use it for emergency decisions: in an emergency, call 911, and for the road itself, check the province's 511.
Publish data instead of reading it
This page is for reading the data. If you are a ministry of transportation, a city or an event organizer and want your closures on the map and in this API, with your agency named as the source, see partners. It is free for public agencies.
Contact
Paid plans, a lost key, a question about a field, or a source that looks wrong: [email protected].