For developers and AI agents
Open data: two JSON endpoints
SAVA publishes two of its references as JSON: the HGV driving-ban calendar and the catalogue of this site's pages. No key, no sign-up and no authentication: a plain GET request returns the data.
What both have in common
GET, response in JSON (UTF-8).Access-Control-Allow-Origin: *: they can be called from a browser on any domain.Cache-Control: public, max-age=3600: a response may be reused for one hour. Thegeneratedfield of the calendar says when the response you are reading was built.- Rate limit per IP and per endpoint: 60 requests in a 60-second window that starts with the first one. Request 61 gets HTTP
429with aRetry-Afterheader giving the seconds to wait.
HGV driving-ban calendar
GET https://www.savaexpress.com/api/geo/traffic-bans
The truck driving bans that have a fixed date in the transit countries on SAVA's routes, for the current year and the next: the same two years the public pages index. Every date carries the official source that publishes the rule and the month in which the data was checked against it.
The same data, for people: EU truck traffic ban calendar
Fields
generated: when the response was built, as a UTC timestamp.apiVersion: the version of the response format, currently1.1. A new version only adds fields: none is renamed or changes meaning.timeReference: the time of everystartandend. It is Central European Time: CET (UTC+1) in winter and CEST (UTC+2) in summer, as inEurope/Brussels.window: the dates covered:from,toandyears.filters: the filters applied to this response:from,to,countries(nullmeans all),includeandlang.source: the public page this data mirrors.countries: countries with a dated ban regime:code(ISO 3166-1 alpha-2),name,timezone,summary,officialSource(name,url),lastVerifiedandpage(the country page, or the country's section of the calendar for Hungary, Luxembourg and Liechtenstein).countriesWithoutDatedBans: countries whose regime is seasonal, route-specific or absent, with their summary and official source and no dates. They are listed so that their absence is not read as “no restrictions”.recurring: the night bans of Austria, Switzerland and Liechtenstein, one block per country instead of some 730 dates a year:country,kind,days,startandend(22:00–05:00, over midnight),vehicle,minimumTonnes,scope,exceptions,officialSourceandlastVerified.bans: one entry per date and time window:country,countryName,timezone,date,weekday,reason,startandend(HH:MM in Central European Time;24:00is the end of the day),startsAtandendsAt(the same moments in RFC 3339 with their UTC offset, e.g.2026-09-26T15:00:00+02:00),kind(weekend,holiday,eve,road,datedornight),vehicle,minimumTonnes(only when the vehicle text states a threshold),scope(nationwide,regional,specific-roadsortransit),officialSource,lastVerified,pageand, where they apply,note,appliesTo(e.g.transit-to-FR),roadsandprovisional(truefor dates estimated before the authority publishes its calendar).count: the number of entries inbans.
Parameters
date=YYYY-MM-DD: a single day.from=YYYY-MM-DDandto=YYYY-MM-DD: a range insidewindow. Without any parameter the response covers the whole window.country=AT,FR: one or more ISO codes, separated by commas.include=night: also lists the night bans as dated entries, two per day (00:00–05:00 and 22:00–24:00).lang:en(default),es,ro,it,frorde. Translatessummary,reason,noteandvehicle.- A malformed parameter answers HTTP
400with theparameterand what wasexpected.
Example
Trimmed excerpt of a real response from 25 September 2026; … marks what was left out. The full response is about 1.4 MB: filter it with the parameters above.
{
"generated": "2026-09-25T12:32:20.536Z",
"apiVersion": "1.1",
"timeReference": {
"zone": "Europe/Brussels",
"label": "CET/CEST (Central European Time)",
"note": "All start/end times are Central European Time: CET (UTC+1) in winter, CEST (UTC+2) in summer."
},
"window": {
"from": "2026-01-01",
"to": "2027-12-31",
"years": [2026, 2027]
},
"filters": {
"from": "2026-01-01",
"to": "2027-12-31",
"countries": null,
"include": [],
"lang": "en"
},
"source": "https://www.savaexpress.com/resources/traffic-bans",
"countries": [
{
"code": "DE",
"name": "Germany",
"timezone": "Europe/Berlin",
"summary": "Trucks over 7.5 t are banned nationwide on Sundays and public holidays, 00:00–22:00. Summer Saturday bans also apply on certain motorways.",
"officialSource": {
"name": "§30 StVO / Ferienreiseverordnung (BMDV)",
"url": "https://www.gesetze-im-internet.de/stvo_2013/__30.html"
},
"lastVerified": "2026-09",
"page": "https://www.savaexpress.com/resources/traffic-bans/germany"
},
…
],
"countriesWithoutDatedBans": [
…,
{
"code": "ES",
"name": "Spain",
"timezone": "Europe/Madrid",
"summary": "No simple nationwide weekend ban. The DGT publishes an annual resolution of route- and date-specific restrictions for trucks over 7.5 t (Sundays/holidays on listed roads, plus special-transport and seasonal rules).",
"officialSource": {
"name": "DGT — Restricciones a la circulación",
"url": "https://www.dgt.es/"
},
"lastVerified": "2026-09"
},
…
],
"recurring": [
{
"country": "AT",
"countryName": "Austria",
"kind": "night",
"days": "daily",
"start": "22:00",
"end": "05:00",
"timezone": "Europe/Vienna",
"vehicle": "trucks over 7.5 t",
"minimumTonnes": 7.5,
"scope": "nationwide",
"exceptions": ["Low-noise trucks (lärmarm) carrying a certificate under § 8b (4) KDV 1967", "Road-maintenance vehicles", "Army vehicles where indispensable"],
"officialSource": {
"name": "§ 42 (6) StVO (RIS)",
"url": "https://www.ris.bka.gv.at/NormDokument.wxe?Abfrage=Bundesnormen&Gesetzesnummer=10011336&Paragraf=42"
},
"lastVerified": "2026-09"
},
…
],
"bans": [
{
"country": "AT",
"countryName": "Austria",
"timezone": "Europe/Vienna",
"officialSource": {
"name": "ASFINAG / §42 StVO",
"url": "https://www.asfinag.at/en/traffic-road-safety/hgv-bus/lorry-driving-and-overtaking-bans/"
},
"lastVerified": "2026-09",
"page": "https://www.savaexpress.com/resources/traffic-bans/austria",
"date": "2026-01-01",
"weekday": "Thursday",
"reason": "Public holiday: New Year's Day",
"start": "00:00",
"end": "22:00",
"vehicle": "trucks over 7.5 t",
"minimumTonnes": 7.5,
"scope": "nationwide",
"startsAt": "2026-01-01T00:00:00+01:00",
"endsAt": "2026-01-01T22:00:00+01:00",
"kind": "holiday"
},
…,
{
"country": "AT",
"countryName": "Austria",
"timezone": "Europe/Vienna",
"officialSource": {
"name": "Lkw-Fahrverbote Generalerneuerung Luegbrücke 2026 (BGBl. II Nr. 338/2025 as amended by BGBl. II Nr. 70/2026), § 1",
"url": "https://www.ris.bka.gv.at/Dokumente/Bundesnormen/NOR40276795/NOR40276795.html"
},
"lastVerified": "2026-09",
"page": "https://www.savaexpress.com/resources/traffic-bans/austria",
"date": "2026-09-26",
"weekday": "Saturday",
"reason": "Saturday",
"start": "07:00",
"end": "15:00",
"vehicle": "trucks over 7.5 t",
"minimumTonnes": 7.5,
"scope": "specific-roads",
"note": "A13 Brenner (Luegbrücke works): trucks heading for Italy over the Nößlach–Brenner Nord section; applies on the A12, A13 and A14.",
"startsAt": "2026-09-26T07:00:00+02:00",
"endsAt": "2026-09-26T15:00:00+02:00",
"kind": "road",
"appliesTo": "southbound-to-IT",
"roads": ["A12", "A13", "A14"]
},
…,
{
"country": "IT",
"countryName": "Italy",
"timezone": "Europe/Rome",
"officialSource": {
"name": "MIT — Calendario divieti di circolazione",
"url": "https://www.mit.gov.it/comunicazione/news/mezzi-pesanti-calendario-2026-dei-divieti-di-circolazione-stradale"
},
"lastVerified": "2026-09",
"page": "https://www.savaexpress.com/resources/traffic-bans/italy",
"date": "2027-01-03",
"weekday": "Sunday",
"reason": "Sunday",
"start": "09:00",
"end": "22:00",
"vehicle": "trucks over 7.5 t",
"minimumTonnes": 7.5,
"scope": "nationwide",
"note": "Calendar 2027 not yet published; estimated from the general rules.",
"startsAt": "2027-01-03T09:00:00+01:00",
"endsAt": "2027-01-03T22:00:00+01:00",
"kind": "weekend",
"provisional": true
},
…
],
"count": 2170
}Catalogue of this site's pages
GET https://www.savaexpress.com/api/geo/routes
Every indexable page of this site, with its canonical URL and the languages it exists in: the same list the sitemap publishes. It answers “what is here, and in which languages”. It does not carry distances, transit times, departure days or prices: those are on each corridor page.
The same data, for people: All Spain-origin corridors
Fields
routes: one entry per page:path,canonicalUrl(the English URL),priority,changeFrequency,locales(the languages it exists in) and, when the page has a content date,lastModified.count: the number of entries inroutes.
Example
Trimmed excerpt of a real response from 24 September 2026; … marks what was left out.
{
"routes": [
{
"path": "/",
"canonicalUrl": "https://www.savaexpress.com",
"priority": 1,
"changeFrequency": "weekly",
"locales": ["en", "es", "ro", "it", "fr", "de"]
},
…,
{
"path": "/resources/api",
"canonicalUrl": "https://www.savaexpress.com/resources/api",
"priority": 0.5,
"changeFrequency": "monthly",
"locales": ["en", "es", "ro", "it", "fr", "de"]
},
…,
{
"path": "/resources/traffic-bans",
"canonicalUrl": "https://www.savaexpress.com/resources/traffic-bans",
"priority": 0.6,
"changeFrequency": "weekly",
"locales": ["en", "es", "ro", "it", "fr", "de"],
"lastModified": "2026-09-04"
},
…
],
"count": 178
}Licence: CC BY 4.0
Both responses are published under the Creative Commons Attribution 4.0 International licence. You may copy, redistribute and adapt the data, commercially too, provided you credit SAVA Logistic, link to the licence and indicate whether you made changes.
How to credit
One line next to where you use the data is enough, for example:
Source: SAVA Logistic (www.savaexpress.com/resources/traffic-bans), CC BY 4.0Who to credit for what: SAVA Logistic compiles and publishes the calendar, but the rule behind each date belongs to the authority named in that entry's officialSource. Cite that authority for the rule itself.
lastVerified gives the month in which that country's data was checked against its official source. It says when it was checked, nothing more: before planning around a date, confirm it with the authority.
