Skip to content
Zonio Developers

Coverage & freshness

National by default

Every layer Zonio publishes is loaded for the whole country, not a demo city. A layer is only marked national once its row count has been checked against the publisher's own total.

Some layers are inherently partial because the public data is:

LayerWhy it is partial
mpzp_zonesRoughly a third of Poland is covered by a local plan, and gminas publish them through their own services of varying quality. Plan boundaries are national; zone polygons are added gmina by gmina.
plan_ogolny_zonesGminas are adopting general plans now. Coverage grows every month (what the reform changes).
grid_capacityEach DSO publishes capacity in its own format and granularity (how to read it).
terrain_statsComputed per parcel from LIDAR; rolling out powiat by powiat.

GET /regions?q=… returns, for any region, which layers have data there. The zonio://regions/{teryt} MCP resource does the same for agents, and every gmina's coverage and general-plan status is visible on the Zonio national map.

No data is not no

The most dangerous answer a land-data product can give is "no constraints found" when the constraint layer simply does not cover the area. Zonio separates the two.

Every search response includes a coverage entry per criterion:

modestatus: missing means
requiresThe criterion must be proven true, and the layer has no data here. The search returns blocked: true and no results; it does not pretend nothing qualifies.
screensThe criterion excludes bad parcels, and the layer has no data here. Results are returned unscreened on that criterion; you must tell the user.

Reports and MCP tool outputs follow the same rule, and our tool descriptions instruct agents to surface every missing criterion.

Refresh cadence

CadenceLayers
DailyAirspace (AUP/UUP), air quality
WeeklyGrid capacity, building permits, transactions, Plan Ogólny
MonthlyMPZP zones and plans, environmental layers, OSM-derived layers
QuarterlyParcels, buildings, roads (BDOT10k), terrain

Each refresh only touches a table in a final atomic step, so the API never serves a half-loaded layer. GET /layers returns refreshed_at for each layer, and every row carries its own fetch time. See Provenance & pipeline.