NL Parking Rates & Live Availability Monitor avatar

NL Parking Rates & Live Availability Monitor

Pricing

from $3.00 / 1,000 parking-results

Go to Apify Store
NL Parking Rates & Live Availability Monitor

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

Dennis

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

21 days ago

Last modified

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_cap classification.
  • ๐Ÿ“ 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 offset and maxResults for pagination.
  • ๐Ÿ’ถ Estimate a stay from arrivalAt/departureAt or durationMinutes using 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 detectChanges on and route status_changed or tariff_changed records to Slack/e-mail via the optional webhook.
  • Price comparison โ€” compare pricePerHourEuro across garages in a city before you drive there, or request a concrete parkingCostEstimate for a stay.
  • AI agents & MCP tools โ€” stable JSON with address, multi-query, filter, freshness and cost inputs; set detectChanges: false for one-off lookups.
  • Facility discovery โ€” leave query/address empty 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

FieldDescription
facilityIdsExact RDW facility UUIDs to fetch (skips name/address search)
queryCase-insensitive name search, e.g. a city or garage name
addressFree-text address, place or postcode; geocoded through PDOK Locatieserver. Explicit coordinates take precedence
queriesBatch of up to 20 name/city queries; results are de-duplicated
fuzzyMatchOpt-in typo-tolerant matching for name queries (default false)
nearLatitude/nearLongitude/radiusKmOnly keep facilities within radiusKm (default 5) of this point
sortByrelevance, distance, price or availability (default relevance)
maxPricePerHourEuroOnly return facilities with a known tariff at or below this hourly EUR price
onlyWithEvChargingOnly return facilities with a known positive EV charging-point capacity (default false)
minCapacityOnly return facilities with at least this many spaces
maxResultsPage size after filtering/sorting (default 25, max 2000)
offsetNumber of filtered/sorted records to skip before maxResults (default 0)
candidateLimitMaximum candidates fetched before post-fetch filters; 0 uses an automatic bounded window
onlyWithRealtimeDataOnly facilities with live occupancy (default true)
onlyAvailableNowOnly open, non-full facilities (default false)
arrivalAt/departureAtISO date-times for a stay-cost estimate, up to seven days
durationMinutesAlternative stay length for a cost estimate, up to 10,080 minutes
staleAfterMinutesAge threshold for fresh versus stale source data (default 30)
detectChangesCompare against the previous run and flag status/tariff changes (default true)
monitoringKeyStable key isolating snapshot and history state; use default for backwards compatibility
trackOccupancyHistoryBuild up an occupancy time series per facility across scheduled runs (default false)
maxHistoryPointsHow many past measurements to keep per facility (default 30)
historyRetentionDaysDays of inactivity before occupancy history is pruned (default 90)
voorspelBeschikbaarheidCompare current occupancy with the historical average at the same hour (default false)
webhookUrlOptional HTTPS endpoint for compact status/tariff change alerts
webhookSecretOptional 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 address is supplied; it is source-attributed in searchReference and 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 webhookSecret when 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.

Also by this developer:


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 address search, multi-query matching, offset/candidateLimit pagination, sorting and price/EV/capacity filters.
  • Added stay-cost estimates, static/realtime freshness and dataConfidence fields.
  • Added canonical tariff fingerprints with tariff_changed/status_and_tariff_changed annotations and optional HTTPS webhooks.
  • Added monitoringKey to isolate persistent snapshot/history state while preserving default backwards compatibility.

0.5.0 - Busier/quieter-than-usual prediction

  • Added voorspelBeschikbaarheid (opt-in, requires trackOccupancyHistory) โ€” compares current occupancy against the historical average at the same hour of day, exposed as drukteVoorspelling. New drukte-voorspelling event ($0.005), only charged when a comparable prior measurement (same hour) exists.

0.4.0

  • Added nearLatitude/nearLongitude/radiusKm for geographic radius search, using each facility's resolved location. Solves street-parking zones with no city/place name in query to search by. No pricing change โ€” same parking-facility-record event.
  • Added fuzzyMatch: opt-in typo-tolerant query matching (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/facilityIds between scheduled runs could wipe the tracked status of facilities left out of that run, causing a later run to miss a real availability-change-alert.

0.3.1 - Bugfix

  • Fixed status_changed detection and trackOccupancyHistory never 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 as bezettingsGeschiedenis. New occupancy-history-point event ($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 general capacity field (which some facilities' static feed conflates with EV capacity). null when no specification has a chargingPointCapacity value; 0 is 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_changed alerts via Pay-Per-Event)
  • Facility search by name (query) or exact facilityIds