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:
| Layer | Why it is partial |
|---|---|
mpzp_zones | Roughly 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_zones | Gminas are adopting general plans now. Coverage grows every month (what the reform changes). |
grid_capacity | Each DSO publishes capacity in its own format and granularity (how to read it). |
terrain_stats | Computed 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:
mode | status: missing means |
|---|---|
requires | The 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. |
screens | The 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
| Cadence | Layers |
|---|---|
| Daily | Airspace (AUP/UUP), air quality |
| Weekly | Grid capacity, building permits, transactions, Plan Ogólny |
| Monthly | MPZP zones and plans, environmental layers, OSM-derived layers |
| Quarterly | Parcels, 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.