{
  "openapi": "3.1.0",
  "info": {
    "title": "knoha cadastral API",
    "version": "1.0.0",
    "summary": "Cadastral parcels of Cluj county, Romania, with urbanism rules (POT, CUT, height, setbacks), terrain, surroundings and what can be built.",
    "description": "Read-only, free, no key. Every registered parcel of Cluj county (about 464 000) with its outline, area, dimensions, street frontage, slope, the urbanism zone (UTR) it sits in with that zone's rules from the local regulation (PUG), what is admitted there, and the house planner's verdict on what fits between the setbacks. Also merge options with neighbours, and \"where could I do X\" searches.\n\n**Identifiers.** A parcel is identified by its INSPIRE id `RO.<county SIRUTA>.<locality SIRUTA>.<cadastral number>`, e.g. `RO.127.54975.329163`. A cadastral number alone is not unique across Romania; resolve it with `GET /cadastral-parcels/search` using the SIRUTA codes from `GET /cadastral-parcels/administrative-units`. Localities are referred to by ids like `romania_cluj_cluj-napoca` (see `GET /administrative-areas`).\n\n**Units.** Areas in square metres, distances in metres, slopes in percent, coordinates WGS84 longitude/latitude.\n\n**Accuracy.** Figures quoted from a regulation are the council's; everything geometric (area, frontage, slope, \"a house fits\") is computed and estimative. The binding document for any plot is the certificat de urbanism issued by the town hall. Sources and method: https://knoha.ro/despre-date.\n\n**Rate limits.** Per client address: searches about 60 per minute, single-parcel details about 30 per minute; a 429 carries Retry-After. Please cite https://knoha.ro and link the parcel or zone page when you quote a figure.\n\n**MCP.** The same data as tools for an assistant: an MCP server (Streamable HTTP, no key) at https://knoha.ro/mcp, with find_parcel, get_parcel, get_building_rules, search_parcels, get_merge_options, find_lots_for and more. How to connect: https://knoha.ro/asistent-ai.",
    "termsOfService": "https://knoha.ro/termeni",
    "contact": {
      "name": "knoha (HYCAD SOFTWARE SRL)",
      "url": "https://knoha.ro/despre-date"
    },
    "license": {
      "name": "knoha terms of use",
      "url": "https://knoha.ro/termeni"
    }
  },
  "servers": [
    {
      "url": "https://knoha.ro/api",
      "description": "Production"
    }
  ],
  "security": [],
  "tags": [
    {
      "name": "parcels",
      "description": "Finding parcels and reading one in full"
    },
    {
      "name": "urbanism",
      "description": "What the local regulation allows on a parcel"
    },
    {
      "name": "merges",
      "description": "Joining a parcel with its neighbours"
    },
    {
      "name": "feedback",
      "description": "Telling knoha what is missing"
    }
  ],
  "paths": {
    "/cadastral-parcels/administrative-units": {
      "get": {
        "operationId": "listAdministrativeUnits",
        "summary": "Counties and localities, by SIRUTA code",
        "description": "The counties and localities that hold parcels, with the SIRUTA codes the search by cadastral number needs. Cluj county is 127; Cluj-Napoca is 54975.",
        "tags": [
          "parcels"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AdministrativeUnits"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests from this address; wait the number of seconds in Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/cadastral-parcels/search": {
      "get": {
        "operationId": "findParcelByNumber",
        "summary": "Find a parcel by cadastral number",
        "description": "Resolves a cadastral number to a parcel, given the county and locality SIRUTA codes (from /cadastral-parcels/administrative-units). This is how a number from a sale advert or a land registry extract becomes an INSPIRE id.",
        "tags": [
          "parcels"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ParcelOutline"
                }
              }
            }
          },
          "404": {
            "description": "No parcel carries this INSPIRE id.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests from this address; wait the number of seconds in Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "county",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "County SIRUTA code",
            "example": 127
          },
          {
            "name": "uat",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Locality SIRUTA code",
            "example": 54975
          },
          {
            "name": "number",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The cadastral number",
            "example": "329163"
          }
        ]
      },
      "post": {
        "operationId": "searchParcels",
        "summary": "Search parcels by filters",
        "description": "Parcels matching a set of filters: size, shape, frontage, slope, distance from water, rail and power lines, urbanism zone, what the zone admits (intents), whether a house fits, notary value. Scope with adminAreas or counties, or with a viewport. Returns outlines; read one in full with /cadastral-parcels/{inspireId}/surroundings.",
        "tags": [
          "parcels"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ParcelSearchResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request is malformed (viewport too wide, unknown intent, …).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests from this address; wait the number of seconds in Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ParcelSearchRequest"
              }
            }
          }
        }
      }
    },
    "/cadastral-parcels/stats": {
      "get": {
        "operationId": "getStats",
        "summary": "What the index holds",
        "description": "Counts of parcels, localities, regulated localities, parcels where a house fits and so on, in real numbers.",
        "tags": [
          "parcels"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ParcelStats"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests from this address; wait the number of seconds in Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/cadastral-parcels/{inspireId}/surroundings": {
      "get": {
        "operationId": "getParcelSurroundings",
        "summary": "A parcel in full, with its surroundings",
        "description": "The parcel's outline, dimensions, frontage, slope and elevation, notary value, the parcels it touches, and the roads, water, railways and power lines within radiusMeters (default 500). The page https://knoha.ro/parcela/{inspireId} shows the same.",
        "tags": [
          "parcels"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ParcelSurroundings"
                }
              }
            }
          },
          "404": {
            "description": "No parcel carries this INSPIRE id.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests from this address; wait the number of seconds in Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "inspireId",
            "in": "path",
            "required": true,
            "description": "The parcel's INSPIRE id, e.g. RO.127.54975.329163. Get it from GET /cadastral-parcels/search (by cadastral number) or from any search response.",
            "schema": {
              "type": "string"
            },
            "example": "RO.127.54975.329163"
          },
          {
            "name": "radiusMeters",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            },
            "description": "How far around the parcel to look, metres (default 500)."
          }
        ]
      }
    },
    "/administrative-areas": {
      "get": {
        "operationId": "findAdministrativeAreas",
        "summary": "Look up a locality by name",
        "description": "Localities and counties by name (diacritics optional), with the ids the searches take as adminAreas / counties.",
        "tags": [
          "parcels"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AdministrativeArea"
                  },
                  "description": "Matching areas"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests from this address; wait the number of seconds in Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Part of the name, e.g. \"flore\"",
            "example": "floresti"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "default": 10,
              "maximum": 50
            }
          }
        ]
      }
    },
    "/house-planner/envelope/parcel/{inspireId}": {
      "get": {
        "operationId": "getBuildingEnvelope",
        "summary": "What may be built on a parcel",
        "description": "The building envelope under the parcel's urbanism regulation: zone (UTR), POT, CUT, storeys, height, setbacks, minimum lot, admitted uses, exclusions from protection zones, findings and the source documents. The clearest single answer to \"what can I build here\".",
        "tags": [
          "urbanism"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BuildingEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "No parcel carries this INSPIRE id.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests from this address; wait the number of seconds in Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "inspireId",
            "in": "path",
            "required": true,
            "description": "The parcel's INSPIRE id, e.g. RO.127.54975.329163. Get it from GET /cadastral-parcels/search (by cadastral number) or from any search response.",
            "schema": {
              "type": "string"
            },
            "example": "RO.127.54975.329163"
          }
        ]
      }
    },
    "/house-planner/rules/{ruleId}/text": {
      "get": {
        "operationId": "getRegulationText",
        "summary": "The regulation's own text for a zone",
        "description": "The articles of the local regulation that apply to a zone, for quoting. The ruleId comes from an envelope's sources.",
        "tags": [
          "urbanism"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RegulationText"
                }
              }
            }
          },
          "404": {
            "description": "No text for this rule.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests from this address; wait the number of seconds in Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "ruleId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "A rule id from BuildingEnvelope.sources[].ruleId"
          }
        ]
      }
    },
    "/parcel-merges/parcel/{inspireId}": {
      "get": {
        "operationId": "getMergeOptions",
        "summary": "Neighbours a parcel could be joined with",
        "description": "For each neighbour, what the joined lot would be: area, width, frontage, whether it reaches the zone's minimum lot or gains road access, and what POT/CUT allow on it. Useful when a parcel alone is too small or landlocked.",
        "tags": [
          "merges"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ParcelMergeOption"
                  },
                  "description": "Options, best first"
                }
              }
            }
          },
          "404": {
            "description": "No parcel carries this INSPIRE id.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests from this address; wait the number of seconds in Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "inspireId",
            "in": "path",
            "required": true,
            "description": "The parcel's INSPIRE id, e.g. RO.127.54975.329163. Get it from GET /cadastral-parcels/search (by cadastral number) or from any search response.",
            "schema": {
              "type": "string"
            },
            "example": "RO.127.54975.329163"
          }
        ]
      }
    },
    "/parcel-merges/brief": {
      "post": {
        "operationId": "briefMerges",
        "summary": "Where could I do X",
        "description": "Lots that could be assembled to answer one intent: at least so much floor area, a corner lot, so many metres of street front, ground for a run of row houses. Ranked by fit, not by size.",
        "tags": [
          "merges"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ParcelBriefResponse"
                }
              }
            }
          },
          "400": {
            "description": "The request is malformed (viewport too wide, unknown intent, …).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests from this address; wait the number of seconds in Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ParcelBriefRequest"
              }
            }
          }
        }
      }
    },
    "/feedback": {
      "post": {
        "operationId": "sendFeedback",
        "summary": "Send feedback to knoha",
        "description": "What a user could not find, what was confusing, a suggestion. Stored for the knoha team; a few per hour per address.",
        "tags": [
          "feedback"
        ],
        "responses": {
          "201": {
            "description": "Stored",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "description": "The stored message",
                  "properties": {
                    "id": {
                      "type": "integer",
                      "description": "Message id"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Empty message, unknown kind or malformed email.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "429": {
            "description": "Too many requests from this address; wait the number of seconds in Retry-After.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FeedbackRequest"
              }
            }
          }
        }
      }
    },
    "/urbanism/zones": {
      "get": {
        "operationId": "listZones",
        "summary": "The zones (UTR) of a locality and what they allow",
        "description": "The urbanism zones of a locality whose regulation has been read: each with the headline figures of its own rule (POT, CUT, height regime, minimum lot, setbacks), what it admits by use (outright, with conditions, not at all), the source and the zone page. Without `locality`, the localities that have a plan. `use` keeps only the zones admitting that use. Figures are the council's as read; the zone page shows the same.",
        "parameters": [
          {
            "name": "locality",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "the locality's id (romania_cluj_floresti) or name (Cluj-Napoca, diacritics optional)"
          },
          {
            "name": "use",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "a use key the zone must admit outright or with conditions: house_detached, house_semidetached, house_row, semicollective, apartment_block, mixed_use, commercial, hall, agricultural"
          }
        ],
        "responses": {
          "200": {
            "description": "The zones, or the localities",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ZoneList"
                }
              }
            }
          },
          "404": {
            "description": "Not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/urbanism/zones/{locality}/{utr}": {
      "get": {
        "operationId": "getZone",
        "summary": "One zone in full",
        "description": "One zone with every rule read for it, in the order the house planner applies them (the plan's own, zonal plans, council decisions), its uses with conditions and articles, the lot collective housing needs there, and for each source whether the regulation's own text can be fetched with GET /house-planner/rules/{ruleId}/text.",
        "parameters": [
          {
            "name": "locality",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "the locality's id or name"
          },
          {
            "name": "utr",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "the zone's code (Liu) or key (liu)"
          }
        ],
        "responses": {
          "200": {
            "description": "The zone",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ZoneDetail"
                }
              }
            }
          },
          "404": {
            "description": "Not found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Problem": {
        "type": "object",
        "description": "An error, as RFC 9457 problem details.",
        "properties": {
          "status": {
            "type": "integer",
            "description": "HTTP status"
          },
          "title": {
            "type": "string",
            "description": "Short reason"
          },
          "detail": {
            "type": "string",
            "description": "What went wrong, in words"
          },
          "instance": {
            "type": "string",
            "description": "The request path"
          }
        }
      },
      "GeoJsonGeometry": {
        "type": "object",
        "description": "A GeoJSON geometry (Polygon or MultiPolygon for parcels, LineString for roads and waterways), WGS84 longitude/latitude.",
        "properties": {
          "type": {
            "type": "string",
            "description": "GeoJSON type"
          },
          "coordinates": {
            "type": "array",
            "items": {}
          }
        },
        "required": [
          "type",
          "coordinates"
        ]
      },
      "ParcelOutline": {
        "type": "object",
        "description": "A parcel with its outline, as the map draws it.",
        "properties": {
          "inspireId": {
            "type": "string",
            "description": "The parcel's INSPIRE id, the stable identifier used everywhere in this API: RO.<county SIRUTA>.<locality SIRUTA>.<cadastral number>, e.g. RO.127.54975.329163 is cadastral number 329163 in Cluj-Napoca (54975), Cluj county (127)."
          },
          "nationalCadastralReference": {
            "type": [
              "string",
              "null"
            ],
            "description": "The cadastral number as ANCPI records it (unique only inside one locality)."
          },
          "areaSqm": {
            "type": [
              "number",
              "null"
            ],
            "description": "Area in square metres: ANCPI's figure where recorded, else computed geodesically from the outline."
          },
          "roadFrontageM": {
            "type": [
              "number",
              "null"
            ],
            "description": "Metres of boundary that front a mapped road (OpenStreetMap); null when access was not computed."
          },
          "roadThroughM": {
            "type": [
              "number",
              "null"
            ],
            "description": "Metres of mapped road running through the parcel itself."
          },
          "nearestRoadName": {
            "type": [
              "string",
              "null"
            ],
            "description": "Name of the nearest mapped road, when it has one."
          },
          "nearestRoadDistanceM": {
            "type": [
              "number",
              "null"
            ],
            "description": "Distance to the nearest mapped road, metres."
          },
          "roadParcel": {
            "type": "boolean",
            "description": "True when the parcel is itself a road."
          },
          "possibleAccessRoad": {
            "type": "boolean",
            "description": "True when the outline looks like an unmapped lane (a guess from shape alone)."
          },
          "polygons": {
            "type": [
              "array",
              "null"
            ],
            "description": "The outline as GeoJSON MultiPolygon coordinates [[[[lng, lat], …]]], WGS84.",
            "items": {}
          }
        },
        "required": [
          "inspireId",
          "roadParcel",
          "possibleAccessRoad"
        ]
      },
      "ParcelSearchRequest": {
        "type": "object",
        "description": "Filters for the parcel search. Every field is optional; an absent field is not a filter. A viewport (minLongitude … maxLatitude) is optional too; without one, scope the search with adminAreas or counties. Areas are in square metres, distances in metres, slopes in percent.",
        "properties": {
          "minLongitude": {
            "type": [
              "number",
              "null"
            ],
            "description": "Viewport west edge, degrees; with the other three edges, at most 0.08° wide and 0.05° tall."
          },
          "minLatitude": {
            "type": [
              "number",
              "null"
            ],
            "description": "Viewport south edge."
          },
          "maxLongitude": {
            "type": [
              "number",
              "null"
            ],
            "description": "Viewport east edge."
          },
          "maxLatitude": {
            "type": [
              "number",
              "null"
            ],
            "description": "Viewport north edge."
          },
          "adminAreas": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Locality ids to search in, e.g. [\"romania_cluj_cluj-napoca\", \"romania_cluj_floresti\"]; get them from GET /administrative-areas."
          },
          "counties": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "County ids, e.g. [\"romania_cluj\"]."
          },
          "neighbourhoods": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Quarter slugs inside Cluj-Napoca, e.g. [\"borhanci\", \"zorilor\"]."
          },
          "utrKeys": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Urbanism zone keys (UTR), lower-case, e.g. [\"liu\", \"lir\"]; see the zone pages at https://knoha.ro/urbanism."
          },
          "nationalCadastralReference": {
            "type": [
              "string",
              "null"
            ],
            "description": "An exact cadastral number; only meaningful together with adminAreas, since the same number exists in many localities."
          },
          "minAreaSqm": {
            "type": [
              "number",
              "null"
            ],
            "description": "Minimum parcel area."
          },
          "maxAreaSqm": {
            "type": [
              "number",
              "null"
            ],
            "description": "Maximum parcel area."
          },
          "minNetAreaSqm": {
            "type": [
              "number",
              "null"
            ],
            "description": "Minimum area left after a 5 m strip off every boundary (the usable figure for awkward shapes)."
          },
          "minWidthM": {
            "type": [
              "number",
              "null"
            ],
            "description": "Minimum width."
          },
          "maxWidthM": {
            "type": [
              "number",
              "null"
            ],
            "description": "Maximum width."
          },
          "minDepthM": {
            "type": [
              "number",
              "null"
            ],
            "description": "Minimum depth."
          },
          "maxDepthM": {
            "type": [
              "number",
              "null"
            ],
            "description": "Maximum depth."
          },
          "regularShape": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "True keeps only outlines that fill at least four fifths of their own rotated rectangle."
          },
          "minFrontageM": {
            "type": [
              "number",
              "null"
            ],
            "description": "Minimum metres of street frontage."
          },
          "maxFrontageM": {
            "type": [
              "number",
              "null"
            ],
            "description": "Maximum street frontage."
          },
          "accessClasses": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "frontage",
                "near",
                "distant",
                "none"
              ]
            },
            "description": "How the parcel reaches a road."
          },
          "cornerPlot": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "True keeps corner plots (two street fronts)."
          },
          "hasBuilding": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "True: a mapped building stands on the parcel; false: bare ground."
          },
          "minSlopePct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Minimum slope, percent."
          },
          "maxSlopePct": {
            "type": [
              "number",
              "null"
            ],
            "description": "Maximum slope, percent (e.g. 10 for nearly flat)."
          },
          "orientations": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "N",
                "NE",
                "E",
                "SE",
                "S",
                "SW",
                "W",
                "NW"
              ]
            },
            "description": "Compass octants the slope faces."
          },
          "minWaterDistanceM": {
            "type": [
              "number",
              "null"
            ],
            "description": "At least this far from any watercourse (parcels with no water nearby pass)."
          },
          "excludeWaterBand": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Drop parcels a statutory water protection band reaches into."
          },
          "minRailDistanceM": {
            "type": [
              "number",
              "null"
            ],
            "description": "At least this far from a railway."
          },
          "excludeRailBand": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Drop parcels inside the railway safety strip."
          },
          "minPowerLineDistanceM": {
            "type": [
              "number",
              "null"
            ],
            "description": "At least this far from an overhead power line."
          },
          "excludePowerBand": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Drop parcels inside a power line corridor (ANRE)."
          },
          "excludeLandslideRisk": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Drop parcels touched by a landslide risk class of the PUG (overlays exist for Cluj-Napoca only)."
          },
          "houseFits": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "True keeps parcels where the planner fitted a house between the regulation's setbacks."
          },
          "meetsMinLotArea": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "True keeps parcels at least as large as their zone's minimum lot."
          },
          "rulesFromSnapshot": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "True keeps parcels whose rules come from a real local regulation, not the default residential profile."
          },
          "minPotPercent": {
            "type": [
              "number",
              "null"
            ],
            "description": "Minimum POT (maximum footprint ratio) the zone allows, percent."
          },
          "minCut": {
            "type": [
              "number",
              "null"
            ],
            "description": "Minimum CUT (floor area ratio) the zone allows."
          },
          "minLevelsMax": {
            "type": [
              "number",
              "null"
            ],
            "description": "Minimum number of storeys the zone allows."
          },
          "minBuildableAreaSqm": {
            "type": [
              "number",
              "null"
            ],
            "description": "Minimum area left inside the setbacks."
          },
          "minFootprintSqm": {
            "type": [
              "number",
              "null"
            ],
            "description": "Minimum footprint the house planner fitted."
          },
          "intents": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "house_detached",
                "house_semidetached",
                "house_row",
                "semicollective",
                "apartment_block",
                "mixed_use",
                "commercial",
                "hall",
                "agricultural"
              ]
            },
            "description": "What should be allowed on the parcel: its zone admits at least one of these and the figures fit. Only parcels inside a known UTR zone are judged."
          },
          "outrightIntentsOnly": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "True accepts only zones that admit the intent without conditions (no PUZ required)."
          },
          "minFloorAreaSqm": {
            "type": [
              "number",
              "null"
            ],
            "description": "At least this much floor area the regulation lets stand on the plot."
          },
          "minRowHouseLots": {
            "type": [
              "integer",
              "null"
            ],
            "description": "At least this many row-house lots along the front (where the zone admits rows)."
          },
          "minHallScore": {
            "type": [
              "number",
              "null"
            ],
            "description": "At least this warehouse/hall suitability score, 0-100."
          },
          "truckAccess": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "True keeps parcels a heavy truck can reach from a national road."
          },
          "maxNotaryValueLei": {
            "type": [
              "number",
              "null"
            ],
            "description": "Notary chamber minimum land value at most this, lei."
          },
          "sort": {
            "type": [
              "string",
              "null"
            ],
            "description": "area | netArea | slope | frontage | footprint, ascending; prefix with - for descending, e.g. \"-area\"."
          },
          "limit": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Most parcels to return; capped by the server (a few thousand)."
          }
        }
      },
      "ParcelSearchResponse": {
        "type": "object",
        "description": "The matching parcels.",
        "properties": {
          "parcels": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ParcelOutline"
            },
            "description": "The parcels, in the requested order."
          },
          "total": {
            "type": "integer",
            "description": "How many match in all."
          },
          "truncated": {
            "type": "boolean",
            "description": "True when more matched than were returned."
          }
        },
        "required": [
          "parcels",
          "total",
          "truncated"
        ]
      },
      "AdministrativeUnits": {
        "type": "object",
        "description": "Counties and localities that hold parcels, by SIRUTA code, for the search by cadastral number.",
        "properties": {
          "counties": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "A county",
              "properties": {
                "siruta": {
                  "type": "integer",
                  "description": "County SIRUTA code, e.g. 127 for Cluj."
                },
                "name": {
                  "type": "string",
                  "description": "County name"
                },
                "uats": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "description": "A locality (municipiu, oraș or comună)",
                    "properties": {
                      "siruta": {
                        "type": "integer",
                        "description": "Locality SIRUTA code, e.g. 54975 for Cluj-Napoca."
                      },
                      "name": {
                        "type": "string",
                        "description": "Locality name"
                      },
                      "kind": {
                        "type": "string",
                        "description": "municipiu | oras | comuna"
                      }
                    }
                  },
                  "description": "The county's localities"
                }
              }
            },
            "description": "Counties"
          }
        }
      },
      "AdministrativeArea": {
        "type": "object",
        "description": "A locality or county the search can be scoped to.",
        "properties": {
          "regionId": {
            "type": "string",
            "description": "The id to pass as adminAreas / counties, e.g. romania_cluj_floresti."
          },
          "name": {
            "type": "string",
            "description": "Name, without diacritics"
          },
          "county": {
            "type": [
              "string",
              "null"
            ],
            "description": "County name"
          },
          "type": {
            "type": "string",
            "description": "commune | city | county"
          },
          "parcels": {
            "type": "integer",
            "description": "How many parcels it holds."
          }
        }
      },
      "ParcelStats": {
        "type": "object",
        "description": "What the index holds, in real numbers.",
        "properties": {
          "parcels": {
            "type": "integer",
            "description": "Parcels in the index"
          },
          "communes": {
            "type": "integer",
            "description": "Localities with parcels"
          },
          "counties": {
            "type": "integer",
            "description": "Counties"
          },
          "withTerrain": {
            "type": "integer",
            "description": "Parcels with slope and elevation computed"
          },
          "withRoadAccess": {
            "type": "integer",
            "description": "Parcels with road access computed"
          },
          "withFrontage": {
            "type": "integer",
            "description": "Parcels fronting a mapped road"
          },
          "regulatedUnits": {
            "type": "integer",
            "description": "Localities whose urbanism regulation (PUG) is imported"
          },
          "buildableScope": {
            "type": "integer",
            "description": "Parcels judged by the house planner"
          },
          "houseFits": {
            "type": "integer",
            "description": "Parcels where a house fits"
          },
          "blockedPlots": {
            "type": "integer",
            "description": "Parcels too small or landlocked"
          },
          "unlockedByMerge": {
            "type": "integer",
            "description": "Blocked parcels a merge with a neighbour would unlock"
          }
        }
      },
      "ParcelSurroundings": {
        "type": "object",
        "description": "A parcel in full, with everything within radiusMeters of it. This is what the parcel page shows.",
        "properties": {
          "parcel": {
            "type": "object",
            "description": "The parcel itself",
            "properties": {
              "inspireId": {
                "type": "string",
                "description": "The parcel's INSPIRE id, the stable identifier used everywhere in this API: RO.<county SIRUTA>.<locality SIRUTA>.<cadastral number>, e.g. RO.127.54975.329163 is cadastral number 329163 in Cluj-Napoca (54975), Cluj county (127)."
              },
              "nationalCadastralReference": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "The cadastral number as ANCPI records it (unique only inside one locality)."
              },
              "areaSqm": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Area in square metres: ANCPI's figure where recorded, else computed geodesically from the outline."
              },
              "roadFrontageM": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Metres of boundary that front a mapped road (OpenStreetMap); null when access was not computed."
              },
              "roadThroughM": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Metres of mapped road running through the parcel itself."
              },
              "nearestRoadName": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Name of the nearest mapped road, when it has one."
              },
              "nearestRoadDistanceM": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Distance to the nearest mapped road, metres."
              },
              "roadParcel": {
                "type": "boolean",
                "description": "True when the parcel is itself a road."
              },
              "possibleAccessRoad": {
                "type": "boolean",
                "description": "True when the outline looks like an unmapped lane (a guess from shape alone)."
              },
              "perimeterM": {
                "type": "number",
                "description": "Perimeter, metres"
              },
              "widthM": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Width of the fitted rectangle, metres"
              },
              "depthM": {
                "type": [
                  "number",
                  "null"
                ],
                "description": "Depth, metres"
              },
              "centroid": {
                "type": "array",
                "items": {
                  "type": "number"
                },
                "description": "[longitude, latitude]"
              },
              "geometry": {
                "$ref": "#/components/schemas/GeoJsonGeometry"
              },
              "adminAreaLevel1": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "Locality id, e.g. romania_cluj_cluj-napoca"
              }
            }
          },
          "terrain": {
            "oneOf": [
              {
                "type": "object",
                "description": "Slope and elevation from a digital elevation model (about 30 m cells).",
                "properties": {
                  "source": {
                    "type": "string",
                    "description": "DEM source"
                  },
                  "minM": {
                    "type": "number",
                    "description": "Lowest point, metres above sea level"
                  },
                  "maxM": {
                    "type": "number",
                    "description": "Highest point"
                  },
                  "meanM": {
                    "type": "number",
                    "description": "Mean elevation"
                  },
                  "reliefM": {
                    "type": "number",
                    "description": "Max minus min"
                  },
                  "slopePct": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Overall slope, percent"
                  },
                  "aspectDeg": {
                    "type": [
                      "number",
                      "null"
                    ],
                    "description": "Direction the slope faces, degrees from north"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "hall": {
            "type": [
              "object",
              "null"
            ],
            "description": "Warehouse/hall suitability score and its reasons, where the zone admits a hall.",
            "additionalProperties": true
          },
          "notary": {
            "oneOf": [
              {
                "type": "object",
                "description": "The notary chamber's minimum land value (grila notarială).",
                "properties": {
                  "year": {
                    "type": "integer",
                    "description": "Grid year"
                  },
                  "zone": {
                    "type": "string",
                    "description": "Notary zone"
                  },
                  "landKind": {
                    "type": "string",
                    "description": "intravilan | extravilan"
                  },
                  "valueLei": {
                    "type": "number",
                    "description": "Minimum value of the whole parcel, lei"
                  },
                  "leiPerSqm": {
                    "type": "number",
                    "description": "Minimum value per square metre, lei"
                  },
                  "sourceUrl": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "The grid document"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "radiusMeters": {
            "type": "number",
            "description": "The search radius used"
          },
          "neighbours": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "A touching parcel",
              "properties": {
                "inspireId": {
                  "type": "string",
                  "description": "The parcel's INSPIRE id, the stable identifier used everywhere in this API: RO.<county SIRUTA>.<locality SIRUTA>.<cadastral number>, e.g. RO.127.54975.329163 is cadastral number 329163 in Cluj-Napoca (54975), Cluj county (127)."
                },
                "nationalCadastralReference": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "The cadastral number as ANCPI records it (unique only inside one locality)."
                },
                "areaSqm": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Area in square metres: ANCPI's figure where recorded, else computed geodesically from the outline."
                },
                "roadFrontageM": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Metres of boundary that front a mapped road (OpenStreetMap); null when access was not computed."
                },
                "roadThroughM": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Metres of mapped road running through the parcel itself."
                },
                "nearestRoadName": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Name of the nearest mapped road, when it has one."
                },
                "nearestRoadDistanceM": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Distance to the nearest mapped road, metres."
                },
                "roadParcel": {
                  "type": "boolean",
                  "description": "True when the parcel is itself a road."
                },
                "possibleAccessRoad": {
                  "type": "boolean",
                  "description": "True when the outline looks like an unmapped lane (a guess from shape alone)."
                },
                "sharedBoundaryM": {
                  "type": "number",
                  "description": "Shared boundary, metres"
                },
                "geometry": {
                  "$ref": "#/components/schemas/GeoJsonGeometry"
                }
              }
            },
            "description": "Parcels sharing a boundary"
          },
          "roads": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "A mapped road nearby",
              "properties": {
                "id": {
                  "type": "integer",
                  "description": "OSM way id"
                },
                "name": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Road name"
                },
                "highway": {
                  "type": "string",
                  "description": "OSM highway class, e.g. residential, track"
                },
                "surface": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "OSM surface, e.g. asphalt"
                },
                "distanceM": {
                  "type": "number",
                  "description": "Distance from the parcel, metres"
                },
                "frontageM": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Metres of parcel boundary along this road"
                },
                "geometry": {
                  "$ref": "#/components/schemas/GeoJsonGeometry"
                }
              }
            },
            "description": "Roads within the radius, nearest first"
          },
          "railways": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "Railways within the radius, with distance and safety strip"
          },
          "powerLines": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "Overhead power lines within the radius, with voltage, distance and corridor"
          },
          "substations": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "Substations within the radius"
          },
          "waterways": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "A watercourse or water body nearby",
              "properties": {
                "id": {
                  "type": "integer",
                  "description": "Id"
                },
                "name": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Name"
                },
                "kind": {
                  "type": "string",
                  "description": "watercourse | water_body | wetland | spring | dam …"
                },
                "protectionBandM": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Statutory protection band, metres"
                },
                "distanceM": {
                  "type": "number",
                  "description": "Distance, metres"
                },
                "geometry": {
                  "$ref": "#/components/schemas/GeoJsonGeometry"
                }
              }
            },
            "description": "Water within the radius"
          }
        }
      },
      "EnvelopeValue": {
        "type": "object",
        "description": "A figure with where it comes from.",
        "properties": {
          "value": {
            "type": "number",
            "description": "The figure"
          },
          "basis": {
            "type": "string",
            "description": "rule | default | derived: whether the regulation says it, a default profile was assumed, or it was derived"
          },
          "note": {
            "type": [
              "string",
              "null"
            ],
            "description": "Explanation"
          },
          "heightRule": {
            "type": [
              "string",
              "null"
            ],
            "description": "The height regime text, for height figures"
          }
        }
      },
      "EnvelopeSource": {
        "type": "object",
        "description": "The regulation document a figure comes from.",
        "properties": {
          "ruleId": {
            "type": [
              "string",
              "null"
            ],
            "description": "Id for GET /house-planner/rules/{ruleId}/text"
          },
          "title": {
            "type": [
              "string",
              "null"
            ],
            "description": "Document title, e.g. \"Planul Urbanistic General al UAT Vad (HCL 46/2020-11-12)\""
          },
          "url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Where the document is published"
          },
          "article": {
            "type": [
              "string",
              "null"
            ],
            "description": "The article or zone sheet"
          },
          "docDate": {
            "type": [
              "string",
              "null"
            ],
            "description": "Document date, ISO"
          }
        }
      },
      "BuildingEnvelope": {
        "type": "object",
        "description": "What may be built on a parcel under its urbanism regulation: zone, POT, CUT, storeys, height, setbacks, admitted uses, findings and sources. Every figure says whether it is quoted from the regulation or assumed.",
        "properties": {
          "listingId": {
            "type": "string",
            "description": "The INSPIRE id asked for"
          },
          "status": {
            "type": "string",
            "description": "resolved | unresolved: whether the parcel and its rules were found"
          },
          "snapshotVersion": {
            "type": [
              "string",
              "null"
            ],
            "description": "Version of the regulation import"
          },
          "utr": {
            "oneOf": [
              {
                "type": "object",
                "description": "The zone the parcel is judged in",
                "properties": {
                  "key": {
                    "type": "string",
                    "description": "Zone key, e.g. liu"
                  },
                  "raw": {
                    "type": "string",
                    "description": "Zone code as the PUG writes it, e.g. Liu"
                  },
                  "name": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Zone name"
                  },
                  "coverage": {
                    "type": "number",
                    "description": "Share of the parcel inside the zone, 0-1"
                  }
                }
              },
              {
                "type": "null"
              }
            ]
          },
          "zones": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "A zone touching the parcel",
              "properties": {
                "key": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Zone key"
                },
                "raw": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Zone code"
                },
                "name": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Zone name"
                },
                "coverage": {
                  "type": "number",
                  "description": "Share of the parcel, 0-1"
                },
                "admitsHouses": {
                  "type": "boolean",
                  "description": "Whether the zone admits houses"
                },
                "applied": {
                  "type": "boolean",
                  "description": "Whether this is the zone the rules were taken from"
                },
                "potPercent": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "POT, percent"
                },
                "cut": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "CUT"
                },
                "heightMaxM": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Max height, metres"
                },
                "levels": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Height regime, e.g. (1-2S)+P+2"
                },
                "source": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/EnvelopeSource"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "uses": {
                  "type": [
                    "object",
                    "null"
                  ],
                  "description": "Admitted uses: a map from use (house_detached, house_row, hall, …) to {status: yes|conditional|no, condition, article, page}",
                  "additionalProperties": true
                }
              }
            },
            "description": "Every zone touching the parcel, by coverage"
          },
          "potPercent": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/EnvelopeValue"
              },
              {
                "type": "null"
              }
            ],
            "description": "Maximum footprint as percent of the parcel (POT)"
          },
          "cut": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/EnvelopeValue"
              },
              {
                "type": "null"
              }
            ],
            "description": "Maximum floor area ratio (CUT)"
          },
          "levels": {
            "type": [
              "object",
              "null"
            ],
            "description": "Storeys: max, attic, basement, raw regime text, basis",
            "additionalProperties": true
          },
          "heightMaxM": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/EnvelopeValue"
              },
              {
                "type": "null"
              }
            ]
          },
          "corniceMaxM": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/EnvelopeValue"
              },
              {
                "type": "null"
              }
            ]
          },
          "minLotAreaSqm": {
            "type": [
              "number",
              "null"
            ],
            "description": "Minimum lot area the zone requires"
          },
          "setbacks": {
            "type": [
              "object",
              "null"
            ],
            "description": "street, lateral, rear (EnvelopeValue each) and, where the regulation sets them, buildStrip and mainBodyDepth",
            "additionalProperties": true
          },
          "exclusions": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "Parts of the parcel a protection zone takes (water band, power corridor, rail strip)"
          },
          "findings": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "A finding",
              "properties": {
                "kind": {
                  "type": "string",
                  "description": "What it is about"
                },
                "severity": {
                  "type": "string",
                  "description": "info | warning | restrictive"
                },
                "title": {
                  "type": "string",
                  "description": "One line"
                },
                "detail": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Explanation"
                },
                "nextStep": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "What to do about it"
                }
              }
            },
            "description": "What the planner noticed: too small a lot, a corridor, a use not admitted"
          },
          "nextSteps": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "Suggested next steps (certificat de urbanism, PUZ, …)"
          },
          "assumptions": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            },
            "description": "What was assumed where the regulation is silent"
          },
          "sources": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EnvelopeSource"
            },
            "description": "The regulation documents the figures come from"
          },
          "computedAt": {
            "type": [
              "string",
              "null"
            ],
            "description": "When it was computed, ISO instant"
          }
        }
      },
      "RegulationText": {
        "type": "object",
        "description": "The regulation's own text for a zone.",
        "properties": {
          "ruleId": {
            "type": "string",
            "description": "The rule id"
          },
          "utr": {
            "type": [
              "string",
              "null"
            ],
            "description": "Zone code"
          },
          "title": {
            "type": [
              "string",
              "null"
            ],
            "description": "Document title"
          },
          "url": {
            "type": [
              "string",
              "null"
            ],
            "description": "Where it is published"
          },
          "articles": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "An article",
              "properties": {
                "heading": {
                  "type": "string",
                  "description": "Heading"
                },
                "text": {
                  "type": "string",
                  "description": "Text"
                }
              }
            },
            "description": "The articles that apply"
          }
        }
      },
      "ParcelMergeOption": {
        "type": "object",
        "description": "A neighbour this parcel could be joined with, and what the joined lot would be.",
        "properties": {
          "otherInspireId": {
            "type": "string",
            "description": "The neighbour's INSPIRE id"
          },
          "otherReference": {
            "type": [
              "string",
              "null"
            ],
            "description": "Its cadastral number"
          },
          "otherAreaSqm": {
            "type": "number",
            "description": "Its area"
          },
          "ownAreaSqm": {
            "type": "number",
            "description": "This parcel's area"
          },
          "areaSqm": {
            "type": "number",
            "description": "Joined area"
          },
          "netAreaSqm": {
            "type": [
              "number",
              "null"
            ],
            "description": "Joined usable area"
          },
          "widthM": {
            "type": [
              "number",
              "null"
            ],
            "description": "Joined width"
          },
          "depthM": {
            "type": [
              "number",
              "null"
            ],
            "description": "Joined depth"
          },
          "frontageM": {
            "type": [
              "number",
              "null"
            ],
            "description": "Joined road frontage"
          },
          "streetFrontageM": {
            "type": [
              "number",
              "null"
            ],
            "description": "Joined frontage on named streets"
          },
          "streetCount": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Streets the joined lot fronts"
          },
          "cornerPlot": {
            "type": "boolean",
            "description": "Joined lot is a corner plot"
          },
          "builtSqm": {
            "type": "number",
            "description": "Built area already standing on the two"
          },
          "sameUtr": {
            "type": "boolean",
            "description": "Both in the same urbanism zone"
          },
          "fixesMinLotArea": {
            "type": "boolean",
            "description": "The join reaches the zone's minimum lot where this parcel alone does not"
          },
          "givesRoadAccess": {
            "type": "boolean",
            "description": "The join gives road access to a landlocked parcel"
          },
          "minLotAreaSqm": {
            "type": [
              "number",
              "null"
            ],
            "description": "The zone's minimum lot"
          },
          "underMinLotArea": {
            "type": "boolean",
            "description": "This parcel alone is under the minimum lot"
          },
          "landlocked": {
            "type": "boolean",
            "description": "This parcel alone has no road access"
          },
          "potFootprintSqm": {
            "type": [
              "number",
              "null"
            ],
            "description": "Footprint POT allows on the joined lot"
          },
          "cutFloorAreaSqm": {
            "type": [
              "number",
              "null"
            ],
            "description": "Floor area CUT allows on the joined lot"
          }
        }
      },
      "ParcelBriefRequest": {
        "type": "object",
        "description": "A question of the form \"where could I do X\": one intent, a figure, and where to look.",
        "properties": {
          "intent": {
            "type": "string",
            "enum": [
              "floor-area",
              "corner",
              "frontage",
              "strips"
            ],
            "description": "floor-area: a lot allowing at least `value` m² of floor area; corner: a corner lot; frontage: at least `value` m of street front; strips: at least `value` m² of ground for a run of row houses."
          },
          "value": {
            "type": [
              "number",
              "null"
            ],
            "description": "The figure the intent asks for (m² or m); ignored by corner."
          },
          "adminAreas": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Locality ids to look in, e.g. [\"romania_cluj_floresti\"]."
          },
          "counties": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "County ids, e.g. [\"romania_cluj\"]."
          },
          "minLongitude": {
            "type": [
              "number",
              "null"
            ],
            "description": "Optional viewport west edge"
          },
          "minLatitude": {
            "type": [
              "number",
              "null"
            ],
            "description": "South"
          },
          "maxLongitude": {
            "type": [
              "number",
              "null"
            ],
            "description": "East"
          },
          "maxLatitude": {
            "type": [
              "number",
              "null"
            ],
            "description": "North"
          },
          "maxAreaSqm": {
            "type": [
              "number",
              "null"
            ],
            "description": "How large a joined lot may get before it stops being a useful answer."
          },
          "built": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "none",
              "light",
              "any",
              null
            ],
            "description": "What may already stand on the ground: none (bare), light (nothing bigger than a house), any."
          },
          "houseType": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "detached",
              "semidetached",
              "row",
              null
            ],
            "description": "Which house kind the house count is asked in."
          },
          "uses": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Uses every plot's zone must admit (house_detached, house_row, hall, …)."
          },
          "outrightUsesOnly": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Only zones that admit the use without conditions."
          },
          "limit": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Answers per page"
          },
          "offset": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Answers to skip"
          }
        },
        "required": [
          "intent"
        ]
      },
      "ParcelBriefResponse": {
        "type": "object",
        "description": "Lots that could be assembled to answer the question, best fit first.",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "One answer: the plots it joins and the lot they would make",
              "properties": {
                "members": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "description": "A plot",
                    "properties": {
                      "inspireId": {
                        "type": "string",
                        "description": "INSPIRE id"
                      },
                      "reference": {
                        "type": [
                          "string",
                          "null"
                        ],
                        "description": "Cadastral number"
                      },
                      "areaSqm": {
                        "type": "number",
                        "description": "Area"
                      }
                    }
                  },
                  "description": "The plots"
                },
                "areaSqm": {
                  "type": "number",
                  "description": "Joined area"
                },
                "netAreaSqm": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Usable area"
                },
                "widthM": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Width"
                },
                "depthM": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Depth"
                },
                "streetFrontageM": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Street front"
                },
                "streetCount": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "description": "Streets fronted"
                },
                "cornerPlot": {
                  "type": "boolean",
                  "description": "Corner lot"
                },
                "builtSqm": {
                  "type": "number",
                  "description": "Built area standing on the plots"
                },
                "sameUtr": {
                  "type": "boolean",
                  "description": "All plots in one zone"
                },
                "houseLots": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "description": "How many houses of the asked kind the lot takes"
                },
                "floorAreaSqm": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Floor area the regulation allows"
                },
                "footprintSqm": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "Footprint the regulation allows"
                },
                "utrKey": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Zone key"
                },
                "adminAreaLevel1": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Locality id"
                },
                "geometryJson": {
                  "type": "string",
                  "description": "The joined outline as a GeoJSON string"
                }
              }
            },
            "description": "The page of answers"
          },
          "count": {
            "type": "integer",
            "description": "Answers on this page"
          },
          "total": {
            "type": "integer",
            "description": "Answers in all"
          },
          "offset": {
            "type": "integer",
            "description": "Offset"
          },
          "limit": {
            "type": "integer",
            "description": "Page size"
          },
          "note": {
            "type": "string",
            "description": "How the answers were ranked"
          },
          "coverage": {
            "type": "string",
            "description": "Where the search could look (only localities with an imported regulation, for floor-area)"
          }
        }
      },
      "FeedbackRequest": {
        "type": "object",
        "description": "A message from a user: what they could not find, what was confusing, a suggestion.",
        "properties": {
          "kind": {
            "type": "string",
            "enum": [
              "not-found",
              "confusing",
              "suggestion",
              "other"
            ],
            "description": "What sort of message"
          },
          "message": {
            "type": "string",
            "description": "The message, up to 2000 characters"
          },
          "page": {
            "type": [
              "string",
              "null"
            ],
            "description": "The knoha.ro page it is about, path and query"
          },
          "email": {
            "type": [
              "string",
              "null"
            ],
            "description": "An address to answer at, optional"
          },
          "website": {
            "type": [
              "string",
              "null"
            ],
            "description": "Leave absent or empty. A filled value marks the sender as a bot."
          }
        },
        "required": [
          "kind",
          "message"
        ]
      },
      "ZoneUse": {
        "type": "object",
        "description": "Whether a zone admits one use, as read from the regulation.",
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "yes",
              "conditional",
              "no"
            ]
          },
          "condition": {
            "type": [
              "string",
              "null"
            ],
            "description": "the condition, when conditional"
          },
          "article": {
            "type": [
              "string",
              "null"
            ],
            "description": "the article it was read from"
          },
          "page": {
            "type": [
              "integer",
              "null"
            ],
            "description": "the page of the document"
          }
        },
        "required": [
          "status"
        ]
      },
      "ZoneSource": {
        "type": "object",
        "description": "Where a rule comes from, and whether its official text can be fetched.",
        "properties": {
          "ruleId": {
            "type": "string",
            "description": "the key of GET /house-planner/rules/{ruleId}/text, when hasText"
          },
          "hasText": {
            "type": "boolean"
          },
          "title": {
            "type": [
              "string",
              "null"
            ],
            "description": "the document"
          },
          "url": {
            "type": [
              "string",
              "null"
            ],
            "description": "the document, a PDF"
          },
          "article": {
            "type": [
              "string",
              "null"
            ],
            "description": "the article or table"
          },
          "docNumber": {
            "type": [
              "string",
              "null"
            ],
            "description": "the approving decision, e.g. HCL 493"
          },
          "docDate": {
            "type": [
              "string",
              "null"
            ],
            "description": "ISO date"
          },
          "register": {
            "type": [
              "string",
              "null"
            ],
            "description": "MDLPA for a plan from the national register; null otherwise"
          }
        },
        "required": [
          "ruleId",
          "hasText"
        ]
      },
      "ZoneLocality": {
        "type": "object",
        "properties": {
          "regionId": {
            "type": "string",
            "description": "the id the searches take in adminAreas"
          },
          "name": {
            "type": "string"
          },
          "county": {
            "type": [
              "string",
              "null"
            ],
            "description": ""
          },
          "snapshotVersion": {
            "type": "string"
          },
          "zones": {
            "type": "integer"
          },
          "page": {
            "type": "string",
            "format": "uri"
          }
        },
        "required": [
          "regionId",
          "name",
          "snapshotVersion",
          "zones",
          "page"
        ]
      },
      "ZoneSummary": {
        "type": "object",
        "description": "A zone with the headline figures of its own rule, what it admits by use, and where that was read. Short on purpose: a city has over a hundred; setbacks, the uses in the regulation's words and the conditions are in the detail.",
        "properties": {
          "utr": {
            "type": "string",
            "description": "the code as the plan writes it, e.g. Liu"
          },
          "key": {
            "type": "string",
            "description": "the key utrKeys filters take, e.g. liu"
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "description": "the zone name from the plan"
          },
          "polygons": {
            "type": "integer"
          },
          "areaHa": {
            "type": "number"
          },
          "potMaxPercent": {
            "type": [
              "number",
              "null"
            ],
            "description": "POT, percent"
          },
          "cutMax": {
            "type": [
              "number",
              "null"
            ],
            "description": "CUT"
          },
          "heightMaxM": {
            "type": [
              "number",
              "null"
            ],
            "description": "maximum height, metres"
          },
          "floorsMax": {
            "type": [
              "string",
              "null"
            ],
            "description": "the height regime as written, e.g. (S)+P+1+M"
          },
          "minLotAreaSqm": {
            "type": [
              "number",
              "null"
            ],
            "description": "minimum lot, m²"
          },
          "uses": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": {
              "type": "string",
              "enum": [
                "yes",
                "conditional",
                "no"
              ]
            },
            "description": "by use key (house_detached, house_semidetached, house_row, semicollective, apartment_block, mixed_use, commercial, hall, agricultural): yes, conditional or no; null where not read. Conditions and articles are in the zone detail."
          },
          "rules": {
            "type": "integer",
            "description": "how many rules apply in all"
          },
          "source": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ZoneSource"
              },
              {
                "type": "null"
              }
            ]
          },
          "page": {
            "type": "string",
            "format": "uri",
            "description": "the zone page on knoha.ro, to cite"
          }
        },
        "required": [
          "utr",
          "key",
          "polygons",
          "areaHa",
          "rules",
          "page"
        ]
      },
      "ZoneRule": {
        "type": "object",
        "description": "One rule read for a zone: the plan itself (pug-base), a zonal plan (puz-rlu) or a council decision (hcl).",
        "properties": {
          "ruleId": {
            "type": "string"
          },
          "layer": {
            "type": [
              "string",
              "null"
            ],
            "description": "pug-base, puz-rlu, hcl"
          },
          "scope": {
            "type": [
              "string",
              "null"
            ],
            "description": "utr for the whole zone; narrower scopes name a street or plot"
          },
          "confidence": {
            "type": "string",
            "description": "green (read cleanly) or yellow (read with doubt)"
          },
          "potMaxPercent": {
            "type": [
              "number",
              "null"
            ],
            "description": ""
          },
          "cutMax": {
            "type": [
              "number",
              "null"
            ],
            "description": ""
          },
          "heightMaxM": {
            "type": [
              "number",
              "null"
            ],
            "description": ""
          },
          "floorsMax": {
            "type": [
              "string",
              "null"
            ],
            "description": ""
          },
          "minLotAreaSqm": {
            "type": [
              "number",
              "null"
            ],
            "description": ""
          },
          "setbacks": {
            "type": [
              "string",
              "null"
            ],
            "description": ""
          },
          "permittedUses": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "forbiddenUses": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "source": {
            "$ref": "#/components/schemas/ZoneSource"
          }
        },
        "required": [
          "ruleId",
          "confidence",
          "permittedUses",
          "forbiddenUses",
          "source"
        ]
      },
      "ZoneList": {
        "type": "object",
        "description": "A locality's zones, or, without a locality, every locality with a plan.",
        "properties": {
          "locality": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ZoneLocality"
              },
              {
                "type": "null"
              }
            ]
          },
          "localities": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "$ref": "#/components/schemas/ZoneLocality"
            }
          },
          "use": {
            "type": [
              "string",
              "null"
            ],
            "description": "the use the zones were filtered by"
          },
          "zones": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ZoneSummary"
            }
          }
        },
        "required": [
          "zones"
        ]
      },
      "ZoneDetail": {
        "type": "object",
        "properties": {
          "locality": {
            "$ref": "#/components/schemas/ZoneLocality"
          },
          "zone": {
            "$ref": "#/components/schemas/ZoneSummary"
          },
          "rules": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ZoneRule"
            },
            "description": "every rule read for the zone, the plan's own first; at most 30"
          },
          "collectiveMinFrontageM": {
            "type": [
              "number",
              "null"
            ],
            "description": "the front a lot needs for collective housing, where set"
          },
          "collectiveMinLotAreaSqm": {
            "type": [
              "number",
              "null"
            ],
            "description": "the lot it needs, where set"
          },
          "docUrb": {
            "type": [
              "string",
              "null"
            ],
            "description": "the plan the zone comes from, as it names it"
          },
          "uses": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": {
              "$ref": "#/components/schemas/ZoneUse"
            },
            "description": "by use key: status, condition, article and page; null where not read"
          }
        },
        "required": [
          "locality",
          "zone",
          "rules"
        ]
      }
    }
  }
}
