← Back to all posts
DMS Signs API

Real-Time DMS Sign Messages API: What's on the Highway Signs Right Now

April 30, 2026 · 6 min read

Dynamic Message Signs — the big electronic boards over the highway — are the fastest traveler-information channel a state DOT controls. When a crash happens, the sign two miles upstream often updates before the incident appears in the public 511 feed. Amber alerts, travel times, lane closures, weather warnings, evacuation routes — it all flows through DMS first.

The catch: every state publishes its DMS inventory differently — from clean JSON APIs to multi-district web endpoints to obfuscated binary feeds. Some publish a clean “current message” field; others give you multiple message phases you have to reassemble into the line that’s actually displayed.

Road511 normalizes all of it into one endpoint. One API call returns the live text on every DMS across 30+ jurisdictions. And we’re the only API that publishes a historical archive of message changes.

What You Get

curl "https://api.road511.com/api/v1/features?type=signs&jurisdiction=GA&limit=10" \
  -H "X-API-Key: your_key"
{
  "data": [
    {
      "id": "ga-sign-i85-042",
      "jurisdiction": "GA",
      "feature_type": "signs",
      "name": "I-85 NB at Clairmont Rd",
      "latitude": 33.8103,
      "longitude": -84.3179,
      "properties": {
        "message": "WEEKEND RDWK ALERT\nI-85 S EXIT 109 - 103\nFRI 9PM - MON 5AM",
        "direction": "Southbound"
      }
    }
  ],
  "total": 217,
  "has_more": true
}

The message field is the exact text on the sign, with the sign’s own line breaks preserved as newlines (\n). A dark or default sign comes back with an empty message or a source sentinel such as NO_MESSAGE, so filtering those out client-side leaves the signs that actually have something to say. What else rides in properties varies by DOT — many sources add direction, and some a sign_type or a sign_updated timestamp — but message is the one every source carries.

Filter to Just the Active Signs

Most DMS in any given inventory are blank or showing routine messages. The interesting ones — incidents, alerts, closures — are usually a tiny percentage. Combine type=signs with a bounding box and skip the blanks client-side:

curl "https://api.road511.com/api/v1/features?type=signs\
&bbox=-84.5,33.6,-84.2,33.9\
&limit=200" \
  -H "X-API-Key: your_key"

Returns every DMS in metro Atlanta. Drop the ones whose message is empty or a routine default in your client, and you’re left with the handful of signs that have a message worth reading.

GeoJSON for Map Overlays

Same query, GeoJSON shape, ready to drop onto Leaflet, Mapbox, or QGIS:

curl "https://api.road511.com/api/v1/features/geojson?type=signs\
&bbox=-84.5,33.6,-84.2,33.9" \
  -H "X-API-Key: your_key"
const res = await fetch(
  'https://api.road511.com/api/v1/features/geojson'
  + '?type=signs&bbox=-84.5,33.6,-84.2,33.9',
  { headers: { 'X-API-Key': 'your_key' } }
);
const geojson = await res.json();

L.geoJSON(geojson, {
  filter: (f) => f.properties.message && f.properties.message !== 'NO_MESSAGE',
  pointToLayer: (f, latlng) => L.circleMarker(latlng, {
    radius: 7, color: '#f59e0b', fillOpacity: 0.85
  }),
  onEachFeature: (f, layer) => {
    const lines = (f.properties.message || '').split('\n').join('<br>');
    layer.bindPopup(`
      <strong>${f.properties.name}</strong>
      <pre style="font-family: monospace; font-size: 12px">${lines}</pre>
    `);
  }
}).addTo(map);

Why Aggregating This Matters

DMS messages are a leading indicator. The traffic operator who runs the sign also runs the 511 feed, but the sign update happens first — sometimes ten or fifteen minutes before the event appears in the public incident list. Cross-referencing live sign text with traffic events gives you several things you can’t get from either feed alone:

Coverage

DMS data lives in the signs feature type. We pull from every state and province that exposes a public sign feed. Counts below are approximate active inventory; specific signs come and go as DOTs install or retire hardware.

Jurisdiction Approx. signs
Michigan (MI)~487
Oregon (OR)~485
Texas (TX)varies, 25 districts
Wyoming (WY)~151
Montana (MT)~123
North Dakota (ND)~100
Mississippi (MS)~76
Alabama (AL)~73
Ohio (OH)varies
Oklahoma (OK)varies
Georgia + 8 more statesvaries per state
NEC (ME, NH, VT)varies
Kentucky, Tennessee, Virginia, Arkansasvaries

If a state publishes DMS data, we ingest it. New states roll in regularly — we’ve done the per-source unification work so you don’t have to.

Who Uses This

One Note on Polling and Freshness

DMS feeds are polled by Road511 on schedules between 1 and 5 minutes depending on the state, with adaptive backoff if a feed misbehaves. Where a source stamps its own change time we surface it as sign_updated in properties; otherwise the message you read is at most one polling interval old. For the time-critical use cases (amber alerts, incidents), keep your client on a 30–60 second cache and you’ll see new messages within a couple minutes of the operator posting them.

Try It

See what every highway sign is saying right now

One API call returns the live message on every DMS across 30+ states and provinces — plus a historical archive nobody else publishes. Free 14-day trial. No credit card.

Get Free API Key Explore the Map