NL Parking Rates & Live Availability Monitor
Pricing
from $3.00 / 1,000 parking-results
NL Parking Rates & Live Availability Monitor
Find live parking availability, free spaces, tariffs, EV capacity and stay costs near Dutch addresses. Compare cities, detect status/tariff changes and receive webhook alerts. No API key, from $0.003/record.
Pricing
from $3.00 / 1,000 parking-results
Rating
0.0
(0)
Developer
Dennis
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
21 days ago
Last modified
Categories
Share
NL Parking Rates & Live Availability Monitor ๐ ฟ๏ธ
Clean, structured parking data for the Netherlands: current tariffs, live free-space counts, address search, stay-cost estimates and change alerts, straight from RDW's national Open Parkeerdata feed (Nationaal Parkeer Register). No login or API key is required.
The actor is built for travel planners, parking apps, facility operators, municipalities, repriceurs and real-time monitoring workflows. Instead of a bare snapshot, it can:
- ๐งน Simplify weekday-duplicated tariffs into rules with โฌ/hour rates and
free/metered/daily_capclassification. - ๐ Resolve a free-text address, place or postcode through the open PDOK Locatieserver, then return nearby facilities sorted by distance.
- ๐ Combine multiple queries and filter by price, capacity, EV charging, live availability and freshness; use
offsetandmaxResultsfor pagination. - ๐ถ Estimate a stay from
arrivalAt/departureAtordurationMinutesusing the published tariff periods. - ๐ Detect both live-status and real tariff changes; optionally POST compact change alerts to an HTTPS webhook.
- ๐ก๏ธ Expose
staticFreshness,realtimeFreshness,dataConfidence, source ages and distance so consumers can judge freshness. - ๐๏ธ Isolate scheduled monitors with a stable
monitoringKey, so ad-hoc searches do not overwrite another monitor's baseline.
Only about 543 of the roughly 14,951 facilities in the feed publish live occupancy; the rest have tariffs only (mostly street parking and P+R zones). The actor tells you which is which per record (hasRealtimeData).
When should an AI agent use this?
- "How much does it cost to park at parkeergarage Forum in Groningen right now, and are there free spaces?"
- "Is there still availability in a parking garage in Rotterdam I can drive to now?"
- "Alert me when a specific garage's status flips from available to full."
- "Compare the hourly parking rate across garages in a city before I decide where to park."
- "Which parking facilities in this feed actually report live occupancy, and which only have tariff info?"
- "Find parking near Damrak 1 in Amsterdam and sort the closest facilities with live spaces."
- "What will a two-hour stay at a Groningen garage cost, including the current tariff?"
- "Alert me when a garage's status or published tariff changes."
- "Find the facility ID for a garage by name so I can monitor it in future runs."
What data do you get?
{"identifier": "9f89a6c7-df06-45ea-adf6-0b94088fcb57","name": "parkeergarage Forum","operatorName": "Groningen","address": { "street": "Schoolstraat", "houseNumber": "16", "zipcode": "9712JS", "city": "Groningen", "province": "" },"location": { "lat": 53.219207, "lon": 6.57081 },"usage": "Garage parkeren","capacity": 325,"evLaadpuntenCapaciteit": 10,"tariffs": [{"description": "Garagetarief (1,00 euro/18 min)","kind": "metered","days": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],"validFrom": "00:00", "validUntil": "23:59","rates": [{ "chargeEuro": 1, "chargePeriodMinutes": 18, "pricePerHourEuro": 3.33, "durationFromMinutes": 0, "durationUntilMinutes": null }]},{"description": "Garagetarief (24,00 euro/1440 min)","kind": "daily_cap","days": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],"validFrom": "00:00", "validUntil": "23:59","rates": [{ "chargeEuro": 24, "chargePeriodMinutes": 1440, "pricePerHourEuro": 1, "durationFromMinutes": 0, "durationUntilMinutes": null }]}],"hasRealtimeData": true,"realtime": { "open": true, "full": false, "capacity": 325, "vacantSpaces": 67, "occupancyPercent": 79.4, "status": "available", "lastUpdated": "2026-07-09T14:17:44.000Z" },"distanceKm": 0.42,"staticDataAgeSeconds": 3600,"staticFreshness": "fresh","realtimeAgeSeconds": 120,"realtimeFreshness": "fresh","dataConfidence": "high","changeType": "unchanged","previousStatus": "available","tariffChanged": false,"parkingCostEstimate": { "totalEuro": 7, "currency": "EUR", "durationMinutes": 120, "pricedMinutes": 120, "unpricedMinutes": 0, "method": "tariff_periods", "tariffMatched": true, "arrivalAt": "2026-07-09T14:00:00.000Z", "departureAt": "2026-07-09T16:00:00.000Z" },"sourceUrls": { "static": "https://npropendata.rdw.nl/...", "dynamic": "https://npropendata.rdw.nl/..." }}
Use cases
- Parking-finder apps & dashboards โ one clean call per facility gets tariff, live availability, distance, freshness and optional stay cost together.
- "Notify me when it's full" alerts โ schedule runs with
detectChangeson and routestatus_changedortariff_changedrecords to Slack/e-mail via the optional webhook. - Price comparison โ compare
pricePerHourEuroacross garages in a city before you drive there, or request a concreteparkingCostEstimatefor a stay. - AI agents & MCP tools โ stable JSON with address, multi-query, filter, freshness and cost inputs; set
detectChanges: falsefor one-off lookups. - Facility discovery โ leave
query/addressempty to browse a sample of facilities with live data, then narrow by name or coordinates.
Quick start
Zero-config: returns the first 25 facilities that publish live occupancy, no input needed.
Search by name:
{ "query": "Groningen", "maxResults": 50 }
Search near an address:
{"address": "Damrak 1, Amsterdam","radiusKm": 2,"sortBy": "distance","onlyWithRealtimeData": true,"maxResults": 10}
The address is geocoded once through the open PDOK Locatieserver. distanceKm, searchReference and dataConfidence make the result auditable. Use nearLatitude/nearLongitude instead to skip geocoding.
Compare multiple cities and estimate a stay:
{"queries": ["Groningen", "Rotterdam", "Utrecht"],"durationMinutes": 120,"sortBy": "price","maxResults": 25}
offset applies after the fetched candidate set is filtered and sorted. candidateLimit can be increased when a broad search needs a deeper scan; the automatic window stays bounded to protect run cost.
Monitor specific garages and alert on changes:
{"facilityIds": ["9f89a6c7-df06-45ea-adf6-0b94088fcb57", "76825e73-4c8d-4a9c-9061-6284afcd865c"],"detectChanges": true,"monitoringKey": "my-rotterdam-monitor","webhookUrl": "https://example.com/parking-alerts"}
The first run establishes a baseline. Later runs flag status_changed, tariff_changed or status_and_tariff_changed; a webhook failure is logged but never fails the data run. Use a unique monitoringKey for every independent monitor.
Only currently-available garages right now:
{ "query": "Rotterdam", "onlyAvailableNow": true, "maxResults": 100 }
Input reference
| Field | Description |
|---|---|
facilityIds | Exact RDW facility UUIDs to fetch (skips name/address search) |
query | Case-insensitive name search, e.g. a city or garage name |
address | Free-text address, place or postcode; geocoded through PDOK Locatieserver. Explicit coordinates take precedence |
queries | Batch of up to 20 name/city queries; results are de-duplicated |
fuzzyMatch | Opt-in typo-tolerant matching for name queries (default false) |
nearLatitude/nearLongitude/radiusKm | Only keep facilities within radiusKm (default 5) of this point |
sortBy | relevance, distance, price or availability (default relevance) |
maxPricePerHourEuro | Only return facilities with a known tariff at or below this hourly EUR price |
onlyWithEvCharging | Only return facilities with a known positive EV charging-point capacity (default false) |
minCapacity | Only return facilities with at least this many spaces |
maxResults | Page size after filtering/sorting (default 25, max 2000) |
offset | Number of filtered/sorted records to skip before maxResults (default 0) |
candidateLimit | Maximum candidates fetched before post-fetch filters; 0 uses an automatic bounded window |
onlyWithRealtimeData | Only facilities with live occupancy (default true) |
onlyAvailableNow | Only open, non-full facilities (default false) |
arrivalAt/departureAt | ISO date-times for a stay-cost estimate, up to seven days |
durationMinutes | Alternative stay length for a cost estimate, up to 10,080 minutes |
staleAfterMinutes | Age threshold for fresh versus stale source data (default 30) |
detectChanges | Compare against the previous run and flag status/tariff changes (default true) |
monitoringKey | Stable key isolating snapshot and history state; use default for backwards compatibility |
trackOccupancyHistory | Build up an occupancy time series per facility across scheduled runs (default false) |
maxHistoryPoints | How many past measurements to keep per facility (default 30) |
historyRetentionDays | Days of inactivity before occupancy history is pruned (default 90) |
voorspelBeschikbaarheid | Compare current occupancy with the historical average at the same hour (default false) |
webhookUrl | Optional HTTPS endpoint for compact status/tariff change alerts |
webhookSecret | Optional value sent as X-Parking-Monitor-Secret |
maxResults is the output page size. Post-fetch filters and sorting run before offset; candidateLimit controls how many index candidates are inspected to fill that page. The automatic candidate window is bounded to keep source traffic and cost predictable.
Output additions
Each record now includes distanceKm, staticDataAgeSeconds, staticFreshness, realtimeAgeSeconds, realtimeFreshness, dataConfidence, searchReference, matchedQuery, tariffChanged and โ when a stay window is supplied โ parkingCostEstimate. changeType can be status_changed, tariff_changed or status_and_tariff_changed. A first run is always a baseline snapshot; old snapshots without a tariff fingerprint are upgraded without a false alert.
Pricing
Pay per event: regular facility records are billed at the base parking-result rate; a detected availability-change-alert (a facility's live status actually changed since the last run) is billed at a higher rate. A tariff-only change is exposed as tariff_changed and included in the optional webhook, but it does not add a separate PPE event yet. When trackOccupancyHistory is enabled, each facility that gets a new history point is additionally billed at the occupancy-history-point rate ($0.005). When voorspelBeschikbaarheid is also enabled, each facility with a computable busier/quieter-than-usual comparison is additionally billed at the drukte-voorspelling rate ($0.005).
Data source & reliability
- Parking source: RDW's Open Parkeerdata (Nationaal Parkeer Register), the Dutch government's public parking-data standard (SPDP2.0) โ data.overheid.nl, CC-BY licensed
- Address lookup: the open PDOK Locatieserver is used only when
addressis supplied; it is source-attributed insearchReferenceand needs no API key - No authentication is required; RDW requests use automatic backoff/retry and optional geocoding is bounded
- One broken facility lookup never fails the whole run โ errors are collected per facility in
RUN_SUMMARY - Webhook failures are non-fatal; use
webhookSecretwhen the receiving endpoint supports a shared secret - Facility metadata is business/government data; the actor does not persist account data beyond the configured monitoring scope
FAQ
Why doesn't every facility have live availability? Only municipalities/operators that have installed occupancy sensors publish a dynamicDataUrl. Roughly 543 of roughly 14,951 facilities currently do โ mostly larger garages in bigger cities. Facilities without it still return full tariff information.
Why is a facility's tariff list empty? Its published validity period has expired in the source data. Rather than show stale pricing, the actor drops it โ check staticDataLastUpdated for freshness.
How do I find a facility's ID? Run once with a query or address and no facilityIds โ the returned identifier field is reusable in future runs.
How does address search work? Set address to a free-text address, place or postcode. The actor calls PDOK Locatieserver once, prefers an address centroid, and applies radiusKm; explicit coordinates take precedence.
How is the stay cost calculated? Set arrivalAt and departureAt, or set durationMinutes. The estimate uses the current simplified RDW tariff rules and counts started tariff periods. It is an estimate, not a payment quote; check unpricedMinutes and tariffMatched.
Where is the change-detection history stored? A compact per-facility status and tariff fingerprint lives in a named key-value store selected by monitoringKey. Use a unique key for each independent monitor; default preserves the original store.
What does the webhook send? Only a compact POST containing changed records when status or tariffs change. Non-2xx responses and network errors are reported in RUN_SUMMARY without failing the run.
What does bezettingsGeschiedenis contain? When trackOccupancyHistory is enabled, each facility record gets an array of past {timestamp, occupancyPercent, vacantSpaces} points (oldest first, capped at maxHistoryPoints), built up across scheduled runs via the actor's key-value store. Only facilities with real-time data get history points.
What does drukteVoorspelling contain? When voorspelBeschikbaarheid is enabled, each facility record gets a {gemiddeldeOccupancyPercent, aantalVergelijkbareMetingen, verschilPercentagePunten, richting} object comparing the current occupancy against the historical average at the same hour of day (built from bezettingsGeschiedenis) โ a "busier/quieter than usual for this time" signal rather than a comparison against the all-time average. richting is "drukker"/"rustiger" when the difference exceeds a small noise-margin (5 percentage points), otherwise "gelijk". Stays null until there's at least one prior measurement at the same hour to compare against โ the very first run, or a facility only ever checked at different times of day, always gets null.
Related Actors
Also by this developer:
- NL Waterstanden & Watertemperatuur Monitor โ same profile: a real-time Dutch open-government-data monitoring feed, no login/API key required.
- PDOK Adres Geocoding & Buurtdata โ geocode parking facility addresses to get coordinates and neighbourhood context.
- NL Milieuzones & Zero-Emissiezones Monitor โ same profile: a direct, authentication-free NDW road-traffic-data feed, no scraping involved.
- NL Ziekenhuis Wachttijden Monitor โ same profile: a direct, authentication-free Dutch government REST feed, no scraping involved.
Keywords: nederland parkeren, parkeertarieven, parkeergarage beschikbaarheid, real-time parking availability netherlands, RDW open data, nationaal parkeer register, parking API netherlands, MCP parking tool.
Keywords
netherlands, parking, parking-rates, parking-availability, open-data, rdw, real-time, mcp-tool
Changelog
0.6.0 - Discovery, cost and alert improvements
- Added PDOK-backed
addresssearch, multi-query matching,offset/candidateLimitpagination, sorting and price/EV/capacity filters. - Added stay-cost estimates, static/realtime freshness and
dataConfidencefields. - Added canonical tariff fingerprints with
tariff_changed/status_and_tariff_changedannotations and optional HTTPS webhooks. - Added
monitoringKeyto isolate persistent snapshot/history state while preservingdefaultbackwards compatibility.
0.5.0 - Busier/quieter-than-usual prediction
- Added
voorspelBeschikbaarheid(opt-in, requirestrackOccupancyHistory) โ compares current occupancy against the historical average at the same hour of day, exposed asdrukteVoorspelling. Newdrukte-voorspellingevent ($0.005), only charged when a comparable prior measurement (same hour) exists.
0.4.0
- Added
nearLatitude/nearLongitude/radiusKmfor geographic radius search, using each facility's resolved location. Solves street-parking zones with no city/place name inqueryto search by. No pricing change โ sameparking-facility-recordevent. - Added
fuzzyMatch: opt-in typo-tolerantquerymatching (edit distance + order-independent tokens), for abbreviated/misspelled names or different word order. No pricing change. - Fixed unbounded growth of the occupancy-history key-value store: added
historyRetentionDays(default 90) โ facilities with no new measurement for that long are pruned automatically. No pricing change.
0.3.2 - Bugfix
- The change-detection snapshot is now merged with the previous run's snapshot instead of being fully
replaced, matching the occupancy-history store's existing merge behaviour. Previously, running the actor
with a different
query/facilityIdsbetween scheduled runs could wipe the tracked status of facilities left out of that run, causing a later run to miss a realavailability-change-alert.
0.3.1 - Bugfix
- Fixed
status_changeddetection andtrackOccupancyHistorynever seeing prior-run state: the actor was reading/writing its snapshot/history to Apify's per-Run default key-value store, which is not shared between separate runs. Now uses a named, persistent key-value store. A new baseline will be captured on the next run.
0.3.0
- Added
trackOccupancyHistory(opt-in) โ builds up an occupancy time series per facility across scheduled runs, exposed asbezettingsGeschiedenis. Newoccupancy-history-pointevent ($0.005), only charged for facilities with real-time data that got a new point this run.
0.2.0
- Added
evLaadpuntenCapaciteitโ EV-charging-point capacity, extracted separately from the generalcapacityfield (which some facilities' static feed conflates with EV capacity).nullwhen no specification has achargingPointCapacityvalue;0is a real "no EV charging points" value, not an absence. No pricing change.
0.1.0 - Initial release
- Tariff simplification (weekday-duplicated rules collapsed into unique price structures with computed โฌ/hour rate)
- Live availability normalization (
available/nearly_full/full/closed) - Change detection between runs (
status_changedalerts via Pay-Per-Event) - Facility search by name (
query) or exactfacilityIds