Quick Start
Get up and running in 3 steps:
1. Get an API key
Sign up at portal.road511.com to get a free API key (14-day trial, 1,000 requests/day).
2. Make your first request
curl -H "X-API-Key: YOUR_API_KEY" \ "https://api.road511.com/api/v1/events?jurisdiction=WA&limit=5"
3. Parse the response
{
"data": [
{
"id": "WA-691391",
"type": "construction",
"severity": "minor",
"title": "Maintenance - US 101",
"description": "Travelers in both directions...",
"latitude": 46.449,
"longitude": -123.872,
"jurisdiction": "WA",
"start_time": "2026-03-23T07:00:00Z"
}
],
"total": 90,
"limit": 5,
"has_more": true
}Authentication
All API requests require an API key. Pass it via the X-API-Key header (recommended) or the api_key query parameter.
curl -H "X-API-Key: sk_live_abc123" https://api.road511.com/api/v1/events
curl "https://api.road511.com/api/v1/events?api_key=sk_live_abc123"
Errors & Rate Limits
The API returns standard HTTP status codes. Rate limit headers are included in every response.
| Status | Meaning |
|---|---|
| 200 | Success |
| 400 | Bad request (missing/invalid parameters) |
| 401 | Missing or invalid API key |
| 403 | Plan limit exceeded (jurisdiction, feature gate, expired trial) |
| 429 | Rate limit exceeded — retry after Retry-After seconds |
| 500 | Server error — please retry or contact support |
Events
Traffic events include incidents, construction, closures, weather alerts, restrictions, and special events across all active jurisdictions.
GET /api/v1/events
| Parameter | Type | Description |
|---|---|---|
| jurisdiction | string | Filter by state/province code (e.g., WA, ON) required on Free |
| type | string | Filter by event type: incident, construction, closure, weather, special_event, advisory, restriction |
| severity | string | Filter: minor, moderate, major, critical |
| lat, lng, radius_km | number | Radius search (e.g., lat=47.6&lng=-122.3&radius_km=50) |
| bbox | string | Bounding box: minLng,minLat,maxLng,maxLat |
| limit | int | Results per page (default 100, max per plan) |
| offset | int | Pagination offset |
GET /api/v1/events/geojson Starter+
Same parameters as /events, returns a GeoJSON FeatureCollection. Content-Type: application/geo+json.
GET /api/v1/events/{id}
Single event by ID. Returns full event detail with metadata.
# Events near Seattle, WA curl -H "X-API-Key: $KEY" \ "https://api.road511.com/api/v1/events?jurisdiction=WA&lat=47.6&lng=-122.3&radius_km=100"
import requests resp = requests.get("https://api.road511.com/api/v1/events", params={ "jurisdiction": "WA", "lat": 47.6, "lng": -122.3, "radius_km": 100 }, headers={"X-API-Key": KEY}) events = resp.json()["data"]
const res = await fetch( `https://api.road511.com/api/v1/events?jurisdiction=WA&lat=47.6&lng=-122.3&radius_km=100`, { headers: { "X-API-Key": KEY } } ); const { data, total } = await res.json();
req, _ := http.NewRequest("GET", "https://api.road511.com/api/v1/events?jurisdiction=WA&lat=47.6&lng=-122.3&radius_km=100", nil) req.Header.Set("X-API-Key", key) resp, _ := http.DefaultClient.Do(req)
Features
Features are non-event data: cameras, weather stations, rest areas, signs, truck parking, EV charging, and more. All types share the same endpoint — specify the type with the type parameter.
GET /api/v1/features?type=
| Parameter | Type | Description |
|---|---|---|
| type required | string | Feature type (see Feature Types below) |
| jurisdiction | string | Filter by jurisdiction code |
| active | bool | true to only return active features |
| lat, lng, radius_km | number | Radius search |
| bbox | string | Bounding box: minLng,minLat,maxLng,maxLat |
| limit, offset | int | Pagination |
curl -H "X-API-Key: $KEY" \ "https://api.road511.com/api/v1/features?type=cameras&jurisdiction=CO&lat=39.7&lng=-104.9&radius_km=50"
GET /api/v1/features/{id}/details
Lazy-loaded detail for a single feature. Some features (map-layer compact data) only return full properties via this endpoint.
Truck Corridor Pro+
Find all truck restrictions along a route. Draws a buffered corridor between two points and returns every bridge clearance, weight restriction, truck route, and restriction that intersects it. Uses PostGIS spatial queries for accurate great-circle buffering.
GET /api/v1/truck/corridor
| Parameter | Type | Description |
|---|---|---|
| from_lat required | number | Origin latitude |
| from_lng required | number | Origin longitude |
| to_lat required | number | Destination latitude |
| to_lng required | number | Destination longitude |
| buffer_km | number | Buffer distance around corridor (default 5, max 50 km) |
| height | number | Vehicle height in meters — filters clearances below this |
| weight | number | Vehicle weight in metric tons — filters weight limits below this |
| jurisdiction | string | Restrict to one jurisdiction |
| limit | int | Max results (default 500, max 2000) |
bridge_clearances, bridges, weight_restrictions, truck_restrictions, truck_routes, freight_corridors, truck_parkingcurl -H "X-API-Key: $KEY" \ "https://api.road511.com/api/v1/truck/corridor?\ from_lat=47.61&from_lng=-122.33&\ to_lat=47.66&to_lng=-117.43&\ buffer_km=10"
{
"corridor": {
"from": [47.61, -122.33],
"to": [47.66, -117.43],
"buffer_km": 10,
"distance_km": 371.2
},
"data": [
{
"id": "US-nbi-WA-531234",
"feature_type": "bridge_clearances",
"name": "I-90 over Snoqualmie River",
"latitude": 47.53,
"longitude": -121.82,
"properties": {
"posting_status": "open",
"year_built": 1969,
"_distance_km": "2.31"
}
},
{
"id": "WA-cvr-R-WA-90-1",
"feature_type": "truck_restrictions",
"name": "Snoqualmie Pass",
"properties": {
"restriction": "Oversize loads require pilot car",
"_distance_km": "0.45"
}
}
],
"total": 142,
"limit": 500
}GET /api/v1/truck/corridor/geojson Pro+ GeoJSON
Same query, returns GeoJSON FeatureCollection. Use this to render corridor results directly on a Leaflet or Mapbox map.
// Render truck corridor on Leaflet map const url = `https://api.road511.com/api/v1/truck/corridor/geojson` + `?from_lat=47.61&from_lng=-122.33&to_lat=47.66&to_lng=-117.43&buffer_km=10`; fetch(url, { headers: { "X-API-Key": KEY } }) .then(r => r.json()) .then(geojson => { L.geoJSON(geojson, { pointToLayer: (f, ll) => L.circleMarker(ll, { radius: 6 }), onEachFeature: (f, layer) => { layer.bindPopup(`<b>${f.properties.name}</b><br>${f.properties.feature_type}`); } }).addTo(map); });
import requests resp = requests.get("https://api.road511.com/api/v1/truck/corridor", params={ "from_lat": 47.61, "from_lng": -122.33, "to_lat": 47.66, "to_lng": -117.43, "buffer_km": 10 }, headers={"X-API-Key": KEY}) for feat in resp.json()["data"]: if feat["feature_type"] == "bridge_clearances": print(f"Bridge: {feat['name']} ({feat['properties'].get('posting_status', 'unknown')})")
Analytics Pro+
Historical analytics and trends. All endpoints require Pro or Enterprise plan.
| Endpoint | Description |
|---|---|
| /analytics/history/{id} | Event lifecycle timeline (created, status changes, archived) |
| /analytics/changes | Recent changes feed across all events |
| /analytics/clearance | Incident clearance times (P50/P95 by jurisdiction) |
| /analytics/corridors | Corridor reliability (event frequency by road) |
| /analytics/trends | Event time-series (by type, severity, jurisdiction) |
| /analytics/hotspots | Geographic hotspot clusters |
| /analytics/weather | Weather station reading history |
| /analytics/feature-history | Feature lifecycle changes |
| /analytics/source-health | Source fetch success rates |
| /analytics/fetch-log | Fetch operation statistics |
Webhooks
Subscribe to real-time event changes. When a traffic event is created, changes severity, or is archived, the API sends an HMAC-SHA256 signed POST to your webhook URL.
Payload format
{
"event": "event.created",
"timestamp": "2026-03-25T14:30:00Z",
"data": {
"id": "WA-691391",
"type": "construction",
"severity": "minor",
"jurisdiction": "WA",
"title": "Maintenance - US 101",
"latitude": 46.449,
"longitude": -123.872
}
}Verify the X-Road511-Signature header using HMAC-SHA256 with your webhook secret. Deliveries retry with exponential backoff (3 attempts).
Feature Types
Pass any of these as the type parameter to /features.
Event Types
| Type | Severity Range | Description |
|---|---|---|
| incident | moderate–critical | Crashes, disabled vehicles, hazards |
| construction | minor–moderate | Road work, maintenance, paving |
| closure | major–critical | Full road closures |
| weather | moderate–critical | Weather-related road impacts |
| special_event | minor–moderate | Planned events (parades, races) |
| advisory | minor–moderate | Travel advisories, warnings |
| restriction | minor–moderate | Weight, height, speed restrictions |
Plans & Limits
| Limit | Free (14-day trial) | Starter ($29/mo) | Pro ($99/mo) | Enterprise |
|---|---|---|---|---|
| RPM | 60 | 300 | 1,000 | 5,000 |
| Daily requests | 1,000 | 50,000 | 500,000 | Unlimited |
| API keys | 1 | 3 | 10 | 50 |
| Jurisdictions/req | 2 | 10 | Unlimited | Unlimited |
| Results/page | 100 | 500 | 1,000 | Unlimited |
| GeoJSON export | No | Yes | Yes | Yes |
| Analytics | No | No | Yes | Yes |
| Truck corridor | No | No | Yes | Yes |
| Data delay | 15 min | Real-time | Real-time | Real-time |