// ai summary · launch·10 Oct 2026·7 min read

What does parking here actually cost — for my stay?

Parking NL answers that for every public parking area in the Netherlands: the real price for your arrival time and duration, cheapest first, with the free spots, live garage spaces and the zones drawn on the map.

AI summary —written by an AI agent from a brief I gave it and from the project's own docs. The product is real and live at parking.davidbroza.dev; the prose isn't hand-written.
RDW open dataOpenStreetMapMapLibre + PMTilesMCP
Parking NL in Scheveningen: the 'in this area' card with the price where you are first, then cheaper alternatives, zones filled by price
Scheveningen: the price in this area first, then a cheaper alternative only when it's worth the walk.

// the question

Not "€ per hour". The price of my stay.

Parking signs and most parking maps give a rate per hour. The question a driver actually has is different: where can I park for 3 hours from 14:00 for the least money? The answer depends on pay hours, day caps, progressive tariffs, evening and day cards, holidays — and whether there's a free street ten minutes' walk away.

Parking NL does that maths for every option around you. Pick a time and a duration (30 minutes up to 8 hours), and you get a list sorted by the total price, with free spots first. It starts at your location, the map polygons are coloured by the price for your stay, and live garages show their free spaces.

Parking NL in Rotterdam centre: options sorted by the price for your stay, garage badges with capacity and live free spaces
Rotterdam centre: sorted by what your stay costs. Garage badges show capacity and live free spaces.

// coverage

Every public parking area in the national register.

count (10 Oct 2026)
Public parking areas4,833
Municipalities present301 of 342 (264 with tariffs)
Areas with a computable tariff3,956 (3,589 of them placed on the map)
Garages with live occupancy429
Free spots from OpenStreetMap17,394 clusters
Zone shapes3,423 real polygons + 910 approximate (dashed); 500 without a shape

The free spots come from OpenStreetMap parking tagged fee=no, minus private and customer-only parking, and minus 3,232 spots that sit inside a paid street zone. A free spot always links to its OSM object and says it's community-maintained: check the signs.

Phone: a parking option near the Ziggo Dome with its tariff and the walking route to the venue
Phone: Rotterdam centre in destination mode, price here first and a cheaper alternative below
Mobile-first: the walking route to the Ziggo Dome, and Rotterdam with the saving one card down. Navigate hands off to Apple Maps, Google Maps or Waze.

// where the data comes from

Open data only.

  • RDW Open Data Parkeren (CC-0): 23 tables — areas, regulations, time frames, fare parts, special days, capacity, entrances, zone polygons. Re-exported nightly.
  • NPR open parking data: 544 live garage feeds, 429 matched to areas on the map.
  • OpenStreetMap (ODbL): 458,564 parking objects, for free spots and garage/lot outlines.
  • Gemeente Amsterdam open data: parking bays, for Amsterdam exception zones.
  • PDOK: address and place search.

The tariff calculator is one pure function shared by the website, the API and the AI connector. It handles day and time frames, progressive and step pricing, day caps, optional products like day and evening cards (it picks the cheapest valid combination) and holidays. Fifteen tests pin it to real rules from Amsterdam, Rotterdam, Utrecht, Delft and Pijnacker.

// for ai assistants

"Find me parking at the Rijksmuseum for 3 hours."

The same engine is an MCP server at /mcp and a REST API with an OpenAPI spec, documented on /developers. Add it to Claude, ChatGPT, Cursor or Grok and ask in plain words. Each answer has the price for the stay, walking time, live free spaces, a data-quality flag, navigation links and a spoken_summary for voice and in-car use.

A real answer from the live API, for Monday 12 October, 3 hours from 14:00:

find_parking("Rijksmuseum Amsterdam", arrival 14:00, 180 min)

1. Garage Albert Cuyp        €13.00   7 min walk   live: 50 of 600 free
2. Garage Heinekenplein      €13.80   9 min walk   live: 150 free
3. Parking de Hoofdstad      €14.40   6 min walk

   all three: tariff_outdated = true

Note the last line: all three garages carry a tariff the operator last updated before 2024, and the answer says so instead of pretending. More on that below.

The Parking NL developers page: MCP endpoint, REST endpoints, OpenAPI, the find_parking, get_tariff and geocode tools
/developers: the MCP endpoint, REST API, OpenAPI spec and copy-paste configs for each assistant.

The app is free for drivers — no account, no ads. Developers get anonymous access (30 calls/min, 500/day per IP) or an API key; plans for higher volumes and data licences are on /pricing. It's early access and the prices are indicative.

// how accurate is it

7 out of 10 — and the 3 misses are the data, not the maths.

I checked 10 locations against the official 2026 municipal tariff regulations. 7 came out exactly right for the checked stay — Rotterdam, Utrecht, Den Haag (including the steep progressive streets in the old centre), Delft street zones, a free P+R.

misswhy
Delft Phoenixgarage and ZuidpoortgarageThe operator's RDW registration still carries 2021 rates, about 10–15% too low (€3.60 vs €4.00 for 1 h)
Amsterdam centreRight hourly rate (€8.05), but RDW still lists pay hours 09–24 while the inner city is now paid 24/7, so night stays come out too cheap. RDW also has no geometry for Amsterdam's street tariff areas, so they can't be placed on the map

The calculator reproduced every published rule exactly; every error came from input data that's out of date. So the app now flags it: of the 3,956 priced areas, 1,813 carry tariffs last changed before 2024. Those get a "tariff may be outdated" label, and where there's no usable price at all, it says "price unknown" rather than guessing.

Phone: Garage Parkstraat in Den Haag labelled 'tariff may be outdated' and 'price unknown'
Honest labels: "tariff may be outdated" and "price unknown" when part of the stay falls outside the hours the operator registered.

// what's new · 11 oct 2026

Price here first, then the cheaper option

The app has been redesigned around one question: what does it cost here? Most of the changes came out of four rounds of synthetic UX testing, and real people now test it in the live app with Verbatim. All screenshots below are from production.

  • Information hierarchy. The top card shows the zone or garage you're in (or the nearest within 150 m) with its price. Below it, a cheaper alternative appears only when it saves at least €1 and 20%, is at most 15 minutes further, is fully priced and is legal for you. Otherwise the card says there's no cheaper option nearby. Everything else (list, sort, time) is one tap away, and filters, walking rings and restrictions live in one map menu.
  • My location vs destination. A clear mode pill ("Mijn locatie", "Bestemming" or "Kaartgebied") shows whether you're looking where you stand, at a place you searched, or at the map area.
  • Walking route on the map from the parking spot to your destination, plus optional 5/10/15-minute walking rings.
  • In-car layout. A landscape layout for car screens like Tesla's (1180×660), with tap targets of at least 56 px.
  • Installable app with offline. It's a PWA with a manifest, icons, splash screen and a service worker that caches map tiles. A reopened app still shows your last results without a network.
  • Accessibility. In an axe-core audit (WCAG 2.2 AA) across every page, both themes, phone and desktop, serious or critical issues went from 71 to 0. Lighthouse mobile accessibility scores 98–100.
  • Performance. The map loads only after you tap it on devices without GPU acceleration, and there's zero layout shift. In the latest three Lighthouse mobile runs, performance scored 85–90.
  • Deploy gate. Each deploy runs seven checks against production: answer sanity, bottom-sheet touch drag, modes, walking route, in-car layout, axe accessibility and map-control spacing. Any failure rolls the deploy back automatically.
  • Tidier map controls. The controls now sit in one top-right cluster with 12 px gaps, and the touch zoom buttons are 44 px (56 px in the car). A spacing check guards it on every deploy.
  • Richer MCP/API answers. Every result now says how its price was found (official, estimated or unknown), how fresh the tariff is, and the occupancy status (live, stale, restricted or not reported), with filters on top.
Scheveningen on iPhone in 'Mijn locatie' mode: the 'Hier' card shows €2.75 for the zone you're standing in, 'no cheaper option nearby'
Installed app in Utrecht: destination mode, €8.01 at Utrecht Centraal, 'Bespaar €4.51' with a cheaper garage
Left: my location in Scheveningen, the price where I'm standing. Right: the installed app at Utrecht Centraal, with a €4.51 saving one card down.
Desktop: garage detail near the Ziggo Dome with the tariff table and the walking route drawn on the map
Ziggo Dome: the garage detail with its tariff, and the walking route to the venue on the map.
Ziggo Dome on iPhone with walking rings around the venue
Search overlay with landmark results for 'Rijksmus'
Walking rings around the Ziggo Dome, and the full-screen search with landmarks.
Parking NL in-car layout at 1180×660 for a Tesla screen: list on the left, map on the right, large tap targets
The in-car layout at 1180×660, a Tesla screen.

Garages: what open data can and can't do

The national open parking feeds now add 220 garages that only exist there, every Q-Park garage among them. They're on the map with location, operator and capacity. What they don't have is a usable price or live count. The live feeds for those 220 garages are restricted (HTTP 401), and Q-Park's website (which now also hosts APCOA) only allows personal, non-commercial reuse. So those garages honestly say "price unknown" instead of guessing. Open data can't fix that; access from the operators can, and I've drafted a data-partnership request. Across the other garages, 247 public live feeds work and 72 are stale.

Rotterdam centre on desktop: garage badges with capacity and live free spaces next to zone prices
Rotterdam centre: garage badges with capacity and live free spaces, zones filled by price.

A sturdier data pipeline

RDW publishes zone shapes as one row per polygon part, and the old loader kept only the last part. 537 areas lost 1,764 parts; they're now merged. Each source has its own adapter with retries, every area gets quality flags and a confidence score, and there's a public coverage page. Data refreshes nightly at 05:30 (Amsterdam time) with safety checks: if RDW fails, or priced areas drop by more than 15%, nothing is uploaded.

// limits

What it doesn't do (yet).

  • Prices are indicative. They're only as fresh as what each municipality or operator registers. Check the signs before you pay. Rotterdam's centre rate goes from €6.42 to €7.20/h on 1 November 2026 — correct only once Rotterdam updates the register.
  • 41 municipalities are missing from the register entirely.
  • Shapes. 910 zones are approximate hulls around pay meters or entrances, drawn dashed. Utrecht publishes no zone geometry, so all its street zones are approximate. 500 areas have no shape at all.
  • Free spots come from OpenStreetMap and are community-maintained.
  • Live occupancy covers 429 garages; some feeds go stale for days.
  • Walking times use a free public routing server (fair use only), so heavy traffic falls back to estimates marked "≈".
  • Netherlands only, no reservations, no payments.

// stack

TanStack Start on Cloudflare Workers, React 19, Tailwind 4. MapLibre GL with a Protomaps basemap — a Netherlands extract as PMTiles in R2, so no paid map tiles — and the zone polygons as PMTiles too. The data pipeline is Python, DuckDB and Shapely; a refresh from RDW to R2 takes about 30 seconds. Same no-tile-server trick as in map tiles without a tile server.

Try it at parking.davidbroza.dev — or read the project page →

Note: this article was written by an AI from my brief and the project's docs. Parking NL and every number here are real — the prose isn't hand-written.