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
curl -H "X-API-Key: YOUR_API_KEY" \
  "https://api.road511.com/api/v1/events?jurisdiction=WA&limit=5"

3. Parse the response

Response JSON
{
  "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.

Header (recommended)
curl -H "X-API-Key: sk_live_abc123" https://api.road511.com/api/v1/events
Query parameter
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.

StatusMeaning
200Success
400Bad request (missing/invalid parameters)
401Missing or invalid API key
403Plan limit exceeded (jurisdiction, feature gate, expired trial)
429Rate limit exceeded — retry after Retry-After seconds
500Server 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

ParameterTypeDescription
jurisdictionstringFilter by state/province code (e.g., WA, ON) required on Free
typestringFilter by event type: incident, construction, closure, weather, special_event, advisory, restriction
severitystringFilter: minor, moderate, major, critical
lat, lng, radius_kmnumberRadius search (e.g., lat=47.6&lng=-122.3&radius_km=50)
bboxstringBounding box: minLng,minLat,maxLng,maxLat
limitintResults per page (default 100, max per plan)
offsetintPagination 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=

ParameterTypeDescription
type requiredstringFeature type (see Feature Types below)
jurisdictionstringFilter by jurisdiction code
activebooltrue to only return active features
lat, lng, radius_kmnumberRadius search
bboxstringBounding box: minLng,minLat,maxLng,maxLat
limit, offsetintPagination
Example: cameras near Denver
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

ParameterTypeDescription
from_lat requirednumberOrigin latitude
from_lng requirednumberOrigin longitude
to_lat requirednumberDestination latitude
to_lng requirednumberDestination longitude
buffer_kmnumberBuffer distance around corridor (default 5, max 50 km)
heightnumberVehicle height in meters — filters clearances below this
weightnumberVehicle weight in metric tons — filters weight limits below this
jurisdictionstringRestrict to one jurisdiction
limitintMax results (default 500, max 2000)
Searches across: bridge_clearances, bridges, weight_restrictions, truck_restrictions, truck_routes, freight_corridors, truck_parking
Example: I-90 Seattle to Spokane
curl -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"
Response
{
  "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.

EndpointDescription
/analytics/history/{id}Event lifecycle timeline (created, status changes, archived)
/analytics/changesRecent changes feed across all events
/analytics/clearanceIncident clearance times (P50/P95 by jurisdiction)
/analytics/corridorsCorridor reliability (event frequency by road)
/analytics/trendsEvent time-series (by type, severity, jurisdiction)
/analytics/hotspotsGeographic hotspot clusters
/analytics/weatherWeather station reading history
/analytics/feature-historyFeature lifecycle changes
/analytics/source-healthSource fetch success rates
/analytics/fetch-logFetch 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

Webhook POST body
{
  "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.

camerasTraffic camera snapshots with image URLs
weather_stationsRWIS sensors: temperature, wind, humidity, road condition
rest_areasRest stops with amenities (restrooms, wifi, RV dump)
signsDynamic message signs with current text
road_conditionsSegment-level road surface conditions
ev_chargingEV charging stations (NREL data)
bridge_clearancesBridge vertical clearance, load ratings, posting status
truck_restrictionsHeight/weight limits, hazmat zones, permits
weight_restrictionsSeasonal/permanent weight limits (polylines)
truck_routesSTAA designated truck routes (polylines)
freight_corridorsNHFN freight network corridors (polylines)
truck_parkingTruck parking lots with capacity and amenities
weigh_stationsWeigh station locations and status
traffic_segmentsTraffic flow sensor data (speed/volume)
service_vehiclesSnow plows, DOT service vehicles (seasonal)
ferriesFerry terminals and route status

Event Types

TypeSeverity RangeDescription
incidentmoderate–criticalCrashes, disabled vehicles, hazards
constructionminor–moderateRoad work, maintenance, paving
closuremajor–criticalFull road closures
weathermoderate–criticalWeather-related road impacts
special_eventminor–moderatePlanned events (parades, races)
advisoryminor–moderateTravel advisories, warnings
restrictionminor–moderateWeight, height, speed restrictions

Plans & Limits

LimitFree (14-day trial)Starter ($29/mo)Pro ($99/mo)Enterprise
RPM603001,0005,000
Daily requests1,00050,000500,000Unlimited
API keys131050
Jurisdictions/req210UnlimitedUnlimited
Results/page1005001,000Unlimited
GeoJSON exportNoYesYesYes
AnalyticsNoNoYesYes
Truck corridorNoNoYesYes
Data delay15 minReal-timeReal-timeReal-time

Get Free API Key