A dispatcher looking at a snow warning on the E6 has two options. Trust the text, or look at the road. The second one used to mean opening a different national website for every country the route crosses — the Swedish Transport Administration for one side of the Svinesund bridge, the Norwegian Public Roads Administration for the other — each with its own map, its own camera naming and its own idea of what a camera record contains.
We carry 7,587 active road cameras across 16 European countries, and 6,834 of them link to a current still image under one field name. One API call, one schema, whichever side of the border the camera stands on.
One Call Across a Border
The bridge at Svinesund carries the E6 between Sweden and Norway. Ask for every camera within 25 km of it:
curl -H "X-API-Key: $KEY" \
"https://api.napspan.com/api/v1/features?type=cameras&lat=59.09&lng=11.25&radius_km=25"
On 28 September 2026 that returned ten cameras — five Swedish, five Norwegian — in one list. Two of them, trimmed:
{
"id": "SWE-cam-SE_STA_CAMERA_VViS_1439_K1",
"jurisdiction": "SWE",
"name": "Svinesundsbron",
"latitude": 59.092922,
"longitude": 11.252252,
"properties": {
"camera_status": "online",
"image_url": "https://api.trafikinfo.trafikverket.se/v2/Images/data/road.infrastructure.camera/RoadConditionCamera_VViS_1439_K1.jpg",
"photo_time": "2026-09-28T09:20:27.980+02:00"
}
}
{
"id": "NOR-cam-3001013_1",
"jurisdiction": "NOR",
"name": "Ingedal — Sarpsborg",
"road_name": "E6",
"properties": {
"camera_status": "online",
"image_url": "https://kamera.atlas.vegvesen.no/api/images/3001013_1",
"orientation": "Sarpsborg",
"video_url": "https://kamera.vegvesen.no/public/3001013_1/manifest.m3u8"
}
}
The two national systems describe their cameras very differently — Sweden sends a photo timestamp and a county code, Norway sends a viewing direction and a live stream. What they share is the field a client actually needs: image_url, a link to the latest picture, straight from the road authority that took it.
Where the Cameras Are
Measured in one transaction against production on 14 October 2026, 06:10 UTC:
| Country | Active cameras | With a still image |
|---|---|---|
| Spain | 1,959 | 1,959 |
| Sweden | 1,590 | 1,590 |
| Norway | 897 | 897 (136 also stream video) |
| Finland | 814 | 814 |
| Slovenia | 538 | 538 |
| Germany (Bavaria) | 423 | 423 |
| Lithuania | 308 | 308 |
| Iceland | 165 | 165 |
| France | 116 | 100 (all 116 stream video) |
| Bosnia and Herzegovina | 37 | 37 |
| Montenegro | 3 | 3 |
| Scotland, Croatia, Poland, the Netherlands, North Macedonia | 737 | 0 — location only |
Before writing this we pulled five random image links from every country that has them and fetched each one from our European servers. All 53 came back as images.
Read the last row carefully. Scotland (415), Croatia (240), Poland (35), the Netherlands (26) and North Macedonia (21) publish where their cameras stand but not a picture from them, so we carry the location and nothing more. We would rather tell you that here than have you find 737 empty frames in production. And Germany in this table means Bavaria — no other German state is in the set.
Why One Field Name Is the Whole Point
A normalised schema sounds like housekeeping until you count what it saves. Every national feed names the picture differently: one sends a single link, one a list of three angles, one a field called photo_url, one a page that hosts the stream. A fleet that integrates them one by one writes sixteen parsers, and the seventeenth country breaks the dashboard.
We found our own proof of that while preparing this post. Until 28 September, Sweden’s 1,589 cameras reached our API with their still under photo_url only — a client reading image_url saw no picture for a fifth of the cameras in Europe, and nothing errored. That is fixed: the link is under image_url for every country that publishes one, and photo_url stays for anyone already reading it.
Four Things to Know Before You Build on It
It is a still, not a live feed. Only 252 cameras carry a video stream — Norway’s 136 and France’s 116. Everywhere else you get the most recent picture the road authority published, refreshed on its schedule, not ours.
A picture can be old, and only some countries tell you how old. Sweden stamps every photo: at our latest daily refresh, 1,548 of its 1,590 cameras had taken a picture within the previous hour — and the oldest photo still being published was from May 2022. Most countries send no timestamp at all. Where photo_time is present, check it; where it is absent, the age is unknown, not recent.
Camera health is published for less than half the network. 3,404 cameras carry a camera_status — 3,321 online, 83 offline. The other 4,183 come from feeds that do not say. Absent means unknown, never online.
We do not read the pictures. Nothing here tells you whether the road in the frame is snowed over or queued. The image is evidence for a person to look at, not a classified road condition — for that, the restrictions and VMS messages on the same corridor are the structured signal.
The Same Call as Everything Else on the Route
Cameras are one more feature type in the same /features schema as live truck-parking occupancy, per-station fuel prices and live charging status. 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 camera in Europe. Sixteen countries carry cameras in our data; the rest of the continent does not, and 753 of the 7,587 have no picture.
- It is not video. 252 streams, all in Norway and France.
- It does not host the images. Each link points at the road authority’s own server, so availability and refresh are theirs.
- It does not interpret them. A person looks; the API does not guess.
Figures measured against production on 14 October 2026, 06:10 UTC, in a single transaction (first published 28 September; the Netherlands has joined the location-only group since). Camera counts move as authorities add and retire devices; the shape of the finding is what will hold.
Try It
- API docs —
/featureswithtype=cameras, filtered byjurisdiction,bboxorradius_km - Live map — every camera we carry, on one map
- Free API key — no card, 14-day trial
Look at the road before you reroute
6,834 road cameras with a current picture across 16 European countries, in the same API call as truck restrictions, tolls, parking and fuel — with the gaps stated up front. Free 14-day trial. No card.
Get Free API Key Read the Docs