`. MCP tool results include it as `map_url`.
# Data catalogue
Zonio runs a dedicated geospatial pipeline that fetches Polish public data from dozens of government and open sources, normalises it into one PostGIS database, and keeps it fresh. The API and the MCP server read from that database directly.
## Explore the data on zonio.tech
The [zonio.tech layer atlas](https://zonio.tech/en/layers/) is the reference for what Zonio holds: every layer has its own page with a description, the publisher, a link to the original source and a live map preview. Use it to check what a layer contains before you query it, and the [national map](https://zonio.tech/en/map/) to see coverage gmina by gmina.
## For developers
These pages cover what the atlas does not: how each layer is exposed through the API, and how to reason about gaps and freshness in your code.
# Layers
Each layer is produced by one pipeline topic and can be queried through `GET /layers/{id}/features`, used in search filters, and, where marked, rendered as vector tiles. `GET /layers` returns this list live, with feature counts and refresh dates. The last column links to each layer's page on [zonio.tech](https://zonio.tech/en/layers/), with a description, the publisher and a live map preview.
**Served via:** `api`: queryable through the REST API and MCP · `tiles`: also a PMTiles archive · `wms`: proxied raster.
## Cadastre & administration
On zonio.tech: [Cadastre](https://zonio.tech/en/layers/cadastre/)
| Layer | Contents | Source | Served via | On zonio.tech |
| --- | --- | --- | --- | --- |
| `parcels` | Cadastral parcels with geometry, area and TERYT | GUGiK EGiB | api, tiles | [Parcels](https://zonio.tech/en/layers/cadastre/cadastral-parcels/) · [Soil classes](https://zonio.tech/en/layers/land-cover-land-use/land-use-soil-classes-egib/) |
| `cadastral_units` | Cadastral units (~3.2 k) and precincts (~54 k) | GUGiK PRG | api | [Units](https://zonio.tech/en/layers/cadastre/cadastral-units-jednostki/) · [Districts](https://zonio.tech/en/layers/cadastre/cadastral-districts-obreby/) |
| `admin_bounds` | Voivodeships, powiats, gminas | GUGiK PRG | api | [Gminas](https://zonio.tech/en/layers/cadastre/municipality-boundaries/) · [Powiats](https://zonio.tech/en/layers/cadastre/county-boundaries/) · [Voivodeships](https://zonio.tech/en/layers/cadastre/voivodeship-boundaries/) |
## Planning
On zonio.tech: [Spatial planning](https://zonio.tech/en/layers/spatial-planning/)
| Layer | Contents | Source | Served via | On zonio.tech |
| --- | --- | --- | --- | --- |
| `mpzp_plans` | Local plan boundaries, adoption dates, documents | National INSPIRE MPZP service | api | [MPZP](https://zonio.tech/en/layers/spatial-planning/local-zoning-plans-mpzp/) |
| `mpzp_zones` | Local plan zones with raw and normalised symbols | Gmina WFS / ArcGIS services | api, tiles | [MPZP](https://zonio.tech/en/layers/spatial-planning/local-zoning-plans-mpzp/) |
| `plan_ogolny_zones` | General plan zones and status | Gmina services | api, tiles | [General plan](https://zonio.tech/en/layers/spatial-planning/municipal-general-plan/) |
| `studium_zones` | Legacy directional study designations | Gmina services | api, tiles | [Studium](https://zonio.tech/en/layers/spatial-planning/studium-suikzp-archival/) |
| `gunb_permits` | Building permits, joined to parcels | GUNB | api | [Building permits](https://zonio.tech/en/layers/buildings-development/building-permits-gunb/) |
| `psi` | Polish Investment Zone operator jurisdictions | PAIH / zone operators | api | [Investment Zone](https://zonio.tech/en/layers/spatial-planning/polish-investment-zone/) |
## Environment
On zonio.tech: [Environment](https://zonio.tech/en/layers/environment/) · [Land cover & land use](https://zonio.tech/en/layers/land-cover-land-use/)
| Layer | Contents | Source | Served via | On zonio.tech |
| --- | --- | --- | --- | --- |
| `env_layers` | Natura 2000, national and landscape parks, reserves, flood risk, wetlands | GDOŚ, Wody Polskie | api, tiles | [Protected areas](https://zonio.tech/en/layers/environment/protected-areas-gdos/) · [Flood hazard](https://zonio.tech/en/layers/hazards/flood-hazard-isok/) |
| `groundwater` | Major groundwater reservoirs (GZWP) and protection areas | PIG-PIB | api | [Category](https://zonio.tech/en/layers/environment/) |
| `forest_stands` | Managed-forest stands | Forest Data Bank (BDL) | api, tiles | [Forests](https://zonio.tech/en/layers/land-cover-land-use/forests-bdl/) |
| `land_cover` | Arable land, orchards, grassland, forest | BDOT10k | api | [Land cover](https://zonio.tech/en/layers/land-cover-land-use/land-cover-bdot10k/) |
| `air_quality` | Air-quality index per station | GIOŚ | api, tiles | [Air quality](https://zonio.tech/en/layers/environment/air-quality-gios/) |
## Energy & grid
On zonio.tech: [Power grid](https://zonio.tech/en/layers/power-grid/) · [Renewables](https://zonio.tech/en/layers/renewables/)
| Layer | Contents | Source | Served via | On zonio.tech |
| --- | --- | --- | --- | --- |
| `power_substations` | HV and MV substations with voltage | BDOT10k, OSM | api | [PSE](https://zonio.tech/en/layers/power-grid/hv-ehv-substations-pse/) · [OSM](https://zonio.tech/en/layers/power-grid/hv-ehv-substations-osm/) · [BDOT10k](https://zonio.tech/en/layers/power-grid/transformer-stations-bdot10k/) |
| `power_lines` | 110 / 220 / 400 kV lines and MV lines | BDOT10k, OSM | api | [PSE](https://zonio.tech/en/layers/power-grid/transmission-lines-pse/) · [OSM](https://zonio.tech/en/layers/power-grid/hv-ehv-power-lines-osm/) · [BDOT10k](https://zonio.tech/en/layers/power-grid/power-lines-bdot10k/) |
| `grid_capacity` | Available connection capacity per substation | DSO disclosures | api, tiles | [Grid capacity](https://zonio.tech/en/layers/power-grid/grid-connection-capacity-dsos-pse/) |
| `solar_irradiance` | Annual PV yield grid (kWh/kWp) | EU JRC PVGIS | api | [Solar irradiance](https://zonio.tech/en/layers/renewables/solar-irradiance-pvgis/) |
| `oze_installations` | Existing solar, wind, biogas and hydro installations | OSM | api | [Wind](https://zonio.tech/en/layers/renewables/wind-turbines-osm/) · [Solar](https://zonio.tech/en/layers/renewables/solar-pv-plants-osm/) · [Hydro](https://zonio.tech/en/layers/renewables/hydropower-plants-osm/) · [Biogas](https://zonio.tech/en/layers/renewables/biomass-biogas-osm/) |
| `wind_exclusion` | Statutory setback zones around buildings | Derived from buildings | api | [700 m buffer](https://zonio.tech/en/layers/renewables/700-m-from-wind-turbines/) |
| `data_centers` | Existing data centres | OSM | api | [Data centres](https://zonio.tech/en/layers/power-grid/data-centers-osm/) |
| `ev_chargers` | EV charging stations | OpenChargeMap | api | [EV charging](https://zonio.tech/en/layers/power-grid/ev-charging-openchargemap/) |
## Transport & infrastructure
On zonio.tech: [Infrastructure](https://zonio.tech/en/layers/infrastructure/) · [Planned infrastructure](https://zonio.tech/en/layers/planned-infrastructure/) · [Hydrography](https://zonio.tech/en/layers/hydrography/)
| Layer | Contents | Source | Served via | On zonio.tech |
| --- | --- | --- | --- | --- |
| `roads` | Classified road segments | BDOT10k | api, tiles | [Roads](https://zonio.tech/en/layers/infrastructure/roads-bdot10k/) |
| `transport_stops` | Bus, tram and rail stops | GTFS feeds, OSM | api, tiles | [Transit stops](https://zonio.tech/en/layers/infrastructure/transit-stops/) |
| `planned_roads`, `planned_railways` | Roads and railways planned or under construction | OSM, GDDKiA | api | [Roads](https://zonio.tech/en/layers/planned-infrastructure/planned-roads/) · [Railways](https://zonio.tech/en/layers/planned-infrastructure/planned-railways/) |
| `cpk` | CPK airport-and-rail programme zones and corridors | CPK | api | [Area](https://zonio.tech/en/layers/planned-infrastructure/port-polska-surrounding-area/) · [Corridors](https://zonio.tech/en/layers/planned-infrastructure/port-polska-corridors/) |
| `waterways` | Rivers, canals and water bodies | BDOT10k | api | [Rivers](https://zonio.tech/en/layers/hydrography/rivers-canals-bdot10k/) · [Lakes](https://zonio.tech/en/layers/hydrography/lakes-reservoirs-bdot10k/) |
| `hydrants` | Fire hydrants and water tanks | OSM | api | [Fire hydrants](https://zonio.tech/en/layers/infrastructure/fire-hydrants/) |
| `industrial_areas` | Industrial and storage land, named industrial parks | BDOT10k | api | [Category](https://zonio.tech/en/layers/buildings-development/) |
## Buildings & services
On zonio.tech: [Buildings & development](https://zonio.tech/en/layers/buildings-development/) · [Cultural heritage](https://zonio.tech/en/layers/cultural-heritage/)
| Layer | Contents | Source | Served via | On zonio.tech |
| --- | --- | --- | --- | --- |
| `buildings` | Building footprints with function and floors | BDOT10k | api, tiles | [Buildings](https://zonio.tech/en/layers/buildings-development/buildings-bdot10k/) |
| `services_poi` | Schools, clinics, shops and other services | Derived from BDOT10k | api | [Services](https://zonio.tech/en/layers/buildings-development/services-bdot10k/) |
| `heritage_sites` | Registered monuments | NID, OSM | api | [Heritage](https://zonio.tech/en/layers/cultural-heritage/heritage-historic-sites/) · [Archaeology](https://zonio.tech/en/layers/cultural-heritage/archaeological-sites-nid/) |
## Terrain
On zonio.tech: [Terrain relief](https://zonio.tech/en/layers/terrain-relief/)
| Layer | Contents | Source | Served via | On zonio.tech |
| --- | --- | --- | --- | --- |
| `terrain_stats` | Elevation and slope statistics per parcel | GUGiK LIDAR DTM | api | [Slope](https://zonio.tech/en/layers/terrain-relief/terrain-slope-lidar/) |
| `contours` | 5 m contour lines | GUGiK LIDAR DTM | tiles | [Contours](https://zonio.tech/en/layers/terrain-relief/contour-lines-lidar/) |
| `terrain_hillshade` | Shaded relief | GUGiK WMS | wms | [Hillshade](https://zonio.tech/en/layers/terrain-relief/hillshade-nmt/) |
| `ortho` | Orthophotomap | GUGiK WMS | wms | n/a |
## Risk & airspace
On zonio.tech: [Hazards](https://zonio.tech/en/layers/hazards/) · [Infrastructure](https://zonio.tech/en/layers/infrastructure/)
| Layer | Contents | Source | Served via | On zonio.tech |
| --- | --- | --- | --- | --- |
| `mining_areas` | Mining areas and terrains | PIG-PIB MIDAS | api, tiles | [Mining](https://zonio.tech/en/layers/hazards/mining-areas-terrains-midas/) · [Landslides](https://zonio.tech/en/layers/hazards/landslides-sopo-pig-pib/) |
| `aviation_obstacles` | Obstacle limitation surfaces for 66 aerodromes and the national obstacle register | ULC | api, tiles | [Height limits](https://zonio.tech/en/layers/infrastructure/height-limits-ols/) · [Obstacles](https://zonio.tech/en/layers/infrastructure/aviation-obstacles/) |
| `airspace` | Controlled, restricted and temporary airspace | PAŻP | api, tiles | [Airspace](https://zonio.tech/en/layers/infrastructure/airspace-zones-pansa/) |
## Market & society
On zonio.tech: [Market](https://zonio.tech/en/layers/market/)
| Layer | Contents | Source | Served via | On zonio.tech |
| --- | --- | --- | --- | --- |
| `transactions` | Notarised real-estate transactions | GUGiK RCN | api | [Transaction prices](https://zonio.tech/en/layers/market/transaction-prices/) |
| `lokale` | Apartment sales with floor, rooms and market | GUGiK RCN | api | [Transaction prices](https://zonio.tech/en/layers/market/transaction-prices/) |
| `prices` | Residential price medians per city | Derived from RCN | api | [Category](https://zonio.tech/en/layers/market/) |
| `offer_prices` | Developer primary-market offer prices per gmina | Developer disclosures | api | [Category](https://zonio.tech/en/layers/market/) |
| `epc` | Energy-performance certificates | National EPC register | api | [Category](https://zonio.tech/en/layers/market/) |
| `demographics` | Population and density | GUS | api | n/a |
| `kowr_land` | State agricultural land stock | KOWR | api, tiles | [KOWR land](https://zonio.tech/en/layers/land-cover-land-use/state-agricultural-land-kowr/) |
| `protests` | Local opposition signals for renewable projects, per gmina | News + language model | api | [Protests](https://zonio.tech/en/layers/spatial-planning/protests-renewables-competition/) |
# Scenarios
A scenario is a site-selection screen for one asset type. **Hard criteria** must all pass; **parameters** tune them; **ranking signals** order the survivors with default weights you can override per request. Agents use them through the [`find_sites`](/mcp/tools#find_sites) MCP tool, and [plain-language search](/mcp/natural-language-search) applies the right one when a request names an asset type. In code, use them as a template for [`POST /search/parcels`](/guides/site-selection).
## Renewable energy
Built on [grid connection capacity](https://zonio.tech/en/layers/power-grid/grid-connection-capacity-dsos-pse/), [HV/EHV substations](https://zonio.tech/en/layers/power-grid/hv-ehv-substations-pse/), [MV power lines](https://zonio.tech/en/layers/power-grid/power-lines-bdot10k/), [solar irradiance](https://zonio.tech/en/layers/renewables/solar-irradiance-pvgis/), [wind setbacks](https://zonio.tech/en/layers/renewables/700-m-from-wind-turbines/), [land cover](https://zonio.tech/en/layers/land-cover-land-use/land-cover-bdot10k/), [protected areas](https://zonio.tech/en/layers/environment/protected-areas-gdos/) and [rivers](https://zonio.tech/en/layers/hydrography/rivers-canals-bdot10k/). New to grid capacity? Read [how to check connection capacity in Poland](https://zonio.tech/en/articles/grid-connection-capacity-poland/).
| Scenario | Hard criteria | Min area | Ranked by |
| --- | --- | --- | --- |
| `solar_farm_site` | No blocking zone · no environmental risk nearby · near a substation · minimum solar yield · slope within tolerance · not forest or orchard | 1 ha | grid distance 40 · solar yield 30 · area 20 · slope 10 |
| `wind_farm_site` | No blocking zone · statutory setback clear · no environmental risk within 1 km · near a substation | 0.5 ha | grid distance 50 · area 50 |
| `bess_storage` | No blocking zone · grid capacity available · near a substation · no environmental risk · slope within tolerance | 0.2 ha | grid capacity 55 · grid distance 30 · area 15 |
| `agrivoltaics_site` | Agricultural land · near an MV line · no blocking zone · not forest or orchard · slope within tolerance · no environmental risk | 2 ha | grid distance 45 · solar yield 30 · area 25 |
| `biogas_plant` | Agricultural land · no blocking zone · near a substation · no environmental risk | 0.5 ha | area 45 · grid distance 35 · slope 20 |
| `data_center_site` | Grid capacity ≥ 20 MW · near a substation · near water · no environmental risk · slope within tolerance | 0.5 ha | grid capacity 45 · water distance 30 · area 25 |
## Real estate
Built on [local zoning plans](https://zonio.tech/en/layers/spatial-planning/local-zoning-plans-mpzp/), [buildings](https://zonio.tech/en/layers/buildings-development/buildings-bdot10k/), [services](https://zonio.tech/en/layers/buildings-development/services-bdot10k/), [transit stops](https://zonio.tech/en/layers/infrastructure/transit-stops/), [planned roads](https://zonio.tech/en/layers/planned-infrastructure/planned-roads/), [heritage](https://zonio.tech/en/layers/cultural-heritage/heritage-historic-sites/), [terrain slope](https://zonio.tech/en/layers/terrain-relief/terrain-slope-lidar/) and [KOWR land](https://zonio.tech/en/layers/land-cover-land-use/state-agricultural-land-kowr/).
| Scenario | Hard criteria | Min area | Ranked by |
| --- | --- | --- | --- |
| `urban_residential_development` | Residential zoning · vacant · no environmental risk · slope within tolerance · near transit | 500 m² | area 40 · transit distance 35 · slope 25 |
| `housing_estate_site` | Residential zoning · vacant · near a school · near transit · no environmental risk · slope within tolerance · no KOWR pre-emption | 0.5 ha | area 35 · transit distance 35 · slope 30 |
| `retail_park_site` | Commercial zoning · vacant · near transit · no environmental risk · slope within tolerance | 0.5 ha | area 45 · transit distance 45 · slope 10 |
| `logistics_warehouse` | Near a planned or trunk road · no environmental risk · slope within tolerance | 1 ha | area 50 · slope 30 · transit distance 20 |
| `brownfield_redevelopment` | Industrial zoning · existing low-rise building · slope within tolerance · not heritage · not contaminated | 0.1 ha | area 50 · floors 30 · slope 20 |
| `public_land_opportunity` | Overlaps state agricultural land (KOWR) | 0.3 ha | area 60 · transit distance 40 |
## Parameters
| Parameter | Unit | Default | Range |
| --- | --- | --- | --- |
| `min_area_sqm` | m² | per scenario | n/a |
| `env_buffer_m` | m | 100 | 0–2,000 |
| `max_slope_pct` | % | 30 | 5–60 |
| `substation_km` | km | 10 | 1–30 |
| `mv_line_km` | km | 2 | 0.5–10 |
| `capacity_km` | km | 5 | 1–30 |
| `min_capacity_mw` | MW | 10 | 1–200 |
| `min_yield_kwh_kwp` | kWh/kWp | 1,000 | 880–1,120 |
| `max_stop_m` | m | 800 | 100–2,000 |
| `school_m` | m | 1,500 | 500–3,000 |
| `planned_road_km` | km | 5 | 1–30 |
| `water_km` | km | 3 | 1–20 |
| `max_floors` | floors | 2 | 1–5 |
Scenarios override some defaults: `wind_farm_site` uses a 1 km environmental buffer and 15 km substation reach, for example. The [`list_scenarios`](/mcp/tools#list_scenarios) tool always returns the effective values.
## Need another asset type?
Scenarios are configuration on our side, not code. Tell us what you are siting (hotels, cemeteries, PV on rooftops, hydrogen) and the criteria an expert would apply. [Get in touch](/access).
# 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`](https://zonio.tech/en/layers/spatial-planning/local-zoning-plans-mpzp/) | 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`](https://zonio.tech/en/layers/spatial-planning/municipal-general-plan/) | Gminas are adopting general plans now. Coverage grows every month ([what the reform changes](https://zonio.tech/en/articles/general-plan-what-changes/)). |
| [`grid_capacity`](https://zonio.tech/en/layers/power-grid/grid-connection-capacity-dsos-pse/) | Each DSO publishes capacity in its own format and granularity ([how to read it](https://zonio.tech/en/articles/grid-connection-capacity-poland/)). |
| [`terrain_stats`](https://zonio.tech/en/layers/terrain-relief/terrain-slope-lidar/) | 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](https://zonio.tech/en/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](/data/pipeline).
# Provenance & pipeline
Behind the API is a purpose-built geospatial ETL. Knowing how it works tells you how far to trust each answer.
## From source to API
```
public source ──fetch──▶ staging ──transform──▶ working copy ──validate──▶ clean table ──▶ API · MCP · tiles
(WFS, ArcGIS, raw rows reproject to atomic swap
ATOM, WMS, files) + run id EPSG:2180, fix per run
geometries
```
* **Fetch.** Each of ~45 topics has its own fetcher for its source's protocol: OGC WFS with adaptive tile paging, ArcGIS REST, ATOM/GML downloads, per-powiat BDOT10k packages, WMS sampling, Overpass. Fetchers compare what they received against the server's own feature count and fail loudly on a shortfall.
* **Transform.** Geometry is reprojected to EPSG:2180 and validated; invalid shapes are repaired, and anything that still fails goes to a dead-letter queue for inspection instead of aborting the run.
* **Promote.** Data reaches the clean table in one atomic step. A failed run leaves the previous version in place.
* **Index.** GiST spatial indexes on every geometry; large tables are partitioned by gmina so a regional query only touches that region.
## Every row is traceable
Each row in every table carries:
| Column | Meaning |
| --- | --- |
| `source_run_id` | The pipeline run that produced it |
| `fetched_at` | When it was fetched |
| `source_url` | The exact endpoint it came from |
| `source_bbox` | The area that run covered |
Detail endpoints expose this as a `provenance` object, so you can always show *"from GDOŚ, fetched 2026-09-28"* next to a constraint, or audit an answer months later.
## Normalisation
* **Zoning symbols.** Thousands of local spellings (`MN`, `MN1`, `1MN/U`, `M.N.`) are mapped to a common taxonomy of categories; the raw symbol is always kept and anything unrecognised is flagged for review instead of guessed.
* **Coordinates.** One storage CRS for everything, so a distance is always metres. See [Coordinates](/concepts#coordinates).
* **Identifiers.** Parcels keyed by EGiB id, regions by TERYT, so data from any source joins cleanly.
## Quality checks
After each national load we check row counts against the publisher's totals and look at the category breakdown. A category with zero rows nationally is treated as a bug until proven otherwise. Verification dates and national counts are recorded per layer.
# Use cases
Teams that don't want to build can use the [Zonio app](https://zonio.tech/en/) directly: see [features](https://zonio.tech/en/features/) and [pricing](https://zonio.tech/en/pricing/).
## AI land scout
**Who:** PropTech startups, brokers, investment boutiques.
A chat assistant on your site where buyers describe what they want (*"a quiet plot for a house near Kraków, under 400 k PLN, with a bus nearby"*) and get real parcels back, with zoning explained in plain language and a link to the parcel in the [Zonio app](https://zonio.tech/en/features/). Built with the [MCP server and the Claude API](/mcp/claude-api) in an afternoon.
## Renewable-energy origination
**Who:** PV, wind, BESS and agri-PV developers.
Screen a voivodeship for every parcel that clears the legal and technical bar for your asset, ranked by distance to [substations](https://zonio.tech/en/layers/power-grid/hv-ehv-substations-pse/) and [available capacity](https://zonio.tech/en/layers/power-grid/grid-connection-capacity-dsos-pse/) ([how capacity data works](https://zonio.tech/en/articles/grid-connection-capacity-poland/)). Hand the shortlist to the land team with constraints and owners' pre-emption risks already flagged. See [Site selection](/guides/site-selection).
## Due diligence at scale
**Who:** Banks, funds, land-acquisition teams.
Feed hundreds of parcels from a land-register extract into `POST /parcels/batch?include=regulations,constraints` and get a red/amber/green sheet before anyone opens a geoportal. Generate a PDF [report](/guides/due-diligence) for the ones that go forward.
## Valuation and market analytics
**Who:** Valuers, analysts, lenders.
Combine [RCN transaction comparables](https://zonio.tech/en/layers/market/transaction-prices/) with zoning and constraints so the comps you pick actually compare like with like: the same zone category, the same kind of access.
## Map products
**Who:** GIS teams, municipal tools, consultancies.
Drop national zoning, constraints and grid layers (browse them in the [layer atlas](https://zonio.tech/en/layers/)) into your own MapLibre application with [vector tiles](/guides/maps), and use the API for click-through detail.
# Request access
The Zonio API and MCP server are in **private preview**. We are onboarding a small group of design partners who build with Polish land data: AI products, energy developers, real-estate and finance teams.
Email **[kontakt@zonio.tech](mailto\:kontakt@zonio.tech)** with:
1. who you are and what you are building;
2. whether you will use the REST API, the MCP server, or both;
3. the regions and layers you care about most.
Looking for the Zonio app rather than the API? Start at [zonio.tech](https://zonio.tech/en/). More about us on the [company page](https://zonio.tech/en/company/).
# Glossary
Most terms link to the matching layer in the [zonio.tech layer atlas](https://zonio.tech/en/layers/).
| Term | Meaning |
| --- | --- |
| **[BDOT10k](https://zonio.tech/en/layers/buildings-development/buildings-bdot10k/)** | National topographic object database at 1:10,000: buildings, roads, land cover, utilities. Published per powiat by GUGiK. |
| **[BDL](https://zonio.tech/en/layers/land-cover-land-use/forests-bdl/)** | *Bank Danych o Lasach*, the Forest Data Bank. |
| **[Działka ewidencyjna](https://zonio.tech/en/layers/cadastre/cadastral-parcels/)** | Cadastral parcel. The unit Zonio searches. |
| **[DSO / OSD](https://zonio.tech/en/layers/power-grid/grid-connection-capacity-dsos-pse/)** | Distribution system operator (*operator systemu dystrybucyjnego*): PGE, Tauron, Enea, Energa, Stoen. Publishes available connection capacity. |
| **[EGiB](https://zonio.tech/en/layers/land-cover-land-use/land-use-soil-classes-egib/)** | *Ewidencja Gruntów i Budynków*, the land and buildings register; source of parcel geometry and ids. |
| **[GDOŚ](https://zonio.tech/en/layers/environment/protected-areas-gdos/)** | General Directorate for Environmental Protection; publishes protected areas. |
| **[GPZ](https://zonio.tech/en/layers/power-grid/hv-ehv-substations-pse/)** | *Główny Punkt Zasilający*, an HV/MV substation, the usual grid connection point for renewables. |
| **GUGiK** | Head Office of Geodesy and Cartography; publishes cadastre, BDOT10k, LIDAR, orthophoto and RCN. |
| **GZWP** | *Główny Zbiornik Wód Podziemnych*, a major groundwater reservoir, often with protection restrictions. |
| **[Gmina](https://zonio.tech/en/layers/cadastre/municipality-boundaries/)** | Municipality. ~2,477 in Poland; responsible for local and general plans. Each has a profile on the [national map](https://zonio.tech/en/map/). |
| **[KOWR](https://zonio.tech/en/layers/land-cover-land-use/state-agricultural-land-kowr/)** | National Support Centre for Agriculture; holds state agricultural land and a pre-emption right on many farmland sales. |
| **[MIDAS](https://zonio.tech/en/layers/hazards/mining-areas-terrains-midas/)** | National mineral-resources and mining-area database (PIG-PIB). |
| **[MPZP](https://zonio.tech/en/layers/spatial-planning/local-zoning-plans-mpzp/)** | *Miejscowy plan zagospodarowania przestrzennego*, the local zoning plan. Legally binding. |
| **[Natura 2000](https://zonio.tech/en/layers/environment/protected-areas-gdos/)** | EU network of protected sites (bird and habitat directives). |
| **[NMT / DTM](https://zonio.tech/en/layers/terrain-relief/hillshade-nmt/)** | Digital terrain model from LIDAR. |
| **[Obręb](https://zonio.tech/en/layers/cadastre/cadastral-districts-obreby/)** | Cadastral precinct; part of the parcel id. |
| **[OZE](https://zonio.tech/en/layers/renewables/)** | *Odnawialne źródła energii*, renewable energy sources. |
| **[Plan Ogólny](https://zonio.tech/en/layers/spatial-planning/municipal-general-plan/)** | General plan, mandatory for every gmina, replacing the Studium. [What it changes](https://zonio.tech/en/articles/general-plan-what-changes/). |
| **[Powiat](https://zonio.tech/en/layers/cadastre/county-boundaries/)** | County. 380 in Poland. |
| **[PRG](https://zonio.tech/en/layers/cadastre/municipality-boundaries/)** | National register of boundaries and addresses. |
| **PUWG 1992** | Poland's national coordinate system, EPSG:2180. Zonio stores and measures in it. |
| **[RCN](https://zonio.tech/en/layers/market/transaction-prices/)** | *Rejestr Cen Nieruchomości*, the national register of notarised real-estate prices. |
| **[Studium](https://zonio.tech/en/layers/spatial-planning/studium-suikzp-archival/)** | *Studium uwarunkowań i kierunków zagospodarowania przestrzennego*, the legacy directional study. |
| **TERYT** | National territorial division codes: 2 digits voivodeship, 4 powiat, 7 gmina. |
| **[ULC](https://zonio.tech/en/layers/infrastructure/height-limits-ols/)** | Civil Aviation Authority; publishes obstacle limitation surfaces. |
| **[Województwo](https://zonio.tech/en/layers/cadastre/voivodeship-boundaries/)** | Voivodeship (province). 16 in Poland. |
| **WZ** | *Warunki zabudowy*, a building conditions decision, required outside an MPZP. |
Zonio Geo API · MCP server · Private preview
Ask Poland's land anything.
38 million cadastral parcels, every zoning plan we can reach, environmental constraints, the power grid and the property market, behind one API key. Query it from your code, or give it to your AI agent as an MCP server.
Connect your agent
Quickstart
API reference
## Search parcels the way you'd ask a colleague
Add the Zonio MCP server to Claude, Cursor or your own agent and ask:
> *Find vacant plots over 2 ha within 5 km of a 110 kV substation in Podkarpackie, outside Natura 2000, and rank them by available grid capacity.*
The agent calls [`search_parcels`](/mcp/tools#search_parcels), checks each shortlisted plot with [`check_regulations`](/mcp/tools#check_regulations) and [`check_constraints`](/mcp/tools#check_constraints), and answers with parcel ids, a map link and the reasons every plot made the list, including which criteria **could not be checked** in that region.
```bash [Claude Code]
claude mcp add --transport http zonio https://mcp.zonio.tech/mcp \
--header "Authorization: Bearer $ZONIO_API_KEY"
```
## Start here
## See the data on zonio.tech
Every layer behind the API has its own page on [zonio.tech](https://zonio.tech/en/) with a description, the publisher and a live map. Start with the ones agents ask about most:
* **Zoning:** [local zoning plans (MPZP)](https://zonio.tech/en/layers/spatial-planning/local-zoning-plans-mpzp/), [municipal general plans](https://zonio.tech/en/layers/spatial-planning/municipal-general-plan/), [Studium](https://zonio.tech/en/layers/spatial-planning/studium-suikzp-archival/)
* **Cadastre:** [cadastral parcels](https://zonio.tech/en/layers/cadastre/cadastral-parcels/), [cadastral districts](https://zonio.tech/en/layers/cadastre/cadastral-districts-obreby/), [municipality boundaries](https://zonio.tech/en/layers/cadastre/municipality-boundaries/)
* **Power grid:** [grid connection capacity](https://zonio.tech/en/layers/power-grid/grid-connection-capacity-dsos-pse/), [HV/EHV substations (PSE)](https://zonio.tech/en/layers/power-grid/hv-ehv-substations-pse/), [transmission lines](https://zonio.tech/en/layers/power-grid/transmission-lines-pse/)
* **Environment & hazards:** [protected areas](https://zonio.tech/en/layers/environment/protected-areas-gdos/), [flood hazard](https://zonio.tech/en/layers/hazards/flood-hazard-isok/), [mining areas](https://zonio.tech/en/layers/hazards/mining-areas-terrains-midas/)
* **Market:** [transaction prices](https://zonio.tech/en/layers/market/transaction-prices/)
Browse all 14 categories in the [layer atlas](https://zonio.tech/en/layers/), or open any of the 2,477 gminas on the [national map](https://zonio.tech/en/map/).
# Geocoding
Turn addresses and place names into parcels and TERYT codes.
## Geocode an address
`GET /geocode`
Free-text address search against the national address register (PRG), resolved to the parcel at each hit.
### Query parameters
- `q` `string` _(required)_
### Responses
#### `200`: Up to 15 candidates, best first.
Body (`application/json`):
- `label` `string`
- `lng` `number`
- `lat` `number`
- `parcel_id` `string | null`
### Example request
```bash
curl 'https://api.zonio.tech/v1/geocode?q=Kraków, Rynek Główny 1'
```
```ts
fetch('https://api.zonio.tech/v1/geocode?q=Kraków, Rynek Główny 1')
```
## Search administrative units
`GET /regions`
Diacritic-insensitive autocomplete over every gmina, powiat and voivodeship. `krakow` finds `Kraków`.
### Query parameters
- `q` `string` _(required)_
### Responses
#### `200`: Matching units.
Body (`application/json`):
- `teryt` `string`
- `name` `string`
- `unit_type` `string`
- `parent` `string | null`
- `layers_available` `string[]`: Layers with data in this unit. Check before relying on a partial layer.
### Example request
```bash
curl 'https://api.zonio.tech/v1/regions?q=krakow'
```
```ts
fetch('https://api.zonio.tech/v1/regions?q=krakow')
```
# Layers
The raw data layers behind every answer.
## List data layers
`GET /layers`
### Responses
#### `200`: Every layer with its source, coverage and freshness.
Body (`application/json`):
- `id` `string`
- `name` `string`
- `category` `string`
- `geometry_type` `string`
- `source` `string`
- `coverage` `string`
- `feature_count` `integer`
- `refreshed_at` `string `
- `tiles_url` `string | null`
### Example request
```bash
curl https://api.zonio.tech/v1/layers
```
```ts
fetch('https://api.zonio.tech/v1/layers')
```
## Query a layer
`GET /layers/{layer_id}/features`
Raw features of one layer inside a bounding box, as GeoJSON. Paginate with `cursor`.
### Path parameters
- `layer_id` `string` _(required)_
### Query parameters
- `bbox` `string` _(required)_: WGS84 `minLng,minLat,maxLng,maxLat`.
- `limit` `integer`
- `cursor` `string`
### Responses
#### `200`: A page of features.
Body (`application/geo+json`):
- `type` `string`
- `features` `object[]`
- `next_cursor` `string | null`
### Example request
```bash
curl 'https://api.zonio.tech/v1/layers/power_substations/features?bbox=19.80,49.95,20.25,50.15&limit=500&cursor=string'
```
```ts
fetch('https://api.zonio.tech/v1/layers/power_substations/features?bbox=19.80,49.95,20.25,50.15&limit=500&cursor=string')
```
# Market
Real-estate transaction comparables and price medians.
## List transaction comparables
`GET /market/transactions`
Notarised sales from the national price register (RCN) near a parcel or in a region.
### Query parameters
- `parcel_id` `string`
- `region` `string`
- `radius_m` `integer`
- `property_type` `string`
- `since` `string `
### Responses
#### `200`: Transactions, newest first.
Body (`application/json`):
- `count` `integer`
- `median_price_per_sqm_pln` `number`
- `transactions` `object[]`
- `date` `string `
- `property_type` `string`
- `price_pln` `number`
- `area_sqm` `number`
- `price_per_sqm_pln` `number`
- `distance_m` `number`
### Example request
```bash
curl 'https://api.zonio.tech/v1/market/transactions?parcel_id=string®ion=string&radius_m=2000&property_type=land&since=2024-01-01'
```
```ts
fetch('https://api.zonio.tech/v1/market/transactions?parcel_id=string®ion=string&radius_m=2000&property_type=land&since=2024-01-01')
```
# Parcels
Look up a parcel and everything known about it.
## Get a parcel
`GET /parcels/{parcel_id}`
One cadastral parcel as a GeoJSON Feature. Use `include` to embed
the regulations, constraints, terrain, proximity and market blocks
in a single round-trip.
### Path parameters
- `parcel_id` `string` _(required)_: EGiB parcel id. URL-encode the `/` in parcel numbers (`100/1` → `100%2F1`).
### Query parameters
- `include` `string`: Comma-separated blocks to embed.
### Responses
#### `200`: The parcel.
Body (`application/geo+json`):
- `type` `string`
- `id` `string`
- `geometry` `object`: GeoJSON Polygon or MultiPolygon in WGS84.
- `properties` `object & object`
#### `401`: Missing or invalid API key.
Body (`application/json`):
- `error` `object`
- `code` `string` _(required)_
- `message` `string` _(required)_
- `request_id` `string`
- `candidates` `string[]`
#### `404`: No such parcel.
Body (`application/json`):
- `error` `object`
- `code` `string` _(required)_
- `message` `string` _(required)_
- `request_id` `string`
- `candidates` `string[]`
### Example request
```bash
curl 'https://api.zonio.tech/v1/parcels/126101_1.0018.AR_1.100%252F1?include=regulations,constraints,terrain,proximity'
```
```ts
fetch('https://api.zonio.tech/v1/parcels/126101_1.0018.AR_1.100%252F1?include=regulations,constraints,terrain,proximity')
```
## Get the parcel at a point
`GET /parcels/at`
The parcel containing the point, falling back to the nearest parcel within 200 m.
### Query parameters
- `lng` `number` _(required)_
- `lat` `number` _(required)_
### Responses
#### `200`: The parcel.
Body (`application/geo+json`):
- `type` `string`
- `id` `string`
- `geometry` `object`: GeoJSON Polygon or MultiPolygon in WGS84.
- `properties` `object & object`
#### `404`: No such parcel.
Body (`application/json`):
- `error` `object`
- `code` `string` _(required)_
- `message` `string` _(required)_
- `request_id` `string`
- `candidates` `string[]`
### Example request
```bash
curl 'https://api.zonio.tech/v1/parcels/at?lng=19.9372&lat=50.0614'
```
```ts
fetch('https://api.zonio.tech/v1/parcels/at?lng=19.9372&lat=50.0614')
```
## Autocomplete parcel ids
`GET /parcels/autocomplete`
Prefix and substring match on the EGiB parcel id, for search boxes.
### Query parameters
- `q` `string` _(required)_
### Responses
#### `200`: Up to 10 suggestions.
Body (`application/json`):
- `parcel_id` `string`
- `area_sqm` `number`
- `gmina` `string`
- `teryt` `string`
### Example request
```bash
curl 'https://api.zonio.tech/v1/parcels/autocomplete?q=126101_1.0018.AR_1.100'
```
```ts
fetch('https://api.zonio.tech/v1/parcels/autocomplete?q=126101_1.0018.AR_1.100')
```
## Get many parcels
`POST /parcels/batch`
Up to 500 parcels in one call. Unknown ids are listed in `missing`.
### Request body (required) (`application/json`)
- `parcel_ids` `string[]` _(required)_
- `include` `string[]`
### Responses
#### `200`: The parcels found.
Body (`application/json`):
- `type` `string`
- `features` `object[]`
- `type` `string`
- `id` `string`
- `geometry` `object`: GeoJSON Polygon or MultiPolygon in WGS84.
- `properties` `object & object`
- `missing` `string[]`
### Example request
```bash
curl https://api.zonio.tech/v1/parcels/batch \
--request POST \
--header 'Content-Type: application/json' \
--data '{
"parcel_ids": [
"126101_1.0018.AR_1.100/1",
"126101_1.0018.AR_1.101/2"
],
"include": [
"regulations"
]
}'
```
```ts
fetch('https://api.zonio.tech/v1/parcels/batch', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
parcel_ids: ['126101_1.0018.AR_1.100/1', '126101_1.0018.AR_1.101/2'],
include: ['regulations']
})
})
```
## Get zoning & planning status
`GET /parcels/{parcel_id}/regulations`
The planning instruments that apply to the parcel: the local plan
(MPZP) zone and its parameters, the general plan (Plan Ogólny) zone,
the legacy Studium designation, and statutory pre-emption rights.
### Path parameters
- `parcel_id` `string` _(required)_: EGiB parcel id. URL-encode the `/` in parcel numbers (`100/1` → `100%2F1`).
### Responses
#### `200`: The regulatory state.
Body (`application/json`):
- `mpzp` `object | null`: Local zoning plan (MPZP) zone at the parcel, or null if no plan applies.
- `plan_name` `string`
- `adopted_on` `string `
- `symbol` `string`
- `category` `string`
- `label` `string`
- `max_height_m` `number | null`
- `max_building_coverage_pct` `number | null`
- `min_biologically_active_pct` `number | null`
- `document_url` `string `
- `plan_ogolny` `object | null`: General plan zone, mandatory for every gmina from 2026.
- `status` `string`
- `zone_symbol` `string`
- `zone_label` `string`
- `studium` `object | null`
- `designation` `string`
- `pre_emption` `object[]`: Statutory pre-emption rights that apply to a sale.
- `holder` `string`
- `basis` `string`
### Example request
```bash
curl https://api.zonio.tech/v1/parcels/126101_1.0018.AR_1.100%252F1/regulations
```
```ts
fetch('https://api.zonio.tech/v1/parcels/126101_1.0018.AR_1.100%252F1/regulations')
```
## Get environmental & legal constraints
`GET /parcels/{parcel_id}/constraints`
Every constraint layer that intersects the parcel or a buffer around
it: Natura 2000, protected landscapes, flood-risk zones, heritage
protection, mining areas, aviation obstacle surfaces, groundwater
protection, wind-turbine setbacks.
### Path parameters
- `parcel_id` `string` _(required)_: EGiB parcel id. URL-encode the `/` in parcel numbers (`100/1` → `100%2F1`).
### Query parameters
- `buffer_m` `integer`
### Responses
#### `200`: The constraints found.
Body (`application/json`):
- `blocking` `boolean`: True when at least one constraint normally prevents development.
- `items` `object[]`
- `layer` `string`
- `kind` `string`
- `name` `string`
- `overlap_pct` `number`
- `distance_m` `number`
- `severity` `string`
### Example request
```bash
curl 'https://api.zonio.tech/v1/parcels/126101_1.0018.AR_1.100%252F1/constraints?buffer_m=0'
```
```ts
fetch('https://api.zonio.tech/v1/parcels/126101_1.0018.AR_1.100%252F1/constraints?buffer_m=0')
```
## Get terrain statistics
`GET /parcels/{parcel_id}/terrain`
Elevation and slope derived from GUGiK LIDAR.
### Path parameters
- `parcel_id` `string` _(required)_: EGiB parcel id. URL-encode the `/` in parcel numbers (`100/1` → `100%2F1`).
### Responses
#### `200`: Terrain statistics.
Body (`application/json`):
- `elevation_min_m` `number`
- `elevation_max_m` `number`
- `slope_mean_pct` `number`
- `slope_p90_pct` `number`
- `aspect` `string`
### Example request
```bash
curl https://api.zonio.tech/v1/parcels/126101_1.0018.AR_1.100%252F1/terrain
```
```ts
fetch('https://api.zonio.tech/v1/parcels/126101_1.0018.AR_1.100%252F1/terrain')
```
## Get distances to nearby infrastructure
`GET /parcels/{parcel_id}/proximity`
The nearest feature of each requested kind and its distance in
metres: substations, MV lines, transit stops, schools, water, planned
roads, EV chargers and more.
### Path parameters
- `parcel_id` `string` _(required)_: EGiB parcel id. URL-encode the `/` in parcel numbers (`100/1` → `100%2F1`).
### Query parameters
- `kinds` `string`: Comma-separated. Defaults to all.
### Responses
#### `200`: Nearest features.
### Example request
```bash
curl 'https://api.zonio.tech/v1/parcels/126101_1.0018.AR_1.100%252F1/proximity?kinds=power_substation,transit_stop,school'
```
```ts
fetch('https://api.zonio.tech/v1/parcels/126101_1.0018.AR_1.100%252F1/proximity?kinds=power_substation,transit_stop,school')
```
## Get a due-diligence report
`GET /parcels/{parcel_id}/report`
Every block above plus market comparables, assembled into one
document. Ask for `application/pdf` to get a branded, shareable PDF.
### Path parameters
- `parcel_id` `string` _(required)_: EGiB parcel id. URL-encode the `/` in parcel numbers (`100/1` → `100%2F1`).
### Query parameters
- `scenario` `string`: Evaluate the parcel against a scenario's criteria.
### Responses
#### `200`: The report.
Body (`application/json`):
- `parcel` `object`
- `type` `string`
- `id` `string`
- `geometry` `object`: GeoJSON Polygon or MultiPolygon in WGS84.
- `properties` `object & object`
- `summary` `string`
- `scenario_fit` `object | null`
- `scenario` `string`
- `passes` `boolean`
- `failed_criteria` `string[]`
- `market` `object`
- `median_price_per_sqm_pln` `number`
- `comparables` `integer`
### Example request
```bash
curl 'https://api.zonio.tech/v1/parcels/126101_1.0018.AR_1.100%252F1/report?scenario=solar_farm_site'
```
```ts
fetch('https://api.zonio.tech/v1/parcels/126101_1.0018.AR_1.100%252F1/report?scenario=solar_farm_site')
```
# Search
Find parcels with structured filters or a plain-language query.
## Search parcels in plain language
`POST /search/natural-language`
Describe the land you are looking for in English or Polish. Zonio
resolves the region, picks the matching scenario and filters, runs the
search and returns both the parcels **and the structured
interpretation**, so you can show the user exactly what was searched
and re-run it with `POST /search/parcels`.
### Request body (required) (`application/json`)
- `query` `string` _(required)_
- `region` `string`: Optional TERYT code that overrides any place named in the query.
- `language` `string`
- `limit` `integer`
### Responses
#### `200`: The interpretation and the matching parcels.
#### `400`: The request was malformed.
Body (`application/json`):
- `error` `object`
- `code` `string` _(required)_
- `message` `string` _(required)_
- `request_id` `string`
- `candidates` `string[]`
#### `401`: Missing or invalid API key.
Body (`application/json`):
- `error` `object`
- `code` `string` _(required)_
- `message` `string` _(required)_
- `request_id` `string`
- `candidates` `string[]`
#### `422`: The query could not be resolved to a region or any filter.
Body (`application/json`):
- `error` `object`
- `code` `string` _(required)_
- `message` `string` _(required)_
- `request_id` `string`
- `candidates` `string[]`
#### `429`: Too many requests. Retry after `Retry-After` seconds.
Body (`application/json`):
- `error` `object`
- `code` `string` _(required)_
- `message` `string` _(required)_
- `request_id` `string`
- `candidates` `string[]`
### Example request
```bash
curl https://api.zonio.tech/v1/search/natural-language \
--request POST \
--header 'Content-Type: application/json' \
--data '{
"query": "Flat plots over 2 ha near Rzeszów, zoned for industry, within 5 km of a 110 kV substation and outside Natura 2000",
"limit": 20
}'
```
```ts
fetch('https://api.zonio.tech/v1/search/natural-language', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
query: 'Flat plots over 2 ha near Rzeszów, zoned for industry, within 5 km of a 110 kV substation and outside Natura 2000',
limit: 20
})
})
```
## Search parcels with structured filters
`POST /search/parcels`
Hard filters must all pass; survivors are ranked by the optional
`rank_by` signals. Every response carries a `coverage` array: when a
filter's data layer does not cover the region, the filter is reported
as `missing` instead of silently matching nothing.
### Request body (required) (`application/json`)
- `region` `string`: TERYT code (2, 4 or 7 digits). Omit to search all of Poland.
- `bbox` `string`: WGS84 `minLng,minLat,maxLng,maxLat`, as an alternative to `region`.
- `filters` `object`
- `area_sqm` `object`
- `min` `number`
- `max` `number`
- `zoning` `object`
- `categories` `string[]`
- `symbols` `string[]`
- `require_plan` `boolean`
- `slope_pct` `object`
- `max` `number`
- `vacant` `boolean`: No building footprint on the parcel.
- `near` `object[]`
- `layer` `string`
- `within_m` `number`
- `where` `object`
- `exclude` `object[]`
- `layer` `string`
- `kinds` `string[]`
- `buffer_m` `number`
- `rank_by` `object[]`
- `signal` `string`
- `weight` `integer`
- `limit` `integer`
### Responses
#### `200`: Matching parcels, ranked.
Body (`application/json`):
- `count` `integer`
- `blocked` `boolean`
- `coverage` `object[]`
- `criterion` `string`
- `mode` `string`: `requires`: a missing layer blocks the search. `screens`: results are returned but not screened on this criterion.
- `status` `string`
- `results` `object[]`
- `parcel_id` `string`
- `area_sqm` `number`
- `gmina` `string`
- `geometry` `object`
- `score` `number | null`: Relative 0–100 rank within this result set.
- `components` `object[]`
- `signal` `string`
- `value` `number`
- `contribution` `number`
#### `400`: The request was malformed.
Body (`application/json`):
- `error` `object`
- `code` `string` _(required)_
- `message` `string` _(required)_
- `request_id` `string`
- `candidates` `string[]`
#### `401`: Missing or invalid API key.
Body (`application/json`):
- `error` `object`
- `code` `string` _(required)_
- `message` `string` _(required)_
- `request_id` `string`
- `candidates` `string[]`
#### `429`: Too many requests. Retry after `Retry-After` seconds.
Body (`application/json`):
- `error` `object`
- `code` `string` _(required)_
- `message` `string` _(required)_
- `request_id` `string`
- `candidates` `string[]`
### Example request
```bash
curl https://api.zonio.tech/v1/search/parcels \
--request POST \
--header 'Content-Type: application/json' \
--data '{
"region": "1863",
"filters": {
"area_sqm": {
"min": 20000
},
"zoning": {
"categories": [
"industrial",
"commercial_services"
]
},
"slope_pct": {
"max": 5
},
"near": [
{
"layer": "power_substations",
"within_m": 5000,
"where": {
"voltage_kv_gte": 110
}
}
],
"exclude": [
{
"layer": "env_layers",
"kinds": [
"natura2000",
"flood_risk_1pct"
],
"buffer_m": 100
}
]
},
"rank_by": [
{
"signal": "grid_distance_km",
"weight": 60
},
{
"signal": "area",
"weight": 40
}
],
"limit": 50
}'
```
```ts
fetch('https://api.zonio.tech/v1/search/parcels', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
region: '1863',
filters: {
area_sqm: {
min: 20000
},
zoning: {
categories: ['industrial', 'commercial_services']
},
slope_pct: {
max: 5
},
near: [
{
layer: 'power_substations',
within_m: 5000,
where: {
voltage_kv_gte: 110
}
}
],
exclude: [
{
layer: 'env_layers',
kinds: ['natura2000', 'flood_risk_1pct'],
buffer_m: 100
}
]
},
rank_by: [
{
signal: 'grid_distance_km',
weight: 60
},
{
signal: 'area',
weight: 40
}
],
limit: 50
})
})
```