BYTETOOLS

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.

No API key requiredCORS enabledHTTPSFree tier

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
curl 'https://api.parkendd.de/Dresden'
JavaScript (fetch)
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);
Python (requests)
import requests

res = requests.get("https://api.parkendd.de/Dresden", timeout=20)
res.raise_for_status()
print(res.json())
Response — HTTP 200 (truncated)
{
  "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

ParameterTypeRequiredDescription
(city)pathOptional`/{City}` returns that city's car parks. Names are capitalised and use German spelling. Dresden
(city list)pathOptionalThe base URL returns every supported city with its coordinates and metadata. /
(timespan)pathOptionalSome 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

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.