Skip to main content
Glama

Expat Living Italy

Find comuni by criteria

find_comuni
Read-onlyIdempotent

Which Italian comuni match: region, province, population range, purchase-price and rent ranges (OMI), population change 2019–2025, the eight shortlist filters (January low, days above 30 C, regional hospital-care score, all three care scores at 60, tourist beds per resident, outside seismic zone 1, road time to a hospital with inpatient beds, road time to an airport) and/or the verified comuni of a tax regime. Paged (max 100) and sortable. Healthcare scores are region grain (autonomous-province grain for Bolzano and Trento): every town in the region shares the score. A comune with no price, rent, population-change, climate, healthcare, tourism, seismic or drive-time figure is left out of the filter on it and COUNTED in missingData — never treated as cheap, free or stable; say how many were left out. The taxRegime filter lists only comuni on the regime's verified routes: a comune missing from it is NOT a 'no' (the response says so in taxRegime.note). Rows carry plain numbers; their source and vintage are in figures. Use search_comuni to turn a town name into a code, get_comune for one town's full profile.

Input Schema

NameRequiredDescriptionDefault
qNoOnly comuni whose name contains this (case- and accent-insensitive).
sortNoSort key. A comune without a figure for the sort key always sorts last.population
limitNoRows per page, 1–100. Default 25.
orderNoDefault: desc for population, populationChange, januaryLow and hospitalCareScore; asc for name, purchasePrice, rent, daysAbove30C, bedsPerResident, seismicClass, hospitalDriveMinutes, emergencyDriveMinutes, deaDriveMinutes, airportDriveMinutes, supermarketDriveMinutes, pharmacyDriveMinutes and stationDriveMinutes.
offsetNoRows to skip, for the next page.
regionNoA region name or slug, e.g. "Abruzzo" or "valle-d-aosta".
provinceNoA province's two-letter code ("AQ") or slug ("l-aquila").
taxRegimeNoA verified geographic regime slug from /tax/regimes. Lists only comuni on the regime's verified routes; a comune missing from the list is NOT a "no" (the rule may admit comuni by routes not yet encoded).
maxPopulationNoResidents, inclusive.
minPopulationNoResidents, inclusive.
minJanuaryLowCNo[UI key jan] Average January daily minimum (ERA5-Land, 2015 to 2024) at least this many degrees C, whole numbers -10 to 12. Town grain. A comune with no figure is left out and counted in missingData.
maxDaysAbove30CNo[UI key heat] Average days a year above 30 C (ERA5-Land, 2015 to 2024) at most this many, 0 to 120. Town grain. No figure: left out and counted.
emergencyDeaOnlyNo[UI key edlevel=dea] With maxEmergencyDriveMinutes: count only a DEA (level I or II), not a Pronto Soccorso. A DEA is a larger emergency department with more specialties on site. Ignored without maxEmergencyDriveMinutes.
maxRentEurM2MonthNoRent in EUR/m2 per month, inclusive. A comune with no rent figure is left out.
minRentEurM2MonthNoRent in EUR/m2 per month, inclusive. A comune with no rent figure is left out.
maxBedsPerResidentNo[UI key beds] Registered tourist beds per resident (ISTAT, 2024) at most this; one of 0.1, 0.5, 1. Town grain. A comune with no figure is left out and counted; a real zero is a figure.
excludeSeismicZone1No[UI key seis] true: leave out comuni in official seismic zone 1, the highest hazard class (hazard class 4 in the map layer). A legal classification from the Dipartimento della Protezione Civile (31 May 2025), not a forecast. A comune with no single classification is left out and counted.
minHospitalCareScoreNo[UI key hosp] Ministero della Salute NSG 2024 hospital-care score at least this, 50 to 100; 60 is the official sufficiency line. REGION grain: every comune in a region shares its region's score, except Bolzano-province and Trento-province comuni, which carry their own autonomous province's score. No figure: left out and counted.
maxPurchasePriceEurM2NoPurchase price in EUR/m2, inclusive. A comune with no price is left out, never treated as cheap.
minPurchasePriceEurM2NoPurchase price in EUR/m2, inclusive. A comune with no price is left out, never treated as cheap.
allCareScoresAtLeast60No[UI key nsg60] true: the NSG prevention, community-care and hospital-care scores must all be at least 60. Region grain (autonomous-province grain for Bolzano and Trento). A comune missing any of the three is left out and counted.
maxAirportDriveMinutesNo[UI key adrive] Minutes by road from the comune's main town to the nearest of the airports where ENAC recorded at least 4,000 passengers in 2025 (it leaves out Taranto-Grottaglie and Brescia-Montichiari, which carried almost none), at most this; one of 60, 90, 120, 180. Town grain, free-flow, approximate; says nothing about flights. No figure: left out and counted.
maxPopulationChangePctNoPopulation change 2019 to 2025, in percent, inclusive.
minPopulationChangePctNoPopulation change 2019 to 2025, in percent, inclusive. A negative value means decline.
maxHospitalDriveMinutesNo[UI key hdrive] Minutes by road from the comune's main town to the nearest hospital with inpatient beds (Ministero della Salute 2023 list, OpenStreetMap roads) at most this; one of 15, 30, 45, 60. Town grain, free-flow, approximate. Not necessarily a hospital with an emergency department. A comune with no figure (for example a ferry-only island) is left out and counted.
maxEmergencyDriveMinutesNo[UI key edrive] Minutes by road from the comune's main town to the nearest emergency department in the Ministero della Salute's emergency network (sites active at 31 December 2025: DEA level II, DEA level I or Pronto Soccorso; OpenStreetMap roads) at most this; one of 15, 30, 45, 60. Town grain, free-flow, approximate; not a service guarantee. Combine with emergencyDeaOnly to count only DEA level I or II. A comune with no figure is left out and counted.

Output Schema

NameRequiredDescriptionDefault
limitYes
totalYesComuni matching every filter, before paging.
offsetYes
appliedYesThe filters and sort as understood, with region and province resolved to their canonical names.
figuresYes
hasMoreYes
resultsYes
returnedYes
taxRegimeNoPresent only when taxRegime was filtered on.
nextOffsetYesPass as offset for the next page; null on the last page.
attributionYes
missingDataYesOne entry per figure you filtered on: how many comuni were left out for having no figure.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed16 schema fields changed
    • addedInput schema / properties / emergencyDeaOnly
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "boolean"
      +    },
      +    {
      +      "enum": [
      +        "true",
      +        "false"
      +      ],
      +      "type": "string"
      +    }
      +  ],
      +  "description": "[UI key edlevel=dea] With maxEmergencyDriveMinutes: count only a DEA (level I or II), not a Pronto Soccorso. A DEA is a larger emergency department with more specialties on site. Ignored without maxEmergencyDriveMinutes."
      +}
    • addedInput schema / properties / maxEmergencyDriveMinutes
      Added value: +{
      +  "description": "[UI key edrive] Minutes by road from the comune's main town to the nearest emergency department in the Ministero della Salute's emergency network (sites active at 31 December 2025: DEA level II, DEA level I or Pronto Soccorso; OpenStreetMap roads) at most this; one of 15, 30, 45, 60. Town grain, free-flow, approximate; not a service guarantee. Combine with emergencyDeaOnly to count only DEA level I or II. A comune with no figure is left out and counted.",
      +  "type": "number"
      +}
    • changedInput schema / properties / order / description
      Previous value: -"Default: desc for population, populationChange, januaryLow and hospitalCareScore; asc for name, purchasePrice, rent, daysAbove30C, bedsPerResident, seismicClass, hospitalDriveMinutes, airportDriveMinutes, supermarketDriveMinutes, pharmacyDriveMinutes and stationDriveMinutes."New value: +"Default: desc for population, populationChange, januaryLow and hospitalCareScore; asc for name, purchasePrice, rent, daysAbove30C, bedsPerResident, seismicClass, hospitalDriveMinutes, emergencyDriveMinutes, deaDriveMinutes, airportDriveMinutes, supermarketDriveMinutes, pharmacyDriveMinutes and stationDriveMinutes."
    • changedInput schema / properties / sort / enum
      Previous value: -[
      -  "population",
      -  "name",
      -  "purchasePrice",
      -  "rent",
      -  "populationChange",
      -  "januaryLow",
      -  "daysAbove30C",
      -  "hospitalCareScore",
      -  "bedsPerResident",
      -  "seismicClass",
      -  "hospitalDriveMinutes",
      -  "airportDriveMinutes",
      -  "supermarketDriveMinutes",
      -  "pharmacyDriveMinutes",
      -  "stationDriveMinutes"
      -]New value: +[
      +  "population",
      +  "name",
      +  "purchasePrice",
      +  "rent",
      +  "populationChange",
      +  "januaryLow",
      +  "daysAbove30C",
      +  "hospitalCareScore",
      +  "bedsPerResident",
      +  "seismicClass",
      +  "hospitalDriveMinutes",
      +  "emergencyDriveMinutes",
      +  "deaDriveMinutes",
      +  "airportDriveMinutes",
      +  "supermarketDriveMinutes",
      +  "pharmacyDriveMinutes",
      +  "stationDriveMinutes"
      +]
    • addedOutput schema / properties / attribution / properties / license
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "License of Expat Living Italy's own work only; upstream data keeps its own license, per dataset.",
      +  "properties": {
      +    "name": {
      +      "type": "string"
      +    },
      +    "url": {
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "name",
      +    "url"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / properties / attribution / required
      Previous value: -[
      -  "publisher",
      -  "url",
      -  "citeAs",
      -  "request"
      -]New value: +[
      +  "publisher",
      +  "url",
      +  "citeAs",
      +  "request",
      +  "license"
      +]
    • addedOutput schema / properties / figures / properties / nearestDeaMinutes
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "coverage": {
      +      "additionalProperties": false,
      +      "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +      "properties": {
      +        "in": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "of": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "in",
      +        "of"
      +      ],
      +      "type": "object"
      +    },
      +    "extractedOn": {
      +      "description": "ISO date this value was extracted from the source.",
      +      "type": "string"
      +    },
      +    "license": {
      +      "type": "string"
      +    },
      +    "method": {
      +      "description": "URL to the methodology page for this dataset.",
      +      "type": "string"
      +    },
      +    "source": {
      +      "type": "string"
      +    },
      +    "unit": {
      +      "type": "string"
      +    },
      +    "vintage": {
      +      "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "unit",
      +    "source",
      +    "vintage",
      +    "extractedOn",
      +    "method",
      +    "license"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / properties / figures / required
      Previous value: -[
      -  "population",
      -  "purchasePriceEurM2",
      -  "rentPriceEurM2Month",
      -  "populationChangePct",
      -  "januaryLowC",
      -  "daysAbove30C",
      -  "hospitalCareScore",
      -  "communityCareScore",
      -  "preventionScore",
      -  "bedsPerResident",
      -  "seismicClass",
      -  "nearestHospitalMinutes",
      -  "nearestEmergencyMinutes",
      -  "nearestAirportMinutes",
      -  "nearestSupermarketMinutes",
      -  "nearestPharmacyMinutes",
      -  "nearestStationMinutes"
      -]New value: +[
      +  "population",
      +  "purchasePriceEurM2",
      +  "rentPriceEurM2Month",
      +  "populationChangePct",
      +  "januaryLowC",
      +  "daysAbove30C",
      +  "hospitalCareScore",
      +  "communityCareScore",
      +  "preventionScore",
      +  "bedsPerResident",
      +  "seismicClass",
      +  "nearestHospitalMinutes",
      +  "nearestEmergencyMinutes",
      +  "nearestDeaMinutes",
      +  "nearestAirportMinutes",
      +  "nearestSupermarketMinutes",
      +  "nearestPharmacyMinutes",
      +  "nearestStationMinutes"
      +]
    • changedOutput schema / properties / missingData / items / properties / excluded / description
      Previous value: -"Comuni that passed every filter not about this figure but have no figure, so could not be tested and are left out. Price, rent and population change are counted against every other filter except their own and can overlap. The eight shortlist filters (januaryLow, daysAbove30C, hospitalCareScore, allCareScores, bedsPerResident, seismicClass, hospitalDrive, airportDrive) are counted in that fixed order, each against the comuni that reached it, exactly as the /data funnel does."New value: +"Comuni that passed every filter not about this figure but have no figure, so could not be tested and are left out. Price, rent and population change are counted against every other filter except their own and can overlap. The nine shortlist filters (januaryLow, daysAbove30C, hospitalCareScore, allCareScores, bedsPerResident, seismicClass, hospitalDrive, emergencyDrive, airportDrive) are counted in that fixed order, each against the comuni that reached it, exactly as the /data funnel does."
    • changedOutput schema / properties / missingData / items / properties / filter / enum
      Previous value: -[
      -  "purchasePrice",
      -  "rent",
      -  "populationChange",
      -  "januaryLow",
      -  "daysAbove30C",
      -  "hospitalCareScore",
      -  "allCareScores",
      -  "bedsPerResident",
      -  "seismicClass",
      -  "hospitalDrive",
      -  "airportDrive"
      -]New value: +[
      +  "purchasePrice",
      +  "rent",
      +  "populationChange",
      +  "januaryLow",
      +  "daysAbove30C",
      +  "hospitalCareScore",
      +  "allCareScores",
      +  "bedsPerResident",
      +  "seismicClass",
      +  "hospitalDrive",
      +  "emergencyDrive",
      +  "airportDrive"
      +]
    • changedOutput schema / properties / missingData / maxItems
      Previous value: -11New value: +12
    • addedOutput schema / properties / results / items / properties / nearestDeaKm
      Added value: +{
      +  "description": "Kilometers by road to nearestDeaName. null: no figure.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / nearestDeaLevel
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "DEA2",
      +        "DEA1"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The Ministry's level of nearestDeaName: DEA2 = DEA level II, DEA1 = DEA level I. null: no figure."
      +}
    • addedOutput schema / properties / results / items / properties / nearestDeaMinutes
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Minutes by road to nearestDeaName, free-flow, approximate. null: no figure (never 0)."
      +}
    • addedOutput schema / properties / results / items / properties / nearestDeaName
      Added value: +{
      +  "description": "Nearest hospital the same Ministry list gives as DEA level II or DEA level I (Pronto Soccorso sites left out). Often the same hospital as nearestEmergencyName. null: no figure.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / results / items / required
      Previous value: -[
      -  "istatCode",
      -  "name",
      -  "province",
      -  "provinceCode",
      -  "region",
      -  "page",
      -  "population",
      -  "purchasePriceEurM2",
      -  "rentPriceEurM2Month",
      -  "populationChangePct",
      -  "januaryLowC",
      -  "daysAbove30C",
      -  "hospitalCareScore",
      -  "communityCareScore",
      -  "preventionScore",
      -  "nsgGrain",
      -  "bedsPerResident",
      -  "seismicClass",
      -  "seismicZone",
      -  "nearestHospitalName",
      -  "nearestHospitalMinutes",
      -  "nearestHospitalKm",
      -  "nearestEmergencyName",
      -  "nearestEmergencyLevel",
      -  "nearestEmergencyMinutes",
      -  "nearestEmergencyKm",
      -  "nearestAirportName",
      -  "nearestAirportIata",
      -  "nearestAirportMinutes",
      -  "nearestAirportKm",
      -  "nearestSupermarketName",
      -  "nearestSupermarketMinutes",
      -  "nearestSupermarketKm",
      -  "nearestPharmacyName",
      -  "nearestPharmacyMinutes",
      -  "nearestPharmacyKm",
      -  "nearestStationName",
      -  "nearestStationMinutes",
      -  "nearestStationKm"
      -]New value: +[
      +  "istatCode",
      +  "name",
      +  "province",
      +  "provinceCode",
      +  "region",
      +  "page",
      +  "population",
      +  "purchasePriceEurM2",
      +  "rentPriceEurM2Month",
      +  "populationChangePct",
      +  "januaryLowC",
      +  "daysAbove30C",
      +  "hospitalCareScore",
      +  "communityCareScore",
      +  "preventionScore",
      +  "nsgGrain",
      +  "bedsPerResident",
      +  "seismicClass",
      +  "seismicZone",
      +  "nearestHospitalName",
      +  "nearestHospitalMinutes",
      +  "nearestHospitalKm",
      +  "nearestEmergencyName",
      +  "nearestEmergencyLevel",
      +  "nearestEmergencyMinutes",
      +  "nearestEmergencyKm",
      +  "nearestDeaName",
      +  "nearestDeaLevel",
      +  "nearestDeaMinutes",
      +  "nearestDeaKm",
      +  "nearestAirportName",
      +  "nearestAirportIata",
      +  "nearestAirportMinutes",
      +  "nearestAirportKm",
      +  "nearestSupermarketName",
      +  "nearestSupermarketMinutes",
      +  "nearestSupermarketKm",
      +  "nearestPharmacyName",
      +  "nearestPharmacyMinutes",
      +  "nearestPharmacyKm",
      +  "nearestStationName",
      +  "nearestStationMinutes",
      +  "nearestStationKm"
      +]
  2. Changed4 schema fields changed
    • addedOutput schema / properties / results / items / properties / nearestEmergencyLevel
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "DEA2",
      +        "DEA1",
      +        "PS"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The Ministry's emergency level of nearestEmergencyName: DEA2 = DEA level II, DEA1 = DEA level I, PS = Pronto Soccorso (a smaller emergency department than a DEA). null: no figure."
      +}
    • changedOutput schema / properties / results / items / properties / nearestEmergencyMinutes / description
      Previous value: -"Minutes by road to nearestEmergencyName (OpenStreetMap). null: no figure."New value: +"Minutes by road to nearestEmergencyName (Ministry emergency network; roads © OpenStreetMap contributors). null: no figure."
    • changedOutput schema / properties / results / items / properties / nearestEmergencyName / description
      Previous value: -"Nearest hospital OpenStreetMap volunteers tag as having an emergency department. Less complete and less accurate than the Ministry list: a town can look far only because a nearby one is not tagged. null: no figure."New value: +"Nearest hospital the Ministero della Salute lists in its emergency network (sites active at 31 December 2025) as DEA level II, DEA level I or Pronto Soccorso. A Pronto Soccorso is not the same as a DEA. Not a service guarantee. null: no figure."
    • changedOutput schema / properties / results / items / required
      Previous value: -[
      -  "istatCode",
      -  "name",
      -  "province",
      -  "provinceCode",
      -  "region",
      -  "page",
      -  "population",
      -  "purchasePriceEurM2",
      -  "rentPriceEurM2Month",
      -  "populationChangePct",
      -  "januaryLowC",
      -  "daysAbove30C",
      -  "hospitalCareScore",
      -  "communityCareScore",
      -  "preventionScore",
      -  "nsgGrain",
      -  "bedsPerResident",
      -  "seismicClass",
      -  "seismicZone",
      -  "nearestHospitalName",
      -  "nearestHospitalMinutes",
      -  "nearestHospitalKm",
      -  "nearestEmergencyName",
      -  "nearestEmergencyMinutes",
      -  "nearestEmergencyKm",
      -  "nearestAirportName",
      -  "nearestAirportIata",
      -  "nearestAirportMinutes",
      -  "nearestAirportKm",
      -  "nearestSupermarketName",
      -  "nearestSupermarketMinutes",
      -  "nearestSupermarketKm",
      -  "nearestPharmacyName",
      -  "nearestPharmacyMinutes",
      -  "nearestPharmacyKm",
      -  "nearestStationName",
      -  "nearestStationMinutes",
      -  "nearestStationKm"
      -]New value: +[
      +  "istatCode",
      +  "name",
      +  "province",
      +  "provinceCode",
      +  "region",
      +  "page",
      +  "population",
      +  "purchasePriceEurM2",
      +  "rentPriceEurM2Month",
      +  "populationChangePct",
      +  "januaryLowC",
      +  "daysAbove30C",
      +  "hospitalCareScore",
      +  "communityCareScore",
      +  "preventionScore",
      +  "nsgGrain",
      +  "bedsPerResident",
      +  "seismicClass",
      +  "seismicZone",
      +  "nearestHospitalName",
      +  "nearestHospitalMinutes",
      +  "nearestHospitalKm",
      +  "nearestEmergencyName",
      +  "nearestEmergencyLevel",
      +  "nearestEmergencyMinutes",
      +  "nearestEmergencyKm",
      +  "nearestAirportName",
      +  "nearestAirportIata",
      +  "nearestAirportMinutes",
      +  "nearestAirportKm",
      +  "nearestSupermarketName",
      +  "nearestSupermarketMinutes",
      +  "nearestSupermarketKm",
      +  "nearestPharmacyName",
      +  "nearestPharmacyMinutes",
      +  "nearestPharmacyKm",
      +  "nearestStationName",
      +  "nearestStationMinutes",
      +  "nearestStationKm"
      +]
  3. Changed16 schema fields changed
    • changedInput schema / properties / order / description
      Previous value: -"Default: desc for population, populationChange, januaryLow and hospitalCareScore; asc for name, purchasePrice, rent, daysAbove30C, bedsPerResident, seismicClass, hospitalDriveMinutes and airportDriveMinutes."New value: +"Default: desc for population, populationChange, januaryLow and hospitalCareScore; asc for name, purchasePrice, rent, daysAbove30C, bedsPerResident, seismicClass, hospitalDriveMinutes, airportDriveMinutes, supermarketDriveMinutes, pharmacyDriveMinutes and stationDriveMinutes."
    • changedInput schema / properties / sort / enum
      Previous value: -[
      -  "population",
      -  "name",
      -  "purchasePrice",
      -  "rent",
      -  "populationChange",
      -  "januaryLow",
      -  "daysAbove30C",
      -  "hospitalCareScore",
      -  "bedsPerResident",
      -  "seismicClass",
      -  "hospitalDriveMinutes",
      -  "airportDriveMinutes"
      -]New value: +[
      +  "population",
      +  "name",
      +  "purchasePrice",
      +  "rent",
      +  "populationChange",
      +  "januaryLow",
      +  "daysAbove30C",
      +  "hospitalCareScore",
      +  "bedsPerResident",
      +  "seismicClass",
      +  "hospitalDriveMinutes",
      +  "airportDriveMinutes",
      +  "supermarketDriveMinutes",
      +  "pharmacyDriveMinutes",
      +  "stationDriveMinutes"
      +]
    • addedOutput schema / properties / figures / properties / nearestPharmacyMinutes
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "coverage": {
      +      "additionalProperties": false,
      +      "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +      "properties": {
      +        "in": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "of": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "in",
      +        "of"
      +      ],
      +      "type": "object"
      +    },
      +    "extractedOn": {
      +      "description": "ISO date this value was extracted from the source.",
      +      "type": "string"
      +    },
      +    "license": {
      +      "type": "string"
      +    },
      +    "method": {
      +      "description": "URL to the methodology page for this dataset.",
      +      "type": "string"
      +    },
      +    "source": {
      +      "type": "string"
      +    },
      +    "unit": {
      +      "type": "string"
      +    },
      +    "vintage": {
      +      "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "unit",
      +    "source",
      +    "vintage",
      +    "extractedOn",
      +    "method",
      +    "license"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / figures / properties / nearestStationMinutes
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "coverage": {
      +      "additionalProperties": false,
      +      "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +      "properties": {
      +        "in": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "of": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "in",
      +        "of"
      +      ],
      +      "type": "object"
      +    },
      +    "extractedOn": {
      +      "description": "ISO date this value was extracted from the source.",
      +      "type": "string"
      +    },
      +    "license": {
      +      "type": "string"
      +    },
      +    "method": {
      +      "description": "URL to the methodology page for this dataset.",
      +      "type": "string"
      +    },
      +    "source": {
      +      "type": "string"
      +    },
      +    "unit": {
      +      "type": "string"
      +    },
      +    "vintage": {
      +      "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "unit",
      +    "source",
      +    "vintage",
      +    "extractedOn",
      +    "method",
      +    "license"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / figures / properties / nearestSupermarketMinutes
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "coverage": {
      +      "additionalProperties": false,
      +      "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +      "properties": {
      +        "in": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "of": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "in",
      +        "of"
      +      ],
      +      "type": "object"
      +    },
      +    "extractedOn": {
      +      "description": "ISO date this value was extracted from the source.",
      +      "type": "string"
      +    },
      +    "license": {
      +      "type": "string"
      +    },
      +    "method": {
      +      "description": "URL to the methodology page for this dataset.",
      +      "type": "string"
      +    },
      +    "source": {
      +      "type": "string"
      +    },
      +    "unit": {
      +      "type": "string"
      +    },
      +    "vintage": {
      +      "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "unit",
      +    "source",
      +    "vintage",
      +    "extractedOn",
      +    "method",
      +    "license"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / properties / figures / required
      Previous value: -[
      -  "population",
      -  "purchasePriceEurM2",
      -  "rentPriceEurM2Month",
      -  "populationChangePct",
      -  "januaryLowC",
      -  "daysAbove30C",
      -  "hospitalCareScore",
      -  "communityCareScore",
      -  "preventionScore",
      -  "bedsPerResident",
      -  "seismicClass",
      -  "nearestHospitalMinutes",
      -  "nearestEmergencyMinutes",
      -  "nearestAirportMinutes"
      -]New value: +[
      +  "population",
      +  "purchasePriceEurM2",
      +  "rentPriceEurM2Month",
      +  "populationChangePct",
      +  "januaryLowC",
      +  "daysAbove30C",
      +  "hospitalCareScore",
      +  "communityCareScore",
      +  "preventionScore",
      +  "bedsPerResident",
      +  "seismicClass",
      +  "nearestHospitalMinutes",
      +  "nearestEmergencyMinutes",
      +  "nearestAirportMinutes",
      +  "nearestSupermarketMinutes",
      +  "nearestPharmacyMinutes",
      +  "nearestStationMinutes"
      +]
    • addedOutput schema / properties / results / items / properties / nearestPharmacyKm
      Added value: +{
      +  "description": "Kilometers by road to nearestPharmacyName. null: no figure.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / nearestPharmacyMinutes
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Minutes by road from the comune's main town, free-flow, approximate. null: no figure (never 0)."
      +}
    • addedOutput schema / properties / results / items / properties / nearestPharmacyName
      Added value: +{
      +  "description": "Nearest pharmacy in the Ministero della Salute's open register (ordinary and branch pharmacies). Says nothing about opening hours or duty. null: no figure.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / nearestStationKm
      Added value: +{
      +  "description": "Kilometers by road to nearestStationName. null: no figure.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / nearestStationMinutes
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Minutes by road from the comune's main town, free-flow, approximate. null: no figure (never 0)."
      +}
    • addedOutput schema / properties / results / items / properties / nearestStationName
      Added value: +{
      +  "description": "Nearest railway station with passenger service (OpenStreetMap, volunteer mapping; metro, tram and heritage lines left out). Says nothing about train frequency. null: no figure.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / nearestSupermarketKm
      Added value: +{
      +  "description": "Kilometers by road to nearestSupermarketName. null: no figure.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / nearestSupermarketMinutes
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Minutes by road from the comune's main town, free-flow, approximate. null: no figure (never 0)."
      +}
    • addedOutput schema / properties / results / items / properties / nearestSupermarketName
      Added value: +{
      +  "description": "Nearest supermarket (OpenStreetMap shop=supermarket, volunteer mapping: a store missing from the map is missing here; small grocers are not counted). null: no figure.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / results / items / required
      Previous value: -[
      -  "istatCode",
      -  "name",
      -  "province",
      -  "provinceCode",
      -  "region",
      -  "page",
      -  "population",
      -  "purchasePriceEurM2",
      -  "rentPriceEurM2Month",
      -  "populationChangePct",
      -  "januaryLowC",
      -  "daysAbove30C",
      -  "hospitalCareScore",
      -  "communityCareScore",
      -  "preventionScore",
      -  "nsgGrain",
      -  "bedsPerResident",
      -  "seismicClass",
      -  "seismicZone",
      -  "nearestHospitalName",
      -  "nearestHospitalMinutes",
      -  "nearestHospitalKm",
      -  "nearestEmergencyName",
      -  "nearestEmergencyMinutes",
      -  "nearestEmergencyKm",
      -  "nearestAirportName",
      -  "nearestAirportIata",
      -  "nearestAirportMinutes",
      -  "nearestAirportKm"
      -]New value: +[
      +  "istatCode",
      +  "name",
      +  "province",
      +  "provinceCode",
      +  "region",
      +  "page",
      +  "population",
      +  "purchasePriceEurM2",
      +  "rentPriceEurM2Month",
      +  "populationChangePct",
      +  "januaryLowC",
      +  "daysAbove30C",
      +  "hospitalCareScore",
      +  "communityCareScore",
      +  "preventionScore",
      +  "nsgGrain",
      +  "bedsPerResident",
      +  "seismicClass",
      +  "seismicZone",
      +  "nearestHospitalName",
      +  "nearestHospitalMinutes",
      +  "nearestHospitalKm",
      +  "nearestEmergencyName",
      +  "nearestEmergencyMinutes",
      +  "nearestEmergencyKm",
      +  "nearestAirportName",
      +  "nearestAirportIata",
      +  "nearestAirportMinutes",
      +  "nearestAirportKm",
      +  "nearestSupermarketName",
      +  "nearestSupermarketMinutes",
      +  "nearestSupermarketKm",
      +  "nearestPharmacyName",
      +  "nearestPharmacyMinutes",
      +  "nearestPharmacyKm",
      +  "nearestStationName",
      +  "nearestStationMinutes",
      +  "nearestStationKm"
      +]
  4. Changed2 schema fields changed
    • changedInput schema / properties / maxAirportDriveMinutes / description
      Previous value: -"[UI key adrive] Minutes by road from the comune's main town to the nearest airport where ENAC recorded passengers in 2025, at most this; one of 60, 90, 120, 180. Town grain, free-flow, approximate; says nothing about flights. No figure: left out and counted."New value: +"[UI key adrive] Minutes by road from the comune's main town to the nearest of the airports where ENAC recorded at least 4,000 passengers in 2025 (it leaves out Taranto-Grottaglie and Brescia-Montichiari, which carried almost none), at most this; one of 60, 90, 120, 180. Town grain, free-flow, approximate; says nothing about flights. No figure: left out and counted."
    • changedOutput schema / properties / results / items / properties / nearestAirportName / description
      Previous value: -"Nearest airport where ENAC recorded passengers in 2025 (positions from OurAirports). Says nothing about flights. null: no figure."New value: +"Nearest of the airports where ENAC recorded at least 4,000 passengers in 2025 (positions from OurAirports; Taranto-Grottaglie and Brescia-Montichiari, which carried almost none, are left out). Says nothing about flights. null: no figure."
  5. Changed22 schema fields changed
    • addedInput schema / properties / maxAirportDriveMinutes
      Added value: +{
      +  "description": "[UI key adrive] Minutes by road from the comune's main town to the nearest airport where ENAC recorded passengers in 2025, at most this; one of 60, 90, 120, 180. Town grain, free-flow, approximate; says nothing about flights. No figure: left out and counted.",
      +  "type": "number"
      +}
    • addedInput schema / properties / maxHospitalDriveMinutes
      Added value: +{
      +  "description": "[UI key hdrive] Minutes by road from the comune's main town to the nearest hospital with inpatient beds (Ministero della Salute 2023 list, OpenStreetMap roads) at most this; one of 15, 30, 45, 60. Town grain, free-flow, approximate. Not necessarily a hospital with an emergency department. A comune with no figure (for example a ferry-only island) is left out and counted.",
      +  "type": "number"
      +}
    • changedInput schema / properties / order / description
      Previous value: -"Default: desc for population, populationChange, januaryLow and hospitalCareScore; asc for name, purchasePrice, rent, daysAbove30C, bedsPerResident and seismicClass."New value: +"Default: desc for population, populationChange, januaryLow and hospitalCareScore; asc for name, purchasePrice, rent, daysAbove30C, bedsPerResident, seismicClass, hospitalDriveMinutes and airportDriveMinutes."
    • changedInput schema / properties / sort / enum
      Previous value: -[
      -  "population",
      -  "name",
      -  "purchasePrice",
      -  "rent",
      -  "populationChange",
      -  "januaryLow",
      -  "daysAbove30C",
      -  "hospitalCareScore",
      -  "bedsPerResident",
      -  "seismicClass"
      -]New value: +[
      +  "population",
      +  "name",
      +  "purchasePrice",
      +  "rent",
      +  "populationChange",
      +  "januaryLow",
      +  "daysAbove30C",
      +  "hospitalCareScore",
      +  "bedsPerResident",
      +  "seismicClass",
      +  "hospitalDriveMinutes",
      +  "airportDriveMinutes"
      +]
    • addedOutput schema / properties / figures / properties / nearestAirportMinutes
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "coverage": {
      +      "additionalProperties": false,
      +      "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +      "properties": {
      +        "in": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "of": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "in",
      +        "of"
      +      ],
      +      "type": "object"
      +    },
      +    "extractedOn": {
      +      "description": "ISO date this value was extracted from the source.",
      +      "type": "string"
      +    },
      +    "license": {
      +      "type": "string"
      +    },
      +    "method": {
      +      "description": "URL to the methodology page for this dataset.",
      +      "type": "string"
      +    },
      +    "source": {
      +      "type": "string"
      +    },
      +    "unit": {
      +      "type": "string"
      +    },
      +    "vintage": {
      +      "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "unit",
      +    "source",
      +    "vintage",
      +    "extractedOn",
      +    "method",
      +    "license"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / figures / properties / nearestEmergencyMinutes
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "coverage": {
      +      "additionalProperties": false,
      +      "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +      "properties": {
      +        "in": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "of": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "in",
      +        "of"
      +      ],
      +      "type": "object"
      +    },
      +    "extractedOn": {
      +      "description": "ISO date this value was extracted from the source.",
      +      "type": "string"
      +    },
      +    "license": {
      +      "type": "string"
      +    },
      +    "method": {
      +      "description": "URL to the methodology page for this dataset.",
      +      "type": "string"
      +    },
      +    "source": {
      +      "type": "string"
      +    },
      +    "unit": {
      +      "type": "string"
      +    },
      +    "vintage": {
      +      "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "unit",
      +    "source",
      +    "vintage",
      +    "extractedOn",
      +    "method",
      +    "license"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / figures / properties / nearestHospitalMinutes
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "coverage": {
      +      "additionalProperties": false,
      +      "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +      "properties": {
      +        "in": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "of": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "in",
      +        "of"
      +      ],
      +      "type": "object"
      +    },
      +    "extractedOn": {
      +      "description": "ISO date this value was extracted from the source.",
      +      "type": "string"
      +    },
      +    "license": {
      +      "type": "string"
      +    },
      +    "method": {
      +      "description": "URL to the methodology page for this dataset.",
      +      "type": "string"
      +    },
      +    "source": {
      +      "type": "string"
      +    },
      +    "unit": {
      +      "type": "string"
      +    },
      +    "vintage": {
      +      "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "unit",
      +    "source",
      +    "vintage",
      +    "extractedOn",
      +    "method",
      +    "license"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / properties / figures / required
      Previous value: -[
      -  "population",
      -  "purchasePriceEurM2",
      -  "rentPriceEurM2Month",
      -  "populationChangePct",
      -  "januaryLowC",
      -  "daysAbove30C",
      -  "hospitalCareScore",
      -  "communityCareScore",
      -  "preventionScore",
      -  "bedsPerResident",
      -  "seismicClass"
      -]New value: +[
      +  "population",
      +  "purchasePriceEurM2",
      +  "rentPriceEurM2Month",
      +  "populationChangePct",
      +  "januaryLowC",
      +  "daysAbove30C",
      +  "hospitalCareScore",
      +  "communityCareScore",
      +  "preventionScore",
      +  "bedsPerResident",
      +  "seismicClass",
      +  "nearestHospitalMinutes",
      +  "nearestEmergencyMinutes",
      +  "nearestAirportMinutes"
      +]
    • changedOutput schema / properties / missingData / items / properties / excluded / description
      Previous value: -"Comuni that passed every filter not about this figure but have no figure, so could not be tested and are left out. Price, rent and population change are counted against every other filter except their own and can overlap. The six shortlist filters (januaryLow, daysAbove30C, hospitalCareScore, allCareScores, bedsPerResident, seismicClass) are counted in that fixed order, each against the comuni that reached it, exactly as the /data funnel does."New value: +"Comuni that passed every filter not about this figure but have no figure, so could not be tested and are left out. Price, rent and population change are counted against every other filter except their own and can overlap. The eight shortlist filters (januaryLow, daysAbove30C, hospitalCareScore, allCareScores, bedsPerResident, seismicClass, hospitalDrive, airportDrive) are counted in that fixed order, each against the comuni that reached it, exactly as the /data funnel does."
    • changedOutput schema / properties / missingData / items / properties / filter / enum
      Previous value: -[
      -  "purchasePrice",
      -  "rent",
      -  "populationChange",
      -  "januaryLow",
      -  "daysAbove30C",
      -  "hospitalCareScore",
      -  "allCareScores",
      -  "bedsPerResident",
      -  "seismicClass"
      -]New value: +[
      +  "purchasePrice",
      +  "rent",
      +  "populationChange",
      +  "januaryLow",
      +  "daysAbove30C",
      +  "hospitalCareScore",
      +  "allCareScores",
      +  "bedsPerResident",
      +  "seismicClass",
      +  "hospitalDrive",
      +  "airportDrive"
      +]
    • changedOutput schema / properties / missingData / maxItems
      Previous value: -9New value: +11
    • addedOutput schema / properties / results / items / properties / nearestAirportIata
      Added value: +{
      +  "description": "IATA code of nearestAirportName.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / nearestAirportKm
      Added value: +{
      +  "description": "Kilometers by road to nearestAirportName. null: no figure.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / nearestAirportMinutes
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Minutes by road from the comune's main town, free-flow, approximate. null: no figure (never 0)."
      +}
    • addedOutput schema / properties / results / items / properties / nearestAirportName
      Added value: +{
      +  "description": "Nearest airport where ENAC recorded passengers in 2025 (positions from OurAirports). Says nothing about flights. null: no figure.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / nearestEmergencyKm
      Added value: +{
      +  "description": "Kilometers by road to nearestEmergencyName. null: no figure.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / nearestEmergencyMinutes
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Minutes by road to nearestEmergencyName (OpenStreetMap). null: no figure."
      +}
    • addedOutput schema / properties / results / items / properties / nearestEmergencyName
      Added value: +{
      +  "description": "Nearest hospital OpenStreetMap volunteers tag as having an emergency department. Less complete and less accurate than the Ministry list: a town can look far only because a nearby one is not tagged. null: no figure.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / nearestHospitalKm
      Added value: +{
      +  "description": "Kilometers by road to nearestHospitalName. null: no figure.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / nearestHospitalMinutes
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Minutes by road from the comune's main town, free-flow, approximate. Town grain. null: no figure (never 0)."
      +}
    • addedOutput schema / properties / results / items / properties / nearestHospitalName
      Added value: +{
      +  "description": "Nearest hospital with inpatient beds (Ministero della Salute 2023 list), by road. Not necessarily one with an emergency department. null: no figure.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / results / items / required
      Previous value: -[
      -  "istatCode",
      -  "name",
      -  "province",
      -  "provinceCode",
      -  "region",
      -  "page",
      -  "population",
      -  "purchasePriceEurM2",
      -  "rentPriceEurM2Month",
      -  "populationChangePct",
      -  "januaryLowC",
      -  "daysAbove30C",
      -  "hospitalCareScore",
      -  "communityCareScore",
      -  "preventionScore",
      -  "nsgGrain",
      -  "bedsPerResident",
      -  "seismicClass",
      -  "seismicZone"
      -]New value: +[
      +  "istatCode",
      +  "name",
      +  "province",
      +  "provinceCode",
      +  "region",
      +  "page",
      +  "population",
      +  "purchasePriceEurM2",
      +  "rentPriceEurM2Month",
      +  "populationChangePct",
      +  "januaryLowC",
      +  "daysAbove30C",
      +  "hospitalCareScore",
      +  "communityCareScore",
      +  "preventionScore",
      +  "nsgGrain",
      +  "bedsPerResident",
      +  "seismicClass",
      +  "seismicZone",
      +  "nearestHospitalName",
      +  "nearestHospitalMinutes",
      +  "nearestHospitalKm",
      +  "nearestEmergencyName",
      +  "nearestEmergencyMinutes",
      +  "nearestEmergencyKm",
      +  "nearestAirportName",
      +  "nearestAirportIata",
      +  "nearestAirportMinutes",
      +  "nearestAirportKm"
      +]
  6. Changed20 schema fields changed
    • changedInput schema / properties / order / description
      Previous value: -"Default: desc for population and populationChange, asc for name, purchasePrice and rent."New value: +"Default: desc for population, populationChange, januaryLow and hospitalCareScore; asc for name, purchasePrice, rent, daysAbove30C, bedsPerResident and seismicClass."
    • changedInput schema / properties / sort / enum
      Previous value: -[
      -  "population",
      -  "name",
      -  "purchasePrice",
      -  "rent",
      -  "populationChange"
      -]New value: +[
      +  "population",
      +  "name",
      +  "purchasePrice",
      +  "rent",
      +  "populationChange",
      +  "januaryLow",
      +  "daysAbove30C",
      +  "hospitalCareScore",
      +  "bedsPerResident",
      +  "seismicClass"
      +]
    • addedOutput schema / properties / figures / properties / bedsPerResident
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "coverage": {
      +      "additionalProperties": false,
      +      "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +      "properties": {
      +        "in": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "of": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "in",
      +        "of"
      +      ],
      +      "type": "object"
      +    },
      +    "extractedOn": {
      +      "description": "ISO date this value was extracted from the source.",
      +      "type": "string"
      +    },
      +    "license": {
      +      "type": "string"
      +    },
      +    "method": {
      +      "description": "URL to the methodology page for this dataset.",
      +      "type": "string"
      +    },
      +    "source": {
      +      "type": "string"
      +    },
      +    "unit": {
      +      "type": "string"
      +    },
      +    "vintage": {
      +      "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "unit",
      +    "source",
      +    "vintage",
      +    "extractedOn",
      +    "method",
      +    "license"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / figures / properties / communityCareScore
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "coverage": {
      +      "additionalProperties": false,
      +      "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +      "properties": {
      +        "in": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "of": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "in",
      +        "of"
      +      ],
      +      "type": "object"
      +    },
      +    "extractedOn": {
      +      "description": "ISO date this value was extracted from the source.",
      +      "type": "string"
      +    },
      +    "license": {
      +      "type": "string"
      +    },
      +    "method": {
      +      "description": "URL to the methodology page for this dataset.",
      +      "type": "string"
      +    },
      +    "source": {
      +      "type": "string"
      +    },
      +    "unit": {
      +      "type": "string"
      +    },
      +    "vintage": {
      +      "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "unit",
      +    "source",
      +    "vintage",
      +    "extractedOn",
      +    "method",
      +    "license"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / figures / properties / daysAbove30C
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "coverage": {
      +      "additionalProperties": false,
      +      "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +      "properties": {
      +        "in": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "of": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "in",
      +        "of"
      +      ],
      +      "type": "object"
      +    },
      +    "extractedOn": {
      +      "description": "ISO date this value was extracted from the source.",
      +      "type": "string"
      +    },
      +    "license": {
      +      "type": "string"
      +    },
      +    "method": {
      +      "description": "URL to the methodology page for this dataset.",
      +      "type": "string"
      +    },
      +    "source": {
      +      "type": "string"
      +    },
      +    "unit": {
      +      "type": "string"
      +    },
      +    "vintage": {
      +      "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "unit",
      +    "source",
      +    "vintage",
      +    "extractedOn",
      +    "method",
      +    "license"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / figures / properties / hospitalCareScore
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "coverage": {
      +      "additionalProperties": false,
      +      "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +      "properties": {
      +        "in": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "of": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "in",
      +        "of"
      +      ],
      +      "type": "object"
      +    },
      +    "extractedOn": {
      +      "description": "ISO date this value was extracted from the source.",
      +      "type": "string"
      +    },
      +    "license": {
      +      "type": "string"
      +    },
      +    "method": {
      +      "description": "URL to the methodology page for this dataset.",
      +      "type": "string"
      +    },
      +    "source": {
      +      "type": "string"
      +    },
      +    "unit": {
      +      "type": "string"
      +    },
      +    "vintage": {
      +      "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "unit",
      +    "source",
      +    "vintage",
      +    "extractedOn",
      +    "method",
      +    "license"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / figures / properties / januaryLowC
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "coverage": {
      +      "additionalProperties": false,
      +      "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +      "properties": {
      +        "in": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "of": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "in",
      +        "of"
      +      ],
      +      "type": "object"
      +    },
      +    "extractedOn": {
      +      "description": "ISO date this value was extracted from the source.",
      +      "type": "string"
      +    },
      +    "license": {
      +      "type": "string"
      +    },
      +    "method": {
      +      "description": "URL to the methodology page for this dataset.",
      +      "type": "string"
      +    },
      +    "source": {
      +      "type": "string"
      +    },
      +    "unit": {
      +      "type": "string"
      +    },
      +    "vintage": {
      +      "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "unit",
      +    "source",
      +    "vintage",
      +    "extractedOn",
      +    "method",
      +    "license"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / figures / properties / preventionScore
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "coverage": {
      +      "additionalProperties": false,
      +      "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +      "properties": {
      +        "in": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "of": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "in",
      +        "of"
      +      ],
      +      "type": "object"
      +    },
      +    "extractedOn": {
      +      "description": "ISO date this value was extracted from the source.",
      +      "type": "string"
      +    },
      +    "license": {
      +      "type": "string"
      +    },
      +    "method": {
      +      "description": "URL to the methodology page for this dataset.",
      +      "type": "string"
      +    },
      +    "source": {
      +      "type": "string"
      +    },
      +    "unit": {
      +      "type": "string"
      +    },
      +    "vintage": {
      +      "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "unit",
      +    "source",
      +    "vintage",
      +    "extractedOn",
      +    "method",
      +    "license"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / figures / properties / seismicClass
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "coverage": {
      +      "additionalProperties": false,
      +      "description": "How many of Italy's places this dataset covers at all, e.g. 7587 of 7894 comuni.",
      +      "properties": {
      +        "in": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "of": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "in",
      +        "of"
      +      ],
      +      "type": "object"
      +    },
      +    "extractedOn": {
      +      "description": "ISO date this value was extracted from the source.",
      +      "type": "string"
      +    },
      +    "license": {
      +      "type": "string"
      +    },
      +    "method": {
      +      "description": "URL to the methodology page for this dataset.",
      +      "type": "string"
      +    },
      +    "source": {
      +      "type": "string"
      +    },
      +    "unit": {
      +      "type": "string"
      +    },
      +    "vintage": {
      +      "description": "The period the value describes, e.g. \"2025H2\" or \"2025\" — not when it was fetched.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "unit",
      +    "source",
      +    "vintage",
      +    "extractedOn",
      +    "method",
      +    "license"
      +  ],
      +  "type": "object"
      +}
    • changedOutput schema / properties / figures / required
      Previous value: -[
      -  "population",
      -  "purchasePriceEurM2",
      -  "rentPriceEurM2Month",
      -  "populationChangePct"
      -]New value: +[
      +  "population",
      +  "purchasePriceEurM2",
      +  "rentPriceEurM2Month",
      +  "populationChangePct",
      +  "januaryLowC",
      +  "daysAbove30C",
      +  "hospitalCareScore",
      +  "communityCareScore",
      +  "preventionScore",
      +  "bedsPerResident",
      +  "seismicClass"
      +]
    • addedOutput schema / properties / results / items / properties / bedsPerResident
      Added value: +{
      +  "description": "Registered tourist beds per resident (ISTAT, 2024). Town grain. A real zero is 0; null: no figure.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / communityCareScore
      Added value: +{
      +  "description": "NSG 2024 community and district care score, 0 to 100. Grain in nsgGrain. null: no figure.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / daysAbove30C
      Added value: +{
      +  "description": "Average days a year above 30 C (ERA5-Land, 2015 to 2024). Town grain. null: no figure.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / hospitalCareScore
      Added value: +{
      +  "description": "NSG 2024 hospital-care score, 0 to 100; 60 is the official sufficiency line. Grain in nsgGrain. null: no figure.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / januaryLowC
      Added value: +{
      +  "description": "Average January daily minimum, C (ERA5-Land, 2015 to 2024). Town grain, nearest ~9 km grid cell. null: no figure.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / nsgGrain
      Added value: +{
      +  "anyOf": [
      +    {
      +      "enum": [
      +        "region",
      +        "autonomous_province"
      +      ],
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Whose NSG scores these are: the comune's region, or for Bolzano-province and Trento-province comuni their own autonomous province (scored separately, never averaged). null when the comune has no NSG score."
      +}
    • addedOutput schema / properties / results / items / properties / preventionScore
      Added value: +{
      +  "description": "NSG 2024 prevention score, 0 to 100. Grain in nsgGrain. null: no figure.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / results / items / properties / seismicClass
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 4,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Hazard class 1 (lowest) to 4 (highest), as on the map layer. Always read it with seismicZone. null: no single classification."
      +}
    • addedOutput schema / properties / results / items / properties / seismicZone
      Added value: +{
      +  "anyOf": [
      +    {
      +      "maximum": 4,
      +      "minimum": 1,
      +      "type": "integer"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "The official zona sismica (1 = highest hazard), 5 minus seismicClass. A legal classification from the Dipartimento della Protezione Civile (31 May 2025), not a forecast or a verdict on any building."
      +}
    • changedOutput schema / properties / results / items / required
      Previous value: -[
      -  "istatCode",
      -  "name",
      -  "province",
      -  "provinceCode",
      -  "region",
      -  "page",
      -  "population",
      -  "purchasePriceEurM2",
      -  "rentPriceEurM2Month",
      -  "populationChangePct"
      -]New value: +[
      +  "istatCode",
      +  "name",
      +  "province",
      +  "provinceCode",
      +  "region",
      +  "page",
      +  "population",
      +  "purchasePriceEurM2",
      +  "rentPriceEurM2Month",
      +  "populationChangePct",
      +  "januaryLowC",
      +  "daysAbove30C",
      +  "hospitalCareScore",
      +  "communityCareScore",
      +  "preventionScore",
      +  "nsgGrain",
      +  "bedsPerResident",
      +  "seismicClass",
      +  "seismicZone"
      +]
  7. Changed10 schema fields changed
    • addedInput schema / properties / allCareScoresAtLeast60
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "boolean"
      +    },
      +    {
      +      "enum": [
      +        "true",
      +        "false"
      +      ],
      +      "type": "string"
      +    }
      +  ],
      +  "description": "[UI key nsg60] true: the NSG prevention, community-care and hospital-care scores must all be at least 60. Region grain (autonomous-province grain for Bolzano and Trento). A comune missing any of the three is left out and counted."
      +}
    • addedInput schema / properties / excludeSeismicZone1
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "boolean"
      +    },
      +    {
      +      "enum": [
      +        "true",
      +        "false"
      +      ],
      +      "type": "string"
      +    }
      +  ],
      +  "description": "[UI key seis] true: leave out comuni in official seismic zone 1, the highest hazard class (hazard class 4 in the map layer). A legal classification from the Dipartimento della Protezione Civile (31 May 2025), not a forecast. A comune with no single classification is left out and counted."
      +}
    • addedInput schema / properties / maxBedsPerResident
      Added value: +{
      +  "description": "[UI key beds] Registered tourist beds per resident (ISTAT, 2024) at most this; one of 0.1, 0.5, 1. Town grain. A comune with no figure is left out and counted; a real zero is a figure.",
      +  "type": "number"
      +}
    • addedInput schema / properties / maxDaysAbove30C
      Added value: +{
      +  "description": "[UI key heat] Average days a year above 30 C (ERA5-Land, 2015 to 2024) at most this many, 0 to 120. Town grain. No figure: left out and counted.",
      +  "maximum": 120,
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • addedInput schema / properties / minHospitalCareScore
      Added value: +{
      +  "description": "[UI key hosp] Ministero della Salute NSG 2024 hospital-care score at least this, 50 to 100; 60 is the official sufficiency line. REGION grain: every comune in a region shares its region's score, except Bolzano-province and Trento-province comuni, which carry their own autonomous province's score. No figure: left out and counted.",
      +  "maximum": 100,
      +  "minimum": 50,
      +  "type": "integer"
      +}
    • addedInput schema / properties / minJanuaryLowC
      Added value: +{
      +  "description": "[UI key jan] Average January daily minimum (ERA5-Land, 2015 to 2024) at least this many degrees C, whole numbers -10 to 12. Town grain. A comune with no figure is left out and counted in missingData.",
      +  "maximum": 12,
      +  "minimum": -10,
      +  "type": "integer"
      +}
    • changedOutput schema / properties / applied / additionalProperties / type
      Previous value: -[
      -  "string",
      -  "number"
      -]New value: +[
      +  "string",
      +  "number",
      +  "boolean"
      +]
    • changedOutput schema / properties / missingData / items / properties / excluded / description
      Previous value: -"Comuni that passed every filter not about this figure but have no figure, so could not be tested and are left out. Counted per figure; the counts can overlap."New value: +"Comuni that passed every filter not about this figure but have no figure, so could not be tested and are left out. Price, rent and population change are counted against every other filter except their own and can overlap. The six shortlist filters (januaryLow, daysAbove30C, hospitalCareScore, allCareScores, bedsPerResident, seismicClass) are counted in that fixed order, each against the comuni that reached it, exactly as the /data funnel does."
    • changedOutput schema / properties / missingData / items / properties / filter / enum
      Previous value: -[
      -  "purchasePrice",
      -  "rent",
      -  "populationChange"
      -]New value: +[
      +  "purchasePrice",
      +  "rent",
      +  "populationChange",
      +  "januaryLow",
      +  "daysAbove30C",
      +  "hospitalCareScore",
      +  "allCareScores",
      +  "bedsPerResident",
      +  "seismicClass"
      +]
    • changedOutput schema / properties / missingData / maxItems
      Previous value: -3New value: +9
  8. Changed1 schema field changed
    • changedOutput schema / properties / results / items / properties / purchasePriceEurM2 / description
      Previous value: -"null: no OMI price for this comune. Never a zero."New value: +"null: no OMI price for this comune. Never a zero. OMI is Agenzia delle Entrate's official range of market values per m2, built from recorded sales and appraisals. Asking prices on listing sites are what sellers hope for, and usually run higher."
  9. Added

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, the description discloses paging limits, sortability, region-grain healthcare scoring, missingData counting semantics, taxRegime omission semantics, and that row figures carry source/vintage metadata in `figures`. These are substantial behavioral details that materially affect interpretation of results.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and is appropriately sized for a 26-parameter filtering tool. It is dense and packed into one long paragraph, which slightly reduces readability, but most sentences carry important caveats or routing guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With rich annotations, complete schema coverage, and an output schema, the description supplies the remaining critical context: missing-data handling, regional grain caveats, taxRegime limitations, and sibling-tool routing. Nothing essential for correct invocation or interpretation appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all 26 parameters thoroughly. The description adds useful global semantics beyond the schema: missing figures are excluded and counted rather than treated as favorable, taxRegime omissions are not negatives, and healthcare scores are region-grain with autonomous-province exceptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description immediately states that this tool finds Italian comuni matching specified geographic, demographic, price, climate, healthcare, tourism, seismic, drive-time, and tax-regime criteria. It distinguishes itself from search_comuni, which converts a town name to a code, and get_comune, which returns one town's full profile.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly directs name-to-code lookup to search_comuni and single-town profile requests to get_comune, leaving find_comuni as the criteria-based multi-town filter. It also gives important usage caveats for missing-data and taxRegime results, preventing misinterpretation of omitted rows as negative answers.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources