ParkenDD API
Free car park availability API with no key: live free-space counts for multi-storey car parks across German, Austrian and Swiss cities. Tested example and live response.
Endpoint tested and returned HTTP 200 on 2026-08-21
What is the ParkenDD API?
ParkenDD is a free, key-free API aggregating live car park occupancy for cities across Germany, Austria and Switzerland. For each car park it reports free spaces, total capacity, coordinates, type and current state, drawn from each city's own published feed.
Dozens of German cities publish car park occupancy, each in its own format on its own portal, and ParkenDD is the open-source project that scrapes them all into one schema. Fetching the base URL lists every supported city; adding a city name returns its car parks with live counts. That normalisation is the entire value — the alternative is writing a parser per municipality.
Because each city is a separate scraper, freshness varies enormously and the `last_updated` field is not decoration. Some cities update every few minutes; others have been stale for months because the upstream portal changed and the scraper broke. Always compare `last_updated` against the current time before presenting a number as live, and show the age rather than implying the count is current. `last_downloaded` tells you when ParkenDD last tried, which distinguishes a broken scraper from a quiet source.
Quick facts
- Base URL
https://api.parkendd.de- Authentication
- No API key or account. Open-source project aggregating municipal open data.
- Rate limit
- No published quota. Upstream sources refresh every few minutes at best, so polling faster achieves nothing.
- Pricing
- Free and open source.
- CORS
- Enabled — callable directly from browser JavaScript
- Official docs
- Read the docs
How to use the ParkenDD API
Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.
1. Fetch live car park occupancy for a German city
GET https://api.parkendd.de/Dresden
curl 'https://api.parkendd.de/Dresden'const res = await fetch("https://api.parkendd.de/Dresden");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);import requests
res = requests.get("https://api.parkendd.de/Dresden", timeout=20)
res.raise_for_status()
print(res.json()){
"last_downloaded": "2026-07-18T05:45:07",
"last_updated": "2026-07-18T05:44:35",
"lots": [
{
"address": "Wilsdruffer Straße",
"coords": {
"lat": 51.05031,
"lng": 13.73754
},
"forecast": true,
"free": 360,
"id": "dresdenaltmarkt",
"lot_type": "Tiefgarage",
"name": "Altmarkt",
"region": "Innere Altstadt",
"state": "open",
"total": 400
},
{
"address": "An der Frauenkirche 12a",
"coords": {
"lat": 51.05165,
"lng": 13.7439
},
"forecast": false,
"free": 87,
"id": "dresdenanderfrauenkirche",
"lot_type": "Tiefgarage",
"name": "An der Frauenkirche",
"region": "Innere Altstadt",
"state": "open",
"total": 120
},
{
"address": "Landhausstraße 2",
"coords": {
"lat": 51.05082,
"lng": 13.74174
},
"forecast": false,
"free": 195,
"id": "dresdenfrauenkircheneumarkt",
"lot_type": "Tiefgarage",
"name": "Frauenkirche / Neumarkt",
"region": "Innere Altstadt",
"state": "open",
"total": 250
},
{
"address": "Kleine Brüdergasse 3",
"coords": {
"lat": 51.05149,
"lng": 13.73584
},
"forecast": false,
"free": 143,
"id": "dresdenhausamzwinger",
"lot_type": "Tiefgarage",
"name": "Haus am Zwinger",
"region": "Innere Altstadt",
"state": "open",
"total": 171
},
{
"address": "Ostra-Allee",
"coords": {
"lat": 51.05383,Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
(city) | path | Optional | `/{City}` returns that city's car parks. Names are capitalised and use German spelling. Dresden |
(city list) | path | Optional | The base URL returns every supported city with its coordinates and metadata. / |
(timespan) | path | Optional | Some cities expose historical occupancy through a timespan path. |
Response fields
last_downloadedstring- When ParkenDD last fetched from the upstream source.
last_updatedstring- When the upstream data itself was last refreshed. Check this before calling a figure live.
lotsarray- The car parks in that city.
lots[].namestring- Car park name as the city publishes it.
lots[].free / totalinteger- Free spaces now and total capacity. `free` may be absent where a city publishes only a state.
lots[].statestring- `open`, `closed`, `nodata` or `unknown`. Check it before trusting `free`.
lots[].coordsobject- Position as `{lat, lng}` — note `lng`, not `lon`, and separate keys rather than GeoJSON.
lots[].lot_typestring- German facility type: `Tiefgarage` underground, `Parkhaus` multi-storey, `Parkplatz` surface.
lots[].regionstring- District or quarter of the city, useful for grouping.
lots[].idstring- Stable identifier for the car park, for tracking occupancy over time.
lots[].forecastboolean- Whether occupancy predictions are available for this car park.
What you can build with the ParkenDD API
- Show live parking availability in a city app
- Guide drivers to the nearest car park with free spaces
- Track occupancy over time to identify peak periods
- Map car parks by district with capacity and type
- Compare parking pressure across German cities
Common errors and how to fix them
500
Intermittent server error — roughly one request in three fails. ParkenDD aggregates municipal car-park pages, so a 500 usually means one upstream city website was unreachable when the API last refreshed.
Fix: Retry once or twice with a short backoff before treating it as an outage, and cache the last good response so a transient upstream failure does not blank your UI. Occupancy figures only change every few minutes, so a short cache costs nothing.
last_updated is months old
The upstream city feed changed and the scraper has not been fixed.
Fix: Always compare `last_updated` to now and show the age. A stale count presented as live sends drivers to a full car park.
500 for a city name
The name is misspelled or that city's scraper is currently failing.
Fix: Fetch the base URL for the current city list. German spellings are used — Zuerich, Muenster — and capitalisation matters.
free is missing on some lots
Not every city publishes counts; some publish only a state.
Fix: Fall back to `state`. An `open` car park with no count is still worth showing, clearly labelled as count unavailable.
Coordinates plot in the wrong place
The key is `lng`, not `lon`, and this is not GeoJSON.
Fix: Read `coords.lat` and `coords.lng` explicitly rather than destructuring by position.
ParkenDD API — frequently asked questions
Is the ParkenDD API free?
Yes, free and open source with no key or account. It aggregates municipal open data that each city already publishes.
Which cities are covered?
Around thirty across Germany, Austria and Switzerland, including Dresden, Hamburg, Frankfurt, Basel and Zurich. Fetch the base URL for the live list, which changes as scrapers are added or retired.
How current is the occupancy data?
It varies by city, which is why every response carries `last_updated`. Some cities refresh every few minutes; others have been stale for months after an upstream change broke the scraper. Check the timestamp before treating a count as live.
What do the German lot types mean?
`Tiefgarage` is an underground car park, `Parkhaus` a multi-storey, `Parkplatz` a surface lot and `Straßenrand` on-street parking. They are not translated, so map them yourself for an English interface.
Tools that pair with this API
JSON to CSV Converter
Convert a JSON array of objects to CSV online. Automatic column headers from the union of all keys, delimiter choice and proper quoting — all in-browser.
Coordinate Converter
Convert GPS coordinates between decimal degrees, degrees-minutes-seconds and decimal minutes instantly. Paste any format like 40°26'46"N and copy the result.
Percentage Change Calculator
Work out the percentage increase or decrease between an old and a new value. See the absolute change and whether it went up or down, instantly and privately.
ParkenDD is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.