A weather forecast gives you the temperature of the air, about two metres above the ground. A truck drives on the road. On a clear autumn night the two can be several degrees apart, and the road is the colder one: asphalt radiates its heat to the sky, a bridge deck loses it from both sides, and the first ice of the season forms on a surface that is below zero under air that is not.
Road authorities measure the road itself. Their roadside weather stations carry a sensor in the asphalt, and most of them publish what it reads. We carry 3,574 road-weather stations across 9 European countries, and 2,883 of them publish a road-surface temperature — now under one field name, surface_temperature_c, whichever country the station stands in.
What the Road Said on 9 October
At 07:00 UTC on 9 October 2026, 191 stations reported a road surface at or below 0 °C. At 31 of them the air was above freezing, and at 7 it was above +2 °C. Across all 2,721 stations that publish both readings, the road was colder than the air at 737 — more than one in four.
Two of them, from the same moment:
- Korsmyra, county road 63, Norway — air +2.2 °C, road surface −1.1 °C.
- Bergfors, Sweden — air +0.3 °C, road surface −1.7 °C.
A route plan built on air temperature sees nothing at either place. That is the case this data exists for.
One Call Across a Border
The E6 crosses from Sweden into Norway at Svinesund. Ask for every road-weather station within 25 km of the bridge:
curl -H "X-API-Key: $KEY" \
"https://api.napspan.com/api/v1/features?type=weather_stations&lat=59.09&lng=11.25&radius_km=25"
On the morning of 9 October that returned nine stations — four Swedish, five Norwegian — in one list. One from each side, trimmed:
{
"id": "SWE-rwis-1439",
"jurisdiction": "SWE",
"name": "Svinesundsbron",
"properties": {
"observation_time": "2026-10-09T08:50:03.000+02:00",
"air_temperature_c": 5.1,
"surface_temperature_c": 1.9,
"dewpoint_c": 0.6,
"humidity_pct": 69.7,
"wind_speed_ms": 1.5,
"visibility_m": 20000
}
}
{
"id": "NOR-ws-0129014",
"jurisdiction": "NOR",
"name": "Solbergtårnet syd",
"road_name": "E6",
"properties": {
"air_temperature_c": 5.3,
"surface_temperature_c": 5.1,
"road_surface_temperature_c": 5.1,
"humidity_pct": 72.8,
"wind_speed_ms": 1.4
}
}
On the bridge itself the road was 3.2 degrees colder than the air. Thirteen kilometres north on the E6 it was 0.2 degrees colder. Same morning, same corridor — which is why one temperature per route is not enough.
Five Names for One Number
The Norwegian row above carries the surface temperature twice. That is deliberate, and it is the reason this post exists.
Until 8 October, road-surface temperature reached our API under five different keys, one per national convention: surface_temperature_c from Germany, Sweden and Poland, road_surface_temperature_c from Norway and Iceland, road_temperature_c from Lithuania, surface_temp_c from Scotland, and road_surface_temp_c from Slovenia and Latvia — Latvia’s one level down, inside a nested object. Air temperature, dew point, humidity and wind direction were split the same way. A client reading surface_temperature_c saw the road in three countries and nothing in six, and nothing errored.
Since 8 October every station also carries the common key. The original key stays, because someone may already be reading it; the common one is added next to it. Where a country already used the common name, nothing changed.
Where the Readings Are
Measured in one transaction against production on 9 October 2026, 07:00 UTC:
| Country | Stations | Surface temp. | Air temp. | Surface condition |
|---|---|---|---|---|
| Germany | 1,510 | 1,148 | 1,193 | 1,109 |
| Sweden | 837 | 768 | 748 | — |
| Norway | 502 | 417 | 427 | — |
| Iceland | 206 | 94 | 181 | — |
| Lithuania | 167 | 162 | 161 | 166 |
| Scotland | 165 | 150 | 155 | 165 |
| Slovenia | 110 | 71 | 96 | 71 |
| Latvia | 72 | 68 | 69 | 69 |
| Poland | 5 | 5 | 5 | — |
| Total | 3,574 | 2,883 | 3,035 | 1,580 |
Some stations measure only air or wind and have no surface sensor at all. Scotland is the only part of the United Kingdom in the set, and Poland is five stations, not a national network.
We Found a Bug of Our Own on the Way
While pulling the figures for this post, fifteen Swedish stations reported a road surface of exactly 0.0 °C under air as warm as +10.7 °C. They were not icy. The national feed sends a sensor that has no reading as an empty record, and our parser turned “no reading” into zero — the same mistake gave 50 Swedish stations a visibility of 0 m. Fixed on 9 October: a sensor that sends no value now produces no field. Every Swedish figure on this page was measured after the fix.
Five Things to Know Before You Build on It
Surface condition is in the agency’s own words. 1,580 stations in five countries describe the road surface — dry, wet, glaze from Germany, Wet and Moist from Scotland, Šlapia (“wet”) from Lithuania. We carry the word as published under surface_condition and do not map it onto a shared scale: the scales do not line up, and a translated “wet” that the agency meant as “wet and treated” is worse than the original. Sweden publishes ice, water and snow flags for 56 of its 837 stations; we do not carry those yet.
Some sensors publish impossible numbers, and we pass them through. At the moment we measured, 26 stations published a pair of readings that cannot both be true — a road surface of −75 °C on the A45 in Germany under +5.8 °C air, or air of −40 °C on the E6 in northern Norway over a +1.3 °C road. The figures in this post leave those 26 out. The API does not: it returns what the road authority published, and a sanity check against the air temperature belongs in your code.
Not every country says when the reading was taken. Germany, Sweden and Latvia stamp each observation with observation_time, Poland with measure_time. Norway, Iceland, Lithuania, Scotland and Slovenia do not. Where the stamp exists, check it: on the same morning, the oldest Swedish observation still being published was five days old.
Units are in the field name. _c is Celsius, _ms metres per second, _pct percent, _m metres. Where a feed does not state its unit we do not guess one: Scotland’s wind speed is carried as published and has no wind_speed_ms.
It is a measurement, not a forecast. Each reading is what the sensor saw when it last reported. Nothing here predicts where ice will form in two hours.
The Same Call as Everything Else on the Route
Road-weather stations are one more feature type in the same /features schema as road cameras, live truck-parking occupancy and truck restrictions and VMS messages. A camera shows a person the road; a surface sensor gives your code a number. Filter by jurisdiction with ISO 3166-1 alpha-3 codes (NOR, SWE), by bbox, or by a point and radius_km as above.
What This Does Not Do
- It is not every country. Nine countries carry road-weather stations in our data. France, Spain, Italy, Austria and the Netherlands are not among them.
- It does not classify the road. No “icy” flag is computed from the numbers; the condition text is the agency’s, where it publishes one.
- It does not clean the data. Impossible readings arrive as published.
- It does not forecast. Measurements only.
Figures measured against production on 9 October 2026, 07:00 UTC, in a single transaction; observation ages on the same morning. Readings change by the minute, and a winter morning will look nothing like this October one — the coverage and the field names are what will hold.
Try It
- API docs —
/featureswithtype=weather_stations, filtered byjurisdiction,bboxorradius_km - Live map — every station we carry, on one map
- Free API key — no card, 14-day trial
Read the road, not the air
Road-surface temperature from 2,883 stations in 9 European countries under one field name, in the same API call as cameras, restrictions and parking — with the gaps stated up front. Free 14-day trial. No card.
Get Free API Key Read the Docs