← Back to all posts
Traffic Cameras API Tutorial

How to Get Real-Time Traffic Camera Feeds via API

April 19, 2026 · 6 min read

No major traffic data provider gives you camera feeds. Not HERE, not TomTom, not Google, not INRIX. They all sell traffic flow from probe data, but live camera images? Nobody aggregates that.

Road511 does. 10,000+ traffic cameras across 40+ US states and Canadian provinces, all accessible through one REST API.

The Problem

Every state DOT publishes camera images, but every one does it differently:

Want cameras for a cross-state route? You're looking at 5+ separate integrations with different auth, formats, and update schedules.

One API Call

curl "https://api.road511.com/api/v1/features?type=cameras&jurisdiction=CA&limit=20" \
  -H "X-API-Key: your_key"
{
  "data": [
    {
      "id": "ca-cam-d7-101-001",
      "jurisdiction": "CA",
      "feature_type": "cameras",
      "name": "US-101 at Ventura Blvd",
      "latitude": 34.1583,
      "longitude": -118.4686,
      "is_active": true,
      "properties": {
        "image_url": "https://cwwp2.dot.ca.gov/data/d7/cctv/image/us101atventurabl/us101atventurabl.jpg",
        "direction": "Northbound",
        "highway": "US-101"
      }
    }
  ],
  "total": 1847,
  "has_more": true
}

The image_url is a direct link to the camera image. Most refresh every 30–120 seconds. Some cameras also have video_url for live streams.

GeoJSON for Maps

Want to drop every camera in a state directly onto a Leaflet map?

curl "https://api.road511.com/api/v1/features/geojson?type=cameras&jurisdiction=GA" \
  -H "X-API-Key: your_key"

Returns a standard GeoJSON FeatureCollection. Add it to your map layer with zero transformation:

const response = await fetch(
  'https://api.road511.com/api/v1/features/geojson?type=cameras&jurisdiction=GA',
  { headers: { 'X-API-Key': 'your_key' } }
);
const geojson = await response.json();

L.geoJSON(geojson, {
  onEachFeature: (feature, layer) => {
    const { name, image_url } = feature.properties;
    layer.bindPopup(`
      <strong>${name}</strong><br>
      <img src="${image_url}" width="320" loading="lazy">
    `);
  }
}).addTo(map);

Bounding Box Queries

Don't know which states your route crosses? Use a bounding box:

curl "https://api.road511.com/api/v1/features?type=cameras&bbox=-118.5,33.7,-117.8,34.3&limit=50" \
  -H "X-API-Key: your_key"

This returns cameras within the LA metro area regardless of jurisdiction.

Lazy-Loaded Details

Some cameras return compact data in list mode but have richer detail available on demand:

curl "https://api.road511.com/api/v1/features/ab-cam-001/details" \
  -H "X-API-Key: your_key"

The detail endpoint fetches the latest image URL and any additional metadata directly from the upstream source, cached in Redis for performance.

What's Available

State/Province Camera Count Refresh Rate
California~1,8001–5 min
Ontario~8002–5 min
Georgia~70030 sec
Michigan~7802–5 min
Texas~600+1–5 min
Pennsylvania~500+2–5 min
And 35+ more…

Use Cases

Try It

Start pulling camera feeds in minutes

Free 14-day trial. No credit card. Cameras from 40+ jurisdictions.

Get Free API Key Explore the Map