{
  "openapi": "3.1.0",
  "info": {
    "title": "DátováMapa – API portálu",
    "version": "0.1",
    "description": "Katalóg dát, zjednotené dáta všetkých poskytovateľov, dotazy na miesto (čo je v bode a okolí, súhrn za obec) a validátor protokolu. Dokumentácia: https://datovamapa.sk/dokumentacia/api.md, návod pre AI asistentov: https://datovamapa.sk/dokumentacia/ai-asistenti.md"
  },
  "servers": [
    {
      "url": "https://datovamapa.sk"
    }
  ],
  "externalDocs": {
    "url": "https://datovamapa.sk/llms.txt",
    "description": "Rozcestník dokumentácie pre jazykové modely"
  },
  "paths": {
    "/api/catalog": {
      "get": {
        "operationId": "getCatalog",
        "summary": "Všetci poskytovatelia a dátové sady",
        "responses": {
          "200": {
            "description": "Katalóg",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/api/data/{provider}/{dataset}": {
      "get": {
        "operationId": "fetchData",
        "summary": "Dáta dátovej sady ako GeoJSON (cez cache portálu)",
        "description": "Ďalšie query parametre podľa `params` sady v katalógu. Údaje z feature.dm sú v properties s prefixom __dm_.",
        "parameters": [
          {
            "name": "provider",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "bbox",
            "in": "query",
            "schema": {
              "type": "string",
              "example": "16.5,49.1,16.7,49.3"
            },
            "description": "minLon,minLat,maxLon,maxLat; povinné pri sadách s mode bbox"
          },
          {
            "name": "zoom",
            "in": "query",
            "schema": {
              "type": "number",
              "minimum": 0,
              "maximum": 24
            },
            "description": "Povinné pri sadách s mode bbox"
          },
          {
            "name": "cursor",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "GeoJSON FeatureCollection",
            "headers": {
              "X-DM-Cache": {
                "schema": {
                  "type": "string",
                  "enum": [
                    "hit",
                    "miss",
                    "stale"
                  ]
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string",
                      "const": "FeatureCollection"
                    },
                    "features": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "type": {
                            "type": "string",
                            "const": "Feature"
                          },
                          "id": {
                            "anyOf": [
                              {
                                "type": "string",
                                "maxLength": 200
                              },
                              {
                                "type": "number"
                              }
                            ]
                          },
                          "geometry": {
                            "anyOf": [
                              {
                                "oneOf": [
                                  {
                                    "type": "object",
                                    "properties": {
                                      "type": {
                                        "type": "string",
                                        "const": "Point"
                                      },
                                      "coordinates": {
                                        "minItems": 2,
                                        "maxItems": 3,
                                        "type": "array",
                                        "items": {
                                          "type": "number"
                                        }
                                      }
                                    },
                                    "required": [
                                      "type",
                                      "coordinates"
                                    ]
                                  },
                                  {
                                    "type": "object",
                                    "properties": {
                                      "type": {
                                        "type": "string",
                                        "const": "MultiPoint"
                                      },
                                      "coordinates": {
                                        "type": "array",
                                        "items": {
                                          "minItems": 2,
                                          "maxItems": 3,
                                          "type": "array",
                                          "items": {
                                            "type": "number"
                                          }
                                        }
                                      }
                                    },
                                    "required": [
                                      "type",
                                      "coordinates"
                                    ]
                                  },
                                  {
                                    "type": "object",
                                    "properties": {
                                      "type": {
                                        "type": "string",
                                        "const": "LineString"
                                      },
                                      "coordinates": {
                                        "minItems": 2,
                                        "type": "array",
                                        "items": {
                                          "minItems": 2,
                                          "maxItems": 3,
                                          "type": "array",
                                          "items": {
                                            "type": "number"
                                          }
                                        }
                                      }
                                    },
                                    "required": [
                                      "type",
                                      "coordinates"
                                    ]
                                  },
                                  {
                                    "type": "object",
                                    "properties": {
                                      "type": {
                                        "type": "string",
                                        "const": "MultiLineString"
                                      },
                                      "coordinates": {
                                        "type": "array",
                                        "items": {
                                          "minItems": 2,
                                          "type": "array",
                                          "items": {
                                            "minItems": 2,
                                            "maxItems": 3,
                                            "type": "array",
                                            "items": {
                                              "type": "number"
                                            }
                                          }
                                        }
                                      }
                                    },
                                    "required": [
                                      "type",
                                      "coordinates"
                                    ]
                                  },
                                  {
                                    "type": "object",
                                    "properties": {
                                      "type": {
                                        "type": "string",
                                        "const": "Polygon"
                                      },
                                      "coordinates": {
                                        "type": "array",
                                        "items": {
                                          "minItems": 4,
                                          "type": "array",
                                          "items": {
                                            "minItems": 2,
                                            "maxItems": 3,
                                            "type": "array",
                                            "items": {
                                              "type": "number"
                                            }
                                          }
                                        }
                                      }
                                    },
                                    "required": [
                                      "type",
                                      "coordinates"
                                    ]
                                  },
                                  {
                                    "type": "object",
                                    "properties": {
                                      "type": {
                                        "type": "string",
                                        "const": "MultiPolygon"
                                      },
                                      "coordinates": {
                                        "type": "array",
                                        "items": {
                                          "type": "array",
                                          "items": {
                                            "minItems": 4,
                                            "type": "array",
                                            "items": {
                                              "minItems": 2,
                                              "maxItems": 3,
                                              "type": "array",
                                              "items": {
                                                "type": "number"
                                              }
                                            }
                                          }
                                        }
                                      }
                                    },
                                    "required": [
                                      "type",
                                      "coordinates"
                                    ]
                                  }
                                ]
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "properties": {
                            "default": {},
                            "anyOf": [
                              {
                                "type": "object",
                                "propertyNames": {
                                  "type": "string"
                                },
                                "additionalProperties": {}
                              },
                              {
                                "type": "null"
                              }
                            ]
                          },
                          "dm": {
                            "type": "object",
                            "properties": {
                              "title": {
                                "description": "Nadpis objektu v detaile",
                                "type": "string",
                                "maxLength": 200
                              },
                              "description": {
                                "type": "string",
                                "maxLength": 2000
                              },
                              "url": {
                                "description": "Odkaz na detail objektu u poskytovateľa",
                                "type": "string",
                                "format": "uri"
                              },
                              "color": {
                                "description": "Prepíše farbu z prezentácie",
                                "type": "string",
                                "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                              },
                              "chart": {
                                "description": "Graf vývoja hodnoty v detaile objektu",
                                "type": "object",
                                "properties": {
                                  "label": {
                                    "type": "string",
                                    "minLength": 1,
                                    "maxLength": 80,
                                    "description": "Čo graf ukazuje, napr. Počet obyvateľov"
                                  },
                                  "unit": {
                                    "type": "string",
                                    "maxLength": 20
                                  },
                                  "decimals": {
                                    "type": "integer",
                                    "minimum": 0,
                                    "maximum": 6
                                  },
                                  "note": {
                                    "description": "Poznámka pod grafom, napr. o zmene metodiky",
                                    "type": "string",
                                    "maxLength": 200
                                  },
                                  "highlight": {
                                    "description": "Zvýraznené obdobie (napr. zvolené v časovom filtri) – portál ho podfarbí, ukáže hodnotu na jeho konci a zmenu aj trend počíta od jeho začiatku. Rovnaké from a to = jedno zvolené obdobie (napr. rok).",
                                    "type": "object",
                                    "properties": {
                                      "from": {
                                        "type": "string",
                                        "pattern": "^\\d{4}(?:-\\d{2}(?:-\\d{2})?)?$",
                                        "description": "Rok, mesiac alebo deň v ISO 8601"
                                      },
                                      "to": {
                                        "type": "string",
                                        "pattern": "^\\d{4}(?:-\\d{2}(?:-\\d{2})?)?$",
                                        "description": "Rok, mesiac alebo deň v ISO 8601"
                                      }
                                    },
                                    "required": [
                                      "from",
                                      "to"
                                    ]
                                  },
                                  "points": {
                                    "minItems": 2,
                                    "maxItems": 100,
                                    "type": "array",
                                    "items": {
                                      "type": "object",
                                      "properties": {
                                        "period": {
                                          "type": "string",
                                          "pattern": "^\\d{4}(?:-\\d{2}(?:-\\d{2})?)?$",
                                          "description": "Rok, mesiac alebo deň v ISO 8601"
                                        },
                                        "value": {
                                          "type": "number"
                                        }
                                      },
                                      "required": [
                                        "period",
                                        "value"
                                      ]
                                    },
                                    "description": "Hodnoty zoradené od najstaršieho obdobia"
                                  }
                                },
                                "required": [
                                  "label",
                                  "points"
                                ]
                              }
                            }
                          }
                        },
                        "required": [
                          "type",
                          "geometry"
                        ]
                      }
                    },
                    "dm": {
                      "type": "object",
                      "properties": {
                        "protocol": {
                          "type": "string"
                        },
                        "generated": {
                          "description": "Kedy bola odpoveď vytvorená (ISO 8601)",
                          "type": "string",
                          "maxLength": 40
                        },
                        "ttl": {
                          "description": "Ako dlho (s) je odpoveď platná",
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 9007199254740991
                        },
                        "total": {
                          "description": "Celkový počet objektov zodpovedajúcich dotazu",
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 9007199254740991
                        },
                        "truncated": {
                          "description": "Odpoveď neobsahuje všetky objekty (limit)",
                          "type": "boolean"
                        },
                        "next": {
                          "description": "Kurzor pre ďalšiu stránku",
                          "type": "string",
                          "maxLength": 500
                        },
                        "notice": {
                          "description": "Krátke oznámenie pre používateľa, napr. priblížte mapu",
                          "type": "string",
                          "maxLength": 300
                        },
                        "timeline": {
                          "description": "Počty objektov vo výreze po obdobiach za celý čas, ktorý sada pokrýva – nezávisle od zvoleného obdobia a limitu. Portál z nich kreslí graf pri legende.",
                          "maxItems": 400,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "period": {
                                "type": "string",
                                "pattern": "^\\d{4}(?:-\\d{2}(?:-\\d{2})?)?$",
                                "description": "Rok, mesiac alebo deň v ISO 8601"
                              },
                              "count": {
                                "type": "integer",
                                "minimum": 0,
                                "maximum": 9007199254740991
                              },
                              "values": {
                                "description": "Rozpad počtu podľa hodnôt vlastnosti, podľa ktorej sa objekty farbia (color.field) – graf ich zafarbí ako legendu",
                                "type": "object",
                                "propertyNames": {
                                  "type": "string",
                                  "maxLength": 100
                                },
                                "additionalProperties": {
                                  "type": "integer",
                                  "minimum": 0,
                                  "maximum": 9007199254740991
                                }
                              }
                            },
                            "required": [
                              "period",
                              "count"
                            ]
                          }
                        },
                        "chart": {
                          "description": "Súhrnný vývoj hodnoty za celé územie sady alebo výrez (napr. počet obyvateľov Slovenska) – portál ho ukáže pri časovom filtri, keď odpoveď neposiela dm.timeline",
                          "type": "object",
                          "properties": {
                            "label": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 80,
                              "description": "Čo graf ukazuje, napr. Počet obyvateľov"
                            },
                            "unit": {
                              "type": "string",
                              "maxLength": 20
                            },
                            "decimals": {
                              "type": "integer",
                              "minimum": 0,
                              "maximum": 6
                            },
                            "note": {
                              "description": "Poznámka pod grafom, napr. o zmene metodiky",
                              "type": "string",
                              "maxLength": 200
                            },
                            "highlight": {
                              "description": "Zvýraznené obdobie (napr. zvolené v časovom filtri) – portál ho podfarbí, ukáže hodnotu na jeho konci a zmenu aj trend počíta od jeho začiatku. Rovnaké from a to = jedno zvolené obdobie (napr. rok).",
                              "type": "object",
                              "properties": {
                                "from": {
                                  "type": "string",
                                  "pattern": "^\\d{4}(?:-\\d{2}(?:-\\d{2})?)?$",
                                  "description": "Rok, mesiac alebo deň v ISO 8601"
                                },
                                "to": {
                                  "type": "string",
                                  "pattern": "^\\d{4}(?:-\\d{2}(?:-\\d{2})?)?$",
                                  "description": "Rok, mesiac alebo deň v ISO 8601"
                                }
                              },
                              "required": [
                                "from",
                                "to"
                              ]
                            },
                            "points": {
                              "minItems": 2,
                              "maxItems": 100,
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "period": {
                                    "type": "string",
                                    "pattern": "^\\d{4}(?:-\\d{2}(?:-\\d{2})?)?$",
                                    "description": "Rok, mesiac alebo deň v ISO 8601"
                                  },
                                  "value": {
                                    "type": "number"
                                  }
                                },
                                "required": [
                                  "period",
                                  "value"
                                ]
                              },
                              "description": "Hodnoty zoradené od najstaršieho obdobia"
                            }
                          },
                          "required": [
                            "label",
                            "points"
                          ]
                        }
                      }
                    }
                  },
                  "required": [
                    "type",
                    "features"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Neplatný dotaz",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Neznáma dátová sada",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "Chyba zdroja dát",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/nearby": {
      "get": {
        "operationId": "nearby",
        "summary": "Čo je v bode a okolí z vybraných dátových sád",
        "description": "GeoJSON sady: objekty do vzdialenosti radius zoradené od najbližšieho (distance v metroch, 0 = bod vo vnútri plochy). Rastrové sady: prvky priamo v bode (WMS GetFeatureInfo / ArcGIS identify). status ok s prázdnymi hits = nič tu nie je, unavailable = sada hodnotu v bode neposkytuje. Jedno z datasets, purpose, search je povinné. Parametre sád: {provider}/{dataset}.{param}=hodnota.",
        "parameters": [
          {
            "name": "point",
            "in": "query",
            "schema": {
              "type": "string",
              "example": "14.4527,50.0914"
            },
            "description": "lon,lat vo WGS84"
          },
          {
            "name": "place",
            "in": "query",
            "schema": {
              "type": "string",
              "example": "Thámova 7, Praha"
            },
            "description": "Miesto bodu: adresa alebo názov (prvý nález vyhľadávania miesta)"
          },
          {
            "name": "radius",
            "in": "query",
            "schema": {
              "type": "number",
              "minimum": 1,
              "maximum": 20000,
              "default": 500
            },
            "description": "Polomer okolia v metroch"
          },
          {
            "name": "datasets",
            "in": "query",
            "schema": {
              "type": "string",
              "example": "vuv/zaplavova-uzemi,cgs/radon"
            },
            "description": "Kľúče provider/dataset oddelené čiarkou, najviac 12"
          },
          {
            "name": "purpose",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "construction",
                "housing",
                "land-purchase",
                "agriculture",
                "investment",
                "transport",
                "tourism",
                "business",
                "public-administration"
              ]
            },
            "description": "Sady s týmto účelom, ktoré bod pokrývajú"
          },
          {
            "name": "search",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Sady podľa zhody s textom"
          },
          {
            "name": "max",
            "in": "query",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 5
            },
            "description": "Najviac objektov na sadu"
          }
        ],
        "responses": {
          "200": {
            "description": "Výsledky po sadách",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PointAnswer"
                }
              }
            }
          },
          "400": {
            "description": "Neplatný dotaz",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Miesto sa nepodarilo nájsť",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/summary/{provider}/{dataset}": {
      "get": {
        "operationId": "summary",
        "summary": "Súhrn GeoJSON sady za celé územie alebo za obec",
        "description": "Počet objektov, kategórie, najvyššie a najnižšie hodnoty, pri kartograme hodnoty plochy obce (own). Ďalšie query parametre sú parametre sady.",
        "parameters": [
          {
            "name": "provider",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dataset",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "municipality",
            "in": "query",
            "schema": {
              "type": "string",
              "example": "Ostrava"
            },
            "description": "Ktorákoľvek obec Slovenska: názov, názov s okresom („Nová Ves (okres Trenčín)“) alebo kód obce"
          }
        ],
        "responses": {
          "200": {
            "description": "Súhrn",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Rastrová sada alebo sada len pre priblíženie (zadajte obec)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "404": {
            "description": "Neznáma sada alebo obec",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "502": {
            "description": "Chyba zdroja dát",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/validate": {
      "get": {
        "operationId": "checkProvider",
        "summary": "Živý test: stiahne manifest a pošle testovací dotaz na každú sadu",
        "parameters": [
          {
            "name": "manifestUrl",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uri"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Report",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Report"
                }
              }
            }
          },
          "400": {
            "description": "Chýba manifestUrl",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "validate",
        "summary": "Kontrola manifestu alebo dát bez zverejnenia",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "$ref": "#/components/schemas/Manifest"
                  },
                  {
                    "$ref": "#/components/schemas/DataResponse"
                  },
                  {
                    "type": "object",
                    "required": [
                      "manifest"
                    ],
                    "properties": {
                      "manifest": {
                        "$ref": "#/components/schemas/Manifest"
                      }
                    }
                  },
                  {
                    "type": "object",
                    "required": [
                      "data"
                    ],
                    "properties": {
                      "data": {
                        "$ref": "#/components/schemas/DataResponse"
                      },
                      "dataset": {
                        "type": "object",
                        "description": "Dátová sada z manifestu"
                      }
                    }
                  },
                  {
                    "type": "object",
                    "required": [
                      "manifestUrl"
                    ],
                    "properties": {
                      "manifestUrl": {
                        "type": "string",
                        "format": "uri"
                      }
                    }
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Report",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Report"
                }
              }
            }
          },
          "400": {
            "description": "Neplatný vstup",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/registration": {
      "post": {
        "operationId": "registerProvider",
        "summary": "Registrácia poskytovateľa: živý test manifestu a zaradenie medzi neschválené dáta",
        "description": "Dáta sú po registrácii dostupné len na stránkach sád s upozornením; do katalógu sa dostanú po schválení prevádzkovateľom. Schválenie platí pre konkrétny obsah manifestu.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "manifestUrl"
                ],
                "properties": {
                  "manifestUrl": {
                    "type": "string",
                    "format": "uri"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Už zaregistrované (stav v poli status)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "201": {
            "description": "Zaregistrované, čaká na schválenie",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Neplatný vstup",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "403": {
            "description": "Registrácia bola zamietnutá",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "409": {
            "description": "Id alebo URL manifestu je už zaregistrované",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "422": {
            "description": "Manifest neprešiel živým testom (report v poli check)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Príliš veľa požiadaviek alebo plný front na schválenie",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "503": {
            "description": "Registrácia nie je dostupná",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/dokumentacia/pre-ai-agentov.md": {
      "get": {
        "operationId": "documentation_ai_agents",
        "summary": "Návod pre AI agentov",
        "description": "Postup krok za krokom, pravidlá, šablóny kódu a kritériá hotovej práce pre agenta, ktorý pripravuje dáta poskytovateľa.",
        "responses": {
          "200": {
            "description": "Markdown",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/dokumentacia/ai-asistenti.md": {
      "get": {
        "operationId": "documentation_ai_assistants",
        "summary": "Dáta pre AI asistentov",
        "description": "Ako pripojiť DátovúMapu k AI asistentovi (MCP, HTTP API) a pýtať sa na miesta a dáta.",
        "responses": {
          "200": {
            "description": "Markdown",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/dokumentacia/pre-poskytovatelov.md": {
      "get": {
        "operationId": "documentation_providers",
        "summary": "Pre poskytovateľov dát",
        "description": "Ako pripojiť dáta: statické súbory, vlastný endpoint alebo WMS; manifest, dáta, vizualizácie, overenie, podmienky.",
        "responses": {
          "200": {
            "description": "Markdown",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/dokumentacia/protokol.md": {
      "get": {
        "operationId": "documentation_protocol",
        "summary": "Protokol 0.1",
        "description": "Normatívna špecifikácia manifestu, dátového dotazu, odpovede a cache.",
        "responses": {
          "200": {
            "description": "Markdown",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/dokumentacia/api.md": {
      "get": {
        "operationId": "documentation_api",
        "summary": "API portálu a MCP server",
        "description": "Katalóg, dáta, validátor, MCP nástroje, odkazy na mapu a kódy nálezov.",
        "responses": {
          "200": {
            "description": "Markdown",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/dokumentacia/o-projekte.md": {
      "get": {
        "operationId": "documentation_about",
        "summary": "O projekte",
        "description": "Vízia DátovejMapy, princípy a plán rozvoja.",
        "responses": {
          "200": {
            "description": "Markdown",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Manifest": {
        "type": "object",
        "properties": {
          "$schema": {
            "type": "string"
          },
          "protocol": {
            "type": "string",
            "pattern": "^\\d+\\.\\d+$",
            "description": "Verzia protokolu, podľa ktorej je manifest napísaný, napr. 0.1"
          },
          "provider": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "pattern": "^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$",
                "examples": [
                  "mesto-brno",
                  "kontejnery-na-odpad"
                ]
              },
              "name": {
                "type": "string",
                "minLength": 1,
                "maxLength": 120
              },
              "description": {
                "type": "string",
                "maxLength": 1000
              },
              "homepage": {
                "type": "string",
                "format": "uri"
              },
              "logo": {
                "type": "string",
                "format": "uri"
              },
              "contact": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string",
                    "format": "email",
                    "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
                  },
                  "url": {
                    "type": "string",
                    "format": "uri"
                  }
                }
              },
              "managedBy": {
                "default": "provider",
                "description": "portal = manifest pre verejnú službu udržiava DátováMapa, nie vlastník dát",
                "type": "string",
                "enum": [
                  "provider",
                  "portal"
                ]
              }
            },
            "required": [
              "id",
              "name"
            ]
          },
          "license": {
            "description": "Predvolená licencia pre všetky dátové sady",
            "type": "object",
            "properties": {
              "name": {
                "type": "string",
                "minLength": 1,
                "description": "Názov licencie, napr. CC BY 4.0"
              },
              "url": {
                "type": "string",
                "format": "uri"
              },
              "attribution": {
                "type": "string",
                "minLength": 1,
                "maxLength": 300,
                "description": "Text atribúcie, ktorý portál zobrazí pri mape, napr. © Štátny geologický ústav Dionýza Štúra"
              }
            },
            "required": [
              "name",
              "attribution"
            ]
          },
          "datasets": {
            "minItems": 1,
            "maxItems": 200,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "pattern": "^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$",
                  "examples": [
                    "mesto-brno",
                    "kontejnery-na-odpad"
                  ]
                },
                "title": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 120
                },
                "description": {
                  "type": "string",
                  "maxLength": 1000
                },
                "category": {
                  "description": "Odporúčané hodnoty: territory, nature, water, risks, energy, transport, society, economy, infrastructure, sample, other",
                  "type": "string",
                  "maxLength": 40
                },
                "tags": {
                  "maxItems": 30,
                  "type": "array",
                  "items": {
                    "type": "string",
                    "maxLength": 40
                  }
                },
                "keywords": {
                  "description": "Slová a synonymá, podľa ktorých sadu nájde používateľ aj AI asistent portálu. Píšte po slovensky, aj hovorové tvary.",
                  "examples": [
                    [
                      "odpad",
                      "kontejner",
                      "třídění",
                      "popelnice"
                    ]
                  ],
                  "maxItems": 60,
                  "type": "array",
                  "items": {
                    "type": "string",
                    "maxLength": 60
                  }
                },
                "useCases": {
                  "description": "Pre aké účely je sada užitočná. Odporúčané hodnoty: construction, housing, land-purchase, agriculture, investment, transport, tourism, business, public-administration; iné sú povolené.",
                  "examples": [
                    [
                      "construction",
                      "housing"
                    ]
                  ],
                  "maxItems": 20,
                  "type": "array",
                  "items": {
                    "type": "string",
                    "maxLength": 60
                  }
                },
                "coverage": {
                  "type": "object",
                  "properties": {
                    "bbox": {
                      "type": "array",
                      "prefixItems": [
                        {
                          "type": "number",
                          "minimum": -180,
                          "maximum": 180
                        },
                        {
                          "type": "number",
                          "minimum": -90,
                          "maximum": 90
                        },
                        {
                          "type": "number",
                          "minimum": -180,
                          "maximum": 180
                        },
                        {
                          "type": "number",
                          "minimum": -90,
                          "maximum": 90
                        }
                      ],
                      "items": false,
                      "minItems": 4,
                      "maxItems": 4,
                      "description": "[minLon, minLat, maxLon, maxLat] vo WGS84"
                    },
                    "area": {
                      "description": "Slovný popis pokrytia, napr. Slovensko, Prešovský kraj",
                      "type": "string",
                      "maxLength": 60
                    },
                    "minZoom": {
                      "description": "Pod týmto priblížením portál dáta nenačítava",
                      "type": "number",
                      "minimum": 0,
                      "maximum": 24
                    },
                    "maxZoom": {
                      "type": "number",
                      "minimum": 0,
                      "maximum": 24
                    }
                  }
                },
                "temporal": {
                  "type": "object",
                  "properties": {
                    "updated": {
                      "description": "Dátum poslednej aktualizácie dát (ISO 8601)",
                      "type": "string",
                      "maxLength": 40
                    },
                    "frequency": {
                      "description": "Ako často sa dáta menia, napr. denne",
                      "type": "string",
                      "maxLength": 60
                    },
                    "param": {
                      "description": "Kľúč parametra, ktorým používateľ volí obdobie (typ range v rokoch, alebo date-range). Portál ho ukáže ako časový filter pri legende, s grafom z dm.timeline.",
                      "type": "string",
                      "maxLength": 32
                    }
                  }
                },
                "license": {
                  "description": "Prepisuje licenciu poskytovateľa",
                  "type": "object",
                  "properties": {
                    "name": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Názov licencie, napr. CC BY 4.0"
                    },
                    "url": {
                      "type": "string",
                      "format": "uri"
                    },
                    "attribution": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 300,
                      "description": "Text atribúcie, ktorý portál zobrazí pri mape, napr. © Štátny geologický ústav Dionýza Štúra"
                    }
                  },
                  "required": [
                    "name",
                    "attribution"
                  ]
                },
                "source": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "const": "geojson"
                        },
                        "url": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 2048,
                          "description": "Endpoint vracajúci FeatureCollection; môže byť relatívny voči manifestu",
                          "examples": [
                            "https://data.example.cz/datovamapa/kontejnery",
                            "kontejnery.geojson"
                          ]
                        },
                        "mode": {
                          "default": "full",
                          "description": "full = celá sada jedným dotazom, bbox = portál sa pýta na aktuálny výrez mapy",
                          "type": "string",
                          "enum": [
                            "full",
                            "bbox"
                          ]
                        },
                        "maxFeatures": {
                          "description": "Koľko objektov poskytovateľ vráti najviac; portál posiela ako limit",
                          "type": "integer",
                          "minimum": 1,
                          "maximum": 5000
                        }
                      },
                      "required": [
                        "type",
                        "url"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "const": "raster"
                        },
                        "tiles": {
                          "minItems": 1,
                          "maxItems": 4,
                          "type": "array",
                          "items": {
                            "type": "string",
                            "pattern": "^https:\\/\\/\\S+$"
                          },
                          "description": "Šablóny URL s {z}/{x}/{y} alebo {bbox-epsg-3857}"
                        },
                        "tileSize": {
                          "default": 256,
                          "anyOf": [
                            {
                              "type": "number",
                              "const": 256
                            },
                            {
                              "type": "number",
                              "const": 512
                            }
                          ]
                        },
                        "minZoom": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 24
                        },
                        "maxZoom": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 24
                        }
                      },
                      "required": [
                        "type",
                        "tiles"
                      ]
                    }
                  ]
                },
                "presentation": {
                  "oneOf": [
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "const": "circle"
                        },
                        "color": {
                          "anyOf": [
                            {
                              "type": "string",
                              "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                            },
                            {
                              "type": "object",
                              "properties": {
                                "field": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 64
                                },
                                "type": {
                                  "type": "string",
                                  "const": "categorical"
                                },
                                "values": {
                                  "type": "object",
                                  "propertyNames": {
                                    "type": "string"
                                  },
                                  "additionalProperties": {
                                    "type": "string",
                                    "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                                  },
                                  "description": "Hodnota vlastnosti → farba"
                                },
                                "default": {
                                  "type": "string",
                                  "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                                }
                              },
                              "required": [
                                "field",
                                "type",
                                "values"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "field": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 64
                                },
                                "type": {
                                  "type": "string",
                                  "const": "interpolate"
                                },
                                "stops": {
                                  "minItems": 2,
                                  "type": "array",
                                  "items": {
                                    "type": "array",
                                    "prefixItems": [
                                      {
                                        "type": "number"
                                      },
                                      {
                                        "type": "string",
                                        "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                                      }
                                    ],
                                    "items": false,
                                    "minItems": 2,
                                    "maxItems": 2
                                  },
                                  "description": "Zoradené dvojice [hodnota, farba]"
                                }
                              },
                              "required": [
                                "field",
                                "type",
                                "stops"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "field": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 64
                                },
                                "type": {
                                  "type": "string",
                                  "const": "step"
                                },
                                "default": {
                                  "type": "string",
                                  "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
                                  "description": "Farba pre hodnoty pod prvou zarážkou"
                                },
                                "stops": {
                                  "minItems": 1,
                                  "type": "array",
                                  "items": {
                                    "type": "array",
                                    "prefixItems": [
                                      {
                                        "type": "number"
                                      },
                                      {
                                        "type": "string",
                                        "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                                      }
                                    ],
                                    "items": false,
                                    "minItems": 2,
                                    "maxItems": 2
                                  },
                                  "description": "Zoradené dvojice [od hodnoty, farba]"
                                }
                              },
                              "required": [
                                "field",
                                "type",
                                "default",
                                "stops"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "type": {
                                  "type": "string",
                                  "const": "trend"
                                },
                                "threshold": {
                                  "description": "Priemerná zmena za jedno obdobie grafu v % počiatočnej hodnoty, pod ktorou hodnota stagnuje (predvolene 0,5)",
                                  "type": "number",
                                  "minimum": 0,
                                  "maximum": 100
                                },
                                "colors": {
                                  "description": "Prepíše predvolené farby (rastie zelená, stagnuje sivá, klesá červená) – napr. keď je rast nežiaduci",
                                  "type": "object",
                                  "properties": {
                                    "up": {
                                      "type": "string",
                                      "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                                    },
                                    "flat": {
                                      "type": "string",
                                      "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                                    },
                                    "down": {
                                      "type": "string",
                                      "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                                    }
                                  }
                                }
                              },
                              "required": [
                                "type"
                              ]
                            }
                          ]
                        },
                        "radius": {
                          "description": "Polomer v pixeloch",
                          "anyOf": [
                            {
                              "type": "number",
                              "minimum": 0
                            },
                            {
                              "type": "object",
                              "properties": {
                                "field": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 64
                                },
                                "type": {
                                  "type": "string",
                                  "const": "interpolate"
                                },
                                "stops": {
                                  "minItems": 2,
                                  "type": "array",
                                  "items": {
                                    "type": "array",
                                    "prefixItems": [
                                      {
                                        "type": "number"
                                      },
                                      {
                                        "type": "number",
                                        "minimum": 0
                                      }
                                    ],
                                    "items": false,
                                    "minItems": 2,
                                    "maxItems": 2
                                  }
                                }
                              },
                              "required": [
                                "field",
                                "type",
                                "stops"
                              ]
                            }
                          ]
                        },
                        "opacity": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 1
                        },
                        "strokeColor": {
                          "type": "string",
                          "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                        },
                        "strokeWidth": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 10
                        },
                        "label": {
                          "type": "object",
                          "properties": {
                            "field": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 64,
                              "description": "Vlastnosť, ktorej hodnota sa zobrazí ako popisok"
                            },
                            "minZoom": {
                              "type": "number",
                              "minimum": 0,
                              "maximum": 24
                            },
                            "color": {
                              "type": "string",
                              "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                            },
                            "size": {
                              "type": "number",
                              "minimum": 6,
                              "maximum": 32
                            }
                          },
                          "required": [
                            "field"
                          ]
                        },
                        "cluster": {
                          "description": "Zoskupovanie blízkych bodov",
                          "anyOf": [
                            {
                              "type": "boolean"
                            },
                            {
                              "type": "object",
                              "properties": {
                                "radius": {
                                  "type": "number",
                                  "minimum": 10,
                                  "maximum": 200
                                },
                                "maxZoom": {
                                  "type": "number",
                                  "minimum": 0,
                                  "maximum": 20
                                }
                              }
                            }
                          ]
                        },
                        "legend": {
                          "description": "Vlastná legenda; inak ju portál odvodí z farieb",
                          "maxItems": 20,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "label": {
                                "type": "string",
                                "maxLength": 80
                              },
                              "color": {
                                "type": "string",
                                "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                              }
                            },
                            "required": [
                              "label",
                              "color"
                            ]
                          }
                        }
                      },
                      "required": [
                        "type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "const": "heatmap"
                        },
                        "weight": {
                          "description": "Váha bodu, typicky z číselnej vlastnosti",
                          "anyOf": [
                            {
                              "type": "number",
                              "minimum": 0
                            },
                            {
                              "type": "object",
                              "properties": {
                                "field": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 64
                                },
                                "type": {
                                  "type": "string",
                                  "const": "interpolate"
                                },
                                "stops": {
                                  "minItems": 2,
                                  "type": "array",
                                  "items": {
                                    "type": "array",
                                    "prefixItems": [
                                      {
                                        "type": "number"
                                      },
                                      {
                                        "type": "number",
                                        "minimum": 0
                                      }
                                    ],
                                    "items": false,
                                    "minItems": 2,
                                    "maxItems": 2
                                  }
                                }
                              },
                              "required": [
                                "field",
                                "type",
                                "stops"
                              ]
                            }
                          ]
                        },
                        "radius": {
                          "type": "number",
                          "minimum": 1,
                          "maximum": 100
                        },
                        "intensity": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 10
                        },
                        "colors": {
                          "description": "Farebná škála od nízkej po vysokú hustotu",
                          "minItems": 2,
                          "maxItems": 10,
                          "type": "array",
                          "items": {
                            "type": "string",
                            "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                          }
                        },
                        "opacity": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 1
                        },
                        "legend": {
                          "description": "Vlastná legenda; inak ju portál odvodí z farieb",
                          "maxItems": 20,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "label": {
                                "type": "string",
                                "maxLength": 80
                              },
                              "color": {
                                "type": "string",
                                "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                              }
                            },
                            "required": [
                              "label",
                              "color"
                            ]
                          }
                        }
                      },
                      "required": [
                        "type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "const": "line"
                        },
                        "color": {
                          "anyOf": [
                            {
                              "type": "string",
                              "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                            },
                            {
                              "type": "object",
                              "properties": {
                                "field": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 64
                                },
                                "type": {
                                  "type": "string",
                                  "const": "categorical"
                                },
                                "values": {
                                  "type": "object",
                                  "propertyNames": {
                                    "type": "string"
                                  },
                                  "additionalProperties": {
                                    "type": "string",
                                    "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                                  },
                                  "description": "Hodnota vlastnosti → farba"
                                },
                                "default": {
                                  "type": "string",
                                  "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                                }
                              },
                              "required": [
                                "field",
                                "type",
                                "values"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "field": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 64
                                },
                                "type": {
                                  "type": "string",
                                  "const": "interpolate"
                                },
                                "stops": {
                                  "minItems": 2,
                                  "type": "array",
                                  "items": {
                                    "type": "array",
                                    "prefixItems": [
                                      {
                                        "type": "number"
                                      },
                                      {
                                        "type": "string",
                                        "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                                      }
                                    ],
                                    "items": false,
                                    "minItems": 2,
                                    "maxItems": 2
                                  },
                                  "description": "Zoradené dvojice [hodnota, farba]"
                                }
                              },
                              "required": [
                                "field",
                                "type",
                                "stops"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "field": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 64
                                },
                                "type": {
                                  "type": "string",
                                  "const": "step"
                                },
                                "default": {
                                  "type": "string",
                                  "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
                                  "description": "Farba pre hodnoty pod prvou zarážkou"
                                },
                                "stops": {
                                  "minItems": 1,
                                  "type": "array",
                                  "items": {
                                    "type": "array",
                                    "prefixItems": [
                                      {
                                        "type": "number"
                                      },
                                      {
                                        "type": "string",
                                        "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                                      }
                                    ],
                                    "items": false,
                                    "minItems": 2,
                                    "maxItems": 2
                                  },
                                  "description": "Zoradené dvojice [od hodnoty, farba]"
                                }
                              },
                              "required": [
                                "field",
                                "type",
                                "default",
                                "stops"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "type": {
                                  "type": "string",
                                  "const": "trend"
                                },
                                "threshold": {
                                  "description": "Priemerná zmena za jedno obdobie grafu v % počiatočnej hodnoty, pod ktorou hodnota stagnuje (predvolene 0,5)",
                                  "type": "number",
                                  "minimum": 0,
                                  "maximum": 100
                                },
                                "colors": {
                                  "description": "Prepíše predvolené farby (rastie zelená, stagnuje sivá, klesá červená) – napr. keď je rast nežiaduci",
                                  "type": "object",
                                  "properties": {
                                    "up": {
                                      "type": "string",
                                      "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                                    },
                                    "flat": {
                                      "type": "string",
                                      "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                                    },
                                    "down": {
                                      "type": "string",
                                      "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                                    }
                                  }
                                }
                              },
                              "required": [
                                "type"
                              ]
                            }
                          ]
                        },
                        "width": {
                          "anyOf": [
                            {
                              "type": "number",
                              "minimum": 0
                            },
                            {
                              "type": "object",
                              "properties": {
                                "field": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 64
                                },
                                "type": {
                                  "type": "string",
                                  "const": "interpolate"
                                },
                                "stops": {
                                  "minItems": 2,
                                  "type": "array",
                                  "items": {
                                    "type": "array",
                                    "prefixItems": [
                                      {
                                        "type": "number"
                                      },
                                      {
                                        "type": "number",
                                        "minimum": 0
                                      }
                                    ],
                                    "items": false,
                                    "minItems": 2,
                                    "maxItems": 2
                                  }
                                }
                              },
                              "required": [
                                "field",
                                "type",
                                "stops"
                              ]
                            }
                          ]
                        },
                        "opacity": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 1
                        },
                        "dash": {
                          "minItems": 2,
                          "maxItems": 8,
                          "type": "array",
                          "items": {
                            "type": "number",
                            "minimum": 0
                          }
                        },
                        "label": {
                          "type": "object",
                          "properties": {
                            "field": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 64,
                              "description": "Vlastnosť, ktorej hodnota sa zobrazí ako popisok"
                            },
                            "minZoom": {
                              "type": "number",
                              "minimum": 0,
                              "maximum": 24
                            },
                            "color": {
                              "type": "string",
                              "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                            },
                            "size": {
                              "type": "number",
                              "minimum": 6,
                              "maximum": 32
                            }
                          },
                          "required": [
                            "field"
                          ]
                        },
                        "legend": {
                          "description": "Vlastná legenda; inak ju portál odvodí z farieb",
                          "maxItems": 20,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "label": {
                                "type": "string",
                                "maxLength": 80
                              },
                              "color": {
                                "type": "string",
                                "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                              }
                            },
                            "required": [
                              "label",
                              "color"
                            ]
                          }
                        }
                      },
                      "required": [
                        "type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "const": "fill"
                        },
                        "color": {
                          "anyOf": [
                            {
                              "type": "string",
                              "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                            },
                            {
                              "type": "object",
                              "properties": {
                                "field": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 64
                                },
                                "type": {
                                  "type": "string",
                                  "const": "categorical"
                                },
                                "values": {
                                  "type": "object",
                                  "propertyNames": {
                                    "type": "string"
                                  },
                                  "additionalProperties": {
                                    "type": "string",
                                    "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                                  },
                                  "description": "Hodnota vlastnosti → farba"
                                },
                                "default": {
                                  "type": "string",
                                  "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                                }
                              },
                              "required": [
                                "field",
                                "type",
                                "values"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "field": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 64
                                },
                                "type": {
                                  "type": "string",
                                  "const": "interpolate"
                                },
                                "stops": {
                                  "minItems": 2,
                                  "type": "array",
                                  "items": {
                                    "type": "array",
                                    "prefixItems": [
                                      {
                                        "type": "number"
                                      },
                                      {
                                        "type": "string",
                                        "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                                      }
                                    ],
                                    "items": false,
                                    "minItems": 2,
                                    "maxItems": 2
                                  },
                                  "description": "Zoradené dvojice [hodnota, farba]"
                                }
                              },
                              "required": [
                                "field",
                                "type",
                                "stops"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "field": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 64
                                },
                                "type": {
                                  "type": "string",
                                  "const": "step"
                                },
                                "default": {
                                  "type": "string",
                                  "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$",
                                  "description": "Farba pre hodnoty pod prvou zarážkou"
                                },
                                "stops": {
                                  "minItems": 1,
                                  "type": "array",
                                  "items": {
                                    "type": "array",
                                    "prefixItems": [
                                      {
                                        "type": "number"
                                      },
                                      {
                                        "type": "string",
                                        "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                                      }
                                    ],
                                    "items": false,
                                    "minItems": 2,
                                    "maxItems": 2
                                  },
                                  "description": "Zoradené dvojice [od hodnoty, farba]"
                                }
                              },
                              "required": [
                                "field",
                                "type",
                                "default",
                                "stops"
                              ]
                            },
                            {
                              "type": "object",
                              "properties": {
                                "type": {
                                  "type": "string",
                                  "const": "trend"
                                },
                                "threshold": {
                                  "description": "Priemerná zmena za jedno obdobie grafu v % počiatočnej hodnoty, pod ktorou hodnota stagnuje (predvolene 0,5)",
                                  "type": "number",
                                  "minimum": 0,
                                  "maximum": 100
                                },
                                "colors": {
                                  "description": "Prepíše predvolené farby (rastie zelená, stagnuje sivá, klesá červená) – napr. keď je rast nežiaduci",
                                  "type": "object",
                                  "properties": {
                                    "up": {
                                      "type": "string",
                                      "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                                    },
                                    "flat": {
                                      "type": "string",
                                      "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                                    },
                                    "down": {
                                      "type": "string",
                                      "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                                    }
                                  }
                                }
                              },
                              "required": [
                                "type"
                              ]
                            }
                          ]
                        },
                        "opacity": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 1
                        },
                        "outlineColor": {
                          "type": "string",
                          "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                        },
                        "outlineWidth": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 10
                        },
                        "label": {
                          "type": "object",
                          "properties": {
                            "field": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 64,
                              "description": "Vlastnosť, ktorej hodnota sa zobrazí ako popisok"
                            },
                            "minZoom": {
                              "type": "number",
                              "minimum": 0,
                              "maximum": 24
                            },
                            "color": {
                              "type": "string",
                              "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                            },
                            "size": {
                              "type": "number",
                              "minimum": 6,
                              "maximum": 32
                            }
                          },
                          "required": [
                            "field"
                          ]
                        },
                        "legend": {
                          "description": "Vlastná legenda; inak ju portál odvodí z farieb",
                          "maxItems": 20,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "label": {
                                "type": "string",
                                "maxLength": 80
                              },
                              "color": {
                                "type": "string",
                                "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                              }
                            },
                            "required": [
                              "label",
                              "color"
                            ]
                          }
                        }
                      },
                      "required": [
                        "type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "const": "raster"
                        },
                        "opacity": {
                          "type": "number",
                          "minimum": 0,
                          "maximum": 1
                        },
                        "legend": {
                          "description": "Vlastná legenda; inak ju portál odvodí z farieb",
                          "maxItems": 20,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "label": {
                                "type": "string",
                                "maxLength": 80
                              },
                              "color": {
                                "type": "string",
                                "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                              }
                            },
                            "required": [
                              "label",
                              "color"
                            ]
                          }
                        }
                      },
                      "required": [
                        "type"
                      ]
                    },
                    {
                      "type": "object",
                      "properties": {
                        "type": {
                          "type": "string",
                          "const": "auto"
                        },
                        "color": {
                          "type": "string",
                          "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                        },
                        "legend": {
                          "description": "Vlastná legenda; inak ju portál odvodí z farieb",
                          "maxItems": 20,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "label": {
                                "type": "string",
                                "maxLength": 80
                              },
                              "color": {
                                "type": "string",
                                "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                              }
                            },
                            "required": [
                              "label",
                              "color"
                            ]
                          }
                        }
                      },
                      "required": [
                        "type"
                      ]
                    }
                  ]
                },
                "fields": {
                  "maxItems": 100,
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 64
                      },
                      "label": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 80
                      },
                      "type": {
                        "default": "string",
                        "type": "string",
                        "enum": [
                          "string",
                          "number",
                          "integer",
                          "boolean",
                          "date",
                          "datetime",
                          "url",
                          "image",
                          "email",
                          "phone"
                        ]
                      },
                      "unit": {
                        "type": "string",
                        "maxLength": 20
                      },
                      "decimals": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 8
                      },
                      "description": {
                        "type": "string",
                        "maxLength": 300
                      },
                      "primary": {
                        "description": "Hodnota slúži ako nadpis objektu v detaile",
                        "type": "boolean"
                      }
                    },
                    "required": [
                      "key",
                      "label"
                    ]
                  }
                },
                "params": {
                  "maxItems": 20,
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "key": {
                        "type": "string",
                        "pattern": "^[a-zA-Z][a-zA-Z0-9_]{0,31}$"
                      },
                      "label": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 80
                      },
                      "type": {
                        "type": "string",
                        "enum": [
                          "enum",
                          "multi-enum",
                          "number",
                          "range",
                          "boolean",
                          "date",
                          "date-range",
                          "text"
                        ]
                      },
                      "description": {
                        "type": "string",
                        "maxLength": 300
                      },
                      "options": {
                        "description": "Pre enum a multi-enum",
                        "maxItems": 200,
                        "type": "array",
                        "items": {
                          "type": "object",
                          "properties": {
                            "value": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 100
                            },
                            "label": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 100
                            }
                          },
                          "required": [
                            "value",
                            "label"
                          ]
                        }
                      },
                      "min": {
                        "type": "number"
                      },
                      "max": {
                        "type": "number"
                      },
                      "step": {
                        "type": "number",
                        "exclusiveMinimum": 0
                      },
                      "unit": {
                        "type": "string",
                        "maxLength": 20
                      },
                      "default": {
                        "type": [
                          "string",
                          "number",
                          "boolean"
                        ]
                      },
                      "required": {
                        "type": "boolean"
                      }
                    },
                    "required": [
                      "key",
                      "label",
                      "type"
                    ]
                  }
                },
                "cache": {
                  "type": "object",
                  "properties": {
                    "ttl": {
                      "description": "Ako dlho (s) smie portál odpoveď držať v cache",
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 31536000
                    },
                    "store": {
                      "description": "Smie portál dáta uložiť do svojej cache vrstvy pre analýzy a kombinácie (predvolene áno)",
                      "type": "boolean"
                    }
                  }
                }
              },
              "required": [
                "id",
                "title",
                "source",
                "presentation"
              ]
            }
          }
        },
        "required": [
          "protocol",
          "provider",
          "datasets"
        ]
      },
      "DataResponse": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "const": "FeatureCollection"
          },
          "features": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "type": {
                  "type": "string",
                  "const": "Feature"
                },
                "id": {
                  "anyOf": [
                    {
                      "type": "string",
                      "maxLength": 200
                    },
                    {
                      "type": "number"
                    }
                  ]
                },
                "geometry": {
                  "anyOf": [
                    {
                      "oneOf": [
                        {
                          "type": "object",
                          "properties": {
                            "type": {
                              "type": "string",
                              "const": "Point"
                            },
                            "coordinates": {
                              "minItems": 2,
                              "maxItems": 3,
                              "type": "array",
                              "items": {
                                "type": "number"
                              }
                            }
                          },
                          "required": [
                            "type",
                            "coordinates"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "type": {
                              "type": "string",
                              "const": "MultiPoint"
                            },
                            "coordinates": {
                              "type": "array",
                              "items": {
                                "minItems": 2,
                                "maxItems": 3,
                                "type": "array",
                                "items": {
                                  "type": "number"
                                }
                              }
                            }
                          },
                          "required": [
                            "type",
                            "coordinates"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "type": {
                              "type": "string",
                              "const": "LineString"
                            },
                            "coordinates": {
                              "minItems": 2,
                              "type": "array",
                              "items": {
                                "minItems": 2,
                                "maxItems": 3,
                                "type": "array",
                                "items": {
                                  "type": "number"
                                }
                              }
                            }
                          },
                          "required": [
                            "type",
                            "coordinates"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "type": {
                              "type": "string",
                              "const": "MultiLineString"
                            },
                            "coordinates": {
                              "type": "array",
                              "items": {
                                "minItems": 2,
                                "type": "array",
                                "items": {
                                  "minItems": 2,
                                  "maxItems": 3,
                                  "type": "array",
                                  "items": {
                                    "type": "number"
                                  }
                                }
                              }
                            }
                          },
                          "required": [
                            "type",
                            "coordinates"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "type": {
                              "type": "string",
                              "const": "Polygon"
                            },
                            "coordinates": {
                              "type": "array",
                              "items": {
                                "minItems": 4,
                                "type": "array",
                                "items": {
                                  "minItems": 2,
                                  "maxItems": 3,
                                  "type": "array",
                                  "items": {
                                    "type": "number"
                                  }
                                }
                              }
                            }
                          },
                          "required": [
                            "type",
                            "coordinates"
                          ]
                        },
                        {
                          "type": "object",
                          "properties": {
                            "type": {
                              "type": "string",
                              "const": "MultiPolygon"
                            },
                            "coordinates": {
                              "type": "array",
                              "items": {
                                "type": "array",
                                "items": {
                                  "minItems": 4,
                                  "type": "array",
                                  "items": {
                                    "minItems": 2,
                                    "maxItems": 3,
                                    "type": "array",
                                    "items": {
                                      "type": "number"
                                    }
                                  }
                                }
                              }
                            }
                          },
                          "required": [
                            "type",
                            "coordinates"
                          ]
                        }
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "properties": {
                  "default": {},
                  "anyOf": [
                    {
                      "type": "object",
                      "propertyNames": {
                        "type": "string"
                      },
                      "additionalProperties": {}
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "dm": {
                  "type": "object",
                  "properties": {
                    "title": {
                      "description": "Nadpis objektu v detaile",
                      "type": "string",
                      "maxLength": 200
                    },
                    "description": {
                      "type": "string",
                      "maxLength": 2000
                    },
                    "url": {
                      "description": "Odkaz na detail objektu u poskytovateľa",
                      "type": "string",
                      "format": "uri"
                    },
                    "color": {
                      "description": "Prepíše farbu z prezentácie",
                      "type": "string",
                      "pattern": "^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$"
                    },
                    "chart": {
                      "description": "Graf vývoja hodnoty v detaile objektu",
                      "type": "object",
                      "properties": {
                        "label": {
                          "type": "string",
                          "minLength": 1,
                          "maxLength": 80,
                          "description": "Čo graf ukazuje, napr. Počet obyvateľov"
                        },
                        "unit": {
                          "type": "string",
                          "maxLength": 20
                        },
                        "decimals": {
                          "type": "integer",
                          "minimum": 0,
                          "maximum": 6
                        },
                        "note": {
                          "description": "Poznámka pod grafom, napr. o zmene metodiky",
                          "type": "string",
                          "maxLength": 200
                        },
                        "highlight": {
                          "description": "Zvýraznené obdobie (napr. zvolené v časovom filtri) – portál ho podfarbí, ukáže hodnotu na jeho konci a zmenu aj trend počíta od jeho začiatku. Rovnaké from a to = jedno zvolené obdobie (napr. rok).",
                          "type": "object",
                          "properties": {
                            "from": {
                              "type": "string",
                              "pattern": "^\\d{4}(?:-\\d{2}(?:-\\d{2})?)?$",
                              "description": "Rok, mesiac alebo deň v ISO 8601"
                            },
                            "to": {
                              "type": "string",
                              "pattern": "^\\d{4}(?:-\\d{2}(?:-\\d{2})?)?$",
                              "description": "Rok, mesiac alebo deň v ISO 8601"
                            }
                          },
                          "required": [
                            "from",
                            "to"
                          ]
                        },
                        "points": {
                          "minItems": 2,
                          "maxItems": 100,
                          "type": "array",
                          "items": {
                            "type": "object",
                            "properties": {
                              "period": {
                                "type": "string",
                                "pattern": "^\\d{4}(?:-\\d{2}(?:-\\d{2})?)?$",
                                "description": "Rok, mesiac alebo deň v ISO 8601"
                              },
                              "value": {
                                "type": "number"
                              }
                            },
                            "required": [
                              "period",
                              "value"
                            ]
                          },
                          "description": "Hodnoty zoradené od najstaršieho obdobia"
                        }
                      },
                      "required": [
                        "label",
                        "points"
                      ]
                    }
                  }
                }
              },
              "required": [
                "type",
                "geometry"
              ]
            }
          },
          "dm": {
            "type": "object",
            "properties": {
              "protocol": {
                "type": "string"
              },
              "generated": {
                "description": "Kedy bola odpoveď vytvorená (ISO 8601)",
                "type": "string",
                "maxLength": 40
              },
              "ttl": {
                "description": "Ako dlho (s) je odpoveď platná",
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "total": {
                "description": "Celkový počet objektov zodpovedajúcich dotazu",
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991
              },
              "truncated": {
                "description": "Odpoveď neobsahuje všetky objekty (limit)",
                "type": "boolean"
              },
              "next": {
                "description": "Kurzor pre ďalšiu stránku",
                "type": "string",
                "maxLength": 500
              },
              "notice": {
                "description": "Krátke oznámenie pre používateľa, napr. priblížte mapu",
                "type": "string",
                "maxLength": 300
              },
              "timeline": {
                "description": "Počty objektov vo výreze po obdobiach za celý čas, ktorý sada pokrýva – nezávisle od zvoleného obdobia a limitu. Portál z nich kreslí graf pri legende.",
                "maxItems": 400,
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "period": {
                      "type": "string",
                      "pattern": "^\\d{4}(?:-\\d{2}(?:-\\d{2})?)?$",
                      "description": "Rok, mesiac alebo deň v ISO 8601"
                    },
                    "count": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 9007199254740991
                    },
                    "values": {
                      "description": "Rozpad počtu podľa hodnôt vlastnosti, podľa ktorej sa objekty farbia (color.field) – graf ich zafarbí ako legendu",
                      "type": "object",
                      "propertyNames": {
                        "type": "string",
                        "maxLength": 100
                      },
                      "additionalProperties": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 9007199254740991
                      }
                    }
                  },
                  "required": [
                    "period",
                    "count"
                  ]
                }
              },
              "chart": {
                "description": "Súhrnný vývoj hodnoty za celé územie sady alebo výrez (napr. počet obyvateľov Slovenska) – portál ho ukáže pri časovom filtri, keď odpoveď neposiela dm.timeline",
                "type": "object",
                "properties": {
                  "label": {
                    "type": "string",
                    "minLength": 1,
                    "maxLength": 80,
                    "description": "Čo graf ukazuje, napr. Počet obyvateľov"
                  },
                  "unit": {
                    "type": "string",
                    "maxLength": 20
                  },
                  "decimals": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 6
                  },
                  "note": {
                    "description": "Poznámka pod grafom, napr. o zmene metodiky",
                    "type": "string",
                    "maxLength": 200
                  },
                  "highlight": {
                    "description": "Zvýraznené obdobie (napr. zvolené v časovom filtri) – portál ho podfarbí, ukáže hodnotu na jeho konci a zmenu aj trend počíta od jeho začiatku. Rovnaké from a to = jedno zvolené obdobie (napr. rok).",
                    "type": "object",
                    "properties": {
                      "from": {
                        "type": "string",
                        "pattern": "^\\d{4}(?:-\\d{2}(?:-\\d{2})?)?$",
                        "description": "Rok, mesiac alebo deň v ISO 8601"
                      },
                      "to": {
                        "type": "string",
                        "pattern": "^\\d{4}(?:-\\d{2}(?:-\\d{2})?)?$",
                        "description": "Rok, mesiac alebo deň v ISO 8601"
                      }
                    },
                    "required": [
                      "from",
                      "to"
                    ]
                  },
                  "points": {
                    "minItems": 2,
                    "maxItems": 100,
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "period": {
                          "type": "string",
                          "pattern": "^\\d{4}(?:-\\d{2}(?:-\\d{2})?)?$",
                          "description": "Rok, mesiac alebo deň v ISO 8601"
                        },
                        "value": {
                          "type": "number"
                        }
                      },
                      "required": [
                        "period",
                        "value"
                      ]
                    },
                    "description": "Hodnoty zoradené od najstaršieho obdobia"
                  }
                },
                "required": [
                  "label",
                  "points"
                ]
              }
            }
          }
        },
        "required": [
          "type",
          "features"
        ]
      },
      "Issue": {
        "type": "object",
        "required": [
          "path",
          "code",
          "message"
        ],
        "properties": {
          "path": {
            "type": "string",
            "description": "Miesto v dokumente, napr. datasets[0].keywords"
          },
          "code": {
            "type": "string",
            "description": "Stabilný kód nálezu, pozri /dokumentacia/api.md#kody-nalezu"
          },
          "message": {
            "type": "string"
          },
          "hint": {
            "type": "string",
            "description": "Rada, ako nález opraviť"
          }
        }
      },
      "Report": {
        "type": "object",
        "required": [
          "valid",
          "errors",
          "warnings",
          "summary"
        ],
        "properties": {
          "valid": {
            "type": "boolean"
          },
          "summary": {
            "type": "string"
          },
          "errors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Issue"
            }
          },
          "warnings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Issue"
            }
          },
          "kind": {
            "type": "string",
            "enum": [
              "manifest",
              "data"
            ]
          },
          "featureCount": {
            "type": "integer"
          },
          "manifestUrl": {
            "type": "string"
          },
          "provider": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "name": {
                "type": "string"
              }
            }
          },
          "datasets": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "sourceType": {
                  "type": "string"
                },
                "request": {
                  "type": "string"
                },
                "durationMs": {
                  "type": "integer"
                },
                "featureCount": {
                  "type": "integer"
                },
                "valid": {
                  "type": "boolean"
                },
                "summary": {
                  "type": "string"
                },
                "errors": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Issue"
                  }
                },
                "warnings": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Issue"
                  }
                }
              }
            }
          }
        }
      },
      "Error": {
        "type": "object",
        "required": [
          "error",
          "code"
        ],
        "properties": {
          "error": {
            "type": "string"
          },
          "code": {
            "type": "string"
          }
        }
      },
      "Place": {
        "type": "object",
        "required": [
          "name",
          "type",
          "point"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "description": "adresa, ulica, obec, časť obce…"
          },
          "point": {
            "type": "array",
            "items": {
              "type": "number"
            },
            "minItems": 2,
            "maxItems": 2,
            "description": "[lon, lat]"
          },
          "municipality": {
            "type": "object",
            "description": "Obec, v ktorej miesto leží; code (kód obce) je jednoznačný aj pri rovnomenných obciach",
            "properties": {
              "slug": {
                "type": "string"
              },
              "code": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "district": {
                "type": "string"
              },
              "region": {
                "type": "string"
              }
            }
          },
          "near": {
            "type": "object",
            "description": "Najbližšia obec nad 10 000 obyvateľov (pri miestach mimo týchto miest)",
            "properties": {
              "name": {
                "type": "string"
              },
              "km": {
                "type": "number"
              }
            }
          }
        }
      },
      "PointAnswer": {
        "type": "object",
        "required": [
          "point",
          "radius",
          "generated",
          "results",
          "map"
        ],
        "properties": {
          "place": {
            "$ref": "#/components/schemas/Place"
          },
          "point": {
            "type": "array",
            "items": {
              "type": "number"
            }
          },
          "radius": {
            "type": "number"
          },
          "generated": {
            "type": "string",
            "format": "date-time"
          },
          "skipped": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Sady nad limit, na ktoré sa dotaz nepýtal"
          },
          "map": {
            "type": "string",
            "format": "uri"
          },
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "dataset",
                "title",
                "status",
                "hits"
              ],
              "properties": {
                "dataset": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "description": {
                  "type": "string"
                },
                "legend": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "provider": {
                  "type": "string"
                },
                "attribution": {
                  "type": "string"
                },
                "license": {
                  "type": "string"
                },
                "status": {
                  "type": "string",
                  "enum": [
                    "ok",
                    "unavailable",
                    "error"
                  ]
                },
                "count": {
                  "type": "integer"
                },
                "radius": {
                  "type": "number"
                },
                "truncated": {
                  "type": "boolean"
                },
                "notice": {
                  "type": "string"
                },
                "error": {
                  "type": "string"
                },
                "code": {
                  "type": "string"
                },
                "hits": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "required": [
                      "title",
                      "distance",
                      "values"
                    ],
                    "properties": {
                      "title": {
                        "type": "string"
                      },
                      "distance": {
                        "type": "number"
                      },
                      "values": {
                        "type": "array",
                        "items": {
                          "type": "object",
                          "required": [
                            "label",
                            "value"
                          ],
                          "properties": {
                            "label": {
                              "type": "string"
                            },
                            "value": {
                              "type": "string"
                            }
                          }
                        }
                      },
                      "description": {
                        "type": "string"
                      },
                      "url": {
                        "type": "string"
                      },
                      "chart": {
                        "type": "object"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}